Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
.classpath | 21
dev/null |binary
etc/eclipse-tools/RHQ | 19
etc/eclipse-tools/maven/RHQ | 33
etc/m2/settings.xml | 2
modules/common/ant-bundle/pom.xml | 50
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java | 27
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java | 204 ++
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java | 50
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java | 29
modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java | 115 +
modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties | 1
modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java | 87
modules/common/ant-bundle/src/test/resources/simple-build.xml | 12
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java | 81
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeContext.java | 3
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java | 5
modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java | 64
modules/common/jboss-as/src/main/java/org/jboss/on/common/jbossas/AbstractJBossASContentFacetDelegate.java | 3
modules/common/pom.xml | 1
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/content/ContentAgentService.java | 10
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/discovery/DiscoveryAgentService.java | 2
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java | 14
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java | 14
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/content/ContentDiscoveryReport.java | 83
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/content/ContentServerService.java | 2
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/content/ContentServiceResponse.java | 6
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/content/DeletePackagesRequest.java | 69
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/content/DeployPackagesRequest.java | 78
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/content/RetrievePackageBitsRequest.java | 70
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/AutoDiscoveryRequest.java | 86
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java | 2
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/InvalidInventoryReportException.java | 2
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/InventoryReport.java | 143 +
modules/core/dbutils/pom.xml | 74
modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml | 17
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 99
modules/core/domain/pom.xml | 79
modules/core/domain/src/main/java/META-INF/MANIFEST.MF | 14
modules/core/domain/src/main/java/org/rhq/core/RHQDomain.gwt.xml | 18
modules/core/domain/src/main/java/org/rhq/core/client/RHQDomain.java | 31
modules/core/domain/src/main/java/org/rhq/core/domain/alert/Alert.java | 12
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertConditionLog.java | 3
modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertDampeningEvent.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Principal.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 28
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java | 31
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployDefinition.java | 16
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java | 39
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java | 48
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java | 291 ++
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java | 36
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java | 101 +
modules/core/domain/src/main/java/org/rhq/core/domain/cloud/composite/FailoverListComposite.java | 77
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractConfigurationUpdate.java | 19
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/Configuration.java | 58
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/Property.java | 130 -
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PropertyList.java | 29
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PropertyMap.java | 29
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PropertySimple.java | 17
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/RawConfiguration.java | 51
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/ConfigurationDefinition.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/PropertyDefinition.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/definition/constraint/Constraint.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/group/GroupPluginConfigurationUpdate.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/Advisory.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/CVE.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/ContentServiceRequest.java | 16
modules/core/domain/src/main/java/org/rhq/core/domain/content/Distribution.java | 10
modules/core/domain/src/main/java/org/rhq/core/domain/content/DistributionType.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/InstalledPackageHistory.java | 17
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java | 51
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageType.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/RepoSyncResults.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/ContentDiscoveryReport.java | 82
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/ContentResponseResult.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/DeletePackagesRequest.java | 67
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/DeployIndividualPackageResponse.java | 25
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/DeployPackagesRequest.java | 76
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/DeployPackagesResponse.java | 22
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/RemoveIndividualPackageResponse.java | 24
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/RemovePackagesResponse.java | 23
modules/core/domain/src/main/java/org/rhq/core/domain/content/transfer/RetrievePackageBitsRequest.java | 68
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertCriteria.java | 45
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java | 39
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java | 27
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java | 15
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java | 133 -
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/EventCriteria.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GroupOperationHistoryCriteria.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageCriteria.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDefinitionCriteria.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementScheduleCriteria.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationDefinitionCriteria.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationHistoryCriteria.java | 23
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/PackageVersionCriteria.java | 10
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RepoCriteria.java | 11
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java | 27
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java | 20
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupDefinitionCriteria.java | 108 +
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceOperationHistoryCriteria.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java | 15
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java | 16
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/dialect/H2CustomDialect.java | 45
modules/core/domain/src/main/java/org/rhq/core/domain/discovery/AvailabilityReport.java | 11
modules/core/domain/src/main/java/org/rhq/core/domain/discovery/InventoryReport.java | 143 -
modules/core/domain/src/main/java/org/rhq/core/domain/discovery/ResourceSyncInfo.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/event/Event.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/event/EventDefinition.java | 26
modules/core/domain/src/main/java/org/rhq/core/domain/event/EventSource.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/event/transfer/EventReport.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementConverterClient.java | 360 +++
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric.java | 3
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric1D.java | 3
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric1H.java | 3
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric6H.java | 16
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataPK.java | 9
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementReport.java | 42
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/calltime/CallTimeData.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/calltime/CallTimeDataComposite.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/calltime/CallTimeDataValue.java | 22
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/composite/MeasurementNumericValueAndUnits.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/composite/MeasurementOOBComposite.java | 12
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/composite/MeasurementStringValueAndUnits.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/util/MeasurementConverter.java | 426 ----
modules/core/domain/src/main/java/org/rhq/core/domain/operation/OperationHistory.java | 20
modules/core/domain/src/main/java/org/rhq/core/domain/operation/ResourceOperationHistory.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/plugin/AbstractPlugin.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/plugin/Plugin.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/plugin/ServerPlugin.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Agent.java | 41
modules/core/domain/src/main/java/org/rhq/core/domain/resource/CreateResourceHistory.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/resource/DeleteResourceHistory.java | 17
modules/core/domain/src/main/java/org/rhq/core/domain/resource/InventorySummary.java | 114 +
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 366 +--
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceError.java | 3
modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java | 20
modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/RecentlyAddedResourceComposite.java | 11
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java | 16
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/composite/AutoGroupComposite.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/state/discovery/AutoDiscoveryRequest.java | 84
modules/core/domain/src/main/java/org/rhq/core/domain/util/EntitySerializer.java | 281 --
modules/core/domain/src/main/java/org/rhq/core/domain/util/OrderingField.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java | 28
modules/core/domain/src/main/java/org/rhq/core/domain/util/PageList.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/util/PersistenceUtility.java | 589 -----
modules/core/domain/src/main/java/org/rhq/core/domain/util/Recordizable.java | 28
modules/core/domain/src/main/java/org/rhq/core/domain/util/ReportUtils.java | 50
modules/core/domain/src/main/java/org/rhq/core/domain/util/serial/ExternalizableStrategy.java | 65
modules/core/domain/src/main/java/org/rhq/core/public/RHQDomain.css | 7
modules/core/domain/src/main/java/org/rhq/core/public/RHQDomain.html | 10
modules/core/domain/src/main/java/org/rhq/core/rebind/RecordBuilderGenerator.java | 172 +
modules/core/domain/src/main/java/org/rhq/core/server/EntitySerializer.java | 281 ++
modules/core/domain/src/main/java/org/rhq/core/server/ExternalizableStrategy.java | 65
modules/core/domain/src/main/java/org/rhq/core/server/H2CustomDialect.java | 45
modules/core/domain/src/main/java/org/rhq/core/server/MeasurementConverter.java | 355 +++
modules/core/domain/src/main/java/org/rhq/core/server/MeasurementParser.java | 104 +
modules/core/domain/src/main/java/org/rhq/core/server/PersistenceUtility.java | 602 +++++
modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java | 173 +
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/ConfigurationTest.java | 149 -
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationIntegrationTest.java | 15
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/RawConfigurationTest.java | 59
modules/core/domain/src/test/java/org/rhq/core/domain/configuration/test/ConfigurationTest.java | 28
modules/core/domain/src/test/java/org/rhq/core/domain/content/test/ContentSourceSyncResultsTest.java | 22
modules/core/domain/src/test/java/org/rhq/core/domain/content/test/ContentSourceTest.java | 51
modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java | 4
modules/core/domain/src/test/java/org/rhq/core/domain/content/test/RepoGroupTest.java | 53
modules/core/domain/src/test/java/org/rhq/core/domain/measurement/test/CompositeLoadingTest.java | 48
modules/core/domain/src/test/java/org/rhq/core/domain/measurement/test/MeasurementTest.java | 3
modules/core/domain/src/test/java/org/rhq/core/domain/operation/OperationHistoryTest.java | 47
modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ProblemResourceTest.java | 3
modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ResourceErrorTest.java | 46
modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/ResourceGroupTest.java | 49
modules/core/domain/src/test/java/org/rhq/core/domain/resource/test/TokenGenerationTest.java | 6
modules/core/domain/src/test/java/org/rhq/core/domain/test/QueryAllTest.java | 2
modules/core/domain/src/test/java/org/rhq/core/domain/test/SerializableTest.java | 3
modules/core/domain/src/test/java/org/rhq/core/domain/util/units/test/MeasurementConverterTest.java | 73
modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java | 10
modules/core/plugin-container/src/main/java/org/rhq/core/pc/PluginContainerMBeanImpl.java | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/StandaloneContainer.java | 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java | 14
modules/core/plugin-container/src/main/java/org/rhq/core/pc/configuration/ConfigurationManager.java | 13
modules/core/plugin-container/src/main/java/org/rhq/core/pc/content/ContentDiscoveryRunner.java | 5
modules/core/plugin-container/src/main/java/org/rhq/core/pc/content/ContentManager.java | 12
modules/core/plugin-container/src/main/java/org/rhq/core/pc/content/CreateContentRunner.java | 12
modules/core/plugin-container/src/main/java/org/rhq/core/pc/content/DeleteContentRunner.java | 9
modules/core/plugin-container/src/main/java/org/rhq/core/pc/content/RetrieveContentBitsRunner.java | 4
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/AutoDiscoveryExecutor.java | 4
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/CreateResourceRunner.java | 27
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/DeleteResourceRunner.java | 26
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java | 4
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/RuntimeDiscoveryExecutor.java | 2
modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/ConfigManagementTest.java | 41
modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java | 6
modules/core/util/src/main/java/org/rhq/core/util/MessageDigestGenerator.java | 108 -
modules/core/util/src/main/java/org/rhq/core/util/NumberUtil.java | 65
modules/core/util/src/main/java/org/rhq/core/util/exception/ThrowableUtil.java | 9
modules/core/util/src/test/java/org/rhq/core/util/NumberUtilTest.java | 44
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/ExternalizableStrategyCommandPreprocessor.java | 2
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java | 2
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/promptcmd/DiscoveryPromptCommand.java | 2
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/promptcmd/FailoverPromptCommand.java | 2
modules/enterprise/gui/coregui/pom.xml | 426 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 61
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Breadcrumb.java | 115 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BreadcrumbTrailPane.java | 109 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 355 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java | 115 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java | 73
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UnknownViewException.java | 33
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/View.java | 120 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewId.java | 97
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewRenderer.java | 34
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 371 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionEditorView.java | 131 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 175 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleGroupsEditorItem.java | 100
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java | 227 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesView.java | 120 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/SubjectRolesEditorItem.java | 126 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java | 166 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java | 290 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java | 128 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDataSource.java | 298 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java | 186 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertsView.java | 286 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/SubsystemResourceAlertDataSource.java | 46
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AlertDefinitionsDataSource.java | 194 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AlertDefinitionsView.java | 59
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java | 87
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleTopView.java | 56
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java | 120 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java | 38
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java | 208 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java | 94
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java | 40
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java | 175 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadRecipeStep.java | 170 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/AbstractBundleDeployWizard.java | 163 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployDefinitionInfoStep.java | 85
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java | 88
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/CreateConfigStep.java | 57
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployOptionsStep.java | 96
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java | 147 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployTargetStep.java | 68
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java | 154 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectTemplateStep.java | 89
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java | 125 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java | 176 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesDataSource.java | 99
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java | 167 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java | 112 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/AboutModalWindow.java | 96
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/EnhancedListGrid.java | 63
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java | 35
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/HeaderLabel.java | 35
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/SimpleCollapsiblePanel.java | 81
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/SubTabLayout.java | 101 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java | 248 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 1004 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ListGridConfigurationEditor.java | 255 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/measurement/MeasurementRangeEditor.java | 123 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java | 194 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTab.java | 59
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSelectedEvent.java | 101 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSelectedHandler.java | 28
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java | 84
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/PropertyGrid.java | 133 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 370 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableAction.java | 30
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java | 206 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/DynamicCallbackForm.java | 147 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/DynamicCallbackFormHandlerCollection.java | 34
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/DynamicCallbackFormImpl.java | 101 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/DynamicCallbackFormImplHost.java | 23
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/DynamicCallbackFormImplIE6.java | 49
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/DynamicFormHandler.java | 33
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/DynamicFormSubmitCompleteEvent.java | 54
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/TextFileRetrieverForm.java | 116 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java | 44
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardStep.java | 33
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java | 251 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 224 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java | 54
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java | 52
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/Portlet.java | 97
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletSettingsWindow.java | 87
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/RecentlyAddedResource.java | 78
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/RecentlyAddedResourceDS.java | 226 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/RecentlyAddedView.java | 56
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java | 101 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AlertGWTService.java | 65
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java | 79
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java | 70
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java | 31
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java | 139 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/MeasurementDataGWTService.java | 52
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java | 45
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceBossGWTService.java | 39
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java | 63
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java | 42
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceTypeGWTService.java | 20
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java | 40
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java | 103 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java | 95
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java | 134 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionDataSource.java | 113 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java | 93
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java | 182 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java | 161 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java | 146 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSelectListener.java | 29
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/CustomResourceTreeGrid.java | 58
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 315 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTitleBar.java | 125 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeDatasource.java | 331 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java | 445 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java | 163 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/alert/ResourceAlertHistoryView.java | 51
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java | 114 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java | 64
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java | 159 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ResourceConfigurationEditView.java | 102 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/GraphListView.java | 148 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java | 309 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java | 304 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeDataSource.java | 130 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/calltime/CallTimeView.java | 144 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/OperationHistoryDataSource.java | 111 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/OperationHistoryView.java | 107 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/OperationWizard.java | 69
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/ExecutionSchedule.java | 292 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java | 148 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java | 70
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java | 406 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/detail/OperationDetailsView.java | 116 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java | 57
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java | 186 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java | 221 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java | 229 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java | 62
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java | 87
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java | 172 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java | 254 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java | 81
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java | 88
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SelectedResourceDataSource.java | 73
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java | 254 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeDataSource.java | 260 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeView.java | 115 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/summary/SummaryCountsView.java | 110 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java | 160 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/SearchBarPane.java | 89
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/CanvasUtility.java | 53
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java | 43
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 174 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java | 48
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenter.java | 51
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java | 201 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferenceChangeEvent.java | 47
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferenceChangeListener.java | 30
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferenceNames.java | 242 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferences.java | 136 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/MonitoringRequestCallback.java | 66
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RPCManager.java | 92
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java | 66
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AlertGWTServiceImpl.java | 60
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java | 66
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleFileUploadServlet.java | 81
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java | 178 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java | 77
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/FileUploadServlet.java | 184 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/MeasurementDataGWTServiceImpl.java | 72
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ObjectFilter.java | 86
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java | 78
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceBossGWTServiceImpl.java | 47
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java | 210 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java | 57
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceTypeGWTServiceImpl.java | 29
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java | 65
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java | 78
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/util/SerialUtility.java | 61
modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css | 263 ++
modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.html | 30
modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml | 130 +
modules/enterprise/gui/coregui/src/main/webapp/images/Favorite_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/Favorite_24_Selected.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/RHQ.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/ajax-loader.gif |binary
modules/enterprise/gui/coregui/src/main/webapp/images/header/header_bg.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/header/header_bg_line.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/header/header_bg_selected.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/header/rhq_logo_28px.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/info/icn_info_blue.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/info/icn_info_orange.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/info/icn_info_red.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/Service_down_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/Service_down_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/Service_up_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/Service_up_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_green_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_green_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_grey_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_grey_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_red_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_red_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_yellow_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/availability_yellow_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/dir_closed.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/dir_opened.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/folder_closed.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/folder_down_closed.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/folder_down_opened.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/folder_group_closed.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/folder_group_opened.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/resources/folder_opened.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/rhq_logo_animated_100px.gif |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_24.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_16.png |binary
modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_24.png |binary
modules/enterprise/gui/pom.xml | 1
modules/enterprise/gui/portal-war/pom.xml | 3
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/ListAlertHistoryUIBean.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/ListGroupAlertHistoryUIBean.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/converter/MetricPercentConverter.java | 4
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/description/BaselineDescriber.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/description/ThresholdDescriber.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/ExistingResourceConfigurationUIBean.java | 46
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/configuration/resource/RawConfigUIBean.java | 10
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ShowInstalledPackageHistoryUIBean.java | 3
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/image/chart/HorizontalChart.java | 8
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/image/chart/PerformanceChart.java | 5
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/image/chart/VerticalChart.java | 12
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/InventorySummaryUIBean.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/AlertDefUtil.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/ViewAlertAction.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/condition/MeasurementConverterValidator.java | 7
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartAction.java | 6
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/hub/GroupHubPortalAction.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/hub/ResourceHubPortalAction.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/portlet/summaryCounts/ViewAction.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/taglib/MetricDisplayTag.java | 17
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/taglib/display/MetricDecorator.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/util/MonitorUtils.java | 7
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/navigation/resource/ResourceTreeModelUIBean.java | 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java | 10
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/StartupServlet.java | 5
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/subsystem/SubsystemAlertHistoryUIBean.java | 4
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/util/StatisticsUtility.java | 2
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/web.xml | 5
modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp | 2
modules/enterprise/gui/portal-war/src/main/webapp/admin/test/control.jsp | 3
modules/enterprise/gui/portal-war/src/main/webapp/admin/test/hibernate.jsp | 2
modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/downloads-body.xhtml | 101 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/largeenv.xhtml | 4
modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/listAlertTemplates.xhtml | 3
modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/report/resourceInstallReport-body.xhtml | 93
modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/events/history-plain.xhtml | 257 ++
modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/menu/menu.xhtml | 1
modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/monitor/tables-plain.xhtml | 168 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/discovery/queue.xhtml | 1
modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/alert/listGroupAlertDefinitions.xhtml | 3
modules/enterprise/gui/portal-war/src/main/webapp/rhq/layout/main-layout.xhtml | 4
modules/enterprise/gui/portal-war/src/main/webapp/rhq/layout/main.xhtml | 6
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/deploy-plain.xhtml | 148 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/history-plain.xhtml | 363 +++
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/installed_package_details-plain.xhtml | 157 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription-plain.xhtml | 259 ++
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/view-plain.xhtml | 170 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/monitor/availabilityHistory-plain.xhtml | 200 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/monitor/schedules-plain.xhtml | 172 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/monitor/traits-plain.xhtml | 105 +
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/summary/overview-plain.xhtml | 69
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/summary/table/recentOOBs.xhtml | 2
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/summary/timeline-plain.xhtml | 53
modules/enterprise/gui/portal-war/src/test/resources/log4j.xml | 51
modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/proxy/ResourceClientProxy.java | 18
modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClientProxy.java | 2
modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js | 45
modules/enterprise/server/container/pom.xml | 31
modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat | 11
modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml | 69
modules/enterprise/server/ear/pom.xml | 18
modules/enterprise/server/jar/pom.xml | 2
modules/enterprise/server/jar/src/main/java/META-INF/MANIFEST.MF | 30
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java | 24
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerLocal.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 13
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java | 13
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 337 ++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java | 31
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java | 73
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java | 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/AffinityGroupManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/CloudManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 22
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java | 19
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/AdvisoryManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java | 30
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerLocal.java | 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentServerServiceImpl.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java | 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServerServiceImpl.java | 23
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java | 25
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java | 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryServerServiceImpl.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/event/EventManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/CallTimeDataManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementProblemManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementFormatter.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/GroupOperationJob.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java | 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java | 44
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/InventorySummary.java | 114 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceAvailabilityManagerLocal.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceBossBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceBossLocal.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceFactoryManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 15
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerLocal.java | 10
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceTypeManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java | 10
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java | 21
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerLocal.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/EnhancedSchedulerImpl.java | 17
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/AccessBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/CoreTestBean.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java | 146 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryRunner.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 31
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/alert/test/AlertManagerBeanTest.java | 5
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 354 +++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java | 5
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java | 84
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanUnitTest.java | 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentManagerBeanTest.java | 13
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanEligiblePackagesTest.java | 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/discovery/test/DiscoveryBossBeanTest.java | 17
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/event/test/EventManagerTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java | 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/MeasurementBaselineManagerTest.java | 4
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/measurement/test/MeasurementViewManagerTest.java | 3
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/group/test/RecursiveResourceGroupTest.java | 3
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 | 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/test/ResourceFactoryManagerBeanTest.java | 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/scheduler/jobs/DataPurgeJobTest.java | 4
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java | 10
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/util/ResourceTreeHelper.java | 3
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/util/SessionTestHelper.java | 3
modules/enterprise/server/plugins/ant-bundle/pom.xml | 214 ++
modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java | 125 +
modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml | 20
modules/enterprise/server/plugins/filetemplate-bundle/pom.xml | 6
modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java | 7
modules/enterprise/server/plugins/jboss-software/src/main/resources/META-INF/rhq-serverplugin.xml | 2
modules/enterprise/server/plugins/perspectives/core/perspective/src/main/resources/META-INF/rhq-serverplugin.xml | 17
modules/enterprise/server/plugins/pom.xml | 1
modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml | 1
modules/enterprise/server/safe-invoker/src/main/java/org/rhq/enterprise/server/util/HibernateDetachUtility.java | 91
modules/plugins/ant-bundle/pom.xml | 267 ++
modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java | 136 +
modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java | 51
modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml | 20
modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java | 166 +
modules/plugins/ant-bundle/src/test/resources/log4j.xml | 35
modules/plugins/ant-bundle/src/test/resources/simple-build.xml | 8
modules/plugins/ant-bundle/src/test/resources/test-build.xml | 27
modules/plugins/apache/src/test/java/org/rhq/plugins/apache/ApachePluginTest.java | 7
modules/plugins/augeas/src/main/java/org/rhq/plugins/augeas/helper/AugeasRawConfigHelper.java | 5
modules/plugins/byteman/src/main/java/org/rhq/plugins/byteman/BytemanAgentComponent.java | 10
modules/plugins/cobbler/src/main/java/org/rhq/plugins/cobbler/CobblerComponent.java | 9
modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java | 8
modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java | 2
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerComponent.java | 4
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerContentFacetDelegate.java | 10
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/StandaloneManagedDeploymentComponent.java | 6
modules/plugins/jboss-as-5/testsuite/src/main/java/org/rhq/plugins/jbossas5/JBossServerTest.java | 2
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/ApplicationComponent.java | 4
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/JBossASServerComponent.java | 5
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/WarDiscoveryHelper.java | 7
modules/plugins/jboss-as/src/test/java/org/rhq/plugins/jbossas/test/JBossASPluginTest.java | 2
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java | 3
modules/plugins/jmx/src/test/java/org/rhq/plugins/jmx/test/JMXPluginTest.java | 3
modules/plugins/nss/src/main/java/org/rhq/plugin/nss/NameServiceSwitchComponent.java | 5
modules/plugins/perftest/src/main/java/org/rhq/plugins/perftest/PerfTestComponent.java | 6
modules/plugins/platform/src/main/java/org/rhq/plugins/platform/LinuxPlatformComponent.java | 8
modules/plugins/platform/src/main/java/org/rhq/plugins/platform/WindowsPlatformComponent.java | 2
modules/plugins/platform/src/test/java/org/rhq/plugins/platform/test/PlatformPluginTest.java | 2
modules/plugins/pom.xml | 17
modules/plugins/postgres/src/test/java/org/rhq/plugins/postgres/test/PostgresPluginTest.java | 3
modules/plugins/rhq-agent/src/test/java/org/rhq/plugins/agent/AgentPluginTest.java | 2
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatGroupComponent.java | 16
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatUserComponent.java | 24
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatVHostComponent.java | 3
modules/plugins/tomcat/src/main/java/org/jboss/on/plugins/tomcat/TomcatWarComponent.java | 8
modules/plugins/tomcat/src/test/java/org/jboss/on/plugins/tomcat/test/TomcatPluginTest.java | 3
modules/plugins/validate-all-plugins/pom.xml | 1
pom.xml | 21
647 files changed, 35130 insertions(+), 4251 deletions(-)
New commits:
commit 09a34d0f20f378e27055b466b343943f0711a282
Merge: bd65937... 8593598...
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Apr 1 20:23:07 2010 -0400
Merge branch 'master' into bugfixes
commit 8593598f69e6bca1a886818b3ec0b4f41da59277
Merge: 22ce633... 85c35b5...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 17:58:16 2010 -0400
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit 22ce63359bb5856a1e51bad5c4923113d9ebc9a9
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 17:57:43 2010 -0400
add a4j keep-alive annotation to UIBean will survive across AJAX requests
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ShowInstalledPackageHistoryUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ShowInstalledPackageHistoryUIBean.java
index 075d273..668d980 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ShowInstalledPackageHistoryUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ShowInstalledPackageHistoryUIBean.java
@@ -23,6 +23,8 @@ import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.faces.component.UIData;
import javax.faces.model.SelectItem;
+
+import org.ajax4jsf.model.KeepAlive;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.content.InstalledPackageHistory;
@@ -37,6 +39,7 @@ import org.rhq.enterprise.server.content.ContentUIManagerLocal;
*
* @author Jason Dobies
*/
+@KeepAlive
public class ShowInstalledPackageHistoryUIBean {
private InstalledPackageHistory history;
commit 13277b3af1bf163ac712260821c4d3db189e52a1
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 17:57:00 2010 -0400
add better error handling when calling deleteJob() on Quartz scheduler returns false
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/EnhancedSchedulerImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/EnhancedSchedulerImpl.java
index 23a8381..b3c213a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/EnhancedSchedulerImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/EnhancedSchedulerImpl.java
@@ -63,12 +63,17 @@ public class EnhancedSchedulerImpl implements EnhancedScheduler {
try {
// see if the job is already scheduled and if so,
// either remove it so we can reschedule it or keep it (based on rescheduleIfExists)
- if (this.scheduler.getJobDetail(name, groupName) != null) {
+ JobDetail job = this.scheduler.getJobDetail(name, groupName);
+ if (job != null) {
if (rescheduleIfExists) {
log.debug("Looks like repeating job [" + name + ':' + groupName
+ "] is already scheduled - removing it so it can be rescheduled");
this.scheduler.deleteJob(name, groupName);
+ if (!this.scheduler.deleteJob(name, groupName)) {
+ log.error("Failed to delete job [" + job + "] in order to reschedule it.");
+ return;
+ }
} else {
log.debug("Looks like repeating job [" + name + ':' + groupName
+ "] is already scheduled - leaving the original job as-is");
@@ -107,12 +112,16 @@ public class EnhancedSchedulerImpl implements EnhancedScheduler {
try {
// see if the job is already scheduled and if so,
// either remove it so we can reschedule it or keep it (based on rescheduleIfExists)
- if (this.scheduler.getJobDetail(name, groupName) != null) {
+ JobDetail job = this.scheduler.getJobDetail(name, groupName);
+ if (job != null) {
if (rescheduleIfExists) {
log.debug("Looks like cron job [" + name + ':' + groupName
+ "] is already scheduled - removing it so it can be rescheduled");
- this.scheduler.deleteJob(name, groupName);
+ if (!this.scheduler.deleteJob(name, groupName)) {
+ log.error("Failed to delete job [" + job + "] in order to reschedule it.");
+ return;
+ }
} else {
log.debug("Looks like cron job [" + name + ':' + groupName
+ "] is already scheduled - leaving the original job as-is");
@@ -142,7 +151,7 @@ public class EnhancedSchedulerImpl implements EnhancedScheduler {
Date next = this.scheduler.scheduleJob(job, trigger);
log.info("Scheduled cron job [" + name + ':' + groupName + "] to fire next at [" + next
- + "] with the cronString of [" + cronString + "]");
+ + "] with the cronString of [" + cronString + "].");
return;
}
commit 85c35b5409a9de7c9a03a79730f03087714dca4c
Merge: 9d11886... 6c1cda8...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Apr 1 16:15:20 2010 -0400
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit 6c1cda84cc39eaa183d237ae669710ac85eaebe3
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 15:57:33 2010 -0400
fix overlap of dbupgrade version 2.59 between RHQ 1.3.1 and HEAD; fix a few minor typos
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 23f1fbd..de2d2ca 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -1471,6 +1471,20 @@
</schemaSpec>
<schemaSpec version="2.59">
+ <schema-directSQL>
+ <statement desc="Changing default persistence mode to FILESYSTEM for new JBoss CSP content sources">
+ UPDATE rhq_content_source_type SET default_download_mode = 'FILESYSTEM'
+ WHERE id = 101
+ </statement>
+ <statement desc="Changing persistence mode to FILESYSTEM on out-of-box JBoss CSP content source">
+ UPDATE rhq_content_source SET download_mode = 'FILESYSTEM'
+ WHERE id = 101 AND configuration_id =
+ (SELECT configuration_id FROM rhq_config_property WHERE id = 112 AND string_value IS null)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
+ <schemaSpec version="2.60">
<schema-directSQL>
<statement desc="Creating table RHQ_RAW_CONFIG">
CREATE TABLE RHQ_RAW_CONFIG (ID INTEGER)
@@ -1479,7 +1493,7 @@
<schema-alterColumn table="RHQ_RAW_CONFIG" column="ID" columnType="INTEGER" nullable="FALSE" />
<schema-createSequence name="RHQ_RAW_CONFIG_ID_SEQ" initial="10001" />
<schema-directSQL>
- <statement desc="Creating primary key for RHQ_PARTITION_EVENT">
+ <statement desc="Creating primary key for RHQ_RAW_CONFIG">
ALTER TABLE RHQ_RAW_CONFIG ADD PRIMARY KEY (ID)
</statement>
</schema-directSQL>
@@ -1532,7 +1546,7 @@
</schemaSpec>
- <schemaSpec version="2.59.1">
+ <schemaSpec version="2.60.1">
<schema-addColumn table="RHQ_PLUGIN" column="AMPS_VERSION" columnType="VARCHAR2" />
<schema-alterColumn table="RHQ_PLUGIN"
column="AMPS_VERSION"
@@ -1540,7 +1554,7 @@
precision="16"/>
</schemaSpec>
- <schemaSpec version="2.59.2">
+ <schemaSpec version="2.60.2">
<schema-directSQL>
<!-- RHN_CHANNEL => RHQ_REPO -->
<statement>
@@ -2696,6 +2710,7 @@
</statement>
</schema-directSQL>
</schemaSpec>
+
<schemaSpec version="2.78">
<!-- Remove obsolete tables RHQ_BUNDLE_CONFIG and RHQ_BUNDLE_DEPLOYMENT (the latter by cascade) -->
<schema-dropTable table="RHQ_BUNDLE_DEPLOYMENT" />
@@ -2908,7 +2923,7 @@
</statement>
</schema-directSQL>
<schema-directSQL>
- <statement desc="Creating primary key for RHQ_AFFINITY_GROUP">
+ <statement desc="Creating primary key for RHQ_SAVED_SEARCH">
ALTER TABLE RHQ_SAVED_SEARCH ADD PRIMARY KEY ( ID )
</statement>
</schema-directSQL>
@@ -2971,4 +2986,3 @@
</dbupgrade>
</target>
</project>
-
commit 9d1188637cd4854be5253428a98998b1cd432d48
Merge: 8a99109... b1a26f1...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Apr 1 15:51:52 2010 -0400
Merge branch 'gwt'
commit 0af2eed9684a2e0a16be0fc5a110210ba350e6da
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 13:30:36 2010 -0400
update copyright date in javadoc footer; link JEE5 javadoc in to domain javadoc
diff --git a/modules/core/domain/pom.xml b/modules/core/domain/pom.xml
index 05e1a4b..3fe0ff1 100644
--- a/modules/core/domain/pom.xml
+++ b/modules/core/domain/pom.xml
@@ -330,6 +330,7 @@
<breakiterator>true</breakiterator>
<links>
<link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
+ <link>http://java.sun.com/javaee/5/docs/api/</link>
</links>
</configuration>
</execution>
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index bfb4d67..5458784 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -641,7 +641,7 @@
<link href="../domain" />
<link href="../plugin-api" />
<link href="http://java.sun.com/j2se/1.5.0/docs/api/" />
- <bottom><![CDATA[Copyright © 2008-2009 <a href="http://rhq-project.org/">Red Hat, Inc.</a>. All Rights Reserved.]]></bottom>
+ <bottom><![CDATA[Copyright © 2008-2010 <a href="http://rhq-project.org/">Red Hat, Inc.</a>. All Rights Reserved.]]></bottom>
</javadoc>
</tasks>
</configuration>
commit 8a99109184c38e490ea7c793db7b3eb8bdf314bd
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 13:17:45 2010 -0400
fix annoying sporadic test failures in ConfigurationManagerBeanTest
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index dbd2395..4158d8b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -840,6 +840,9 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
Resource resource = entityManager.find(Resource.class, resourceId);
+ // TODO (ips, 04/01/10): Our id's are not guaranteed to be sequential, because our sequences are configured to
+ // pre-create and cache blocks of 10 sequence id's, so it may be better to order by
+ // "cu.createdTime", rather than "cu.id".
pc.initDefaultOrderingField("cu.id", PageOrdering.DESC);
String queryName = ResourceConfigurationUpdate.QUERY_FIND_ALL_BY_RESOURCE_ID;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
index 774f44c..2854544 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
@@ -107,29 +107,38 @@ public interface ConfigurationManagerLocal {
Long endDate, PageControl pc);
/**
- * Returns the list of all resource configuration updates for the given resource. This will show you an audit trail
- * of the update history for the resource (who updated it, when and what did they do). You can pick one
+ * Returns the list of all Resource configuration updates for the given Resource, in reverse of the order in which
+ * they were created (i.e. most recent update will be the first item in the list). This will show you an audit trail
+ * of the update history for the Resource (who updated it, when and what did they change). You can pick one
* configuration version to later rollback to that version via
* {@link #updateResourceConfiguration(Subject, int, Configuration)}.
*
- * @param subject the user who wants to see the information
+ * @param subject the user who wants to see the information
* @param resourceId the resource whose update requests are to be returned, if null will not filter by resourceId
* @param beginDate filter used to show only results occurring after this epoch millis parameter, nullable
* @param endDate filter used to show only results occurring before this epoch millis parameter, nullable
* @param suppressOldest if true, will not include the oldest element in the history (usually the initial update)
* @param pc the pagination controls
*
- * @return the resource's complete list of updates (will be empty (not <code>null</code>) if none)
+ * @return the Resource's complete list of updates (will be empty (not <code>null</code>) if none)
*/
PageList<ResourceConfigurationUpdate> findResourceConfigurationUpdates(Subject subject, Integer resourceId,
Long beginDate, Long endDate, boolean suppressOldest, PageControl pc);
+ /**
+ * Returns a single plugin configuration update.
+ *
+ * @param subject the user who wants to see the information
+ * @param configurationUpdateId the ID of the configuration update entity to return
+ *
+ * @return the plugin configuration update
+ */
PluginConfigurationUpdate getPluginConfigurationUpdate(Subject subject, int configurationUpdateId);
/**
* Returns a single resource configuration update
*
- * @param subject the user who wants to see the information
+ * @param subject the user who wants to see the information
* @param configurationUpdateId the ID of the configuration update entity to return
*
* @return the resource configuration update
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
index 45164d2..c79506d 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -23,7 +23,6 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Collection;
import javax.persistence.EntityManager;
@@ -46,7 +45,6 @@ import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
-import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.group.GroupPluginConfigurationUpdate;
import org.rhq.core.domain.discovery.AvailabilityReport;
import org.rhq.core.domain.discovery.InventoryReport;
@@ -78,7 +76,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
private Resource newResource1;
private Resource newResource2;
private ResourceGroup compatibleGroup;
- private PageControl pageControl;
+ private PageControl configUpdatesPageControl;
private Agent agent;
private Subject overlord;
@@ -87,9 +85,12 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
*/
@BeforeClass
public void beforeClass() {
- // make sure page control sorts so the latest config is last
- pageControl = PageControl.getUnlimitedInstance();
- pageControl.addDefaultOrderingField("cu.id", PageOrdering.ASC);
+ // Make sure page control sorts so the latest config update is last (the default is for the latest to be first).
+ configUpdatesPageControl = PageControl.getUnlimitedInstance();
+ // (ips, 04/01/10): Use createdTime, rather than id, to order by, since the id's are not guaranteed to be
+ // ordered sequentially (this is because, dbsetup configures our sequences to pre-create
+ // and cache sequence values 10 at a time.
+ configUpdatesPageControl.addDefaultOrderingField("cu.createdTime", PageOrdering.ASC);
configurationManager = LookupUtil.getConfigurationManager();
resourceManager = LookupUtil.getResourceManager();
@@ -224,7 +225,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
assert history1 != null;
PropertySimple myprop = history1.getConfiguration().getSimple("myboolean");
assert myprop != null;
- assert myprop.getStringValue().equals("true");
+ assert "true".equals(myprop.getStringValue());
// now update to that second config - the "agent" will sleep for a bit before it completes
// so we will have an INPROGRESS configuration for a few seconds before it goes to SUCCESS
@@ -244,7 +245,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
assert history2.getId() == history1.getId();
myprop = history2.getConfiguration().getSimple("myboolean");
assert myprop != null;
- assert myprop.getStringValue().equals("true");
+ assert "true".equals(myprop.getStringValue());
myprop = history2.getConfiguration().getSimple("mysleep"); // this wasn't in the first config
assert myprop == null;
// record that this test case ran, we expect it will if the agent delay is there
@@ -256,9 +257,10 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
assert history2.getId() != history1.getId();
myprop = history2.getConfiguration().getSimple("myboolean");
assert myprop != null;
- assert myprop.getStringValue().equals("false");
+ assert "false".equals(myprop.getStringValue());
myprop = history2.getConfiguration().getSimple("mysleep");
- assert myprop.getLongValue() == 7000L;
+ assert myprop.getLongValue() != null;
+ assert myprop.getLongValue().longValue() == 7000L;
}
} while (inProgress);
@@ -555,7 +557,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
configurationManager.updateResourceConfiguration(overlord, resource.getId(), configuration);
- Thread.sleep(4000); // wait for the test agent to complete the request
+ Thread.sleep(2000); // wait for the test agent to complete the request
// our test service pretends the agent got an error - it will set some errors and the call to
// completedConfigurationUpdate is made inline (in the real code, this would be asynchronous)
@@ -626,13 +628,13 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
configurationManager.updateResourceConfiguration(overlord, resource.getId(), configuration);
- Thread.sleep(4000); // wait for the test agent to complete the request
+ Thread.sleep(2000); // wait for the test agent to complete the request
// at this point in time, the round trip messaging is done and we have the agent response
List<ResourceConfigurationUpdate> requests;
requests = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert requests.size() == 1;
assert requests.get(0) != null;
@@ -663,7 +665,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
assert live != null;
mybool = live.getSimple("myboolean");
assert mybool != null;
- assert mybool.getStringValue().equals("true");
+ assert "true".equals(mybool.getStringValue());
assert mybool.getErrorMessage() == null;
// purging a non-existing request is a no-op
@@ -674,7 +676,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
configurationManager.purgeResourceConfigurationUpdate(overlord, request.getId(), false);
requests = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert requests.size() == 1; // it will create one for us from the "live" configuration
}
@@ -704,34 +706,35 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
List<ResourceConfigurationUpdate> history;
history = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert history != null;
assert history.size() == 3;
- Configuration currentConfiguration = history.get(2).getConfiguration(); // the last is the current one
+
+ Configuration currentConfiguration = history.get(2).getConfiguration();
PropertySimple mybool = currentConfiguration.getSimple("myboolean");
assert mybool != null;
- assert mybool.getStringValue().equals("TRUE");
+ assert "TRUE".equals(mybool.getStringValue()) : "actual: " + mybool.getStringValue();
// now grab one of the earlier configurations and rollback to it
Configuration rollbackToHere = history.get(1).getConfiguration(); // the "false" one
mybool = rollbackToHere.getSimple("myboolean");
assert mybool != null;
- assert mybool.getStringValue().equals("false");
+ assert "false".equals(mybool.getStringValue()) : "actual: " + mybool.getStringValue();
configurationManager.updateResourceConfiguration(overlord, resource.getId(), rollbackToHere);
Thread.sleep(2000); // wait for the test agent to complete the request
history = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert history != null;
assert history.size() == 4;
- ResourceConfigurationUpdate newConfigUpdate = history.get(3);
- Configuration newConfiguration = newConfigUpdate.getConfiguration(); // the last is the new one
+ ResourceConfigurationUpdate newConfigUpdate = history.get(3); // the last one is the new one
+ Configuration newConfiguration = newConfigUpdate.getConfiguration();
assert newConfiguration.getId() != rollbackToHere.getId();
mybool = newConfiguration.getSimple("myboolean");
assert mybool != null;
- assert mybool.getStringValue().equals("false");
+ assert "false".equals(mybool.getStringValue());
assert mybool.getErrorMessage() == null;
ResourceConfigurationUpdate current = configurationManager.getLatestResourceConfigurationUpdate(overlord,
@@ -768,7 +771,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
List<ResourceConfigurationUpdate> requests;
requests = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert requests != null;
assert requests.size() == 1 : "Got " + requests.size() + " config update requests - expected 1.";
@@ -799,7 +802,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
List<ResourceConfigurationUpdate> requests;
requests = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert requests != null;
assert requests.size() == 2 : "Got " + requests.size() + " config update requests - expected 2.";
@@ -813,7 +816,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
// now get the current configs/requests and
// make sure we deleted just the one configuration, leaving one left
requests = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert requests.size() == 1;
assert requests.get(0).getId() == savedRequest.getId();
@@ -835,14 +838,14 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
Configuration activeConfigurationBefore = configurationManager.getResourceConfiguration(resource.getId());
configurationManager.updateResourceConfiguration(overlord, resource.getId(), configuration1);
- Thread.sleep(4000); // wait for the test agent to complete the request
+ Thread.sleep(2000); // wait for the test agent to complete the request
Configuration activeConfigurationAfter = configurationManager.getResourceConfiguration(resource.getId());
assert activeConfigurationBefore.equals(activeConfigurationAfter) : "ActiveResourceConfiguration was not supposed to change for a failed update -- old was: "
+ activeConfigurationBefore + ", new was: " + activeConfigurationAfter;
configurationManager.updateResourceConfiguration(overlord, resource.getId(), configuration2);
- Thread.sleep(4000); // wait for the test agent to complete the request
+ Thread.sleep(2000); // wait for the test agent to complete the request
Configuration activeConfiguration = configurationManager.getResourceConfiguration(resource.getId());
assert activeConfiguration != null : "ActiveResourceConfiguration was not updated with configuration2";
@@ -851,19 +854,19 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
assert activeProperties.containsKey("myboolean");
PropertySimple activeProperty = activeProperties.get("myboolean");
assert activeProperty.getName().equals("myboolean");
- assert activeProperty.getStringValue().equals("true");
+ assert "true".equals(activeProperty.getStringValue());
// at this point in time, the round trip messaging is done and we have the agent response
List<ResourceConfigurationUpdate> requests;
requests = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert requests != null;
assert requests.size() == 2; // one succeeded and one failed
- assert requests.get(0).getStatus() == ConfigurationUpdateStatus.FAILURE;
- assert requests.get(1).getStatus() == ConfigurationUpdateStatus.SUCCESS;
+ assert requests.get(0).getStatus() == ConfigurationUpdateStatus.FAILURE : "actual: " + requests.get(0).getStatus();
+ assert requests.get(1).getStatus() == ConfigurationUpdateStatus.SUCCESS : "actual: " + requests.get(1).getStatus();
ResourceConfigurationUpdate savedRequest = requests.get(0); // this is the one that failed
ResourceConfigurationUpdate doomedRequest = requests.get(1); // this is the one that succeeded
@@ -873,7 +876,7 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
// now get the current configs/requests and
// make sure we deleted the only one configuration that succeeded, leaving one update record
requests = configurationManager.findResourceConfigurationUpdates(overlord, resource.getId(), null, null, false,
- pageControl);
+ configUpdatesPageControl);
assert requests.size() == 1;
commit f62d8fbeb79eb7aa419280137b8fec069f2126f9
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 10:20:07 2010 -0400
improve description for CSP content source type
diff --git a/modules/enterprise/server/plugins/jboss-software/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/jboss-software/src/main/resources/META-INF/rhq-serverplugin.xml
index 55e2a64..9f98351 100644
--- a/modules/enterprise/server/plugins/jboss-software/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/jboss-software/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -13,7 +13,7 @@
<contentSourceType name="JBossASPatchSource"
displayName="JBoss Patch Content Source"
- description="This content source retrieves patches from the JBoss CSP RSS feed."
+ description="a content source that retrieves package metadata from an RSS feed; the feed must be in the format used by the JBoss CSP"
lazyLoad="true"
apiClass="org.rhq.enterprise.server.plugins.jboss.software.JBossSoftwareContentSourceAdapter">
commit 79e3d2335729acb132e4085d254353d87225e867
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Apr 1 10:19:30 2010 -0400
use two different DBs for tests and dev-container
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index 2fb6a90..9e8e258 100644
--- a/modules/core/dbutils/pom.xml
+++ b/modules/core/dbutils/pom.xml
@@ -93,7 +93,12 @@
return
}
- database = project.properties['rhq.test.ds.db-name']
+ db = project.properties.db
+ if (db == 'dev') {
+ database = project.properties['rhq.dev.ds.db-name']
+ } else {
+ database = project.properties['rhq.test.ds.db-name']
+ }
project.properties.dbsetup = 'true'
sql = Sql.newInstance(
@@ -141,6 +146,20 @@
<configuration>
<tasks>
<property name="settings.localRepository" location="${user.home}/.m2/repository" />
+
+ <condition property="rhq.ds.type-mapping" value="${rhq.dev.ds.type-mapping}" else="${rhq.test.ds.type-mapping}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.connection-url" value="${rhq.dev.ds.connection-url}" else="${rhq.test.ds.connection-url}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.user-name" value="${rhq.dev.ds.user-name}" else="${rhq.test.ds.user-name}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.password" value="${rhq.dev.ds.password}" else="${rhq.test.ds.password}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+
<ant antfile="${basedir}/src/main/scripts/dbsetup-build.xml">
<property name="settings.localRepository" value="${settings.localRepository}" />
<property name="ojdbc5.version" value="${ojdbc5.version}" />
@@ -148,10 +167,10 @@
<property name="h2.version" value="${h2.version}" />
<property name="jtds.version" value="${jtds.version}" />
<property name="task.classpath.property" refid="maven.test.classpath" />
- <property name="rhq.ds.type-mapping" value="${rhq.test.ds.type-mapping}" />
- <property name="rhq.ds.connection-url" value="${rhq.test.ds.connection-url}" />
- <property name="rhq.ds.user-name" value="${rhq.test.ds.user-name}" />
- <property name="rhq.ds.password" value="${rhq.test.ds.password}" />
+ <property name="rhq.ds.type-mapping" value="${rhq.ds.type-mapping}" />
+ <property name="rhq.ds.connection-url" value="${rhq.ds.connection-url}" />
+ <property name="rhq.ds.user-name" value="${rhq.ds.user-name}" />
+ <property name="rhq.ds.password" value="${rhq.ds.password}" />
<property name="project.version" value="${project.version}" />
<property name="db.schema.version" value="${db.schema.version}" />
<property name="dbsetup" value="${dbsetup}" />
@@ -172,6 +191,20 @@
<configuration>
<tasks>
<property name="settings.localRepository" location="${user.home}/.m2/repository" />
+
+ <condition property="rhq.ds.type-mapping" value="${rhq.dev.ds.type-mapping}" else="${rhq.test.ds.type-mapping}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.connection-url" value="${rhq.dev.ds.connection-url}" else="${rhq.test.ds.connection-url}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.user-name" value="${rhq.dev.ds.user-name}" else="${rhq.test.ds.user-name}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.password" value="${rhq.dev.ds.password}" else="${rhq.test.ds.password}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+
<ant antfile="${basedir}/src/main/scripts/dbsetup-build.xml" target="dbsetup-combine">
<property name="settings.localRepository" value="${settings.localRepository}" />
<property name="ojdbc5.version" value="${ojdbc5.version}" />
@@ -179,10 +212,10 @@
<property name="h2.version" value="${h2.version}" />
<property name="jtds.version" value="${jtds.version}" />
<property name="task.classpath.property" refid="maven.test.classpath" />
- <property name="rhq.ds.type-mapping" value="${rhq.test.ds.type-mapping}" />
- <property name="rhq.ds.connection-url" value="${rhq.test.ds.connection-url}" />
- <property name="rhq.ds.user-name" value="${rhq.test.ds.user-name}" />
- <property name="rhq.ds.password" value="${rhq.test.ds.password}" />
+ <property name="rhq.ds.type-mapping" value="${rhq.ds.type-mapping}" />
+ <property name="rhq.ds.connection-url" value="${rhq.ds.connection-url}" />
+ <property name="rhq.ds.user-name" value="${rhq.ds.user-name}" />
+ <property name="rhq.ds.password" value="${rhq.ds.password}" />
<property name="project.version" value="${project.version}" />
<property name="db.schema.version" value="${db.schema.version}" />
</ant>
@@ -204,6 +237,20 @@
<configuration>
<tasks>
<property name="settings.localRepository" location="${user.home}/.m2/repository" />
+
+ <condition property="rhq.ds.type-mapping" value="${rhq.dev.ds.type-mapping}" else="${rhq.test.ds.type-mapping}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.connection-url" value="${rhq.dev.ds.connection-url}" else="${rhq.test.ds.connection-url}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.user-name" value="${rhq.dev.ds.user-name}" else="${rhq.test.ds.user-name}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+ <condition property="rhq.ds.password" value="${rhq.dev.ds.password}" else="${rhq.test.ds.password}">
+ <equals arg1="${db}" arg2="dev"/>
+ </condition>
+
<ant antfile="${basedir}/src/main/scripts/dbsetup-build.xml" target="dbsetup-check-schema">
<property name="settings.localRepository" value="${settings.localRepository}" />
<property name="ojdbc5.version" value="${ojdbc5.version}" />
@@ -211,10 +258,10 @@
<property name="h2.version" value="${h2.version}" />
<property name="jtds.version" value="${jtds.version}" />
<property name="task.classpath.property" refid="maven.test.classpath" />
- <property name="rhq.ds.type-mapping" value="${rhq.test.ds.type-mapping}" />
- <property name="rhq.ds.connection-url" value="${rhq.test.ds.connection-url}" />
- <property name="rhq.ds.user-name" value="${rhq.test.ds.user-name}" />
- <property name="rhq.ds.password" value="${rhq.test.ds.password}" />
+ <property name="rhq.ds.type-mapping" value="${rhq.ds.type-mapping}" />
+ <property name="rhq.ds.connection-url" value="${rhq.ds.connection-url}" />
+ <property name="rhq.ds.user-name" value="${rhq.ds.user-name}" />
+ <property name="rhq.ds.password" value="${rhq.ds.password}" />
<property name="project.version" value="${project.version}" />
<property name="db.schema.version" value="${db.schema.version}" />
<property name="rhq.ds.driver-class" value="${rhq.test.ds.driver-class}" />
@@ -313,3 +360,4 @@
</profiles>
</project>
+
diff --git a/modules/enterprise/server/container/pom.xml b/modules/enterprise/server/container/pom.xml
index 39c7122..db4bf11 100644
--- a/modules/enterprise/server/container/pom.xml
+++ b/modules/enterprise/server/container/pom.xml
@@ -179,20 +179,20 @@
<property name="hibernate3.version" value="${hibernate3.version}" />
<property name="quartz.version" value="${quartz.version}" />
- <!-- dev/test DB settings (used to init rhq-server.properties if dev profile is active or developer prop is set) -->
- <property name="rhq.test.ds.connection-url" value="${rhq.test.ds.connection-url}" />
- <property name="rhq.test.ds.driver-class" value="${rhq.test.ds.driver-class}" />
- <property name="rhq.test.ds.xa-datasource-class" value="${rhq.test.ds.xa-datasource-class}" />
- <property name="rhq.test.ds.user-name" value="${rhq.test.ds.user-name}" />
- <property name="rhq.test.ds.password" value="${rhq.test.ds.password}" />
- <property name="rhq.test.ds.type-mapping" value="${rhq.test.ds.type-mapping}" />
- <property name="rhq.test.ds.server-name" value="${rhq.test.ds.server-name}" />
- <property name="rhq.test.ds.port" value="${rhq.test.ds.port}" />
- <property name="rhq.test.ds.db-name" value="${rhq.test.ds.db-name}" />
- <property name="rhq.test.ds.hibernate-dialect" value="${rhq.test.ds.hibernate-dialect}" />
- <property name="rhq.test.quartz.driverDelegateClass" value="${rhq.test.quartz.driverDelegateClass}" />
- <property name="rhq.test.quartz.selectWithLockSQL" value="${rhq.test.quartz.selectWithLockSQL}" />
- <property name="rhq.test.quartz.lockHandlerClass" value="${rhq.test.quartz.lockHandlerClass}" />
+ <!-- dev DB settings (used to init rhq-server.properties if dev profile is active or developer prop is set) -->
+ <property name="rhq.dev.ds.connection-url" value="${rhq.dev.ds.connection-url}" />
+ <property name="rhq.dev.ds.driver-class" value="${rhq.dev.ds.driver-class}" />
+ <property name="rhq.dev.ds.xa-datasource-class" value="${rhq.dev.ds.xa-datasource-class}" />
+ <property name="rhq.dev.ds.user-name" value="${rhq.dev.ds.user-name}" />
+ <property name="rhq.dev.ds.password.encrypted" value="${rhq.dev.ds.password.encrypted}" />
+ <property name="rhq.dev.ds.type-mapping" value="${rhq.dev.ds.type-mapping}" />
+ <property name="rhq.dev.ds.server-name" value="${rhq.dev.ds.server-name}" />
+ <property name="rhq.dev.ds.port" value="${rhq.dev.ds.port}" />
+ <property name="rhq.dev.ds.db-name" value="${rhq.dev.ds.db-name}" />
+ <property name="rhq.dev.ds.hibernate-dialect" value="${rhq.dev.ds.hibernate-dialect}" />
+ <property name="rhq.dev.quartz.driverDelegateClass" value="${rhq.dev.quartz.driverDelegateClass}" />
+ <property name="rhq.dev.quartz.selectWithLockSQL" value="${rhq.dev.quartz.selectWithLockSQL}" />
+ <property name="rhq.dev.quartz.lockHandlerClass" value="${rhq.dev.quartz.lockHandlerClass}" />
<!-- default server settings used by installer -->
<property name="rhq.server.http.port" value="${rhq.server.http.port}" />
@@ -356,4 +356,5 @@
</profiles>
-</project>
\ No newline at end of file
+</project>
+
diff --git a/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml b/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml
index a7e313a..f3c37fe 100644
--- a/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml
+++ b/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml
@@ -9,8 +9,8 @@
<property name="default.rhq.server.database.driver-class" value="org.postgresql.Driver" />
<property name="default.rhq.server.database.xa-datasource-class" value="org.postgresql.xa.PGXADataSource" />
<property name="default.rhq.server.database.user-name" value="rhqadmin" />
- <!-- NOTE: The below value is "rhqadmin" encrypted. -->
- <property name="default.rhq.server.database.password" value="1eeb2f255e832171df8592078de921bc" />
+ <property name="default.rhq.server.database.password" value="rhqadmin" />
+ <property name="default.rhq.server.database.password.encrypted" value="1eeb2f255e832171df8592078de921bc" />
<property name="default.rhq.server.database.type-mapping" value="PostgreSQL" />
<!-- these are needed for the PostgreSQL XADataSource setup -->
<property name="default.rhq.server.database.server-name" value="127.0.0.1" />
@@ -31,19 +31,19 @@
<target name="set-dev-server-props" if="predeploy">
<echo>*** Using dev database settings in rhq-server.properties...</echo>
- <property name="rhq.server.database.hibernate-dialect" value="${rhq.test.ds.hibernate-dialect}" />
- <property name="rhq.server.database.connection-url" value="${rhq.test.ds.connection-url}" />
- <property name="rhq.server.database.driver-class" value="${rhq.test.ds.driver-class}" />
- <property name="rhq.server.database.xa-datasource-class" value="${rhq.test.ds.xa-datasource-class}" />
- <property name="rhq.server.database.user-name" value="${rhq.test.ds.user-name}" />
- <property name="rhq.server.database.password" value="${rhq.test.ds.password}" />
- <property name="rhq.server.database.type-mapping" value="${rhq.test.ds.type-mapping}" />
- <property name="rhq.server.database.server-name" value="${rhq.test.ds.server-name}" />
- <property name="rhq.server.database.port" value="${rhq.test.ds.port}" />
- <property name="rhq.server.database.db-name" value="${rhq.test.ds.db-name}" />
- <property name="rhq.server.quartz.driverDelegateClass" value="${rhq.test.quartz.driverDelegateClass}" />
- <property name="rhq.server.quartz.selectWithLockSQL" value="${rhq.test.quartz.selectWithLockSQL}" />
- <property name="rhq.server.quartz.lockHandlerClass" value="${rhq.test.quartz.lockHandlerClass}" />
+ <property name="rhq.server.database.hibernate-dialect" value="${rhq.dev.ds.hibernate-dialect}" />
+ <property name="rhq.server.database.connection-url" value="${rhq.dev.ds.connection-url}" />
+ <property name="rhq.server.database.driver-class" value="${rhq.dev.ds.driver-class}" />
+ <property name="rhq.server.database.xa-datasource-class" value="${rhq.dev.ds.xa-datasource-class}" />
+ <property name="rhq.server.database.user-name" value="${rhq.dev.ds.user-name}" />
+ <property name="rhq.server.database.password" value="${rhq.dev.ds.password.encrypted}" />
+ <property name="rhq.server.database.type-mapping" value="${rhq.dev.ds.type-mapping}" />
+ <property name="rhq.server.database.server-name" value="${rhq.dev.ds.server-name}" />
+ <property name="rhq.server.database.port" value="${rhq.dev.ds.port}" />
+ <property name="rhq.server.database.db-name" value="${rhq.dev.ds.db-name}" />
+ <property name="rhq.server.quartz.driverDelegateClass" value="${rhq.dev.quartz.driverDelegateClass}" />
+ <property name="rhq.server.quartz.selectWithLockSQL" value="${rhq.dev.quartz.selectWithLockSQL}" />
+ <property name="rhq.server.quartz.lockHandlerClass" value="${rhq.dev.quartz.lockHandlerClass}" />
</target>
<target name="set-default-server-props" unless="predeploy">
@@ -53,7 +53,7 @@
<property name="rhq.server.database.driver-class" value="${default.rhq.server.database.driver-class}" />
<property name="rhq.server.database.xa-datasource-class" value="${default.rhq.server.database.xa-datasource-class}" />
<property name="rhq.server.database.user-name" value="${default.rhq.server.database.user-name}" />
- <property name="rhq.server.database.password" value="${default.rhq.server.database.password}" />
+ <property name="rhq.server.database.password" value="${default.rhq.server.database.password.encrypted}" />
<property name="rhq.server.database.type-mapping" value="${default.rhq.server.database.type-mapping}" />
<property name="rhq.server.database.server-name" value="${default.rhq.server.database.server-name}" />
<property name="rhq.server.database.port" value="${default.rhq.server.database.port}" />
@@ -164,7 +164,7 @@
</not>
</condition>
- </target>
+ </target>
<target name="prepare-container"
depends="prepare-web-services-1,
@@ -212,8 +212,8 @@
<echo>Running upgrade script for JBossWS ${jbossws-native-dist.version} </echo>
<ant antfile="${basedir}/target/${jboss-native-dir}/build.xml" target="deploy-jboss423" dir="${basedir}/target/${jboss-native-dir}" />
- <echo> </echo>
- <echo>Installing safe ejb3 web invoker ...</echo>
+ <echo/>
+ <echo>Installing safe ejb3 web invoker ...</echo>
<delete verbose="true">
<fileset dir="${jboss.deploy.dir}/jbossws.sar">
<include name="safe-invoker*" />
@@ -272,7 +272,7 @@
<fileset dir="${jboss.deploy.dir}/jms">
<include name="jbossmq-destinations-service.xml" />
<include name="uil2-service.xml" />
- <include name="hsqldb-jdbc2-service.xml" /> <!-- no longer use Hypersonic for JMS backend -->
+ <include name="hsqldb-jdbc2-service.xml" /> <!-- no longer use Hypersonic for JMS backend -->
</fileset>
</delete>
@@ -329,16 +329,16 @@
<echo>Deploying installer webapp ...</echo>
<mkdir dir="${jboss.deploy.dir}/rhq-installer.war" />
- <unwar src="${settings.localRepository}/org/rhq/rhq-installer/${rhq.version}/rhq-installer-${rhq.version}.war"
- dest="${jboss.deploy.dir}/rhq-installer.war" />
+ <unwar src="${settings.localRepository}/org/rhq/rhq-installer/${rhq.version}/rhq-installer-${rhq.version}.war"
+ dest="${jboss.deploy.dir}/rhq-installer.war" />
<echo>Deploying embedded agent sar ...</echo>
- <unjar src="${settings.localRepository}/org/rhq/rhq-enterprise-server-agent-sar/${rhq.version}/rhq-enterprise-server-agent-sar-${rhq.version}.sar"
- dest="${jboss.deploy.dir}/rhq-agent.sar" />
+ <unjar src="${settings.localRepository}/org/rhq/rhq-enterprise-server-agent-sar/${rhq.version}/rhq-enterprise-server-agent-sar-${rhq.version}.sar"
+ dest="${jboss.deploy.dir}/rhq-agent.sar" />
<echo>Deploying RT filter jar ...</echo>
- <copy file="${settings.localRepository}/org/rhq/rhq-rtfilter/${rhq.version}/rhq-rtfilter-${rhq.version}.jar"
- todir="${jboss.home}/server/default/lib" verbose="true" />
+ <copy file="${settings.localRepository}/org/rhq/rhq-rtfilter/${rhq.version}/rhq-rtfilter-${rhq.version}.jar"
+ todir="${jboss.home}/server/default/lib" verbose="true" />
<!-- Delete docs dir and README files... -->
<delete dir="${jboss.home}/docs" />
@@ -354,17 +354,17 @@
<!-- deploy the agent update binary to the downloads location -->
<echo>Deploying the latest agent update binary and renaming it rhq-enterprise-agent-${rhq.version}.jar</echo>
- <copy file="${settings.localRepository}/org/rhq/rhq-enterprise-agentupdate/${rhq.version}/rhq-enterprise-agentupdate-${rhq.version}.jar"
- tofile="${jboss.deploy.dir}/${rhq.earName}/rhq-downloads/rhq-agent/rhq-enterprise-agent-${rhq.version}.jar"
- verbose="true"
- failonerror="true"/>
+ <copy file="${settings.localRepository}/org/rhq/rhq-enterprise-agentupdate/${rhq.version}/rhq-enterprise-agentupdate-${rhq.version}.jar"
+ tofile="${jboss.deploy.dir}/${rhq.earName}/rhq-downloads/rhq-agent/rhq-enterprise-agent-${rhq.version}.jar"
+ verbose="true"
+ failonerror="true"/>
<!-- deploy the remote client binary to the downloads location. -->
<echo>Deploying the latest remote client binary</echo>
- <copy file="${settings.localRepository}/org/rhq/rhq-remoting-cli/${rhq.version}/rhq-remoting-cli-${rhq.version}.zip"
- tofile="${jboss.deploy.dir}/${rhq.earName}/rhq-downloads/rhq-client/rhq-remoting-cli-${rhq.version}.zip"
- verbose="true"
- failonerror="false"/>
+ <copy file="${settings.localRepository}/org/rhq/rhq-remoting-cli/${rhq.version}/rhq-remoting-cli-${rhq.version}.zip"
+ tofile="${jboss.deploy.dir}/${rhq.earName}/rhq-downloads/rhq-client/rhq-remoting-cli-${rhq.version}.zip"
+ verbose="true"
+ failonerror="false"/>
<!-- optionally package the connectors -->
<antcall target="package-connectors" />
@@ -895,3 +895,4 @@ rhq.autoinstall.public-endpoint-address=
</target>
</project>
+
diff --git a/pom.xml b/pom.xml
index 562120a..b3f59cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -80,7 +80,7 @@
<quartz.version>1.6.5</quartz.version>
<jna.version>3.2.2</jna.version>
- <!-- defaults for datasource used by dbsetup, unit+integration tests, and dev container build -
+ <!-- defaults for datasource used by integration tests -
these may be overridden in ~/.m2/settings.xml -->
<rhq.test.ds.connection-url>jdbc:postgresql://127.0.0.1:5432/rhq</rhq.test.ds.connection-url>
<rhq.test.ds.driver-class>org.postgresql.Driver</rhq.test.ds.driver-class>
@@ -96,6 +96,23 @@
<rhq.test.quartz.selectWithLockSQL>SELECT * FROM {0}LOCKS ROWLOCK WHERE LOCK_NAME = ? FOR UPDATE</rhq.test.quartz.selectWithLockSQL>
<rhq.test.quartz.lockHandlerClass>org.quartz.impl.jdbcjobstore.StdRowLockSemaphore</rhq.test.quartz.lockHandlerClass>
+ <!-- defaults for datasource used by the dev container build (see dev docs on the 'dev' profile) -
+ these may be overridden in ~/.m2/settings.xml -->
+ <rhq.dev.ds.connection-url>jdbc:postgresql://127.0.0.1:5432/rhqdev</rhq.dev.ds.connection-url>
+ <rhq.dev.ds.driver-class>org.postgresql.Driver</rhq.dev.ds.driver-class>
+ <rhq.dev.ds.xa-datasource-class>org.postgresql.xa.PGXADataSource</rhq.dev.ds.xa-datasource-class>
+ <rhq.dev.ds.user-name>rhqadmin</rhq.dev.ds.user-name>
+ <rhq.dev.ds.password>rhqadmin</rhq.dev.ds.password>
+ <rhq.dev.ds.password.encrypted>1eeb2f255e832171df8592078de921bc</rhq.dev.ds.password.encrypted>
+ <rhq.dev.ds.type-mapping>PostgreSQL</rhq.dev.ds.type-mapping>
+ <rhq.dev.ds.server-name>127.0.0.1</rhq.dev.ds.server-name>
+ <rhq.dev.ds.port>5432</rhq.dev.ds.port>
+ <rhq.dev.ds.db-name>rhqdev</rhq.dev.ds.db-name>
+ <rhq.dev.ds.hibernate-dialect>org.hibernate.dialect.PostgreSQLDialect</rhq.dev.ds.hibernate-dialect>
+ <rhq.dev.quartz.driverDelegateClass>org.quartz.impl.jdbcjobstore.PostgreSQLDelegate</rhq.dev.quartz.driverDelegateClass>
+ <rhq.dev.quartz.selectWithLockSQL>SELECT * FROM {0}LOCKS ROWLOCK WHERE LOCK_NAME = ? FOR UPDATE</rhq.dev.quartz.selectWithLockSQL>
+ <rhq.dev.quartz.lockHandlerClass>org.quartz.impl.jdbcjobstore.StdRowLockSemaphore</rhq.dev.quartz.lockHandlerClass>
+
<!-- default port numbers for RHQ server -->
<rhq.server.http.port>7080</rhq.server.http.port>
<rhq.server.https.port>7443</rhq.server.https.port>
@@ -744,7 +761,7 @@
<execution>
<id>enforce-versions</id>
<goals>
- <goal>enforce-once</goal>
+ <goal>enforce</goal>
</goals>
<configuration>
<rules>
commit b1a26f14dcbabcbf34f76647a705376958784676
Merge: 0a830f2... b1a907f...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 18:22:08 2010 -0400
Merge branch 'gwt-jay' into gwt
commit b1a907fd8877c8cc483ba1d2dd5ac8c91a5bc4ce
Merge: 5e4feb1... ab70b6f...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 17:46:52 2010 -0400
Merge branch 'master' into gwt-jay
Conflicts:
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
commit 5e4feb14930798edbb51fc04d8d188ed8c45c838
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 17:46:18 2010 -0400
LT commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
index 01ef108..e0462ad 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
@@ -1,263 +1,263 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:onc="http://jboss.org/on/component"
- xmlns:onf="http://jboss.org/on/function"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-
-<ui:composition template="/rhq/resource/layout/main.xhtml">
-
+<?xml version="1.0"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:onc="http://jboss.org/on/component"
+ xmlns:onf="http://jboss.org/on/function"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
+<ui:composition template="/rhq/resource/layout/main.xhtml">
+
<ui:param name="pageTitle" value="View Repo Subscriptions for Resource '#{ResourceUIBean.name}'"/>
- <ui:param name="selectedTabName" value="Content.Subscriptions"/>
-
- <ui:define name="content">
-
- <!-- CURRENT REPOS -->
+ <ui:param name="selectedTabName" value="Content.Subscriptions"/>
+
+ <ui:define name="content">
+
+ <!-- CURRENT REPOS -->
<h:form id="currentRepoForm">
- <input type="hidden" name="id" value="${param.id}"/>
-
- <rich:panel styleClass="BlockContent">
- <f:facet name="header"><h:outputText value="Current Resource Subscriptions"/></f:facet>
+ <input type="hidden" name="id" value="${param.id}"/>
+
+ <rich:panel styleClass="BlockContent">
+ <f:facet name="header"><h:outputText value="Current Resource Subscriptions"/></f:facet>
<a4j:keepAlive beanName="ResourceReposUIBean"/>
-
+
<ui:param name="resourceReposDataModel" value="#{ResourceReposUIBean.dataModel}"/>
<rich:dataTable id="resourceReposDataTable"
rows="#{PageControl.ResourceReposList.pageSize}"
value="#{resourceReposDataModel}"
- var="item"
- width="100%"
- columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
- onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
- <f:facet name="PageControlView">
+ var="item"
+ width="100%"
+ columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+ onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+ <f:facet name="PageControlView">
<onc:paginationControl id="ResourceReposList" />
- </f:facet>
-
- <rich:column>
- <f:facet name="header">
+ </f:facet>
+
+ <rich:column>
+ <f:facet name="header">
<onc:allSelect target="selectedResourceRepos" />
- </f:facet>
-
+ </f:facet>
+
<onc:select name="selectedResourceRepos" value="#{item.repo.id}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.name">
- <h:outputText styleClass="headerText" value="Name" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.name">
+ <h:outputText styleClass="headerText" value="Name" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputLink value="/rhq/content/repo.xhtml">
- <f:param name="mode" value="view"/>
+ <f:param name="mode" value="view"/>
<f:param name="id" value="#{item.repo.id}"/>
<h:outputText value="#{item.repo.name}" />
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Description" />
- </f:facet>
-
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Description" />
+ </f:facet>
+
<h:outputText value="#{item.repo.description}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="COUNT(pv)">
- <h:outputText styleClass="headerText" value="Package Count" />
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{item.packageVersionCount}" />
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.creationDate">
- <h:outputText styleClass="headerText" value="Created" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="COUNT(pv)">
+ <h:outputText styleClass="headerText" value="Package Count" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.packageVersionCount}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.creationDate">
+ <h:outputText styleClass="headerText" value="Created" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.creationDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.lastModifiedDate">
- <h:outputText styleClass="headerText" value="Last Modified" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.lastModifiedDate">
+ <h:outputText styleClass="headerText" value="Last Modified" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.lastModifiedDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="6" width="100%">
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="6" width="100%">
<onc:selectCommandButton action="#{ResourceReposUIBean.deleteSelectedResourceRepos}"
- value="REMOVE SUBSCRIPTIONS"
+ value="REMOVE SUBSCRIPTIONS"
target="selectedResourceRepos"
- styleClass="on-pager-button buttonsmall"
- rendered="${GlobalPermissionsUIBean.inventory}"/>
-
- <ui:include src="/rhq/resource/include/pagination.xhtml">
+ styleClass="on-pager-button buttonsmall"
+ rendered="${GlobalPermissionsUIBean.inventory}"/>
+
+ <ui:include src="/rhq/resource/include/pagination.xhtml">
<ui:param name="paginationDataTableName" value="resourceReposDataTable"/>
<ui:param name="paginationDataModel" value="#{resourceReposDataModel}"/>
<ui:param name="paginationPageControl" value="#{PageControl.ResourceReposList}"/>
- </ui:include>
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
- </rich:dataTable>
-
- </rich:panel>
- </h:form>
-
-
- <!-- AVAILABLE REPOS -->
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+ </rich:panel>
+ </h:form>
+
+
+ <!-- AVAILABLE REPOS -->
<h:form id="availableRepoForm"
- rendered="${GlobalPermissionsUIBean.inventory}">
- <input type="hidden" name="id" value="${param.id}"/>
- <rich:panel styleClass="BlockContent">
+ rendered="${GlobalPermissionsUIBean.inventory}">
+ <input type="hidden" name="id" value="${param.id}"/>
+ <rich:panel styleClass="BlockContent">
<f:facet name="header"><h:outputText value="Available Repositories"/></f:facet>
-
+
<a4j:keepAlive beanName="AvailableResourceReposUIBean"/>
-
+
<ui:param name="availableResourceReposDataModel" value="#{AvailableResourceReposUIBean.dataModel}"/>
<rich:dataTable id="availableResourceReposDataTable"
rows="#{PageControl.AvailableResourceReposList.pageSize}"
value="#{availableResourceReposDataModel}"
- var="item"
- width="100%"
- columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
- onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
- onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
- <f:facet name="PageControlView">
+ var="item"
+ width="100%"
+ columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+ onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+ <f:facet name="PageControlView">
<onc:paginationControl id="AvailableResourceReposList" />
- </f:facet>
-
- <rich:column>
- <f:facet name="header">
+ </f:facet>
+
+ <rich:column>
+ <f:facet name="header">
<onc:allSelect target="selectedAvailableResourceRepos" />
- </f:facet>
-
+ </f:facet>
+
<onc:select name="selectedAvailableResourceRepos" value="#{item.repo.id}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.name">
- <h:outputText styleClass="headerText" value="Name" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.name">
+ <h:outputText styleClass="headerText" value="Name" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputLink value="/rhq/content/repo.xhtml">
- <f:param name="mode" value="view"/>
+ <f:param name="mode" value="view"/>
<f:param name="id" value="#{item.repo.id}"/>
<h:outputText value="#{item.repo.name}" />
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Description" />
- </f:facet>
-
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Description" />
+ </f:facet>
+
<h:outputText value="#{item.repo.description}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="COUNT(pv)">
- <h:outputText styleClass="headerText" value="Package Count" />
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{item.packageVersionCount}" />
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.creationDate">
- <h:outputText styleClass="headerText" value="Created" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="COUNT(pv)">
+ <h:outputText styleClass="headerText" value="Package Count" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.packageVersionCount}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.creationDate">
+ <h:outputText styleClass="headerText" value="Created" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.creationDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.lastModifiedDate">
- <h:outputText styleClass="headerText" value="Last Modified" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.lastModifiedDate">
+ <h:outputText styleClass="headerText" value="Last Modified" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.lastModifiedDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="6" width="100%">
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz" timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="6" width="100%">
<onc:selectCommandButton action="#{AvailableResourceReposUIBean.subscribeSelectedResourceRepos}"
- value="ADD SUBSCRIPTIONS"
+ value="ADD SUBSCRIPTIONS"
target="selectedAvailableResourceRepos"
- styleClass="on-pager-button buttonsmall"
- rendered="${GlobalPermissionsUIBean.inventory}"/>
-
- <ui:include src="/rhq/resource/include/pagination.xhtml">
+ styleClass="on-pager-button buttonsmall"
+ rendered="${GlobalPermissionsUIBean.inventory}"/>
+
+ <ui:include src="/rhq/resource/include/pagination.xhtml">
<ui:param name="paginationDataTableName" value="availableResourceReposDataTable"/>
<ui:param name="paginationDataModel" value="#{availableResourceReposDataModel}"/>
<ui:param name="paginationPageControl" value="#{PageControl.AvailableResourceReposList}"/>
- </ui:include>
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
- </rich:dataTable>
-
- </rich:panel>
-
- <ui:remove><!-- The package mode isn't returning enough data to differentiate it from the new subtab, so
- disabling it for now until we decide if this is needed. --></ui:remove>
- <!--
- <p align="center">
- <h:outputLink value="/rhq/resource/content/subscription_packages.xhtml">
- <f:param name="id" value="${param.id}"/>
- <h:outputText value="Switch To Package Mode" />
- </h:outputLink>
- </p>
- -->
-
- </h:form>
-
- </ui:define>
-</ui:composition>
-
-</html>
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+ </rich:panel>
+
+ <ui:remove><!-- The package mode isn't returning enough data to differentiate it from the new subtab, so
+ disabling it for now until we decide if this is needed. --></ui:remove>
+ <!--
+ <p align="center">
+ <h:outputLink value="/rhq/resource/content/subscription_packages.xhtml">
+ <f:param name="id" value="${param.id}"/>
+ <h:outputText value="Switch To Package Mode" />
+ </h:outputLink>
+ </p>
+ -->
+
+ </h:form>
+
+ </ui:define>
+</ui:composition>
+
+</html>
commit 0a830f22ba3c81d74b11264ee28ac3f870543e8c
Merge: 6bc7cb3... d9c400d...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 17:34:34 2010 -0400
Merge branch 'gwt-jay' into gwt
commit d9c400da11052832f2842232c54791052b7289fd
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 17:34:03 2010 -0400
A change in the Bundle constructor to include the required Repo and
PackageType. This is a safer way to go and is part of fixing up
some domain tests.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
index 261a54e..1a59123 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
@@ -101,14 +101,11 @@ public class Bundle implements Serializable {
// for JPA use
}
- public Bundle(String name, BundleType type) {
+ public Bundle(String name, BundleType type, Repo repo, PackageType packageType) {
setName(name);
setBundleType(type);
- // add implicit Repo
- Repo repo = new Repo(name);
- repo.setCandidate(false);
- repo.setSyncSchedule(null);
setRepo(repo);
+ setPackageType(packageType);
}
public int getId() {
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java
index 2004766..7e041ab 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java
@@ -36,6 +36,8 @@ import org.rhq.core.domain.bundle.BundleVersionRepo;
import org.rhq.core.domain.bundle.BundleVersionRepoPK;
import org.rhq.core.domain.content.Distribution;
import org.rhq.core.domain.content.DistributionType;
+import org.rhq.core.domain.content.PackageCategory;
+import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
@@ -67,12 +69,8 @@ public class BundleTest extends AbstractEJB3Test {
assert q.getResultList().size() == 0 : "should not have repo2 mapping in the db yet";
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
+ Bundle bundle = createBundle(em, name + "-Bundle", bundleType);
- Repo bundleRepo = new Repo(name + "-Bundle");
- em.persist(bundleRepo);
- Bundle bundle = new Bundle(name + "-Bundle", bundleType);
- bundle.setRepo(bundleRepo);
- em.persist(bundle);
BundleVersion bundleVersion = new BundleVersion(name, "1.0.0.BETA", bundle, recipe);
bundleVersion.setVersionOrder(0);
em.persist(bundleVersion);
@@ -133,13 +131,8 @@ public class BundleTest extends AbstractEJB3Test {
String name = "BundleTest-testBundleVersion";
String recipe = "action/script/recipe is here";
- Repo repo1 = new Repo(name + "-Repo1");
- em.persist(repo1);
-
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
- Bundle bundle = new Bundle(name + "-Bundle", bundleType);
- bundle.setRepo(repo1);
- em.persist(bundle);
+ Bundle bundle = createBundle(em, name + "-Bundle", bundleType);
id = bundle.getId();
assert id > 0;
assert bundle.getBundleType().getId() != 0 : "bundleType should have been cascade persisted too";
@@ -207,12 +200,15 @@ public class BundleTest extends AbstractEJB3Test {
assert q.getResultList().size() == 1;
bundle = (Bundle) q.getSingleResult();
bundleType = bundle.getBundleType();
+ Repo repo = bundle.getRepo();
em.remove(bundle);
- em.remove(bundleType);
+ em.remove(repo);
+
+ deleteResourceType(em, bundleType.getResourceType());
+
assert q.getResultList().size() == 0 : "didn't clean up test bundle";
assert em.find(BundleType.class, bundleType.getId()) == null : "didn't clean up bundle type";
- deleteResourceType(em, bundleType.getResourceType());
em.close();
} catch (Throwable t) {
@@ -232,13 +228,8 @@ public class BundleTest extends AbstractEJB3Test {
String name = "BundleTest-testMultipleBundleVersions";
String recipe = "action/script/recipe is here";
- Repo repo1 = new Repo(name + "-Repo1");
- em.persist(repo1);
-
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
- Bundle bundle = new Bundle(name + "-Bundle", bundleType);
- bundle.setRepo(repo1);
- em.persist(bundle);
+ Bundle bundle = createBundle(em, name + "-Bundle", bundleType);
id = bundle.getId();
assert id > 0;
assert bundle.getBundleType().getId() != 0 : "bundleType should have been cascade persisted too";
@@ -350,25 +341,19 @@ public class BundleTest extends AbstractEJB3Test {
try {
int id;
- String name = "BundleTest-testBundle";
+ String name = "BundleTest-testBundle-Bundle";
Query q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
assert q.getResultList().size() == 0; // not in the db yet
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
-
- Repo bundleRepo = new Repo(name);
- em.persist(bundleRepo);
-
- Bundle b = new Bundle(name, bundleType);
- b.setRepo(bundleRepo);
- em.persist(b);
+ Bundle b = createBundle(em, name, bundleType);
id = b.getId();
assert id > 0;
assert b.getBundleType().getId() != 0 : "bundleType should have been persisted independently";
assert b.getRepo().getId() != 0 : "bundle's repo should have been cascade persisted with the bundle";
- assert name.equals(b.getRepo().getName()) : "bundle's repo should have same name as bundle";
+ assert b.getName().equals(b.getRepo().getName()) : "bundle's repo should have same name as bundle";
q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", name);
@@ -483,6 +468,22 @@ public class BundleTest extends AbstractEJB3Test {
return bt;
}
+ private Bundle createBundle(EntityManager em, String name, BundleType bt) throws Exception {
+ // implicit Bundle'sRepo
+ Repo repo = new Repo(name);
+ repo.setCandidate(false);
+ repo.setSyncSchedule(null);
+ em.persist(repo);
+
+ // Bundle's packageType
+ PackageType pt = new PackageType(name, bt.getResourceType());
+ pt.setCategory(PackageCategory.BUNDLE);
+
+ Bundle bundle = new Bundle(name, bt, repo, pt);
+ em.persist(bundle);
+ return bundle;
+ }
+
private ResourceType deleteResourceType(EntityManager em, ResourceType rt) {
rt = em.find(ResourceType.class, rt.getId());
em.remove(rt);
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 ec2e788..642c843 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
@@ -142,16 +142,12 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
throw new IllegalArgumentException("Invalid bundleTypeId: " + bundleTypeId);
}
- Bundle bundle = new Bundle(name, bundleType);
- bundle.setDescription(description);
-
// create and add the required Repo. the Repo is a detached object which helps in its eventual
// removal.
Repo repo = new Repo(name);
repo.setCandidate(false);
repo.setSyncSchedule(null);
repo = repoManager.createRepo(subject, repo);
- bundle.setRepo(repo);
// add the required PackageType. the PackageType is an attached object which helps in cascade removal
// of packages in the bundle's repo.
@@ -164,6 +160,9 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
packageType.setDiscoveryInterval(-1L);
packageType.setCreationData(false);
packageType.setDeploymentConfigurationDefinition(null);
+
+ Bundle bundle = new Bundle(name, bundleType, repo, packageType);
+ bundle.setDescription(description);
bundle.setPackageType(packageType);
log.info("Creating bundle: " + bundle);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 427714b..e9594f4 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -176,7 +176,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
em.remove(em.getReference(BundleDeployDefinition.class, ((BundleDeployDefinition) removeMe).getId()));
}
- // remove bundles which cascade remove repos and packageTypes
+ // remove bundles which cascade remove packageTypes
// packagetypes cascade remove packages
// package cascade remove packageversions
q = em.createQuery("SELECT b FROM Bundle b WHERE b.name LIKE '" + TEST_PREFIX + "%'");
@@ -204,7 +204,8 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(PackageType.class, ((PackageType) removeMe).getId()));
}
- // remove any orphaned repos
+
+ // remove repos no longer referenced by bundles
q = em.createQuery("SELECT r FROM Repo r WHERE r.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
diff --git a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
index 4f2f28b..07c48fc 100644
--- a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
+++ b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
@@ -38,6 +38,8 @@ import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.content.PackageType;
+import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
@@ -81,7 +83,9 @@ public class AntBundlePluginComponentTest {
public void testSimpleBundle() throws Exception {
ResourceType resourceType = new ResourceType("testSimpleBundle", "plugin", ResourceCategory.SERVER, null);
BundleType bundleType = new BundleType("testSimpleBundle", resourceType);
- Bundle bundle = new Bundle("testSimpleBundle", bundleType);
+ Repo repo = new Repo("testSimpleBundle");
+ PackageType packageType = new PackageType("testSimpleBundle", resourceType);
+ Bundle bundle = new Bundle("testSimpleBundle", bundleType, repo, packageType);
BundleVersion bundleVersion = new BundleVersion("testSimpleBundle", "1.0", bundle,
getRecipeFromFile("simple-build.xml"));
@@ -107,7 +111,9 @@ public class AntBundlePluginComponentTest {
public void testAntBundle() throws Exception {
ResourceType resourceType = new ResourceType("testSimpleBundle", "plugin", ResourceCategory.SERVER, null);
BundleType bundleType = new BundleType("testSimpleBundle", resourceType);
- Bundle bundle = new Bundle("testSimpleBundle", bundleType);
+ Repo repo = new Repo("testSimpleBundle");
+ PackageType packageType = new PackageType("testSimpleBundle", resourceType);
+ Bundle bundle = new Bundle("testSimpleBundle", bundleType, repo, packageType);
BundleVersion bundleVersion = new BundleVersion("testSimpleBundle", "1.0", bundle,
getRecipeFromFile("test-build.xml"));
@@ -141,7 +147,9 @@ public class AntBundlePluginComponentTest {
assert props.getProperty("f.exists").equals("true") : props;
assert props.getProperty("pkg.exists").equals("true") : props;
assert props.getProperty("hostname").equals(SystemInfoFactory.createSystemInfo().getHostname()) : props;
- assert props.getProperty("tmpdir").equals(System.getProperty("java.io.tmpdir")) : props;
+ String javaIoTmpDir = System.getProperty("java.io.tmpdir");
+ String val = props.getProperty("tmpdir");
+ assert val.equals(javaIoTmpDir) : props;
}
private void assertResultsSuccess(BundleDeployResult results) {
commit 041c4a4f1f0131eded7795941af36f20179d9590
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 17:32:12 2010 -0400
**MAZZ REVIEW** Escape backslashes in properties being sent to Ant. I'm not
positive about this but in the tests the props are echoed to a file and
when read in via Properties.load() the backslashes are eaten. This solves
that problem but is it the right thing to do?
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
index 86e397f..cd18395 100644
--- a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
@@ -94,7 +94,10 @@ public class AntLauncher {
if (properties != null) {
for (Map.Entry<Object, Object> property : properties.entrySet()) {
- project.setProperty(property.getKey().toString(), property.getValue().toString());
+ // On the assumption that these properties will be slurped in via Properties.load we
+ // need to escape backslashes to have them treated as literals
+ project.setProperty(property.getKey().toString(), property.getValue().toString().replace("\\",
+ "\\\\"));
}
}
commit ab70b6f2369183dba274e3cf713b23f319b4695a
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 31 21:07:13 2010 +0200
Revert navigation to the struts-based alert-configuration
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/listAlertTemplates.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/listAlertTemplates.xhtml
index 2f30a9c..3f94eca 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/listAlertTemplates.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/admin/listAlertTemplates.xhtml
@@ -92,7 +92,8 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputLink value="/rhq/resource/alert/viewAlert.xhtml">
+ <h:outputLink value="/alerts/Config.do">
+ <f:param name="mode" value="viewRoles"/>
<f:param name="type" value="#{param.type}"/>
<f:param name="ad" value="#{item.id}"/>
<h:outputText value="#{item.name}" />
commit 9a38c1e09b617adb83adf75f450dbd07a707fbb5
Merge: eedc12d... 175a985...
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 31 21:02:28 2010 +0200
Merge branch 'master' of ssh://git.fedorahosted.org/git/rhq/rhq
commit eedc12dcf9b635e9d5bc9d414bd252325ccfe489
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 31 21:02:03 2010 +0200
Revert navigation to the struts-based alert-configuration
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/alert/listGroupAlertDefinitions.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/alert/listGroupAlertDefinitions.xhtml
index 5768c23..79b6af5 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/alert/listGroupAlertDefinitions.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/alert/listGroupAlertDefinitions.xhtml
@@ -64,7 +64,8 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputLink value="/rhq/resource/alert/viewAlert.xhtml">
+ <h:outputLink value="/alerts/Config.do">
+ <f:param name="mode" value="viewRoles"/>
<f:param name="groupId" value="#{param.groupId}"/>
<f:param name="ad" value="#{item.id}"/>
<h:outputText value="#{item.name}" />
commit 6bc7cb38fcfa35bd5175e50eda94f02d44130a71
Merge: 2417946... 883be24...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 13:44:00 2010 -0400
Merge branch 'gwt-jay' into gwt
commit 883be246e15d72714fd72050405dfc60d861af41
Merge: c08d04c... 16f3c0a...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 13:43:33 2010 -0400
Merge branch 'master' into gwt-jay
commit 24179466a0ccf6b8d442a4c321eabac814f4bc40
Merge: 5848b67... c08d04c...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 13:41:39 2010 -0400
Merge branch 'gwt-jay' into gwt
commit 5848b67876495c2483f5c8f9f7088fbb4d49aede
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 13:41:28 2010 -0400
LT commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
index dfe7cd8..fd72919 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
@@ -1,125 +1,125 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-
-<ui:composition template="/rhq/resource/layout/main.xhtml">
-
- <ui:param name="pageTitle" value="Upload New Package"/>
- <ui:param name="selectedTabName" value="Content.New"/>
- <ui:define name="content">
-
- <rich:panel id="fileUploadPanel">
- <f:facet name="header">
- <h:outputText value="Package File"/>
- </f:facet>
-
- <h:panelGrid columns="1" width="100%" rendered="${ResourceUIBean.permissions.content}">
- <rich:panel>
- <input type="button"
- class="buttonmed"
- value="UPLOAD FILE..."
- onclick="javascript:open('/rhq/resource/content/file-upload.xhtml', 'uploadwin', 'titlebar=0,toolbar=0,location=0,menubar=0,directories=0,resizable=0,height=160,width=450')"/>
- <rich:spacer width="5" />
- <h:outputText rendered="#{UploadNewPackageUIBean.fileUploaded}"
- value="File Uploaded: #{UploadNewPackageUIBean.fileItem.fileName}"/>
- </rich:panel>
- </h:panelGrid>
-
- <h:outputText rendered="#{!ResourceUIBean.permissions.content}"
- value="You do not have permissions to upload content"/>
-
- </rich:panel>
-
- <h:form id="uploadForm">
- <input type="hidden" name="id" value="${param.id}"/>
-
- <rich:panel rendered="#{CreateNewPackageUIBean.needRequestPackageDetails}">
-
- <f:facet name="header">New Package Details</f:facet>
-
- <input type="hidden" name="newPackage" value="true"/>
-
- <table>
- <tr>
- <td align="right"><b>Name*</b></td>
- <td align="left"><h:inputText value="#{CreateNewPackageUIBean.packageName}"/></td>
- </tr>
- <tr>
- <td align="right"><b>Version*</b></td>
- <td align="left"><h:inputText value="#{CreateNewPackageUIBean.version}"/></td>
- </tr>
- <tr>
- <td align="right"><b>Architecture*</b></td>
- <td align="left">
- <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedArchitectureId}">
- <f:selectItems value="#{CreateNewPackageUIBean.architectures}" />
- </h:selectOneMenu>
- </td>
- </tr>
- <tr>
- <td align="right"><b>Type*</b></td>
- <td align="left">
- <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedPackageTypeId}">
- <f:selectItems value="#{CreateNewPackageUIBean.packageTypes}" />
- </h:selectOneMenu>
- </td>
- </tr>
- </table>
-
- <div class="note-panel"><span class="required-marker-text">*</span><span> denotes a required field.</span></div>
-
- </rich:panel>
-
- <rich:panel>
-
+<?xml version="1.0"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
+<ui:composition template="/rhq/resource/layout/main.xhtml">
+
+ <ui:param name="pageTitle" value="Upload New Package"/>
+ <ui:param name="selectedTabName" value="Content.New"/>
+ <ui:define name="content">
+
+ <rich:panel id="fileUploadPanel">
+ <f:facet name="header">
+ <h:outputText value="Package File"/>
+ </f:facet>
+
+ <h:panelGrid columns="1" width="100%" rendered="${ResourceUIBean.permissions.content}">
+ <rich:panel>
+ <input type="button"
+ class="buttonmed"
+ value="UPLOAD FILE..."
+ onclick="javascript:open('/rhq/resource/content/file-upload.xhtml', 'uploadwin', 'titlebar=0,toolbar=0,location=0,menubar=0,directories=0,resizable=0,height=160,width=450')"/>
+ <rich:spacer width="5" />
+ <h:outputText rendered="#{UploadNewPackageUIBean.fileUploaded}"
+ value="File Uploaded: #{UploadNewPackageUIBean.fileItem.fileName}"/>
+ </rich:panel>
+ </h:panelGrid>
+
+ <h:outputText rendered="#{!ResourceUIBean.permissions.content}"
+ value="You do not have permissions to upload content"/>
+
+ </rich:panel>
+
+ <h:form id="uploadForm">
+ <input type="hidden" name="id" value="${param.id}"/>
+
+ <rich:panel rendered="#{CreateNewPackageUIBean.needRequestPackageDetails}">
+
+ <f:facet name="header">New Package Details</f:facet>
+
+ <input type="hidden" name="newPackage" value="true"/>
+
+ <table>
+ <tr>
+ <td align="right"><b>Name*</b></td>
+ <td align="left"><h:inputText value="#{CreateNewPackageUIBean.packageName}"/></td>
+ </tr>
+ <tr>
+ <td align="right"><b>Version*</b></td>
+ <td align="left"><h:inputText value="#{CreateNewPackageUIBean.version}"/></td>
+ </tr>
+ <tr>
+ <td align="right"><b>Architecture*</b></td>
+ <td align="left">
+ <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedArchitectureId}">
+ <f:selectItems value="#{CreateNewPackageUIBean.architectures}" />
+ </h:selectOneMenu>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><b>Type*</b></td>
+ <td align="left">
+ <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedPackageTypeId}">
+ <f:selectItems value="#{CreateNewPackageUIBean.packageTypes}" />
+ </h:selectOneMenu>
+ </td>
+ </tr>
+ </table>
+
+ <div class="note-panel"><span class="required-marker-text">*</span><span> denotes a required field.</span></div>
+
+ </rich:panel>
+
+ <rich:panel>
+
<f:facet name="header">Repository</f:facet>
-
+
<p>Select one of the following options describing in which repository the new package should be created.</p>
-
+
<input type="radio" name="repoOption" value="subscribed">Currently Subscribed Repository</input>
- <rich:spacer width="5"/>
+ <rich:spacer width="5"/>
<h:selectOneMenu value="#{CreateNewPackageUIBean.subscribedRepoId}">
<f:selectItems value="#{CreateNewPackageUIBean.subscribedRepos}" />
- </h:selectOneMenu>
- <br/>
+ </h:selectOneMenu>
+ <br/>
<input type="radio" name="repoOption" value="unsubscribed">Existing Repository</input>
- <rich:spacer width="5"/>
+ <rich:spacer width="5"/>
<h:selectOneMenu value="#{CreateNewPackageUIBean.unsubscribedRepoId}">
<f:selectItems value="#{CreateNewPackageUIBean.unsubscribedRepos}" />
- </h:selectOneMenu>
- <br/>
+ </h:selectOneMenu>
+ <br/>
<input type="radio" name="repoOption" value="new">New Repository</input>
<rich:spacer width="5"/><h:inputText value="#{CreateNewPackageUIBean.newRepoName}"/>
-
- </rich:panel>
-
- <h:panelGrid id="buttonGrid" columns="2" styleClass="buttons-table" columnClasses="button-cell">
-
- <h:commandButton style="margin-top: 10px;" value="CONTINUE"
- action="#{CreateNewPackageUIBean.createPackage}" styleClass="buttonmed"
- rendered="#{UploadNewPackageUIBean.fileUploaded}"/>
- <h:commandButton style="margin-top: 10px;" value="CONTINUE"
- disabled="true" styleClass="buttonmed-disabled"
- rendered="#{!UploadNewPackageUIBean.fileUploaded}"/>
-
- <h:commandButton style="margin-top: 10px;" value="CANCEL"
- action="#{CreateNewPackageUIBean.cancel}" styleClass="buttonmed"/>
-
- </h:panelGrid>
-
- </h:form>
-
- </ui:define>
-</ui:composition>
-
-</html>
+
+ </rich:panel>
+
+ <h:panelGrid id="buttonGrid" columns="2" styleClass="buttons-table" columnClasses="button-cell">
+
+ <h:commandButton style="margin-top: 10px;" value="CONTINUE"
+ action="#{CreateNewPackageUIBean.createPackage}" styleClass="buttonmed"
+ rendered="#{UploadNewPackageUIBean.fileUploaded}"/>
+ <h:commandButton style="margin-top: 10px;" value="CONTINUE"
+ disabled="true" styleClass="buttonmed-disabled"
+ rendered="#{!UploadNewPackageUIBean.fileUploaded}"/>
+
+ <h:commandButton style="margin-top: 10px;" value="CANCEL"
+ action="#{CreateNewPackageUIBean.cancel}" styleClass="buttonmed"/>
+
+ </h:panelGrid>
+
+ </h:form>
+
+ </ui:define>
+</ui:composition>
+
+</html>
commit c08d04c186c2346d097a93fdaf42d4a8de18e9bd
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 13:37:19 2010 -0400
Avoid Exception by ensuring param is passed.
Protect against spaces in java exe path.
diff --git a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
index 223c581..147e602 100644
--- a/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
+++ b/modules/enterprise/server/container/src/main/bin-resources/bin/generate-db-password.bat
@@ -48,6 +48,15 @@ if "%RHQ_SERVER_DEBUG%" == "false" (
)
rem ----------------------------------------------------------------------
+rem Ensure password parameter is present
+rem ----------------------------------------------------------------------
+
+if /i "%1"=="" (
+ echo Usage: %0 { plainTextPassword }
+ goto :done
+)
+
+rem ----------------------------------------------------------------------
rem Change directory so the current directory is the Server home.
rem ----------------------------------------------------------------------
@@ -86,7 +95,7 @@ if not exist "%RHQ_SERVER_JAVA_EXE_FILE_PATH%" (
)
set _JB_DIR=%RHQ_SERVER_HOME%\jbossas
-%RHQ_SERVER_JAVA_EXE_FILE_PATH% -cp %_JB_DIR%\lib\jboss-common.jar;%_JB_DIR%\lib\jboss-jmx.jar;%_JB_DIR%\server\default\lib\jbosssx.jar;%_JB_DIR%\server\default\lib\jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule %1
+"%RHQ_SERVER_JAVA_EXE_FILE_PATH%" -cp %_JB_DIR%\lib\jboss-common.jar;%_JB_DIR%\lib\jboss-jmx.jar;%_JB_DIR%\server\default\lib\jbosssx.jar;%_JB_DIR%\server\default\lib\jboss-jca.jar org.jboss.resource.security.SecureIdentityLoginModule %1
goto :done
commit c8911e339f9c2a3723f16c59bb4a00ece8d15773
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 13:29:49 2010 -0400
give the server side bundle plugins their own profile to ensure they
don't get omitted by -P!misc-plugins.
diff --git a/modules/plugins/pom.xml b/modules/plugins/pom.xml
index 76ee0ee..6e999e2 100644
--- a/modules/plugins/pom.xml
+++ b/modules/plugins/pom.xml
@@ -111,6 +111,20 @@
</profile>
<profile>
+ <id>bundle-plugins</id>
+ <activation>
+ <property>
+ <name>java.home</name>
+ </property>
+ </activation>
+
+ <modules>
+ <module>filetemplate-bundle</module>
+ <module>ant-bundle</module>
+ </modules>
+ </profile>
+
+ <profile>
<id>linux-plugins</id>
<activation>
<property>
@@ -159,10 +173,6 @@
<module>perftest</module>
<module>snmptrapd</module>
<module>twitter</module>
-
- <!-- bundle plugins -->
- <module>filetemplate-bundle</module>
- <module>ant-bundle</module>
</modules>
</profile>
commit 2a9ef1e3581dff3c45da41fb19aa0ef7f1bfbc26
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 13:28:27 2010 -0400
fix import of PersistenceUtility
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java
index 848a067..1bc9188 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernatePerformanceMonitor.java
@@ -31,7 +31,7 @@ import org.apache.commons.logging.LogFactory;
import org.hibernate.stat.QueryStatistics;
import org.hibernate.stat.Statistics;
-import org.rhq.core.domain.util.PersistenceUtility;
+import org.rhq.core.server.PersistenceUtility;
/**
* @author Joseph Marques
commit 613b7b2d8b09c5b3202b7bf7fc3460f5b76ffcde
Merge: 788f917... 722cd2d...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 10:36:16 2010 -0400
Merge branch 'master' into gwt-jay
commit 788f9174965433412e1f83155f941615f977b67c
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 31 10:36:08 2010 -0400
LT commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
index dfe7cd8..fd72919 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
@@ -1,125 +1,125 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:c="http://java.sun.com/jstl/core"
- xmlns:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-
-<ui:composition template="/rhq/resource/layout/main.xhtml">
-
- <ui:param name="pageTitle" value="Upload New Package"/>
- <ui:param name="selectedTabName" value="Content.New"/>
- <ui:define name="content">
-
- <rich:panel id="fileUploadPanel">
- <f:facet name="header">
- <h:outputText value="Package File"/>
- </f:facet>
-
- <h:panelGrid columns="1" width="100%" rendered="${ResourceUIBean.permissions.content}">
- <rich:panel>
- <input type="button"
- class="buttonmed"
- value="UPLOAD FILE..."
- onclick="javascript:open('/rhq/resource/content/file-upload.xhtml', 'uploadwin', 'titlebar=0,toolbar=0,location=0,menubar=0,directories=0,resizable=0,height=160,width=450')"/>
- <rich:spacer width="5" />
- <h:outputText rendered="#{UploadNewPackageUIBean.fileUploaded}"
- value="File Uploaded: #{UploadNewPackageUIBean.fileItem.fileName}"/>
- </rich:panel>
- </h:panelGrid>
-
- <h:outputText rendered="#{!ResourceUIBean.permissions.content}"
- value="You do not have permissions to upload content"/>
-
- </rich:panel>
-
- <h:form id="uploadForm">
- <input type="hidden" name="id" value="${param.id}"/>
-
- <rich:panel rendered="#{CreateNewPackageUIBean.needRequestPackageDetails}">
-
- <f:facet name="header">New Package Details</f:facet>
-
- <input type="hidden" name="newPackage" value="true"/>
-
- <table>
- <tr>
- <td align="right"><b>Name*</b></td>
- <td align="left"><h:inputText value="#{CreateNewPackageUIBean.packageName}"/></td>
- </tr>
- <tr>
- <td align="right"><b>Version*</b></td>
- <td align="left"><h:inputText value="#{CreateNewPackageUIBean.version}"/></td>
- </tr>
- <tr>
- <td align="right"><b>Architecture*</b></td>
- <td align="left">
- <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedArchitectureId}">
- <f:selectItems value="#{CreateNewPackageUIBean.architectures}" />
- </h:selectOneMenu>
- </td>
- </tr>
- <tr>
- <td align="right"><b>Type*</b></td>
- <td align="left">
- <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedPackageTypeId}">
- <f:selectItems value="#{CreateNewPackageUIBean.packageTypes}" />
- </h:selectOneMenu>
- </td>
- </tr>
- </table>
-
- <div class="note-panel"><span class="required-marker-text">*</span><span> denotes a required field.</span></div>
-
- </rich:panel>
-
- <rich:panel>
-
+<?xml version="1.0"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
+<ui:composition template="/rhq/resource/layout/main.xhtml">
+
+ <ui:param name="pageTitle" value="Upload New Package"/>
+ <ui:param name="selectedTabName" value="Content.New"/>
+ <ui:define name="content">
+
+ <rich:panel id="fileUploadPanel">
+ <f:facet name="header">
+ <h:outputText value="Package File"/>
+ </f:facet>
+
+ <h:panelGrid columns="1" width="100%" rendered="${ResourceUIBean.permissions.content}">
+ <rich:panel>
+ <input type="button"
+ class="buttonmed"
+ value="UPLOAD FILE..."
+ onclick="javascript:open('/rhq/resource/content/file-upload.xhtml', 'uploadwin', 'titlebar=0,toolbar=0,location=0,menubar=0,directories=0,resizable=0,height=160,width=450')"/>
+ <rich:spacer width="5" />
+ <h:outputText rendered="#{UploadNewPackageUIBean.fileUploaded}"
+ value="File Uploaded: #{UploadNewPackageUIBean.fileItem.fileName}"/>
+ </rich:panel>
+ </h:panelGrid>
+
+ <h:outputText rendered="#{!ResourceUIBean.permissions.content}"
+ value="You do not have permissions to upload content"/>
+
+ </rich:panel>
+
+ <h:form id="uploadForm">
+ <input type="hidden" name="id" value="${param.id}"/>
+
+ <rich:panel rendered="#{CreateNewPackageUIBean.needRequestPackageDetails}">
+
+ <f:facet name="header">New Package Details</f:facet>
+
+ <input type="hidden" name="newPackage" value="true"/>
+
+ <table>
+ <tr>
+ <td align="right"><b>Name*</b></td>
+ <td align="left"><h:inputText value="#{CreateNewPackageUIBean.packageName}"/></td>
+ </tr>
+ <tr>
+ <td align="right"><b>Version*</b></td>
+ <td align="left"><h:inputText value="#{CreateNewPackageUIBean.version}"/></td>
+ </tr>
+ <tr>
+ <td align="right"><b>Architecture*</b></td>
+ <td align="left">
+ <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedArchitectureId}">
+ <f:selectItems value="#{CreateNewPackageUIBean.architectures}" />
+ </h:selectOneMenu>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><b>Type*</b></td>
+ <td align="left">
+ <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedPackageTypeId}">
+ <f:selectItems value="#{CreateNewPackageUIBean.packageTypes}" />
+ </h:selectOneMenu>
+ </td>
+ </tr>
+ </table>
+
+ <div class="note-panel"><span class="required-marker-text">*</span><span> denotes a required field.</span></div>
+
+ </rich:panel>
+
+ <rich:panel>
+
<f:facet name="header">Repository</f:facet>
-
+
<p>Select one of the following options describing in which repository the new package should be created.</p>
-
+
<input type="radio" name="repoOption" value="subscribed">Currently Subscribed Repository</input>
- <rich:spacer width="5"/>
+ <rich:spacer width="5"/>
<h:selectOneMenu value="#{CreateNewPackageUIBean.subscribedRepoId}">
<f:selectItems value="#{CreateNewPackageUIBean.subscribedRepos}" />
- </h:selectOneMenu>
- <br/>
+ </h:selectOneMenu>
+ <br/>
<input type="radio" name="repoOption" value="unsubscribed">Existing Repository</input>
- <rich:spacer width="5"/>
+ <rich:spacer width="5"/>
<h:selectOneMenu value="#{CreateNewPackageUIBean.unsubscribedRepoId}">
<f:selectItems value="#{CreateNewPackageUIBean.unsubscribedRepos}" />
- </h:selectOneMenu>
- <br/>
+ </h:selectOneMenu>
+ <br/>
<input type="radio" name="repoOption" value="new">New Repository</input>
<rich:spacer width="5"/><h:inputText value="#{CreateNewPackageUIBean.newRepoName}"/>
-
- </rich:panel>
-
- <h:panelGrid id="buttonGrid" columns="2" styleClass="buttons-table" columnClasses="button-cell">
-
- <h:commandButton style="margin-top: 10px;" value="CONTINUE"
- action="#{CreateNewPackageUIBean.createPackage}" styleClass="buttonmed"
- rendered="#{UploadNewPackageUIBean.fileUploaded}"/>
- <h:commandButton style="margin-top: 10px;" value="CONTINUE"
- disabled="true" styleClass="buttonmed-disabled"
- rendered="#{!UploadNewPackageUIBean.fileUploaded}"/>
-
- <h:commandButton style="margin-top: 10px;" value="CANCEL"
- action="#{CreateNewPackageUIBean.cancel}" styleClass="buttonmed"/>
-
- </h:panelGrid>
-
- </h:form>
-
- </ui:define>
-</ui:composition>
-
-</html>
+
+ </rich:panel>
+
+ <h:panelGrid id="buttonGrid" columns="2" styleClass="buttons-table" columnClasses="button-cell">
+
+ <h:commandButton style="margin-top: 10px;" value="CONTINUE"
+ action="#{CreateNewPackageUIBean.createPackage}" styleClass="buttonmed"
+ rendered="#{UploadNewPackageUIBean.fileUploaded}"/>
+ <h:commandButton style="margin-top: 10px;" value="CONTINUE"
+ disabled="true" styleClass="buttonmed-disabled"
+ rendered="#{!UploadNewPackageUIBean.fileUploaded}"/>
+
+ <h:commandButton style="margin-top: 10px;" value="CANCEL"
+ action="#{CreateNewPackageUIBean.cancel}" styleClass="buttonmed"/>
+
+ </h:panelGrid>
+
+ </h:form>
+
+ </ui:define>
+</ui:composition>
+
+</html>
commit 2c28670eafacf818240ee8e22e696dd3a955ce3c
Merge: 546a772... 43e85fb...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 30 16:49:40 2010 -0400
Merge branch 'gwt' into gwt-jay
commit 546a7720c20e6985dcf6a36b5c7e3fcdf7a4aa36
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 30 16:48:48 2010 -0400
More support for deployment status and group deployment status
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java
index d248fc2..466dce1 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java
@@ -30,6 +30,7 @@ import org.rhq.core.communications.command.annotation.Asynchronous;
import org.rhq.core.communications.command.annotation.LimitedConcurrency;
import org.rhq.core.communications.command.annotation.Timeout;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
import org.rhq.core.domain.content.PackageVersion;
/**
@@ -43,8 +44,6 @@ public interface BundleServerService {
@Asynchronous(guaranteedDelivery = true)
void addDeploymentHistory(int bundleDeploymentId, BundleDeploymentHistory history);
- List<PackageVersion> getAllBundleVersionPackageVersions(int bundleVersionId);
-
/**
* Requests that the server download and stream the bits for the specified package version.
* If the package cannot be found, an exception will be thrown.
@@ -60,4 +59,15 @@ public interface BundleServerService {
@Timeout(45 * 60 * 1000L)
@LimitedConcurrency(ContentServerService.CONCURRENCY_LIMIT_CONTENT_DOWNLOAD)
long downloadPackageBits(PackageVersion packageVersion, OutputStream outputStream);
+
+ List<PackageVersion> getAllBundleVersionPackageVersions(int bundleVersionId);
+
+ /**
+ * Set the (completion) status of a deployment. If required, detailed messages should be provided via
+ * addDeploymentHistory(). Deployments are automatically initialized to IN_PROGRESS.
+ * @param bundleDeploymentId
+ * @param status
+ */
+ @Asynchronous(guaranteedDelivery = true)
+ void setBundleDeploymentStatus(int bundleDeploymentId, BundleDeploymentStatus status);
}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
index 7db3060..66ad88a 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
@@ -37,6 +37,7 @@ public class BundleDeploymentCriteria extends Criteria {
private Integer filterId;
private Integer filterBundleDeployDefinitionId; // requires override
private String filterBundleDeployDefinitionName; // requires override
+ private Integer filterBundleGroupDeploymentId; // requires override
private Integer filterResourceId; // requires override
private String filterResourceName; // requires override
private BundleDeploymentStatus filterStatus;
@@ -46,10 +47,11 @@ public class BundleDeploymentCriteria extends Criteria {
private boolean fetchHistory;
public BundleDeploymentCriteria() {
- filterOverrides.put("resourceId", "resource.id = ?");
- filterOverrides.put("resourceName", "resource.name like ?");
filterOverrides.put("bundleDeployDefinitionId", "parentResource.id = ?");
filterOverrides.put("bundleDeployDefinitionName", "parentResource.name like ?");
+ filterOverrides.put("bundleGroupDeploymentId", "bundleGroupDeployment.id = ?");
+ filterOverrides.put("resourceId", "resource.id = ?");
+ filterOverrides.put("resourceName", "resource.name like ?");
}
@Override
@@ -69,6 +71,10 @@ public class BundleDeploymentCriteria extends Criteria {
this.filterBundleDeployDefinitionName = filterBundleDeployDefinitionName;
}
+ public void addFilterBundleGroupDeploymentId(Integer filterBundleGroupDeploymentId) {
+ this.filterBundleGroupDeploymentId = filterBundleGroupDeploymentId;
+ }
+
public void addFilterResourceId(Integer filterResourceId) {
this.filterResourceId = filterResourceId;
}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index 04b29a8..9602eed 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -43,6 +43,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.content.PackageVersion;
@@ -146,7 +147,7 @@ public class BundleManager extends AgentService implements BundleAgentService, B
if (!result.isSuccess()) {
response.setErrorMessage(result.getErrorMessage());
}
- auditDeployment(deployment, BundleDeploymentAction.DEPLOYMENT_END, "Success");
+ completeDeployment(deployment, BundleDeploymentStatus.SUCCESS, "Success");
} catch (Throwable t) {
log.error("Failed to schedule bundle request: " + request, t);
response.setErrorMessage(t);
@@ -205,6 +206,11 @@ public class BundleManager extends AgentService implements BundleAgentService, B
return packageVersionFiles;
}
+ private void completeDeployment(BundleDeployment deployment, BundleDeploymentStatus status, String message) {
+ getBundleServerService().setBundleDeploymentStatus(deployment.getId(), status);
+ auditDeployment(deployment, BundleDeploymentAction.DEPLOYMENT_END, message);
+ }
+
private void auditDeployment(BundleDeployment deployment, BundleDeploymentAction action, String message) {
BundleDeploymentHistory history = new BundleDeploymentHistory("Bundle Plugin", action, message);
getBundleServerService().addDeploymentHistory(deployment.getId(), history);
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 db9c232..ec2e788 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
@@ -49,6 +49,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
@@ -71,6 +72,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
+import org.rhq.core.domain.util.StringUtils;
import org.rhq.core.util.NumberUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
@@ -155,7 +157,13 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// of packages in the bundle's repo.
ResourceType resourceType = entityManager.find(ResourceType.class, bundleType.getResourceType().getId());
PackageType packageType = new PackageType(name, resourceType);
+ packageType.setDescription("Package type for content of bundle " + name);
packageType.setCategory(PackageCategory.BUNDLE);
+ packageType.setSupportsArchitecture(false);
+ packageType.setDisplayName(StringUtils.deCamelCase(name));
+ packageType.setDiscoveryInterval(-1L);
+ packageType.setCreationData(false);
+ packageType.setDeploymentConfigurationDefinition(null);
bundle.setPackageType(packageType);
log.info("Creating bundle: " + bundle);
@@ -241,6 +249,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return bv;
}
+ @SuppressWarnings("unchecked")
@RequiredPermission(Permission.MANAGE_INVENTORY)
public BundleVersion createBundleVersion(Subject subject, int bundleId, String name, String description,
String version, String recipe) throws Exception {
@@ -310,6 +319,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return bundleVersion;
}
+ @SuppressWarnings("unchecked")
private String getVersion(String version, Bundle bundle) {
if (null != version && version.trim().length() > 0) {
return version;
@@ -492,6 +502,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
if (!response.isSuccess()) {
history = new BundleDeploymentHistory(subject.getName(), BundleDeploymentAction.DEPLOYMENT_END, "Failure: "
+ response.getErrorMessage());
+ bundleManager.setBundleDeploymentStatus(subject, deployment.getId(), BundleDeploymentStatus.FAILURE);
bundleManager.addBundleDeploymentHistory(subject, deployment.getId(), history);
}
@@ -553,6 +564,37 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return deployment;
}
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public BundleDeployment setBundleDeploymentStatus(Subject subject, int bundleDeploymentId,
+ BundleDeploymentStatus status) throws Exception {
+
+ BundleDeployment deployment = entityManager.find(BundleDeployment.class, bundleDeploymentId);
+ if (null == deployment) {
+ throw new IllegalArgumentException("Invalid bundleDeploymentId: " + bundleDeploymentId);
+ }
+
+ deployment.setStatus(status);
+ this.entityManager.persist(deployment);
+
+ // If this is part of a group deployment then update the group status, if necessary.
+ BundleGroupDeployment groupDeployment = deployment.getBundleGroupDeployment();
+ if ((null != groupDeployment) && (BundleDeploymentStatus.INPROGRESS.equals(groupDeployment.getStatus()))) {
+ if (BundleDeploymentStatus.FAILURE.equals(status)) {
+ groupDeployment.setStatus(status);
+ } else {
+ BundleDeploymentCriteria c = new BundleDeploymentCriteria();
+ c.addFilterBundleGroupDeploymentId(groupDeployment.getId());
+ c.addFilterStatus(BundleDeploymentStatus.INPROGRESS);
+ List<BundleDeployment> inProgressDeployments = findBundleDeploymentsByCriteria(subject, c);
+ if (inProgressDeployments.isEmpty()) {
+ groupDeployment.setStatus(BundleDeploymentStatus.SUCCESS);
+ }
+ }
+ }
+
+ return deployment;
+ }
+
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public BundleGroupDeployment createBundleGroupDeployment(BundleGroupDeployment bundleGroupDeployment)
throws Exception {
@@ -711,7 +753,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return results;
}
- // TODO This is not adequate!!!
+ @SuppressWarnings("unchecked")
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void deleteBundle(Subject subject, int bundleId) throws Exception {
Bundle bundle = this.entityManager.find(Bundle.class, bundleId);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
index b265f0e..e55959f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
@@ -25,6 +25,7 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
@@ -81,4 +82,15 @@ public interface BundleManagerLocal extends BundleManagerRemote {
// added here because the same method in @Remote was commented out to bypass a WSProvide issue
Map<String, Boolean> getAllBundleVersionFilenames(Subject subject, int bundleVersionId) throws Exception;
+ /**
+ * Called internally to set deployment status. Typically to a completion status when deployment ends.
+ *
+ * @param subject
+ * @param bundleDeploymentId id of the deployment appending the history record
+ * @param status
+ * @return the updated BundleDeployment
+ */
+ BundleDeployment setBundleDeploymentStatus(Subject subject, int bundleDeploymentId, BundleDeploymentStatus status)
+ throws Exception;
+
}
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 afda193..8350784 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
@@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.clientapi.server.bundle.BundleServerService;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.criteria.BundleFileCriteria;
@@ -94,4 +95,15 @@ public class BundleServerServiceImpl implements BundleServerService {
throw new WrappedRemotingException(e);
}
}
+
+ public void setBundleDeploymentStatus(int bundleDeploymentId, BundleDeploymentStatus status) {
+ try {
+ BundleManagerLocal bm = LookupUtil.getBundleManager();
+ bm.setBundleDeploymentStatus(LookupUtil.getSubjectManager().getOverlord(), bundleDeploymentId, status);
+ } catch (Exception e) {
+ log.error("Failed to set status for deployment id: " + bundleDeploymentId, e);
+ throw new WrappedRemotingException(e);
+ }
+ }
+
}
\ No newline at end of file
commit 43e85fb5f3ff7526794ffeaced196a7e7471eda9
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 30 14:33:40 2010 -0400
provide ant contrib tasks out of box for user
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
index b184274..86e397f 100644
--- a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
@@ -26,9 +26,11 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
+import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
@@ -42,14 +44,17 @@ import org.rhq.core.domain.configuration.definition.PropertySimpleType;
public class AntLauncher {
// currently, the bundle plugins don't need custom ant tasks, but there is an ant task stubbed for future use here
- private static final String ANT_TASKS = "bundle-ant-tasks.properties";
+ private static final String BUNDLE_ANT_TASKS = "bundle-ant-tasks.properties";
+
+ // "out of box" we will provide the antcontrib optional tasks
+ private static final String ANTCONTRIB_ANT_TASKS = "net/sf/antcontrib/antcontrib.properties";
/**
* Launches ANT and parses the given build file and optionally executes it.
*
* @param buildFile the build file that ANT will run
* @param target the target to run, <code>null</code> will run the default target
- * @param customTaskDefs the properties file found in classloader that contains all the taskdef definitions
+ * @param customTaskDefs the properties files found in classloader that contains all the taskdef definitions
* @param properties set of properties to set for the ANT task to access
* @param logFile where ANT messages will be logged
* @param logStdOut if <code>true</code>, log messages will be sent to stdout as well as the log file
@@ -57,7 +62,7 @@ public class AntLauncher {
*
* @throws RuntimeException
*/
- public BundleAntProject startAnt(File buildFile, String target, String customTaskDefs, Properties properties,
+ public BundleAntProject startAnt(File buildFile, String target, Set<String> customTaskDefs, Properties properties,
File logFile, boolean logStdOut, boolean execute) {
PrintWriter logFileOutput = null;
@@ -67,9 +72,14 @@ public class AntLauncher {
ClassLoader classLoader = getClass().getClassLoader();
+ if (customTaskDefs == null) {
+ customTaskDefs = new HashSet<String>(1);
+ }
+ customTaskDefs.add(ANTCONTRIB_ANT_TASKS); // we always want to provide these
+
Properties taskDefs = new Properties();
- if (customTaskDefs != null) {
- InputStream taskDefsStream = classLoader.getResourceAsStream(customTaskDefs);
+ for (String customTaskDef : customTaskDefs) {
+ InputStream taskDefsStream = classLoader.getResourceAsStream(customTaskDef);
try {
taskDefs.load(taskDefsStream);
} finally {
commit c171369abcd868a407b9f9c71eceb6000dc6e8d4
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 30 13:58:58 2010 -0400
remove package type creation for the bundle type
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
index 26bf354..686b16b 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java
@@ -50,7 +50,6 @@ import org.rhq.core.clientapi.descriptor.plugin.ServerDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.ServiceDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.SubCategoryDescriptor;
import org.rhq.core.domain.bundle.BundleType;
-import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.event.EventDefinition;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.resource.ClassLoaderType;
@@ -60,7 +59,6 @@ import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceCreationDataType;
import org.rhq.core.domain.resource.ResourceSubCategory;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.StringUtils;
/**
* This is a stateful class intended to hold the related metadata for a single plugin descriptor. It is designed to be
@@ -527,18 +525,6 @@ public class PluginMetadataParser {
if (bundle != null) {
String typeName = bundle.getType();
resourceType.setBundleType(new BundleType(typeName, resourceType));
-
- // create the peer package type for the bundle type
- PackageType bundlePackageType = new PackageType();
- bundlePackageType.setName(typeName);
- bundlePackageType.setDescription("Package type for content of bundles of type " + typeName);
- bundlePackageType.setCategory(null);
- bundlePackageType.setSupportsArchitecture(false);
- bundlePackageType.setDisplayName(StringUtils.deCamelCase(typeName));
- bundlePackageType.setDiscoveryInterval(-1L);
- bundlePackageType.setCreationData(false);
- bundlePackageType.setDeploymentConfigurationDefinition(null);
- resourceType.addPackageType(bundlePackageType);
}
} catch (InvalidPluginDescriptorException e) {
commit c43e74fbf53cfd2dd58ee9babd328c5866dacb8c
Merge: b3313d9... 96a5298...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 29 15:39:05 2010 -0400
Merge branch 'bundle-jay' into gwt
Conflicts:
modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
commit b3313d96a919adf6168c4dc3065e54fdc71ae69c
Merge: ef3638d... 8bd78f0...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 29 15:37:14 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit ef3638df66757fbfd2f84f03c38af3dfa3556513
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 29 15:35:55 2010 -0400
Incorporate group deployment into bundle deploy wizard. Make initial
use of Selection widgets. Refactored Pulled AbstractSelector out of
ResourceSelector and subclassed ResourceGroupSelector as well.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/AbstractBundleDeployWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/AbstractBundleDeployWizard.java
index 5b11249..369569b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/AbstractBundleDeployWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/AbstractBundleDeployWizard.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.bundle.deploy;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
@@ -33,14 +34,15 @@ public abstract class AbstractBundleDeployWizard extends AbstractBundleWizard {
private BundleVersion bundleVersion;
private BundleDeployDefinition bundleDeployDefinition;
private BundleDeployment bundleDeployment;
+ private BundleGroupDeployment bundleGroupDeployment;
private String name;
private String description;
private ConfigurationTemplate template;
private Configuration config;
- private Integer platformGroupId;
- private Integer platformId;
+ private Integer deployTargetId;
private Boolean newDefinition = Boolean.TRUE;
- private Boolean deployNow = null;
+ private boolean deployNow = true;
+ private boolean resourceDeploy = true;
public Bundle getBundle() {
return bundle;
@@ -110,32 +112,36 @@ public abstract class AbstractBundleDeployWizard extends AbstractBundleWizard {
this.newDefinition = newDefinition;
}
- public boolean isDeployNow() {
- return Boolean.TRUE.equals(deployNow);
+ public Integer getPlatformGroupId() {
+ return deployTargetId;
}
- public Boolean getDeployNow() {
- return deployNow;
+ public void setPlatformGroupId(Integer platformGroupId) {
+ this.deployTargetId = platformGroupId;
}
- public void setDeployNow(Boolean deployNow) {
- this.deployNow = deployNow;
+ public Integer getDeployTargetId() {
+ return deployTargetId;
}
- public Integer getPlatformGroupId() {
- return platformGroupId;
+ public void setDeployTargetId(Integer deployTargetId) {
+ this.deployTargetId = deployTargetId;
}
- public void setPlatformGroupId(Integer platformGroupId) {
- this.platformGroupId = platformGroupId;
+ public boolean isResourceDeploy() {
+ return resourceDeploy;
+ }
+
+ public Boolean isDeployNow() {
+ return deployNow;
}
- public Integer getPlatformId() {
- return platformId;
+ public void setDeployNow(Boolean deployNow) {
+ this.deployNow = deployNow;
}
- public void setPlatformId(Integer platformId) {
- this.platformId = platformId;
+ public void setResourceDeploy(boolean resourceDeploy) {
+ this.resourceDeploy = resourceDeploy;
}
public BundleDeployment getBundleDeployment() {
@@ -146,4 +152,12 @@ public abstract class AbstractBundleDeployWizard extends AbstractBundleWizard {
this.bundleDeployment = bundleDeployment;
}
+ public BundleGroupDeployment getBundleGroupDeployment() {
+ return bundleGroupDeployment;
+ }
+
+ public void setBundleGroupDeployment(BundleGroupDeployment bundleGroupDeployment) {
+ this.bundleGroupDeployment = bundleGroupDeployment;
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
index 284d94c..b1b2671 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
@@ -36,8 +36,8 @@ public class BundleDeployWizard extends AbstractBundleDeployWizard {
steps.add(new BundleDeployDefinitionInfoStep(this));
steps.add(new SelectTemplateStep(this));
steps.add(new CreateConfigStep(this));
- steps.add(new DeployNowStep(this));
- steps.add(new SelectPlatformsStep(this));
+ steps.add(new DeployOptionsStep(this));
+ steps.add(new DeployTargetStep(this));
steps.add(new DeployStep(this));
}
@@ -49,8 +49,8 @@ public class BundleDeployWizard extends AbstractBundleDeployWizard {
steps.add(new BundleDeployDefinitionInfoStep(this));
steps.add(new SelectTemplateStep(this));
steps.add(new CreateConfigStep(this));
- steps.add(new DeployNowStep(this));
- steps.add(new SelectPlatformsStep(this));
+ steps.add(new DeployOptionsStep(this));
+ steps.add(new DeployTargetStep(this));
steps.add(new DeployStep(this));
}
@@ -63,8 +63,8 @@ public class BundleDeployWizard extends AbstractBundleDeployWizard {
steps.add(new SelectTemplateStep(this));
steps.add(new CreateConfigStep(this));
- steps.add(new DeployNowStep(this));
- steps.add(new SelectPlatformsStep(this));
+ steps.add(new DeployOptionsStep(this));
+ steps.add(new DeployTargetStep(this));
steps.add(new DeployStep(this));
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
deleted file mode 100644
index aacf46f..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
+++ /dev/null
@@ -1,76 +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.gui.coregui.client.bundle.deploy;
-
-import java.util.LinkedHashMap;
-
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
-import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
-import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
-
-import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-
-public class DeployNowStep implements WizardStep {
-
- static private final String DEPLOY_LATER = "later";
- static private final String DEPLOY_NOW = "now";
-
- private final BundleDeployWizard wizard;
- private DynamicForm form;
-
- public DeployNowStep(BundleDeployWizard bundleCreationWizard) {
- this.wizard = bundleCreationWizard;
- }
-
- public String getName() {
- return "Deploy Now or Later";
- }
-
- public Canvas getCanvas() {
- if (form == null) {
- form = new DynamicForm();
- form.setWidth100();
- form.setNumCols(2);
- form.setColWidths("50%", "*");
-
- RadioGroupItem radioGroupItem = new RadioGroupItem("deployTime", "Deployment Time");
- LinkedHashMap<String, String> radioGroupValues = new LinkedHashMap<String, String>();
- radioGroupValues.put(DEPLOY_NOW, "Deploy Now");
- radioGroupValues.put(DEPLOY_LATER, "Save Definition and Deploy Later");
- radioGroupItem.setRequired(true);
- radioGroupItem.setValueMap(radioGroupValues);
- radioGroupItem.setValue(DEPLOY_NOW);
- wizard.setDeployNow(true);
- radioGroupItem.addChangedHandler(new ChangedHandler() {
- public void onChanged(ChangedEvent event) {
- wizard.setDeployNow(DEPLOY_NOW.equals(event.getValue()));
- }
- });
-
- form.setItems(radioGroupItem);
- }
- return form;
- }
-
- public boolean nextPage() {
- return form.validate();
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployOptionsStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployOptionsStep.java
new file mode 100644
index 0000000..730a466
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployOptionsStep.java
@@ -0,0 +1,96 @@
+/*
+ * 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.gui.coregui.client.bundle.deploy;
+
+import java.util.LinkedHashMap;
+
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
+
+import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
+
+public class DeployOptionsStep implements WizardStep {
+
+ static private final String DEPLOY_LATER = "later";
+ static private final String DEPLOY_NOW = "now";
+
+ static private final String DEPLOY_GROUP = "group";
+ static private final String DEPLOY_RESOURCE = "resource";
+
+ private final BundleDeployWizard wizard;
+ private DynamicForm form;
+ private RadioGroupItem rgDeployTimeItem;
+ private RadioGroupItem rgDeployTypeItem;
+
+ public DeployOptionsStep(BundleDeployWizard bundleCreationWizard) {
+ this.wizard = bundleCreationWizard;
+ }
+
+ public String getName() {
+ return "Deploy Options";
+ }
+
+ public Canvas getCanvas() {
+ if (form == null) {
+ form = new DynamicForm();
+ form.setWidth100();
+ form.setNumCols(2);
+ form.setColWidths("50%", "*");
+
+ rgDeployTimeItem = new RadioGroupItem("deployTime", "Deployment Time");
+ LinkedHashMap<String, String> deployTimeValues = new LinkedHashMap<String, String>();
+ deployTimeValues.put(DEPLOY_NOW, "Deploy Now");
+ deployTimeValues.put(DEPLOY_LATER, "Deploy Later");
+ rgDeployTimeItem.setRequired(true);
+ rgDeployTimeItem.setValueMap(deployTimeValues);
+ rgDeployTimeItem.setValue(DEPLOY_NOW);
+ wizard.setDeployNow(true);
+ rgDeployTimeItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ wizard.setDeployNow(DEPLOY_NOW.equals(event.getValue()));
+ rgDeployTypeItem.setDisabled(!wizard.isDeployNow());
+ }
+ });
+
+ rgDeployTypeItem = new RadioGroupItem("deployTarget", "Deployment Target");
+ LinkedHashMap<String, String> deployTypeValues = new LinkedHashMap<String, String>();
+ deployTypeValues.put(DEPLOY_RESOURCE, "Deploy to Single Resource");
+ deployTypeValues.put(DEPLOY_GROUP, "Deploy to Group of Resources");
+ rgDeployTypeItem.setRequired(true);
+ rgDeployTypeItem.setValueMap(deployTypeValues);
+ rgDeployTypeItem.setValue(DEPLOY_RESOURCE);
+ wizard.setResourceDeploy(true);
+ rgDeployTypeItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ wizard.setResourceDeploy(DEPLOY_RESOURCE.equals(event.getValue()));
+ }
+ });
+
+ form.setItems(rgDeployTimeItem, rgDeployTypeItem);
+ }
+ return form;
+ }
+
+ public boolean nextPage() {
+ return form.validate();
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
index bf3b8b1..197bd9f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
@@ -28,6 +28,7 @@ import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
@@ -80,27 +81,51 @@ public class DeployStep implements WizardStep {
+ result.getDescription(), Severity.Info));
wizard.setBundleDeployDefinition(result);
- bundleServer.scheduleBundleDeployment(wizard.getBundleDeployDefinition().getId(), wizard
- .getPlatformId(), //
- new AsyncCallback<BundleDeployment>() {
- public void onSuccess(BundleDeployment result) {
- deployingImage.setSrc("/images/status_complete.gif");
- deployingMessage.setText("Bundle Deployment Scheduled!");
- CoreGUI.getMessageCenter().notify(
- new Message("Schedule bundle deployment ["
- + wizard.getBundleDeployDefinition().getName() + "] resource ["
- + result.getResource() + "]", Severity.Info));
- wizard.setBundleDeployment(result);
- }
-
- public void onFailure(Throwable caught) {
- deployingImage.setSrc("/images/status_error.gif");
- deployingMessage.setText("Failed to Schedule Deployment!");
- CoreGUI.getErrorHandler().handleError(
- "Failed to schedule deployment: " + caught.getMessage(), caught);
- wizard.setBundleDeployment(null);
- }
- });
+ if (wizard.isResourceDeploy()) {
+ bundleServer.scheduleBundleDeployment(wizard.getBundleDeployDefinition().getId(),
+ wizard.getDeployTargetId(), //
+ new AsyncCallback<BundleDeployment>() {
+ public void onSuccess(BundleDeployment result) {
+ deployingImage.setSrc("/images/status_complete.gif");
+ deployingMessage.setText("Bundle Deployment Scheduled!");
+ CoreGUI.getMessageCenter().notify(
+ new Message("Schedule bundle deployment ["
+ + wizard.getBundleDeployDefinition().getName() + "] resource ["
+ + result.getResource() + "]", Severity.Info));
+ wizard.setBundleDeployment(result);
+ }
+
+ public void onFailure(Throwable caught) {
+ deployingImage.setSrc("/images/status_error.gif");
+ deployingMessage.setText("Failed to Schedule Deployment!");
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to schedule deployment: " + caught.getMessage(), caught);
+ wizard.setBundleDeployment(null);
+ }
+ });
+ } else {
+ bundleServer.scheduleBundleGroupDeployment(wizard.getBundleDeployDefinition().getId(),
+ wizard.getDeployTargetId(), //
+ new AsyncCallback<BundleGroupDeployment>() {
+ public void onSuccess(BundleGroupDeployment result) {
+ deployingImage.setSrc("/images/status_complete.gif");
+ deployingMessage.setText("Bundle Group Deployment Scheduled!");
+ CoreGUI.getMessageCenter().notify(
+ new Message("Schedule bundle group deployment ["
+ + wizard.getBundleDeployDefinition().getName()
+ + "] resource group [" + result.getGroup() + "]", Severity.Info));
+ wizard.setBundleGroupDeployment(result);
+ }
+
+ public void onFailure(Throwable caught) {
+ deployingImage.setSrc("/images/status_error.gif");
+ deployingMessage.setText("Failed to Schedule Group Deployment!");
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to schedule group deployment: " + caught.getMessage(), caught);
+ wizard.setBundleGroupDeployment(null);
+ }
+ });
+ }
}
public void onFailure(Throwable caught) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployTargetStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployTargetStep.java
new file mode 100644
index 0000000..b6803bb
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployTargetStep.java
@@ -0,0 +1,68 @@
+/*
+ * 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.gui.coregui.client.bundle.deploy;
+
+import java.util.HashSet;
+
+import com.smartgwt.client.util.SC;
+import com.smartgwt.client.widgets.Canvas;
+
+import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.AbstractSelector;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceGroupSelector;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceSelector;
+
+public class DeployTargetStep implements WizardStep {
+
+ private final BundleDeployWizard wizard;
+
+ private AbstractSelector selector;
+
+ public DeployTargetStep(BundleDeployWizard bundleCreationWizard) {
+ this.wizard = bundleCreationWizard;
+ }
+
+ public String getName() {
+ return this.wizard.isResourceDeploy() ? "Select Target Resource" : "Select Target Group";
+ }
+
+ public Canvas getCanvas() {
+ if ((null == selector) || isMismatch()) {
+ selector = this.wizard.isResourceDeploy() ? new ResourceSelector() : new ResourceGroupSelector();
+ }
+
+ return selector;
+ }
+
+ private boolean isMismatch() {
+ return ((selector instanceof ResourceSelector && !this.wizard.isResourceDeploy()) || (selector instanceof ResourceGroupSelector && this.wizard
+ .isResourceDeploy()));
+ }
+
+ public boolean nextPage() {
+ HashSet<Integer> selection = selector.getSelection();
+ if (selection.size() != 1) {
+ SC.warn("Select only a single target resource for deployment. Use group deploy for multiple targets.");
+ return false;
+ }
+
+ wizard.setDeployTargetId(selection.iterator().next());
+ return true;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
deleted file mode 100644
index 1e38fab..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
+++ /dev/null
@@ -1,71 +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.gui.coregui.client.bundle.deploy;
-
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.fields.TextItem;
-import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
-import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
-
-import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-
-public class SelectPlatformsStep implements WizardStep {
-
- private final BundleDeployWizard wizard;
- private DynamicForm form;
-
- public SelectPlatformsStep(BundleDeployWizard bundleCreationWizard) {
- this.wizard = bundleCreationWizard;
- }
-
- public String getName() {
- return "Select Target Platforms";
- }
-
- public Canvas getCanvas() {
- if (form == null) {
- form = new DynamicForm();
- form.setWidth100();
- form.setNumCols(2);
- form.setColWidths("50%", "*");
-
- // TODO: this is temporary until we have a resource selection step
- final TextItem platformIdTextItem = new TextItem("platformId", "Platform Resource Id");
- platformIdTextItem.setRequired(true);
- platformIdTextItem.addChangedHandler(new ChangedHandler() {
- public void onChanged(ChangedEvent event) {
- Object value = event.getValue();
- if (value == null) {
- value = "";
- }
- wizard.setPlatformId(Integer.valueOf(value.toString()));
- }
- });
-
- form.setItems(platformIdTextItem);
- }
-
- return form;
- }
-
- public boolean nextPage() {
- return form.validate();
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index 5743653..b55c172 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -26,6 +26,7 @@ import com.google.gwt.user.client.rpc.RemoteService;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
@@ -63,4 +64,7 @@ public interface BundleGWTService extends RemoteService {
ArrayList<BundleType> getAllBundleTypes() throws Exception;
BundleDeployment scheduleBundleDeployment(int bundleDeployDefinitionId, int resourceId) throws Exception;
+
+ BundleGroupDeployment scheduleBundleGroupDeployment(int bundleDeployDefinitionId, int resourceGroupId)
+ throws Exception;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
index 421a66e..7499f0b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
@@ -54,7 +54,7 @@ public class ResourceGroupsDataSource extends RPCDataSource<ResourceGroup> {
return INSTANCE;
}
- private ResourceGroupsDataSource() {
+ public ResourceGroupsDataSource() {
super("ResourceGroups");
DataSourceField idDataField = new DataSourceIntegerField("id", "ID", 20);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java
new file mode 100644
index 0000000..06c322c
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java
@@ -0,0 +1,254 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.selection;
+
+import java.util.HashSet;
+
+import com.google.gwt.user.client.Timer;
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.DragDataAction;
+import com.smartgwt.client.types.DragTrackerMode;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.widgets.ImgProperties;
+import com.smartgwt.client.widgets.TransferImgButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.events.KeyPressEvent;
+import com.smartgwt.client.widgets.events.KeyPressHandler;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
+import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.RecordDropEvent;
+import com.smartgwt.client.widgets.grid.events.RecordDropHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.layout.VStack;
+
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author Greg Hinkle
+ */
+public abstract class AbstractSelector extends HLayout {
+
+ protected HashSet<Integer> selection = new HashSet<Integer>();
+
+ protected ListGrid availableGrid;
+ protected ListGrid assignedGrid;
+
+ protected TransferImgButton addButton;
+ protected TransferImgButton removeButton;
+ protected TransferImgButton addAllButton;
+ protected TransferImgButton removeAllButton;
+
+ protected Criteria latestCriteria;
+
+ public AbstractSelector() {
+ setAlign(VerticalAlignment.BOTTOM);
+ setHeight(380);
+ }
+
+ public HashSet<Integer> getSelection() {
+ return selection;
+ }
+
+ protected abstract DynamicForm getAvailableFilterForm();
+
+ protected abstract RPCDataSource<?> getDataSource();
+
+ protected abstract Criteria getLatestCriteria(DynamicForm availableFilterForm);
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ final DynamicForm availableFilterForm = getAvailableFilterForm();
+
+ VLayout availableLayout = new VLayout();
+ availableLayout.addMember(new LayoutSpacer());
+
+ availableLayout.addMember(availableFilterForm);
+
+ availableGrid = new ListGrid();
+ availableGrid.setHeight(350);
+ availableGrid.setCanDragRecordsOut(true);
+ availableGrid.setDragTrackerMode(DragTrackerMode.ICON);
+ availableGrid.setTrackerImage(new ImgProperties("types/Service_up_16.png", 16, 16));
+ availableGrid.setDragDataAction(DragDataAction.COPY);
+ availableGrid.setDataSource(getDataSource());
+ availableGrid.setFetchDelay(700);
+
+ availableGrid.setAutoFetchData(true);
+ availableGrid.setFields(new ListGridField("icon", 50), new ListGridField("name"));
+
+ availableLayout.addMember(availableGrid);
+
+ addMember(availableLayout);
+
+ availableFilterForm.addItemChangedHandler(new ItemChangedHandler() {
+ public void onItemChanged(ItemChangedEvent itemChangedEvent) {
+ latestCriteria = getLatestCriteria(availableFilterForm);
+
+ Timer t = new Timer() {
+ @Override
+ public void run() {
+ if (latestCriteria != null) {
+ Criteria c = latestCriteria;
+ latestCriteria = null;
+ availableGrid.fetchData(c);
+ }
+ }
+ };
+ t.schedule(500);
+ }
+ });
+
+ VStack moveButtonStack = new VStack(6);
+ moveButtonStack.setAlign(VerticalAlignment.CENTER);
+ moveButtonStack.setWidth(40);
+
+ addButton = new TransferImgButton(TransferImgButton.RIGHT);
+ addButton.setDisabled(true);
+ removeButton = new TransferImgButton(TransferImgButton.LEFT);
+ removeButton.setDisabled(true);
+ addAllButton = new TransferImgButton(TransferImgButton.RIGHT_ALL);
+ removeAllButton = new TransferImgButton(TransferImgButton.LEFT_ALL);
+ removeAllButton.setDisabled(true);
+
+ moveButtonStack.addMember(addButton);
+ moveButtonStack.addMember(removeButton);
+ moveButtonStack.addMember(addAllButton);
+ moveButtonStack.addMember(removeAllButton);
+
+ addMember(moveButtonStack);
+
+ VLayout assignedLayout = new VLayout();
+ assignedLayout.addMember(new LayoutSpacer());
+
+ assignedGrid = new ListGrid();
+ assignedGrid.setHeight(350);
+ assignedGrid.setCanReorderRecords(true);
+ assignedGrid.setCanDragRecordsOut(true);
+
+ assignedGrid.setCanAcceptDroppedRecords(true);
+ ListGridField iconField = new ListGridField("icon", 50);
+ iconField.setType(ListGridFieldType.ICON);
+ assignedGrid.setFields(iconField, new ListGridField("name"));
+
+ assignedLayout.addMember(assignedGrid);
+ addMember(assignedLayout);
+
+ addButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ assignedGrid.transferSelectedData(availableGrid);
+ select(assignedGrid.getSelection());
+ updateButtons();
+ }
+ });
+ removeButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ deselect(assignedGrid.getSelection());
+ assignedGrid.removeSelectedData();
+ updateButtons();
+ }
+ });
+ addAllButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ availableGrid.selectAllRecords();
+ assignedGrid.transferSelectedData(availableGrid);
+ select(availableGrid.getSelection());
+ updateButtons();
+ }
+ });
+ removeAllButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ assignedGrid.selectAllRecords();
+ deselect(assignedGrid.getSelection());
+ assignedGrid.removeSelectedData();
+ updateButtons();
+ }
+ });
+
+ availableGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ updateButtons();
+ }
+ });
+
+ assignedGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ updateButtons();
+ }
+ });
+
+ assignedGrid.addKeyPressHandler(new KeyPressHandler() {
+ public void onKeyPress(KeyPressEvent event) {
+ if ("Delete".equals(event.getKeyName())) {
+ deselect(assignedGrid.getSelection());
+ assignedGrid.removeSelectedData();
+ }
+ }
+ });
+
+ assignedGrid.addRecordDropHandler(new RecordDropHandler() {
+ public void onRecordDrop(RecordDropEvent recordDropEvent) {
+ select(recordDropEvent.getDropRecords());
+ }
+ });
+ }
+
+ protected void updateButtons() {
+ addButton.setDisabled(!availableGrid.anySelected() || availableGrid.getTotalRows() == 0);
+ removeButton.setDisabled(!assignedGrid.anySelected() || assignedGrid.getTotalRows() == 0);
+ addAllButton.setDisabled(availableGrid.getTotalRows() == 0);
+ removeAllButton.setDisabled(assignedGrid.getTotalRows() == 0);
+ }
+
+ protected void select(ListGridRecord[] records) {
+ availableGrid.deselectAllRecords();
+ for (ListGridRecord record : records) {
+ record.setEnabled(false);
+ selection.add(record.getAttributeAsInt("id"));
+ }
+ }
+
+ protected void deselect(ListGridRecord[] records) {
+ HashSet<Integer> toRemove = new HashSet<Integer>();
+ for (ListGridRecord record : records) {
+ toRemove.add(record.getAttributeAsInt("id"));
+ }
+ selection.removeAll(toRemove);
+
+ for (Integer id : toRemove) {
+ Record r = availableGrid.getDataAsRecordList().find("id", id);
+ if (r != null) {
+ ((ListGridRecord) r).setEnabled(true);
+ }
+ }
+ availableGrid.markForRedraw();
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
new file mode 100644
index 0000000..06f6e4b
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
@@ -0,0 +1,81 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.selection;
+
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceGroupSelector extends AbstractSelector {
+
+ public ResourceGroupSelector() {
+ super();
+ }
+
+ protected DynamicForm getAvailableFilterForm() {
+ DynamicForm availableFilterForm = new DynamicForm();
+ availableFilterForm.setNumCols(4);
+ final TextItem search = new TextItem("search", "Search");
+
+ SelectItem groupCategorySelect = new SelectItem("groupCategory", "Group Category");
+ groupCategorySelect.setValueMap("Compatible", "Mixed");
+ groupCategorySelect.setAllowEmptyValue(true);
+ availableFilterForm.setItems(search, groupCategorySelect);
+
+ return availableFilterForm;
+ }
+
+ protected RPCDataSource<?> getDataSource() {
+ return new SelectedResourceGroupsDataSource();
+ }
+
+ protected Criteria getLatestCriteria(DynamicForm availableFilterForm) {
+ Criteria latestCriteria = new Criteria();
+ Object search = availableFilterForm.getValue("search");
+ Object category = availableFilterForm.getValue("groupCategory");
+ latestCriteria.setAttribute("name", search);
+ latestCriteria.setAttribute("groupCategory", category);
+
+ return latestCriteria;
+ }
+
+ private class SelectedResourceGroupsDataSource extends ResourceGroupsDataSource {
+
+ @Override
+ public ListGridRecord[] buildRecords(PageList<ResourceGroup> resourceGroups) {
+ ListGridRecord[] records = super.buildRecords(resourceGroups);
+ for (ListGridRecord record : records) {
+ if (selection.contains(record.getAttributeAsInt("id"))) {
+ record.setEnabled(false);
+ }
+ }
+ return records;
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
index a309ce1..ea092d5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
@@ -18,72 +18,30 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.selection;
-import java.util.HashSet;
-
-import com.google.gwt.user.client.Timer;
import com.smartgwt.client.data.Criteria;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.types.DragDataAction;
-import com.smartgwt.client.types.DragTrackerMode;
-import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.types.VerticalAlignment;
-import com.smartgwt.client.widgets.ImgProperties;
-import com.smartgwt.client.widgets.TransferImgButton;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-import com.smartgwt.client.widgets.events.KeyPressEvent;
-import com.smartgwt.client.widgets.events.KeyPressHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
-import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
import com.smartgwt.client.widgets.form.fields.IPickTreeItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
-import com.smartgwt.client.widgets.grid.ListGrid;
-import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
-import com.smartgwt.client.widgets.grid.events.RecordDropEvent;
-import com.smartgwt.client.widgets.grid.events.RecordDropHandler;
-import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
-import com.smartgwt.client.widgets.grid.events.SelectionEvent;
-import com.smartgwt.client.widgets.layout.HLayout;
-import com.smartgwt.client.widgets.layout.LayoutSpacer;
-import com.smartgwt.client.widgets.layout.VLayout;
-import com.smartgwt.client.widgets.layout.VStack;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeTreeDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
/**
* @author Greg Hinkle
*/
-public class ResourceSelector extends HLayout {
-
- private HashSet<Integer> selection = new HashSet<Integer>();
-
- private ListGrid availableGrid;
- private ListGrid assignedGrid;
-
- private TransferImgButton addButton;
- private TransferImgButton removeButton;
- private TransferImgButton addAllButton;
- private TransferImgButton removeAllButton;
-
- private Criteria latestCriteria;
+public class ResourceSelector extends AbstractSelector {
public ResourceSelector() {
- setAlign(VerticalAlignment.BOTTOM);
- setHeight(380);
+ super();
}
- @Override
- protected void onDraw() {
- super.onDraw();
-
-
- final DynamicForm availableFilterForm = new DynamicForm();
+ protected DynamicForm getAvailableFilterForm() {
+ DynamicForm availableFilterForm = new DynamicForm();
availableFilterForm.setNumCols(6);
final TextItem search = new TextItem("search", "Search");
@@ -93,190 +51,29 @@ public class ResourceSelector extends HLayout {
typeSelectItem.setCanSelectParentItems(true);
typeSelectItem.setLoadDataOnDemand(false);
-
SelectItem categorySelect = new SelectItem("category", "Category");
categorySelect.setValueMap("Platform", "Server", "Service");
categorySelect.setAllowEmptyValue(true);
availableFilterForm.setItems(search, typeSelectItem, categorySelect);
- VLayout availableLayout = new VLayout();
- availableLayout.addMember(new LayoutSpacer());
-
- availableLayout.addMember(availableFilterForm);
-
- availableGrid = new ListGrid();
- availableGrid.setHeight(350);
- availableGrid.setCanDragRecordsOut(true);
- availableGrid.setDragTrackerMode(DragTrackerMode.ICON);
- availableGrid.setTrackerImage(new ImgProperties("types/Service_up_16.png", 16, 16));
- availableGrid.setDragDataAction(DragDataAction.COPY);
- availableGrid.setDataSource(new SelectedResourceDataSource());
- availableGrid.setFetchDelay(700);
-
- availableGrid.setAutoFetchData(true);
- availableGrid.setFields(new ListGridField("icon", 50), new ListGridField("name"));
-
- availableLayout.addMember(availableGrid);
-
- addMember(availableLayout);
-
-
- availableFilterForm.addItemChangedHandler(new ItemChangedHandler() {
- public void onItemChanged(ItemChangedEvent itemChangedEvent) {
- latestCriteria = new Criteria();
- latestCriteria.setAttribute("name", availableFilterForm.getValue("search"));
- latestCriteria.setAttribute("type", availableFilterForm.getValue("type"));
- latestCriteria.setAttribute("category", availableFilterForm.getValue("category"));
-
- Timer t = new Timer() {
- @Override
- public void run() {
- if (latestCriteria != null) {
- Criteria c = latestCriteria;
- latestCriteria = null;
- availableGrid.fetchData(c);
- }
- }
- };
- t.schedule(500);
- }
- });
-
-
- VStack moveButtonStack = new VStack(6);
- moveButtonStack.setAlign(VerticalAlignment.CENTER);
- moveButtonStack.setWidth(40);
-
- addButton = new TransferImgButton(TransferImgButton.RIGHT);
- addButton.setDisabled(true);
- removeButton = new TransferImgButton(TransferImgButton.LEFT);
- removeButton.setDisabled(true);
- addAllButton = new TransferImgButton(TransferImgButton.RIGHT_ALL);
- removeAllButton = new TransferImgButton(TransferImgButton.LEFT_ALL);
- removeAllButton.setDisabled(true);
-
- moveButtonStack.addMember(addButton);
- moveButtonStack.addMember(removeButton);
- moveButtonStack.addMember(addAllButton);
- moveButtonStack.addMember(removeAllButton);
-
- addMember(moveButtonStack);
-
-
- VLayout assignedLayout = new VLayout();
- assignedLayout.addMember(new LayoutSpacer());
-
- assignedGrid = new ListGrid();
- assignedGrid.setHeight(350);
- assignedGrid.setCanReorderRecords(true);
- assignedGrid.setCanDragRecordsOut(true);
-
- assignedGrid.setCanAcceptDroppedRecords(true);
- ListGridField iconField = new ListGridField("icon", 50);
- iconField.setType(ListGridFieldType.ICON);
- assignedGrid.setFields(iconField, new ListGridField("name"));
-
- assignedLayout.addMember(assignedGrid);
- addMember(assignedLayout);
-
-
-
- addButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- assignedGrid.transferSelectedData(availableGrid);
- select(assignedGrid.getSelection());
- updateButtons();
- }
- });
- removeButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- deselect(assignedGrid.getSelection());
- assignedGrid.removeSelectedData();
- updateButtons();
- }
- });
- addAllButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- availableGrid.selectAllRecords();
- assignedGrid.transferSelectedData(availableGrid);
- select(availableGrid.getSelection());
- updateButtons();
- }
- });
- removeAllButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- assignedGrid.selectAllRecords();
- deselect(assignedGrid.getSelection());
- assignedGrid.removeSelectedData();
- updateButtons();
- }
- });
-
- availableGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
- public void onSelectionChanged(SelectionEvent selectionEvent) {
- updateButtons();
- }
- });
-
- assignedGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
- public void onSelectionChanged(SelectionEvent selectionEvent) {
- updateButtons();
- }
- });
-
- assignedGrid.addKeyPressHandler(new KeyPressHandler() {
- public void onKeyPress(KeyPressEvent event) {
- if ("Delete".equals(event.getKeyName())) {
- deselect(assignedGrid.getSelection());
- assignedGrid.removeSelectedData();
- }
- }
- });
-
-
- assignedGrid.addRecordDropHandler(new RecordDropHandler() {
- public void onRecordDrop(RecordDropEvent recordDropEvent) {
- select(recordDropEvent.getDropRecords());
- }
- });
+ return availableFilterForm;
}
- private void updateButtons() {
- addButton.setDisabled(!availableGrid.anySelected() || availableGrid.getTotalRows() == 0);
- removeButton.setDisabled(!assignedGrid.anySelected() || assignedGrid.getTotalRows() == 0);
- addAllButton.setDisabled(availableGrid.getTotalRows() == 0);
- removeAllButton.setDisabled(assignedGrid.getTotalRows() == 0);
+ protected RPCDataSource<?> getDataSource() {
+ return new SelectedResourceDataSource();
}
- private void select(ListGridRecord[] records) {
- availableGrid.deselectAllRecords();
- for (ListGridRecord record : records) {
- record.setEnabled(false);
- selection.add(record.getAttributeAsInt("id"));
- }
- }
+ protected Criteria getLatestCriteria(DynamicForm availableFilterForm) {
+ Criteria latestCriteria = new Criteria();
+ latestCriteria.setAttribute("name", availableFilterForm.getValue("search"));
+ latestCriteria.setAttribute("type", availableFilterForm.getValue("type"));
+ latestCriteria.setAttribute("category", availableFilterForm.getValue("category"));
- private void deselect(ListGridRecord[] records) {
- HashSet<Integer> toRemove = new HashSet<Integer>();
- for (ListGridRecord record : records) {
- toRemove.add(record.getAttributeAsInt("id"));
- }
- selection.removeAll(toRemove);
-
-
- for (Integer id : toRemove) {
- Record r = availableGrid.getDataAsRecordList().find("id", id);
- if (r != null) {
- ((ListGridRecord) r).setEnabled(true);
- }
- }
- availableGrid.markForRedraw();
+ return latestCriteria;
}
-
private class SelectedResourceDataSource extends ResourceDatasource {
-
@Override
public ListGridRecord[] buildRecords(PageList<Resource> resources) {
ListGridRecord[] records = super.buildRecords(resources);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index 5473a94..1477e95 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
@@ -163,4 +164,15 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
+
+ public BundleGroupDeployment scheduleBundleGroupDeployment(int bundleDeployDefinitionId, int resourceGroupId)
+ throws Exception {
+ try {
+ BundleGroupDeployment result = bundleManager.scheduleBundleGroupDeployment(getSessionSubject(),
+ bundleDeployDefinitionId, resourceGroupId);
+ return SerialUtility.prepare(result, "scheduleBundleGroupDeployment");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
}
\ No newline at end of file
commit 8bd78f0b3a282f09d4549dee054d94855509d484
Merge: c3bb31e... ae88c7c...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:31:34 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit c3bb31e179881380b02df5d9dee0743878a3e4c5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:31:14 2010 -0400
introduce a new bundle type - ANT
we now two kinds of bundles - one has a simple recipe style (file template)
and the second uses Ant scripts as its recipe (thus providing a
more advanced way to lay down bundle content on the agent)
diff --git a/.classpath b/.classpath
index 082cf31..c1a9e78 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="modules/common/jboss-as/src/main/java"/>
+ <classpathentry kind="src" path="modules/common/ant-bundle/src/main/java"/>
+ <classpathentry kind="src" path="modules/common/ant-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/common/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/common/filetemplate-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/enterprise/gui/base-perspective-jar/src/main/java"/>
@@ -71,6 +73,7 @@
<classpathentry kind="src" path="modules/enterprise/server/plugins/alert-microblog/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/alert-mobicents/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/cobbler/src/main/java"/>
+ <classpathentry kind="src" path="modules/enterprise/server/plugins/ant-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/server/plugins/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/gui/portal-war/src/main/java"/>
<classpathentry kind="src" path="modules/enterprise/gui/portal-war/src/test/java"/>
@@ -129,6 +132,8 @@
<classpathentry kind="src" path="modules/plugins/jdbctrace/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/augeas/src/test/java"/>
+ <classpathentry kind="src" path="modules/plugins/ant-bundle/src/main/java"/>
+ <classpathentry kind="src" path="modules/plugins/ant-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/plugins/filetemplate-bundle/src/main/java"/>
<classpathentry kind="src" path="modules/plugins/filetemplate-bundle/src/test/java"/>
<classpathentry kind="src" path="modules/helpers/rtfilter/src/main/java"/>
diff --git a/modules/common/ant-bundle/pom.xml b/modules/common/ant-bundle/pom.xml
new file mode 100644
index 0000000..90e3f39
--- /dev/null
+++ b/modules/common/ant-bundle/pom.xml
@@ -0,0 +1,50 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-common-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Ant Bundle Plugins Common Library</name>
+ <description>A library with the code common to the agent and server plugins for Ant Bundles</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/common/ant-bundle/</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/common/ant-bundle/</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/common/ant-bundle/</scm.module.path>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.6.5</version>
+ </dependency>
+
+ <dependency>
+ <groupId>ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.6.5</version>
+ </dependency>
+
+ <!-- include some optional ant tasks for users to be able to use -->
+ <dependency>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ </dependency>
+
+ </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java
new file mode 100644
index 0000000..d5db4cc
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AbstractBundleTask.java
@@ -0,0 +1,27 @@
+/*
+ * 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.bundle.ant;
+
+import org.apache.tools.ant.Task;
+
+public abstract class AbstractBundleTask extends Task {
+ public BundleAntProject getBundleAntProject() {
+ return (BundleAntProject) getProject();
+ }
+}
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
new file mode 100644
index 0000000..b184274
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/AntLauncher.java
@@ -0,0 +1,191 @@
+/*
+ * 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, 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.bundle.ant;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.helper.ProjectHelper2;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
+import org.rhq.core.domain.configuration.definition.PropertySimpleType;
+
+public class AntLauncher {
+
+ // currently, the bundle plugins don't need custom ant tasks, but there is an ant task stubbed for future use here
+ private static final String ANT_TASKS = "bundle-ant-tasks.properties";
+
+ /**
+ * Launches ANT and parses the given build file and optionally executes it.
+ *
+ * @param buildFile the build file that ANT will run
+ * @param target the target to run, <code>null</code> will run the default target
+ * @param customTaskDefs the properties file found in classloader that contains all the taskdef definitions
+ * @param properties set of properties to set for the ANT task to access
+ * @param logFile where ANT messages will be logged
+ * @param logStdOut if <code>true</code>, log messages will be sent to stdout as well as the log file
+ * @param execute if <code>true</code> the ant script will be parsed and executed; otherwise, it will only be parsed
+ *
+ * @throws RuntimeException
+ */
+ public BundleAntProject startAnt(File buildFile, String target, String customTaskDefs, Properties properties,
+ File logFile, boolean logStdOut, boolean execute) {
+
+ PrintWriter logFileOutput = null;
+
+ try {
+ logFileOutput = new PrintWriter(new FileOutputStream(logFile, true));
+
+ ClassLoader classLoader = getClass().getClassLoader();
+
+ Properties taskDefs = new Properties();
+ if (customTaskDefs != null) {
+ InputStream taskDefsStream = classLoader.getResourceAsStream(customTaskDefs);
+ try {
+ taskDefs.load(taskDefsStream);
+ } finally {
+ taskDefsStream.close();
+ }
+ }
+
+ BundleAntProject project = new BundleAntProject();
+ project.setCoreLoader(classLoader);
+ project.init();
+ project.setBaseDir(buildFile.getParentFile());
+
+ if (properties != null) {
+ for (Map.Entry<Object, Object> property : properties.entrySet()) {
+ project.setProperty(property.getKey().toString(), property.getValue().toString());
+ }
+ }
+
+ // notice we are adding the listener after we set the properties - we do not want the
+ // the properties echoed out in the log (in case they contain sensitive passwords)
+ project.addBuildListener(new LoggerAntBuildListener(target, logFileOutput, Project.MSG_DEBUG));
+ if (logStdOut) {
+ PrintWriter stdout = new PrintWriter(System.out);
+ project.addBuildListener(new LoggerAntBuildListener(target, stdout, Project.MSG_INFO));
+ }
+
+ for (Map.Entry<Object, Object> taskDef : taskDefs.entrySet()) {
+ project.addTaskDefinition(taskDef.getKey().toString(), Class.forName(taskDef.getValue().toString(),
+ true, classLoader));
+ }
+
+ ProjectHelper2 helper = new ProjectHelper2();
+ helper.parse(project, buildFile);
+
+ parseBundleFiles(project);
+ parseBundleConfiguration(project);
+
+ if (execute) {
+ project.executeTarget((target == null) ? project.getDefaultTarget() : target);
+ }
+
+ return project;
+
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot run ANT on script [" + buildFile + "]. Cause: " + e, e);
+ } finally {
+ if (logFileOutput != null) {
+ logFileOutput.close();
+ }
+ }
+ }
+
+ private void parseBundleFiles(BundleAntProject project) {
+ Map<String, ? extends Task> refs = project.getReferences();
+ for (Map.Entry<String, ? extends Task> entry : refs.entrySet()) {
+ String refId = entry.getKey();
+ if (refId.startsWith("_bundlefile.")) {
+ Hashtable attribs = entry.getValue().getRuntimeConfigurableWrapper().getAttributeMap();
+
+ if (!attribs.containsKey("name")) {
+ throw new BuildException("Property id=[" + refId + "] must specify the 'name' attribute");
+ }
+ String name = attribs.get("name").toString();
+
+ // allow the bundle author to specify the bundle file in one of the standard two ways
+ Object location = attribs.get("location");
+ Object value = attribs.get("value");
+
+ String bundleFilename;
+ if (location != null) {
+ bundleFilename = location.toString();
+ } else if (value != null) {
+ bundleFilename = value.toString();
+ } else {
+ throw new BuildException("Property id=[" + refId + "], name=[" + name
+ + "] must specify the bundle file name in an attribute named 'location' or 'value'");
+ }
+
+ project.addBundleFile(name, bundleFilename);
+ }
+ }
+ }
+
+ private void parseBundleConfiguration(BundleAntProject project) {
+ Map<String, ? extends Task> refs = project.getReferences();
+ for (Map.Entry<String, ? extends Task> entry : refs.entrySet()) {
+ String refId = entry.getKey();
+ if (refId.startsWith("_bundleconfig.")) {
+ Hashtable attribs = entry.getValue().getRuntimeConfigurableWrapper().getAttributeMap();
+
+ if (!attribs.containsKey("name")) {
+ throw new BuildException("Property id=[" + refId + "] must specify the 'name' attribute");
+ }
+ String name = attribs.get("name").toString();
+
+ // allow the bundle author to specify the bundle config prop in one of the standard two ways
+ Object location = attribs.get("location");
+ Object value = attribs.get("value");
+
+ String bundlePropValue;
+ if (location != null) {
+ bundlePropValue = location.toString();
+ } else if (value != null) {
+ bundlePropValue = value.toString();
+ } else {
+ throw new BuildException("Property id=[" + refId + "], name=[" + name
+ + "] must specify the bundle configuration name in an attribute named 'location' or 'value'");
+ }
+
+ PropertyDefinitionSimple prop = new PropertyDefinitionSimple(name, "Needed by bundle recipe.", false,
+ PropertySimpleType.STRING);
+ prop.setDisplayName(name);
+ prop.setDefaultValue(bundlePropValue);// TODO: I would like to set this-setDefaultValue is deprecated, how to do this?
+ ConfigurationDefinition configDef = project.getConfigurationDefinition();
+ configDef.put(prop);
+ }
+ }
+ }
+}
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java
new file mode 100644
index 0000000..0dd282c
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleAntProject.java
@@ -0,0 +1,50 @@
+/*
+ * 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, 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.bundle.ant;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tools.ant.Project;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+
+public class BundleAntProject extends Project {
+ private final Map<String, String> bundleFiles = new HashMap<String, String>();
+ private ConfigurationDefinition configDef;
+
+ public Map<String, String> getBundleFiles() {
+ return bundleFiles;
+ }
+
+ public void addBundleFile(String name, String filename) {
+ bundleFiles.put(name, filename);
+ }
+
+ public ConfigurationDefinition getConfigurationDefinition() {
+ if (configDef == null) {
+ configDef = new ConfigurationDefinition("antbundle", null);
+ }
+ return configDef;
+ }
+}
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java
new file mode 100644
index 0000000..a21ca6e
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/BundleTask.java
@@ -0,0 +1,29 @@
+/*
+ * 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.bundle.ant;
+
+import org.apache.tools.ant.BuildException;
+
+public class BundleTask extends AbstractBundleTask {
+ @Override
+ public void execute() throws BuildException {
+ // TODO this is a stub for a custom bundle task, in case we need one
+ return;
+ }
+}
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java
new file mode 100644
index 0000000..e7365e3
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/java/org/rhq/bundle/ant/LoggerAntBuildListener.java
@@ -0,0 +1,115 @@
+/*
+ * 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.bundle.ant;
+
+import java.io.PrintWriter;
+import java.util.Date;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+
+/**
+ * Listens for ANT build events and logs them to a log stream.
+ *
+ * @author John Mazzitelli
+ */
+public class LoggerAntBuildListener implements BuildListener {
+ private final String mainTarget;
+ private final PrintWriter output;
+ private final int priorityThreshold;
+
+ public LoggerAntBuildListener(String target, PrintWriter logFile, int priorityThreshold) {
+ this.mainTarget = (target != null) ? target : "(default)";
+ this.output = logFile;
+ this.priorityThreshold = priorityThreshold;
+
+ // start with the date this was started
+ this.output.println("======================================");
+ this.output.println("ANT target [" + this.mainTarget + "]");
+ this.output.println(new Date().toString());
+ this.output.println("======================================");
+ }
+
+ public void buildFinished(BuildEvent event) {
+ logEvent(event, "FINISHED! [" + this.mainTarget + ']');
+ }
+
+ public void buildStarted(BuildEvent event) {
+ logEvent(event, "STARTED! [" + this.mainTarget + ']');
+ }
+
+ public void messageLogged(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void targetFinished(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void targetStarted(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void taskFinished(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ public void taskStarted(BuildEvent event) {
+ logEvent(event, null);
+ }
+
+ private void logEvent(BuildEvent event, String additionalMessage) {
+ if (event.getPriority() > this.priorityThreshold) {
+ return;
+ }
+
+ String message = event.getMessage();
+ Throwable exception = event.getException();
+ Target target = event.getTarget();
+ Task task = event.getTask();
+
+ if (additionalMessage != null) {
+ output.println(additionalMessage);
+ }
+
+ if (target != null) {
+ output.print("[" + target.getName() + "] ");
+ }
+
+ if (task != null) {
+ output.print("[" + task.getTaskName() + "] ");
+ }
+
+ if (message != null) {
+ output.print(message);
+ }
+
+ if (exception != null) {
+ output.println();
+ exception.printStackTrace(output);
+ }
+
+ output.println();
+ output.flush();
+
+ return;
+ }
+}
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties b/modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties
new file mode 100644
index 0000000..6f84e21
--- /dev/null
+++ b/modules/common/ant-bundle/src/main/resources/bundle-ant-tasks.properties
@@ -0,0 +1 @@
+bundle-task=org.rhq.bundle.ant.BundleTask
\ No newline at end of file
diff --git a/modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java b/modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java
new file mode 100644
index 0000000..01de89e
--- /dev/null
+++ b/modules/common/ant-bundle/src/test/java/org/rhq/bundle/ant/AntLauncherTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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, 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.bundle.ant;
+
+import java.io.File;
+import java.util.Map;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+
+@Test
+public class AntLauncherTest {
+ private File logFile;
+
+ @BeforeMethod
+ public void beforeMethod() {
+ logFile = new File("target/test-ant-log.txt");
+ if (logFile.exists()) {
+ if (!logFile.delete()) {
+ System.out.println("Failed to clean up test - log file did not delete");
+ }
+ }
+ return;
+ }
+
+ public void testSimpleParseTest() throws Exception {
+ AntLauncher ant = new AntLauncher();
+ BundleAntProject project = ant.startAnt(getBuildXml("simple-build.xml"), "unnecessary-target", null, null,
+ logFile, true, false);
+ assert project != null;
+ Map<String, String> bundleFiles = project.getBundleFiles();
+ assert bundleFiles != null;
+ assert bundleFiles.size() == 2 : bundleFiles;
+ assert bundleFiles.get("f").equals("file.txt") : bundleFiles;
+ assert bundleFiles.get("pkg").equals("package.zip") : bundleFiles;
+
+ ConfigurationDefinition configDef = project.getConfigurationDefinition();
+ assert configDef.getPropertyDefinitions().size() == 2;
+ assert configDef.getPropertyDefinitionSimple("custom.prop1") != null;
+ assert configDef.getPropertyDefinitionSimple("custom.prop2") != null;
+ }
+
+ public void testSimpleExecTest() throws Exception {
+ AntLauncher ant = new AntLauncher();
+ BundleAntProject project = ant.startAnt(getBuildXml("simple-build.xml"), "first-target", null, null, logFile,
+ true, true);
+ Map<String, String> bundleFiles = project.getBundleFiles();
+ assert bundleFiles != null;
+ assert bundleFiles.size() == 2 : bundleFiles;
+ assert bundleFiles.get("f").equals("file.txt") : bundleFiles;
+ assert bundleFiles.get("pkg").equals("package.zip") : bundleFiles;
+
+ ConfigurationDefinition configDef = project.getConfigurationDefinition();
+ assert configDef.getPropertyDefinitions().size() == 2;
+ assert configDef.getPropertyDefinitionSimple("custom.prop1") != null;
+ assert configDef.getPropertyDefinitionSimple("custom.prop2") != null;
+ }
+
+ private File getBuildXml(String name) throws Exception {
+ File file = new File("target/test-classes", name);
+ assert file.exists() : "the test ant build script doesn't exist: " + file.getAbsolutePath();
+ return file;
+ }
+}
diff --git a/modules/common/ant-bundle/src/test/resources/simple-build.xml b/modules/common/ant-bundle/src/test/resources/simple-build.xml
new file mode 100644
index 0000000..fecb376
--- /dev/null
+++ b/modules/common/ant-bundle/src/test/resources/simple-build.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<project name="simple-bundle-test">
+ <property id="_bundlefile.1" name="f" location="file.txt" />
+ <property id="_bundleconfig.1" name="custom.prop1" location="1" />
+
+ <target name="first-target">
+ <echo>Hello!!!!!!!!</echo>
+ <property id="_bundlefile.2" name="pkg" value="package.zip" />
+ <property id="_bundleconfig.2" name="custom.prop2" value="2" />
+ <echo>World!!!!!!!!</echo>
+ </target>
+</project>
\ No newline at end of file
diff --git a/modules/common/pom.xml b/modules/common/pom.xml
index 8abfe11..1e561b4 100644
--- a/modules/common/pom.xml
+++ b/modules/common/pom.xml
@@ -67,5 +67,6 @@
<modules>
<module>jboss-as</module>
<module>filetemplate-bundle</module>
+ <module>ant-bundle</module>
</modules>
</project>
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java
index 07c49a8..0e83859 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/ServerPluginService.java
@@ -143,12 +143,12 @@ public class ServerPluginService implements ServerPluginServiceManagement {
File tmpDir = LookupUtil.getCoreServer().getJBossServerTempDir();
- // TODO: determine what things to hide from our war classloader
- //StringBuilder defaultRegex = new StringBuilder();
- //defaultRegex.append("(package\\.with\\.classes\\.to\\.hide\\..*)|");
+ // determine what things to hide from our war classloader
+ StringBuilder defaultRegex = new StringBuilder();
+ defaultRegex.append("(org\\.apache\\.tools\\..*)"); // ant.jar
MasterServerPluginContainerConfiguration config;
- config = new MasterServerPluginContainerConfiguration(pluginDir, dataDir, tmpDir, null);
+ config = new MasterServerPluginContainerConfiguration(pluginDir, dataDir, tmpDir, defaultRegex.toString());
pc.initialize(config);
return pc;
}
diff --git a/modules/enterprise/server/plugins/ant-bundle/pom.xml b/modules/enterprise/server/plugins/ant-bundle/pom.xml
new file mode 100644
index 0000000..b044ca3
--- /dev/null
+++ b/modules/enterprise/server/plugins/ant-bundle/pom.xml
@@ -0,0 +1,214 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-enterprise-server-plugins-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-serverplugin-ant-bundle</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Ant Bundle Server Plugin</name>
+ <description>Server side plugin that manages ant-scripted bundles</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/pl…</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/pl…</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/enterprise/server/plugins/ant-bundle/</scm.module.path>
+ </properties>
+
+ <dependencies>
+
+ <!-- Internal Deps -->
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-domain</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-core-client-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <!-- 3rd Party Deps -->
+
+ <!-- TODO: This is a fix for the Javac bug requiring annotations to be
+ available when compiling dependent classes. It is fixed in JDK 6 -->
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>jboss.jboss-embeddable-ejb3</groupId>
+ <artifactId>hibernate-all</artifactId>
+ <version>1.0.0.Alpha9</version>
+ <scope>provided</scope>
+ <!-- needed for referenced domain entities that use Hibernate annotations -->
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludedGroups>${rhq.testng.excludedGroups}</excludedGroups>
+ <!--
+ <argLine>-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y</argLine>
+ -->
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>copy-rhq-plugins</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+
+ <artifactItem>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <!-- include some optional ant tasks for users to be able to use -->
+ <artifactItem>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ </artifactItem>
+
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ <profiles>
+
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-serverplugins</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${rhq.deploymentDir}" />
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.outputDirectory}">
+ <patternset>
+ <include name="META-INF/**" />
+ </patternset>
+ </unjar>
+ <jar destfile="${deployment.file}" manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF"
+ update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+</project>
\ No newline at end of file
diff --git a/modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java b/modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java
new file mode 100644
index 0000000..15e4ecb
--- /dev/null
+++ b/modules/enterprise/server/plugins/ant-bundle/src/main/java/org/rhq/enterprise/server/plugins/ant/AntBundleServerPluginComponent.java
@@ -0,0 +1,125 @@
+/*
+ * 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.plugins.ant;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.bundle.ant.AntLauncher;
+import org.rhq.bundle.ant.BundleAntProject;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.util.stream.StreamUtil;
+import org.rhq.enterprise.server.bundle.RecipeParseResults;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
+import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
+
+/**
+ * A bundle server-side plugin component that the server uses to process ant-based bundles.
+ *
+ * @author John Mazzitelli
+ */
+public class AntBundleServerPluginComponent implements ServerPluginComponent, BundleServerPluginFacet {
+
+ private final Log log = LogFactory.getLog(AntBundleServerPluginComponent.class);
+
+ private ServerPluginContext context;
+ private File tmpDirectory;
+
+ public void initialize(ServerPluginContext context) throws Exception {
+ this.context = context;
+ this.tmpDirectory = new File(this.context.getTemporaryDirectory(), "ant-bundle-server-plugin");
+ this.tmpDirectory.mkdirs();
+ if (!this.tmpDirectory.exists() || !this.tmpDirectory.isDirectory()) {
+ throw new Exception("Failed to create tmp dir [" + this.tmpDirectory + "] - cannot process ant bundles");
+ }
+ log.debug("The ant bundle plugin has been initialized: " + this);
+ }
+
+ public void start() {
+ log.debug("The ant bundle plugin has started: " + this);
+ }
+
+ public void stop() {
+ log.debug("The ant bundle plugin has stopped: " + this);
+ }
+
+ public void shutdown() {
+ log.debug("The ant bundle plugin has been shut down: " + this);
+ }
+
+ public RecipeParseResults parseRecipe(String recipe) throws Exception {
+
+ Map<String, String> bundleFiles = null;
+ ConfigurationDefinition configDef = null;
+ RecipeParseResults results;
+
+ File recipeFile = File.createTempFile("ant-bundle-recipe", ".xml", this.tmpDirectory);
+ File logFile = File.createTempFile("ant-bundle-recipe", ".log", this.tmpDirectory);
+ try {
+ // store the recipe in the tmp recipe file
+ ByteArrayInputStream in = new ByteArrayInputStream(recipe.getBytes());
+ FileOutputStream out = new FileOutputStream(recipeFile);
+ StreamUtil.copy(in, out);
+
+ // parse, but do not execute, the ant script
+ AntLauncher antLauncher = new AntLauncher();
+ BundleAntProject project = antLauncher.startAnt(recipeFile, null, null, null, logFile, false, false);
+
+ // obtain the parse results
+ bundleFiles = project.getBundleFiles();
+ configDef = project.getConfigurationDefinition();
+ } catch (Throwable t) {
+ if (log.isDebugEnabled()) {
+ try {
+ log.debug(new String(StreamUtil.slurp(new FileInputStream(logFile))));
+ } catch (Exception e) {
+ }
+ }
+ throw new Exception("Failed to parse the bundle ANT script", t);
+ } finally {
+ recipeFile.delete();
+ logFile.delete();
+ }
+
+ results = new RecipeParseResults(configDef, new HashSet<String>(bundleFiles.values()));
+ return results;
+
+ }
+
+ @Override
+ public String toString() {
+ if (this.context == null) {
+ return "<no context>";
+ }
+
+ StringBuilder str = new StringBuilder();
+ str.append("plugin-key=").append(this.context.getPluginEnvironment().getPluginKey()).append(",");
+ str.append("plugin-url=").append(this.context.getPluginEnvironment().getPluginUrl());
+ return str.toString();
+ }
+}
diff --git a/modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml
new file mode 100644
index 0000000..23208b7
--- /dev/null
+++ b/modules/enterprise/server/plugins/ant-bundle/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<bundle-plugin name="AntBundleServerPlugin"
+ displayName="Ant Bundle Processor"
+ description="Processes bundles whose recipes are Ant scripts"
+ package="org.rhq.enterprise.server.plugins.ant"
+ xmlns="urn:xmlns:rhq-serverplugin.bundle"
+ xmlns:serverplugin="urn:xmlns:rhq-serverplugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <serverplugin:help><![CDATA[
+ Processes Ant bundles on the server side.
+ ]]></serverplugin:help>
+
+ <serverplugin:plugin-component class="AntBundleServerPluginComponent">
+ </serverplugin:plugin-component>
+
+ <bundle type="Ant Bundle"/>
+
+</bundle-plugin>
diff --git a/modules/enterprise/server/plugins/pom.xml b/modules/enterprise/server/plugins/pom.xml
index b86cde2..06f91cf 100644
--- a/modules/enterprise/server/plugins/pom.xml
+++ b/modules/enterprise/server/plugins/pom.xml
@@ -84,6 +84,7 @@
<module>alert-subject</module>
<module>cobbler</module>
<module>filetemplate-bundle</module>
+ <module>ant-bundle</module>
<module>validate-all-serverplugins</module>
</modules>
diff --git a/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml b/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
index 58e3d40..9c7cc74 100644
--- a/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
+++ b/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
@@ -54,6 +54,7 @@
<pathelement location="../alert-subject/target/alert-subject-${project.version}.jar" />
<pathelement location="../cobbler/target/cobbler-${project.version}.jar" />
<pathelement location="../filetemplate-bundle/target/rhq-serverplugin-filetemplate-bundle-${project.version}.jar" />
+ <pathelement location="../ant-bundle/target/rhq-serverplugin-ant-bundle-${project.version}.jar" />
<pathelement location="../perspectives/core/target/rhq-core-perspective-${project.version}.jar" />
</classpath>
<sysproperty key="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.SimpleLog" />
diff --git a/modules/plugins/ant-bundle/pom.xml b/modules/plugins/ant-bundle/pom.xml
new file mode 100644
index 0000000..3777af9
--- /dev/null
+++ b/modules/plugins/ant-bundle/pom.xml
@@ -0,0 +1,267 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-plugins-parent</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-plugin</artifactId>
+ <packaging>jar</packaging>
+
+ <name>RHQ Ant Bundle Plugin</name>
+ <description>a plugin that processes ant-based bundles</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/plugins/ant-bundle/</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/plugins/ant-bundle/</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/plugins/ant-bundle/</scm.module.path>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>copy-rhq-plugins</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+
+ <artifactItem>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-ant-bundle-common</artifactId>
+ <version>${project.version}</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.6.5</version>
+ </artifactItem>
+
+ <!-- include some optional ant tasks for users to be able to use -->
+ <artifactItem>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ </artifactItem>
+
+ </artifactItems>
+ <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>integration-tests</id>
+ <activation>
+ <property>
+ <name>maven.test.skip</name>
+ <value>!true</value>
+ </property>
+ </activation>
+
+ <build>
+ <plugins>
+ <!-- Integration testing voodoo to load and test this plugin with its plugin dependencies -->
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>pre-integration-test</phase>
+ <configuration>
+ <tasks>
+ <echo>Setting up plugin dependencies for ${project.artifactId}-${project.version}.jar...</echo>
+ <property name="settings.localRepository" location="${user.home}/.m2/repository" />
+ <mkdir dir="target/itest" />
+ <mkdir dir="target/itest/plugins" />
+ <mkdir dir="target/itest/lib" />
+ <copy toDir="target/itest/plugins" flatten="true">
+ <fileset dir="${settings.localRepository}/">
+ <include name="org/rhq/rhq-platform-plugin/${project.version}/rhq-platform-plugin-${project.version}.jar" />
+ </fileset>
+ <fileset dir="${project.build.directory}">
+ <include name="${project.artifactId}-${project.version}.jar" />
+ </fileset>
+ </copy>
+ <unzip dest="target/itest/lib">
+ <fileset dir="${settings.localRepository}/org/hyperic/sigar-dist/${sigar.version}" includes="*.zip" />
+ <patternset>
+ <include name="**/lib/sigar.jar" />
+ <include name="**/lib/bcel*.jar" />
+ <include name="**/lib/*.so" />
+ <include name="**/lib/*.sl" />
+ <include name="**/lib/*.dll" />
+ <include name="**/lib/*.dylib" />
+ </patternset>
+ </unzip>
+ <move todir="target/itest/lib" flatten="true">
+ <fileset dir="target/itest/lib">
+ <include name="**/lib/*" />
+ </fileset>
+ </move>
+ <delete dir="target/itest/lib/hyperic-sigar-${sigar.version}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ <executions>
+ <execution>
+ <id>surefire-it</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <skip>${maven.test.skip}</skip>
+ <excludedGroups>${rhq.testng.excludedGroups}</excludedGroups>
+ <useSystemClassLoader>false</useSystemClassLoader>
+ <argLine>-Dorg.hyperic.sigar.path=${basedir}/target/itest/lib</argLine>
+ <!--
+ <argLine>-Dorg.hyperic.sigar.path=${basedir}/target/itest/lib -Xdebug -Xnoagent -Djava.compiler=NONE
+ -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y</argLine>
+ -->
+ <systemProperties>
+ <property>
+ <name>project.artifactId</name>
+ <value>${project.artifactId}</value>
+ </property>
+ <property>
+ <name>project.version</name>
+ <value>${project.version}</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+
+ </build>
+ </profile>
+
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-downloads/rhq-plugins</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${rhq.deploymentDir}" />
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}" update="true" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.outputDirectory}">
+ <patternset>
+ <include name="META-INF/**" />
+ </patternset>
+ </unjar>
+ <jar destfile="${deployment.file}" manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF"
+ update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
+ </plugins>
+ </build>
+ </profile>
+
+ </profiles>
+
+</project>
diff --git a/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java
new file mode 100644
index 0000000..f523be1
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginComponent.java
@@ -0,0 +1,136 @@
+/*
+ * 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.plugins.ant;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.bundle.ant.AntLauncher;
+import org.rhq.bundle.ant.BundleAntProject;
+import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.Property;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.pluginapi.bundle.BundleDeployRequest;
+import org.rhq.core.pluginapi.bundle.BundleDeployResult;
+import org.rhq.core.pluginapi.bundle.BundleFacet;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.system.SystemInfoFactory;
+import org.rhq.core.util.stream.StreamUtil;
+
+/**
+ * @author John Mazzitelli
+ */
+@SuppressWarnings("unchecked")
+public class AntBundlePluginComponent implements ResourceComponent, BundleFacet {
+
+ private final Log log = LogFactory.getLog(AntBundlePluginComponent.class);
+
+ private ResourceContext resourceContext;
+
+ private File tmpDirectory;
+
+ public void start(ResourceContext context) throws Exception {
+ resourceContext = context;
+ this.tmpDirectory = new File(context.getTemporaryDirectory(), "ant-bundle-plugin");
+ this.tmpDirectory.mkdirs();
+ if (!this.tmpDirectory.exists() || !this.tmpDirectory.isDirectory()) {
+ throw new Exception("Failed to create tmp dir [" + this.tmpDirectory + "] - cannot process ant bundles");
+ }
+ }
+
+ public void stop() {
+ }
+
+ public AvailabilityType getAvailability() {
+ return AvailabilityType.UP;
+ }
+
+ public BundleDeployResult deployBundle(BundleDeployRequest request) {
+ BundleDeployResult result = new BundleDeployResult();
+ try {
+ BundleDeployDefinition bundleDeployDef = request.getBundleDeployDefinition();
+ BundleVersion bundleVersion = bundleDeployDef.getBundleVersion();
+
+ String recipe = bundleVersion.getRecipe();
+ File recipeFile = File.createTempFile("ant-bundle-recipe", ".xml", request.getBundleFilesLocation());
+ File logFile = File.createTempFile("ant-bundle-recipe", ".log", this.tmpDirectory);
+ try {
+ // store the recipe in the tmp recipe file
+ ByteArrayInputStream in = new ByteArrayInputStream(recipe.getBytes());
+ FileOutputStream out = new FileOutputStream(recipeFile);
+ StreamUtil.copy(in, out);
+
+ // get the bundle's configuration values and the global system facts and
+ // add them as ant properties so the ant script can get their values
+ Configuration config = bundleDeployDef.getConfiguration();
+ Map<String, String> sysFacts = SystemInfoFactory.fetchTemplateEngine().getTokens();
+ Properties antProps = new Properties();
+ for (Map.Entry<String, String> fact : sysFacts.entrySet()) {
+ antProps.setProperty(fact.getKey(), fact.getValue());
+ }
+ if (config != null) {
+ Map<String, Property> allProperties = config.getAllProperties();
+ for (Map.Entry<String, Property> entry : allProperties.entrySet()) {
+ String name = entry.getKey();
+ Property prop = entry.getValue();
+ String value;
+ if (prop instanceof PropertySimple) {
+ value = ((PropertySimple) prop).getStringValue();
+ } else {
+ // for now, just skip all property lists and maps, just assume we are getting simples
+ continue;
+ }
+ antProps.setProperty(name, value);
+ }
+ }
+
+ // parse & execute, the ant script
+ AntLauncher antLauncher = new AntLauncher();
+ BundleAntProject project = antLauncher.startAnt(recipeFile, null, null, antProps, logFile, false, true);
+ } catch (Throwable t) {
+ if (log.isDebugEnabled()) {
+ try {
+ log.debug(new String(StreamUtil.slurp(new FileInputStream(logFile))));
+ } catch (Exception e) {
+ }
+ }
+ throw new Exception("Failed to parse the bundle ANT script", t);
+ } finally {
+ recipeFile.delete();
+ logFile.delete();
+ }
+
+ } catch (Throwable t) {
+ log.error("Failed to deploy bundle [" + request + "]", t);
+ result.setErrorMessage(t);
+ }
+ return result;
+ }
+}
diff --git a/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java
new file mode 100644
index 0000000..50a2f86
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/main/java/org/rhq/plugins/ant/AntBundlePluginDiscoveryComponent.java
@@ -0,0 +1,51 @@
+/*
+ * 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.plugins.ant;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
+import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
+
+/**
+ * @author John Mazzitelli
+ */
+@SuppressWarnings("unchecked")
+public class AntBundlePluginDiscoveryComponent implements ResourceDiscoveryComponent {
+ //private final Log log = LogFactory.getLog(FileTemplateBundlePluginDiscoveryComponent.class);
+
+ public Set<DiscoveredResourceDetails> discoverResources(ResourceDiscoveryContext context) {
+
+ HashSet<DiscoveredResourceDetails> set = new HashSet<DiscoveredResourceDetails>();
+
+ String key = "ant-bundle";
+ String name = "Ant Bundle Handler";
+ String version = this.getClass().getPackage().getImplementationVersion();
+ String description = "Processes bundles whose recipes are Ant scripts";
+
+ DiscoveredResourceDetails resource = new DiscoveredResourceDetails(context.getResourceType(), key, name,
+ version, description, null, null);
+
+ set.add(resource);
+
+ return set;
+ }
+}
\ No newline at end of file
diff --git a/modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml
new file mode 100644
index 0000000..ce2b150
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/main/resources/META-INF/rhq-plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<plugin name="AntBundlePlugin"
+ displayName="Ant Bundle Plugin"
+ package="org.rhq.plugins.ant"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+
+ <server name="Ant Bundle Handler Server"
+ discovery="AntBundlePluginDiscoveryComponent"
+ class="AntBundlePluginComponent"
+ singleton="true"
+ description="This plugin is used to process Ant bundles">
+
+ <bundle type="Ant Bundle" />
+
+ </server>
+</plugin>
diff --git a/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
new file mode 100644
index 0000000..4f2f28b
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/java/org/rhq/plugins/ant/AntBundlePluginComponentTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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, 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.ant;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.pluginapi.bundle.BundleDeployRequest;
+import org.rhq.core.pluginapi.bundle.BundleDeployResult;
+import org.rhq.core.pluginapi.inventory.ResourceContext;
+import org.rhq.core.system.SystemInfoFactory;
+import org.rhq.core.util.stream.StreamUtil;
+
+@Test
+public class AntBundlePluginComponentTest {
+
+ private AntBundlePluginComponent plugin;
+ private File tmpDir;
+
+ @BeforeMethod
+ public void beforeMethod() throws Exception {
+ tmpDir = new File("target/antbundletest");
+ tmpDir.mkdirs();
+ plugin = new AntBundlePluginComponent();
+ ResourceType type = new ResourceType("antBundleTestType", "antBundleTestPlugin", ResourceCategory.SERVER, null);
+ Resource resource = new Resource("antBundleTestKey", "antBundleTestName", type);
+ ResourceContext<?> context = new ResourceContext(resource, null, null,
+ SystemInfoFactory.createJavaSystemInfo(), tmpDir, null, "antBundleTestPC", null, null, null, null, null);
+ plugin.start(context);
+ }
+
+ @BeforeClass
+ @AfterMethod
+ public void cleanTmpDir() {
+ if (tmpDir != null) {
+ File[] files = tmpDir.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ file.delete();
+ }
+ }
+ }
+ }
+
+ public void testSimpleBundle() throws Exception {
+ ResourceType resourceType = new ResourceType("testSimpleBundle", "plugin", ResourceCategory.SERVER, null);
+ BundleType bundleType = new BundleType("testSimpleBundle", resourceType);
+ Bundle bundle = new Bundle("testSimpleBundle", bundleType);
+ BundleVersion bundleVersion = new BundleVersion("testSimpleBundle", "1.0", bundle,
+ getRecipeFromFile("simple-build.xml"));
+
+ BundleDeployDefinition deployDef = new BundleDeployDefinition();
+ deployDef.setBundleVersion(bundleVersion);
+ deployDef.setConfiguration(null);
+
+ BundleDeployRequest request = new BundleDeployRequest();
+ request.setBundleFilesLocation(tmpDir);
+ request.setBundleDeployDefinition(deployDef);
+
+ BundleDeployResult results = plugin.deployBundle(request);
+
+ assertResultsSuccess(results);
+
+ // our ant script wrote some output that we should verify to make sure we ran it
+ File outputFile = new File(tmpDir, "output.1");
+ String output = new String(StreamUtil.slurp(new FileInputStream(outputFile)));
+ assert output.equals("HELLO WORLD") : output;
+
+ }
+
+ public void testAntBundle() throws Exception {
+ ResourceType resourceType = new ResourceType("testSimpleBundle", "plugin", ResourceCategory.SERVER, null);
+ BundleType bundleType = new BundleType("testSimpleBundle", resourceType);
+ Bundle bundle = new Bundle("testSimpleBundle", bundleType);
+ BundleVersion bundleVersion = new BundleVersion("testSimpleBundle", "1.0", bundle,
+ getRecipeFromFile("test-build.xml"));
+
+ Configuration config = new Configuration();
+ config.put(new PropertySimple("custom.prop1", "custom property 1"));
+ config.put(new PropertySimple("custom.prop2", "custom property 2"));
+
+ BundleDeployDefinition deployDef = new BundleDeployDefinition();
+ deployDef.setBundleVersion(bundleVersion);
+ deployDef.setConfiguration(config);
+
+ File file1 = new File(tmpDir, "file.txt");
+ File file2 = new File(tmpDir, "package.zip");
+ assert file1.createNewFile() : "could not create our mock bundle file";
+ assert file2.createNewFile() : "could not create our mock bundle file";
+
+ BundleDeployRequest request = new BundleDeployRequest();
+ request.setBundleFilesLocation(tmpDir);
+ request.setBundleDeployDefinition(deployDef);
+
+ BundleDeployResult results = plugin.deployBundle(request);
+
+ assertResultsSuccess(results);
+
+ // our ant script wrote some output that we should verify to make sure we ran it
+ File outputFile = new File(tmpDir, "output.2");
+ Properties props = new Properties();
+ props.load(new FileInputStream(outputFile));
+ assert props.getProperty("prop1").equals("custom property 1") : props;
+ assert props.getProperty("prop2").equals("custom property 2") : props;
+ assert props.getProperty("f.exists").equals("true") : props;
+ assert props.getProperty("pkg.exists").equals("true") : props;
+ assert props.getProperty("hostname").equals(SystemInfoFactory.createSystemInfo().getHostname()) : props;
+ assert props.getProperty("tmpdir").equals(System.getProperty("java.io.tmpdir")) : props;
+ }
+
+ private void assertResultsSuccess(BundleDeployResult results) {
+ if (results.getErrorMessage() != null) {
+ assert false : "Failed to process bundle: [" + results.getErrorMessage() + "]";
+ }
+ }
+
+ private String getRecipeFromFile(String filename) {
+ InputStream stream = getClass().getClassLoader().getResourceAsStream(filename);
+ byte[] contents = StreamUtil.slurp(stream);
+ return new String(contents);
+ }
+}
diff --git a/modules/plugins/ant-bundle/src/test/resources/log4j.xml b/modules/plugins/ant-bundle/src/test/resources/log4j.xml
new file mode 100644
index 0000000..181834e
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/resources/log4j.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- tests configuration that only dumps WARN or higher messages due to appender threadhold -->
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+
+ <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+ <param name="Threshold" value="ERROR"/>
+ <param name="Target" value="System.out"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t] (%c{5}) - %m%n"/>
+ </layout>
+ </appender>
+
+ <appender name="FILE" class="org.apache.log4j.FileAppender">
+ <param name="File" value="target/test.log"/>
+ <param name="Threshold" value="DEBUG"/>
+ <param name="Append" value="false"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} (%F:%M:%L) -%m%n"/>
+ </layout>
+ </appender>
+
+ <category name="org.rhq">
+ <priority value="DEBUG"/>
+ </category>
+
+ <root>
+ <appender-ref ref="CONSOLE"/>
+ <appender-ref ref="FILE"/>
+ </root>
+
+</log4j:configuration>
diff --git a/modules/plugins/ant-bundle/src/test/resources/simple-build.xml b/modules/plugins/ant-bundle/src/test/resources/simple-build.xml
new file mode 100644
index 0000000..c1606dc
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/resources/simple-build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<project name="test" default="init">
+ <property name="outfile" value="${basedir}/output.1" />
+
+ <target name="init">
+ <echo file="${outfile}" message="HELLO WORLD"/>
+ </target>
+</project>
\ No newline at end of file
diff --git a/modules/plugins/ant-bundle/src/test/resources/test-build.xml b/modules/plugins/ant-bundle/src/test/resources/test-build.xml
new file mode 100644
index 0000000..4b0b778
--- /dev/null
+++ b/modules/plugins/ant-bundle/src/test/resources/test-build.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<project name="simple-build" default="first-target">
+ <property id="_bundlefile.1" name="f" location="file.txt" />
+ <property id="_bundleconfig.1" name="custom.prop1" location="1" />
+
+ <property name="outfile" value="${basedir}/output.2" />
+
+ <target name="first-target">
+ <property id="_bundlefile.2" name="pkg" value="${basedir}/package.zip" />
+ <property id="_bundleconfig.2" name="custom.prop2" value="2" />
+
+ <condition property="file.f.exists">
+ <available file="${f}" />
+ </condition>
+ <condition property="file.pkg.exists">
+ <available file="${pkg}" />
+ </condition>
+
+ <echo file="${outfile}">prop1=${custom.prop1}
+prop2=${custom.prop2}
+f.exists=${file.f.exists}
+pkg.exists=${file.pkg.exists}
+hostname=${rhq.system.hostname}
+tmpdir=${rhq.system.sysprop.java.io.tmpdir}
+ </echo>
+ </target>
+</project>
\ No newline at end of file
diff --git a/modules/plugins/pom.xml b/modules/plugins/pom.xml
index d41b7b1..76ee0ee 100644
--- a/modules/plugins/pom.xml
+++ b/modules/plugins/pom.xml
@@ -162,6 +162,7 @@
<!-- bundle plugins -->
<module>filetemplate-bundle</module>
+ <module>ant-bundle</module>
</modules>
</profile>
diff --git a/modules/plugins/validate-all-plugins/pom.xml b/modules/plugins/validate-all-plugins/pom.xml
index 01e2a34..b3d5e87 100644
--- a/modules/plugins/validate-all-plugins/pom.xml
+++ b/modules/plugins/validate-all-plugins/pom.xml
@@ -62,6 +62,7 @@
<pathelement location="../virt/target/rhq-virt-plugin-${project.version}.jar" />
<pathelement location="../kickstart/target/rhq-kickstart-plugin-${project.version}.jar" />
<pathelement location="../filetemplate-bundle/target/rhq-filetemplate-bundle-plugin-${project.version}.jar" />
+ <pathelement location="../ant-bundle/target/rhq-ant-bundle-plugin-${project.version}.jar" />
</classpath>
<sysproperty key="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.SimpleLog" />
<!--
commit d4e2842142ab368dee94fdee322f8168837956aa
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:29:04 2010 -0400
force the filetemplate plugin to use its own gnu getopt just to isolate it from the servers's version (this probably isn't that important to do)
diff --git a/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml b/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml
index 4a3536e..44cdb03 100644
--- a/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml
+++ b/modules/enterprise/server/plugins/filetemplate-bundle/pom.xml
@@ -101,6 +101,12 @@
<version>${project.version}</version>
</artifactItem>
+ <artifactItem>
+ <groupId>gnu-getopt</groupId>
+ <artifactId>getopt</artifactId>
+ <!-- NOTE: The version is defined in the root POM's dependencyManagement section. -->
+ </artifactItem>
+
</artifactItems>
<outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
</configuration>
commit 5f33867f613ccc768ef2e30efb9ffc722d6b77fa
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:27:49 2010 -0400
allow public API to obtain tokens from the template engine
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index d748463..79ad1ff 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -37,6 +37,10 @@ public class TemplateEngine implements Serializable {
this.tokens = tokens;
}
+ public Map<String, String> getTokens() {
+ return this.tokens;
+ }
+
public String replaceTokens(String input) {
StringBuffer buffer = new StringBuffer();
Matcher matcher = tokenPattern.matcher(input);
commit 0c03d1eb6b3b03cabe58a17dbb98bd43307ca127
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 29 00:27:11 2010 -0400
make the parse call directly in the bundle PC so we can set context CL
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 7b41da0..61715df 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
@@ -79,7 +79,6 @@ import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
-import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.enterprise.server.util.HibernateDetachUtility;
@@ -248,12 +247,11 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// parse the recipe (validation occurs here) and get the config def and list of files
BundleType bundleType = bundle.getBundleType();
- BundleServerPluginFacet bp = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
- .getBundleServerPluginFacet(bundleType.getName());
RecipeParseResults results;
try {
- results = bp.parseRecipe(recipe);
+ results = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager().parseRecipe(
+ bundleType.getName(), recipe);
} catch (Exception e) {
// ensure that we throw a runtime exception to force a rollback
throw new RuntimeException("Failed to parse recipe", e);
@@ -574,9 +572,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// parse the recipe (validation occurs here) and get the config def and list of files
BundleType bundleType = bundleVersion.getBundle().getBundleType();
- BundleServerPluginFacet bp = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
- .getBundleServerPluginFacet(bundleType.getName());
- RecipeParseResults parseResults = bp.parseRecipe(bundleVersion.getRecipe());
+ RecipeParseResults parseResults = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
+ .parseRecipe(bundleType.getName(), bundleVersion.getRecipe());
Set<String> result = parseResults.getBundleFileNames();
@@ -613,9 +610,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// parse the recipe (validation occurs here) and get the config def and list of files
BundleType bundleType = bundleVersion.getBundle().getBundleType();
- BundleServerPluginFacet bp = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
- .getBundleServerPluginFacet(bundleType.getName());
- RecipeParseResults parseResults = bp.parseRecipe(bundleVersion.getRecipe());
+ RecipeParseResults parseResults = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager()
+ .parseRecipe(bundleType.getName(), bundleVersion.getRecipe());
Set<String> filenames = parseResults.getBundleFileNames();
Map<String, Boolean> result = new HashMap<String, Boolean>(filenames.size());
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java
index 68f8a0f..7387f3a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/bundle/BundleServerPluginManager.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.plugin.pc.bundle;
+import org.rhq.enterprise.server.bundle.RecipeParseResults;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
@@ -68,28 +69,51 @@ public class BundleServerPluginManager extends ServerPluginManager {
}
/**
- * Given the {@link BundleType#getName() name of a bundle type}, this will return the stateful plugin component
- * that manages bundles of that type.
+ * Given the {@link BundleType#getName() name of a bundle type}, this will parse the given recipe by asking the
+ * bundle plugin that can parse a recipe of that bundle type.
*
- * @param bundleTypeName
+ * @param bundleTypeName essentially identifies the kind of recipe that is to be parsed
+ * @param recipe the recipe to parse
*
- * @return the plugin component object that will manage bundles of the named bundle type; <code>null</code> if there is no plugin
- * that can support the given bundle type
+ * @return the results of the parse
+ *
+ * @throws Exception if the recipe could not be parsed successfully
*/
- public BundleServerPluginFacet getBundleServerPluginFacet(String bundleTypeName) {
+ public RecipeParseResults parseRecipe(String bundleTypeName, String recipe) throws Exception {
+
if (bundleTypeName == null) {
throw new IllegalArgumentException("bundleTypeName == null");
}
+ if (recipe == null) {
+ throw new IllegalArgumentException("recipe == null");
+ }
+ // find the plugin environment for the bundle plugin of the given type
+ ServerPluginEnvironment pluginEnv = null;
for (ServerPluginEnvironment env : getPluginEnvironments()) {
BundlePluginDescriptorType descriptor = (BundlePluginDescriptorType) env.getPluginDescriptor();
if (bundleTypeName.equals(descriptor.getBundle().getType())) {
- ServerPluginComponent component = getServerPluginComponent(env.getPluginKey().getPluginName());
- // we know this cast will work because our loadPlugin ensured that this component implements this interface
- return (BundleServerPluginFacet) component;
+ pluginEnv = env;
+ break;
}
}
- return null;
+ if (pluginEnv == null) {
+ throw new IllegalArgumentException("Bundle type [" + bundleTypeName + "] is not known to the system");
+ }
+
+ // get the facet and call the parse method in the appropriate classloader
+ String pluginName = pluginEnv.getPluginKey().getPluginName();
+ ServerPluginComponent component = getServerPluginComponent(pluginName);
+ BundleServerPluginFacet facet = (BundleServerPluginFacet) component; // we know this cast will work because our loadPlugin ensured so
+ getLog().debug("Bundle server plugin [" + pluginName + "] is parsing a bundle recipe");
+ ClassLoader originalContextClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(pluginEnv.getPluginClassLoader());
+ RecipeParseResults results = facet.parseRecipe(recipe);
+ return results;
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalContextClassLoader);
+ }
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
index 90aab2f..20fa204 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
@@ -187,9 +187,8 @@ public class TestBundleServerPluginService extends ServerPluginService implement
}
@Override
- public BundleServerPluginFacet getBundleServerPluginFacet(String bundleTypeName) {
-
- return new TestBundlePluginComponent();
+ public RecipeParseResults parseRecipe(String bundleTypeName, String recipe) throws Exception {
+ return new TestBundlePluginComponent().parseRecipe(recipe);
}
}
commit ae88c7ce59839f71a1f5a58d713671c2d0aef03d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 19:54:52 2010 -0400
see if setting an initial value fixes the single-value drop down issue.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
index 52f7c5b..700104f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
@@ -136,6 +136,7 @@ public class SelectBundleVersionStep implements WizardStep {
radioGroupItem.redraw();
selectVersionItem.setValueMap(selectVersionValues);
+ selectVersionItem.setValue(latestVersion.getVersion());
selectVersionItem.redraw();
form.markForRedraw();
commit 4575847ce04b52cfc2f1b5fe47a1fe0b562a600b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 19:36:32 2010 -0400
re-enable single deployment test
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
index 34986f1..bf1c901 100644
--- a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -26,7 +26,7 @@
* said platform.
*/
-var TestsEnabled = false;
+var TestsEnabled = true;
var bundleName = 'testScriptBundle';
@@ -83,9 +83,9 @@ function testDeployment() {
}
function testGroupDeployment() {
-// if ( !TestsEnabled ) {
-// return;
-// }
+ if ( !TestsEnabled ) {
+ return;
+ }
// delete the test bundle if it exists
cleanupTestBundle();
commit 25ca25ee29ce5c69678be92d60c72f2da6100e4c
Merge: 5ee5728... a13969c...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 15:56:19 2010 -0400
Merge branch 'gwt' into gwt-jay
commit 5ee572891e50172aeeee1619ea15814d1bea61e1
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Sun Mar 28 15:54:32 2010 -0400
Domain Model Change and Refactor
Change from a single PackageType for a BundleType to a PackageType per
Bundle.
The former approach originally worked with the idea that
Package.classification set to bundleName could be used to distinguish
between BundleFile packages with the same name but contained in different
bundles. But the fact that classification was never designed to
be used as part of the natural key for a package would have forced a large
refactor potentially conflicting with the current use of classification.
The alternatives were to add a Package.subType to package and make it part
of the natural key. This would have been specific to the needs of bundling
and again added changes to the underlying content domain model. Instead
it was deemed reasonable to have a devoted PackageType per Bundle. This
model does create a potentially large number of packageTypes
(one per bundle) on the BundleType's ResourceType. But it's not clear that
creates any problem. It has the advantage of leveraging the Package
design without introducing any more complexity. Also, Bundle deletion now
can cause cascade removals of the packages for its package type.
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 005bafb..90a71a7 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -501,6 +501,7 @@
<column name="DESCRIPTION" size="500" type="VARCHAR2" required="false"/>
<column name="BUNDLE_TYPE_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_TYPE"/>
<column name="REPO_ID" type="INTEGER" required="true" references="RHQ_REPO"/>
+ <column name="PACKAGE_TYPE_ID" type="INTEGER" required="true" references="RHQ_PACKAGE_TYPE"/>
<!-- This index is for constraint, not performance -->
<index name="RHQ_BUNDLE_UNIQUE" unique="true">
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 326f3ba..2bb52d7 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -2852,6 +2852,7 @@
<schemaSpec version="2.78.1">
<schema-addColumn table="RHQ_BUNDLE" column="REPO_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_BUNDLE" column="REPO_ID" nullable="FALSE" />
<schema-directSQL>
<statement desc="Creating RHQ_BUNDLE foreign key relation to RHQ_REPO">
ALTER TABLE RHQ_BUNDLE
@@ -2922,13 +2923,13 @@
<schema-directSQL>
<statement desc="Creating RHQ_BUNDLE_GROUP_DEPLOY foreign key relation to RHQ_RESOURCE_GROUP">
ALTER TABLE RHQ_BUNDLE_GROUP_DEPLOY
- ADD CONSTRAINT RHQ_RESOURCE_GROUP_FK
+ ADD CONSTRAINT RHQ_RESOURCE_GROUP_ID_FK
FOREIGN KEY (GROUP_ID)
REFERENCES RHQ_RESOURCE_GROUP (ID)
</statement>
<statement desc="Creating RHQ_BUNDLE_GROUP_DEPLOY foreign key relation to RHQ_BUNDLE_DEPLOY_DEF">
ALTER TABLE RHQ_BUNDLE_GROUP_DEPLOY
- ADD CONSTRAINT RHQ_BUNDLE_DEPLOY_DEF_FK
+ ADD CONSTRAINT RHQ_BUNDLE_DEPLOY_DEF_ID_FK
FOREIGN KEY (BUNDLE_DEPLOY_DEF_ID)
REFERENCES RHQ_BUNDLE_DEPLOY_DEF (ID)
</statement>
@@ -2938,7 +2939,7 @@
<schema-directSQL>
<statement desc="Creating RHQ_BUNDLE_DEPLOY foreign key relation to RHQ_BUNDLE_GROUP_DEPLOY">
ALTER TABLE RHQ_BUNDLE_DEPLOY
- ADD CONSTRAINT RHQ_BUNDLE_GROUP_DEPLOY_FK
+ ADD CONSTRAINT RHQ_BUNDLE_GROUP_DEPLOY_ID_FK
FOREIGN KEY (BUNDLE_GROUP_DEPLOY_ID)
REFERENCES RHQ_BUNDLE_GROUP_DEPLOY (ID)
</statement>
@@ -2950,6 +2951,19 @@
<schema-alterColumn table="RHQ_BUNDLE_DEPLOY" column="STATUS" nullable="FALSE" />
</schemaSpec>
+ <schemaSpec version="2.78.7">
+ <schema-addColumn table="RHQ_BUNDLE" column="PACKAGE_TYPE_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_BUNDLE" column="PACKAGE_TYPE_ID" nullable="FALSE" />
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE foreign key relation to RHQ_PACKAGE_TYPE">
+ ALTER TABLE RHQ_BUNDLE
+ ADD CONSTRAINT RHQ_PACKAGE_TYPE_ID_FK
+ FOREIGN KEY (PACKAGE_TYPE_ID)
+ REFERENCES RHQ_PACKAGE_TYPE (ID)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
<schemaSpec version="2.79">
<schema-directSQL>
<statement desc="Normalizing resource group descriptions">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
index 1573d6d..261a54e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
@@ -44,6 +44,7 @@ import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
+import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.Repo;
/**
@@ -89,6 +90,10 @@ public class Bundle implements Serializable {
@OneToOne(fetch = FetchType.LAZY, optional = false)
private Repo repo;
+ @JoinColumn(name = "PACKAGE_TYPE_ID", referencedColumnName = "ID", nullable = false)
+ @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
+ private PackageType packageType;
+
@OneToMany(mappedBy = "bundle", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<BundleVersion> bundleVersions = new ArrayList<BundleVersion>();
@@ -138,6 +143,14 @@ public class Bundle implements Serializable {
this.bundleType = bundleType;
}
+ public PackageType getPackageType() {
+ return packageType;
+ }
+
+ public void setPackageType(PackageType packageType) {
+ this.packageType = packageType;
+ }
+
public Repo getRepo() {
return repo;
}
@@ -161,7 +174,7 @@ public class Bundle implements Serializable {
@Override
public String toString() {
- return "Bundle[id=" + id + ",name=" + name + ",bundleType=" + bundleType + "]";
+ return "Bundle[id=" + id + ",name=" + name + ",bundleType=" + bundleType + ",packageType=" + packageType + "]";
}
@Override
@@ -169,6 +182,7 @@ public class Bundle implements Serializable {
final int prime = 31;
int result = 1;
result = (prime * result) + ((name == null) ? 0 : name.hashCode());
+ result = (prime * result) + ((bundleType == null) ? 0 : bundleType.hashCode());
return result;
}
@@ -192,6 +206,14 @@ public class Bundle implements Serializable {
return false;
}
+ if (bundleType == null) {
+ if (other.bundleType != null) {
+ return false;
+ }
+ } else if (!bundleType.equals(other.bundleType)) {
+ return false;
+ }
+
return true;
}
}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java
index 9a7bce8..2b7017f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageCategory.java
@@ -1,25 +1,25 @@
- /*
- * 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.domain.content;
/**
@@ -53,7 +53,12 @@ public enum PackageCategory {
/**
* A log file
*/
- LOG("Log");
+ LOG("Log"),
+
+ /**
+ * A bundle file, deployable as part of a bundle deploy.
+ */
+ BUNDLE("Bundle");
// Attributes --------------------------------------------
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
index a6b2292..9495b80 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
@@ -36,11 +36,14 @@ public class BundleCriteria extends Criteria {
private Integer filterId;
private Integer filterBundleTypeId; // needs override
- private String filterBundleTypeName; // needs override
+ private String filterBundleTypeName; // needs override
private String filterDescription;
private String filterName;
+ private Integer filterPackageTypeId; // needs override
+ private String filterPackageTypeName; // needs override
private boolean fetchBundleVersions;
+ private boolean fetchPackageType;
private boolean fetchRepo;
private PageOrdering sortName;
@@ -49,6 +52,9 @@ public class BundleCriteria extends Criteria {
public BundleCriteria() {
filterOverrides.put("bundleTypeId", "bundleType.id = ?");
filterOverrides.put("bundleTypeName", "bundleType.name like ?");
+ filterOverrides.put("packageTypeId", "packageType.id = ?");
+ filterOverrides.put("packageTypeName", "packageType.name like ?");
+
}
@Override
@@ -76,10 +82,22 @@ public class BundleCriteria extends Criteria {
this.filterName = filterName;
}
+ public void addFilterPackageTypeId(Integer filterPackageTypeId) {
+ this.filterPackageTypeId = filterPackageTypeId;
+ }
+
+ public void addFilterPackageTypeName(String filterPackageTypeName) {
+ this.filterPackageTypeName = filterPackageTypeName;
+ }
+
public void fetchBundleVersions(boolean fetchBundleVersions) {
this.fetchBundleVersions = fetchBundleVersions;
}
+ public void fetchPackageType(boolean fetchPackageType) {
+ this.fetchPackageType = fetchPackageType;
+ }
+
public void fetchRepo(boolean fetchRepo) {
this.fetchRepo = fetchRepo;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
index 54b4930..96a8594 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
@@ -23,8 +23,6 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
-import org.rhq.core.domain.bundle.BundleDeployDefinition;
-
/**
* @author Jay Shaughnessy
*/
@@ -42,12 +40,13 @@ public class BundleDeployDefinitionCriteria extends Criteria {
private boolean fetchBundleVersion;
private boolean fetchConfiguration;
private boolean fetchDeployments;
+ private boolean fetchGroupDeployments;
public BundleDeployDefinitionCriteria() {
}
@Override
- public Class getPersistentClass() {
+ public Class<?> getPersistentClass() {
return BundleDeployDefinitionCriteria.class;
}
@@ -79,4 +78,8 @@ public class BundleDeployDefinitionCriteria extends Criteria {
this.fetchDeployments = fetchDeployments;
}
+ public void fetchGroupDeployments(boolean fetchGroupDeployments) {
+ this.fetchGroupDeployments = fetchGroupDeployments;
+ }
+
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
index 47f500c..7db3060 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
@@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentStatus;
/**
* @author Jay Shaughnessy
@@ -38,6 +39,7 @@ public class BundleDeploymentCriteria extends Criteria {
private String filterBundleDeployDefinitionName; // requires override
private Integer filterResourceId; // requires override
private String filterResourceName; // requires override
+ private BundleDeploymentStatus filterStatus;
private boolean fetchBundleDeployDefinition;
private boolean fetchResource;
@@ -51,7 +53,7 @@ public class BundleDeploymentCriteria extends Criteria {
}
@Override
- public Class getPersistentClass() {
+ public Class<?> getPersistentClass() {
return BundleDeployment.class;
}
@@ -75,6 +77,10 @@ public class BundleDeploymentCriteria extends Criteria {
this.filterResourceName = filterResourceName;
}
+ public void addFilterStatus(BundleDeploymentStatus filterStatus) {
+ this.filterStatus = filterStatus;
+ }
+
public void fetchBundleDeployDefinition(boolean fetchBundleDeployDefinition) {
this.fetchBundleDeployDefinition = fetchBundleDeployDefinition;
}
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 7b41da0..05c8fb6 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
@@ -58,6 +58,7 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.Package;
+import org.rhq.core.domain.content.PackageCategory;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
@@ -143,7 +144,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
Bundle bundle = new Bundle(name, bundleType);
bundle.setDescription(description);
- // create and add the required Repo. the Repo is a detached object ehich helps in its eventual
+ // create and add the required Repo. the Repo is a detached object which helps in its eventual
// removal.
Repo repo = new Repo(name);
repo.setCandidate(false);
@@ -151,6 +152,13 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
repo = repoManager.createRepo(subject, repo);
bundle.setRepo(repo);
+ // add the required PackageType. the PackageType is an attached object which helps in cascade removal
+ // of packages in the bundle's repo.
+ ResourceType resourceType = entityManager.find(ResourceType.class, bundleType.getResourceType().getId());
+ PackageType packageType = new PackageType(name, resourceType);
+ packageType.setCategory(PackageCategory.BUNDLE);
+ bundle.setPackageType(packageType);
+
log.info("Creating bundle: " + bundle);
entityManager.persist(bundle);
@@ -349,7 +357,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// Create the PackageVersion the BundleFile is tied to. This implicitly creates the
// Package for the PackageVersion.
Bundle bundle = bundleVersion.getBundle();
- PackageType packageType = getBundleTypePackageType(bundle.getBundleType());
+ PackageType packageType = bundle.getPackageType();
architecture = (null == architecture) ? contentManager.getNoArchitecture() : architecture;
if (architecture.getId() == 0) {
Query q = entityManager.createNamedQuery(Architecture.QUERY_FIND_BY_NAME);
@@ -424,15 +432,6 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return bundleFile;
}
- private PackageType getBundleTypePackageType(BundleType bundleType) {
-
- Query packageTypeQuery = entityManager.createNamedQuery(PackageType.QUERY_FIND_BY_RESOURCE_TYPE_ID_AND_NAME);
- packageTypeQuery.setParameter("typeId", bundleType.getResourceType().getId());
- packageTypeQuery.setParameter("name", bundleType.getName());
-
- return (PackageType) packageTypeQuery.getSingleResult();
- }
-
public BundleDeployment scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
throws Exception {
BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index a98d66e..427714b 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -134,13 +134,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
// clean up any tests that don't already clean up after themselves
- q = em.createQuery("SELECT bdh FROM BundleDeploymentHistory bdh ");//WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
- doomed = q.getResultList();
- for (Object removeMe : doomed) {
- em.remove(em.getReference(BundleDeploymentHistory.class, ((BundleDeploymentHistory) removeMe).getId()));
- }
-
- // remove bundleversions which cascade remove bundlefiles and bundledeploydefs
+ // remove bundleversions which cascade remove bundlefiles and bundledeploydefs
+ // bundledeploydefs cascade remove bundledeployments and bundlegroupdeployments
+ // bundledeployments cascade remove bundledeploymenthistory
q = em.createQuery("SELECT bv FROM BundleVersion bv WHERE bv.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
@@ -153,12 +149,11 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleFile.class, ((BundleFile) removeMe).getId()));
}
- // remove any orphaned bgds
- q = em.createQuery("SELECT bgd FROM BundleGroupDeployment bgd WHERE bgd.bundleDeployDefinition.name LIKE '"
- + TEST_PREFIX + "%'");
+ // remove any orphaned deployment history
+ q = em.createQuery("SELECT bdh FROM BundleDeploymentHistory bdh ");//WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
- em.remove(em.getReference(BundleGroupDeployment.class, ((BundleGroupDeployment) removeMe).getId()));
+ em.remove(em.getReference(BundleDeploymentHistory.class, ((BundleDeploymentHistory) removeMe).getId()));
}
// remove any orphaned bds
q = em.createQuery("SELECT bd FROM BundleDeployment bd WHERE bd.bundleDeployDefinition.name LIKE '"
@@ -167,17 +162,27 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleDeployment.class, ((BundleDeployment) removeMe).getId()));
}
+ // remove any orphaned bgds
+ q = em.createQuery("SELECT bgd FROM BundleGroupDeployment bgd WHERE bgd.bundleDeployDefinition.name LIKE '"
+ + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(BundleGroupDeployment.class, ((BundleGroupDeployment) removeMe).getId()));
+ }
// remove any orphaned bdds
q = em.createQuery("SELECT bdd FROM BundleDeployDefinition bdd WHERE bdd.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleDeployDefinition.class, ((BundleDeployDefinition) removeMe).getId()));
}
- // remove packages which cascade remove packageversions
- q = em.createQuery("SELECT p FROM Package p WHERE p.name LIKE '" + TEST_PREFIX + "%'");
+
+ // remove bundles which cascade remove repos and packageTypes
+ // packagetypes cascade remove packages
+ // package cascade remove packageversions
+ q = em.createQuery("SELECT b FROM Bundle b WHERE b.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
- em.remove(em.getReference(Package.class, ((Package) removeMe).getId()));
+ em.remove(em.getReference(Bundle.class, ((Bundle) removeMe).getId()));
}
em.flush();
// remove any orphaned pvs
@@ -187,20 +192,26 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(PackageVersion.class, ((PackageVersion) removeMe).getId()));
}
- // remove bundles which cascade remove repos
- q = em.createQuery("SELECT b FROM Bundle b WHERE b.name LIKE '" + TEST_PREFIX + "%'");
+ // remove any oprphaned packages
+ q = em.createQuery("SELECT p FROM Package p WHERE p.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
- em.remove(em.getReference(Bundle.class, ((Bundle) removeMe).getId()));
+ em.remove(em.getReference(Package.class, ((Package) removeMe).getId()));
+ }
+ // remove any orphaned packagetypes
+ q = em.createQuery("SELECT pt FROM PackageType pt WHERE pt.name LIKE '" + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(PackageType.class, ((PackageType) removeMe).getId()));
}
- em.flush();
// remove any orphaned repos
q = em.createQuery("SELECT r FROM Repo r WHERE r.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
em.remove(em.getReference(Repo.class, ((Repo) removeMe).getId()));
}
- // remove ResourceTypes which cascade remove BundleTypes and PackageTypes
+
+ // remove ResourceTypes which cascade remove BundleTypes
q = em.createQuery("SELECT rt FROM ResourceType rt WHERE rt.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
@@ -213,12 +224,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleType.class, ((BundleType) removeMe).getId()));
}
- // remove any orphaned packagetypes
- q = em.createQuery("SELECT pt FROM PackageType pt WHERE pt.name LIKE '" + TEST_PREFIX + "%'");
- doomed = q.getResultList();
- for (Object removeMe : doomed) {
- em.remove(em.getReference(PackageType.class, ((PackageType) removeMe).getId()));
- }
+
// remove Agents left over from test resources
q = em.createQuery("SELECT a FROM Agent a WHERE a.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
@@ -526,7 +532,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
@Test(enabled = TESTS_ENABLED)
public void testAddBundleFilesToDifferentBundles() throws Exception {
- Bundle b1 = createBundle("one");
+ // create a bundle type to use for both bundles.
+ BundleType bt = createBundleType("one");
+ Bundle b1 = createBundle("one", bt);
assertNotNull(b1);
BundleVersion bv1 = createBundleVersion(b1.getName(), "1.0", b1);
assertNotNull(bv1);
@@ -534,7 +542,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
null, "Bundle #1 File # 1".getBytes(), false);
// create a second bundle but create file of the same name as above
- Bundle b2 = createBundle("two");
+ Bundle b2 = createBundle("two", bt);
assertNotNull(b2);
BundleVersion bv2 = createBundleVersion(b2.getName(), "1.0", b2);
assertNotNull(bv2);
@@ -743,7 +751,6 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
private BundleType createBundleType(String name) throws Exception {
final String fullName = TEST_PREFIX + "-type-" + name;
ResourceType rt = createResourceType(name);
- PackageType pt = createPackageType(name, rt);
BundleType bt = bundleManager.createBundleType(overlord, fullName, rt.getId());
assert bt.getId() > 0;
@@ -800,20 +807,6 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
return rt;
}
- private PackageType createPackageType(String name, ResourceType rt) throws Exception {
- // the package type is named the same as the bundle type
- final String fullName = TEST_PREFIX + "-type-" + name;
- PackageType pt = new PackageType(fullName, rt);
-
- TransactionManager txMgr = getTransactionManager();
- txMgr.begin();
- EntityManager em = getEntityManager();
- em.persist(pt);
- em.close();
- txMgr.commit();
- return pt;
- }
-
// lifted from ResourceManagerBeanTest
private Resource createTestResource() throws Exception {
getTransactionManager().begin();
commit a13969c550099c19bbeb3cbad76df38ec4391cb5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:32:17 2010 -0400
show bundle versions at the bottom right of the bundle view
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java
new file mode 100644
index 0000000..9a576a6
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleVersionDataSource.java
@@ -0,0 +1,125 @@
+/*
+ * 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.gui.coregui.client.bundle.list;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author John Mazzitelli
+ */
+public class BundleVersionDataSource extends RPCDataSource<BundleVersion> {
+
+ private BundleGWTServiceAsync bundleService = GWTServiceLookup.getBundleService();
+ private int bundleId;
+
+ public BundleVersionDataSource() {
+ DataSourceIntegerField idField = new DataSourceIntegerField("id", "ID");
+ idField.setPrimaryKey(true);
+ addField(idField);
+
+ DataSourceTextField nameField = new DataSourceTextField("name", "Name");
+ addField(nameField);
+
+ DataSourceTextField descriptionField = new DataSourceTextField("description", "Description");
+ addField(descriptionField);
+
+ DataSourceTextField latestVersionField = new DataSourceTextField("version", "Version");
+ addField(latestVersionField);
+
+ DataSourceIntegerField deploymentCountField = new DataSourceIntegerField("fileCount", "File Count");
+ addField(deploymentCountField);
+ }
+
+ public int getBundleId() {
+ return bundleId;
+ }
+
+ public void setBundleId(int bundleId) {
+ this.bundleId = bundleId;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+
+ BundleVersionCriteria criteria = new BundleVersionCriteria();
+ criteria.addFilterBundleId(this.bundleId);
+ criteria.fetchBundleFiles(true);
+ criteria.setPageControl(getPageControl(request));
+
+ bundleService.findBundleVersionsByCriteria(criteria, new AsyncCallback<PageList<BundleVersion>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load bundle version data", caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(PageList<BundleVersion> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+
+ }
+
+ @Override
+ public BundleVersion copyValues(ListGridRecord from) {
+ // can't I just get the "object" attribute and return it???
+ Integer idAttrib = from.getAttributeAsInt("id");
+ String nameAttrib = from.getAttribute("name");
+ String descriptionAttrib = from.getAttribute("description");
+ String versionAttrib = from.getAttribute("version");
+
+ BundleVersion bv = new BundleVersion();
+ bv.setId(idAttrib.intValue());
+ bv.setName(nameAttrib);
+ bv.setDescription(descriptionAttrib);
+ bv.setVersion(versionAttrib);
+ return bv;
+ }
+
+ @Override
+ public ListGridRecord copyValues(BundleVersion from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute("id", from.getId());
+ record.setAttribute("name", from.getName());
+ record.setAttribute("description", from.getDescription());
+ record.setAttribute("version", from.getVersion());
+ record.setAttribute("fileCount", Integer.valueOf(from.getBundleFiles().size()));
+
+ record.setAttribute("object", from);
+
+ return record;
+
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
index 4d7575e..be0e415 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
@@ -21,6 +21,8 @@ package org.rhq.enterprise.gui.coregui.client.bundle.list;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.types.SelectionAppearance;
+import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
@@ -32,6 +34,7 @@ import com.smartgwt.client.widgets.tab.TabSet;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
public class BundleView extends VLayout {
@@ -41,6 +44,7 @@ public class BundleView extends VLayout {
private HeaderLabel headerLabel;
private StaticTextItem descriptionItem;
private StaticTextItem latestVersionItem;
+ private Table bundleVersionsTable;
public BundleView() {
super();
@@ -77,11 +81,30 @@ public class BundleView extends VLayout {
}
private Tab createDeploymentsTab() {
- return new Tab("Deployments");
+ Tab deploymentsTab = new Tab("Deployments");
+ return deploymentsTab;
}
private Tab createVersionsTab() {
- return new Tab("Versions");
+ Tab versionsTab = new Tab("Versions");
+
+ bundleVersionsTable = new Table();
+ bundleVersionsTable.setHeight100();
+
+ BundleVersionDataSource bundleVersionsDataSource = new BundleVersionDataSource();
+ bundleVersionsTable.setDataSource(bundleVersionsDataSource);
+
+ bundleVersionsTable.getListGrid().getField("id").setWidth("60");
+ bundleVersionsTable.getListGrid().getField("name").setWidth("25%");
+ bundleVersionsTable.getListGrid().getField("version").setWidth("10%");
+ bundleVersionsTable.getListGrid().getField("fileCount").setWidth("10%");
+ bundleVersionsTable.getListGrid().getField("description").setWidth("*");
+
+ bundleVersionsTable.getListGrid().setSelectionType(SelectionStyle.NONE);
+ bundleVersionsTable.getListGrid().setSelectionAppearance(SelectionAppearance.ROW_STYLE);
+
+ versionsTab.setPane(bundleVersionsTable);
+ return versionsTab;
}
private Tab createSummaryTab() {
@@ -109,21 +132,39 @@ public class BundleView extends VLayout {
}
public void viewRecord(Record record) {
- final BundleWithLatestVersionComposite object;
- object = (BundleWithLatestVersionComposite) record.getAttributeAsObject("object");
-
- if (bundleBeingViewed != object.getBundleId()) {
- headerLabel.setContents(object.getBundleName());
- latestVersionItem.setValue(object.getLatestVersion());
- descriptionItem.setValue(object.getBundleDescription());
- }
-
- try {
- message.hide();
- canvas.show();
- markForRedraw();
- } catch (Throwable t) {
- CoreGUI.getErrorHandler().handleError("Cannot view bundle record", t);
+ if (record == null) {
+ viewNone();
+ } else {
+ final BundleWithLatestVersionComposite object;
+ object = (BundleWithLatestVersionComposite) record.getAttributeAsObject("object");
+
+ if (object == null) {
+ viewNone();
+ } else {
+ if (bundleBeingViewed != object.getBundleId()) {
+ bundleBeingViewed = object.getBundleId();
+
+ // summary tab
+ headerLabel.setContents(object.getBundleName());
+ latestVersionItem.setValue(object.getLatestVersion());
+ descriptionItem.setValue(object.getBundleDescription());
+
+ // versions tab
+ BundleVersionDataSource bvDataSource;
+ bvDataSource = (BundleVersionDataSource) bundleVersionsTable.getDataSource();
+ bvDataSource.setBundleId(bundleBeingViewed);
+ bvDataSource.fetchData();
+ bundleVersionsTable.getListGrid().invalidateCache(); // TODO: is there a better way to refresh?
+ }
+
+ try {
+ message.hide();
+ canvas.show();
+ markForRedraw();
+ } catch (Throwable t) {
+ CoreGUI.getErrorHandler().handleError("Cannot view bundle record", t);
+ }
+ }
}
}
commit 8bfd48b11e356dab8b7621d615fa83916782257f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:31:55 2010 -0400
be able to go to next step when no files need to be uploaded
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
index e241771..7baec2f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
@@ -47,6 +47,7 @@ public class BundleUploadDataStep implements WizardStep {
private final AbstractBundleCreateWizard wizard;
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
private ArrayList<BundleFileUploadForm> uploadForms;
+ private Boolean noFilesNeedToBeUploaded = null; // will be non-null when we know the answer
public BundleUploadDataStep(AbstractBundleCreateWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -84,6 +85,10 @@ public class BundleUploadDataStep implements WizardStep {
}
private boolean isFinished() {
+ if (noFilesNeedToBeUploaded != null && noFilesNeedToBeUploaded.booleanValue()) {
+ return true;
+ }
+
if (wizard.getAllBundleFilesStatus() == null) {
return false;
}
@@ -114,9 +119,11 @@ public class BundleUploadDataStep implements WizardStep {
label.setWidth100();
mainLayout.addMember(label);
uploadForms = null;
+ noFilesNeedToBeUploaded = Boolean.TRUE;
return;
}
+ noFilesNeedToBeUploaded = Boolean.FALSE;
uploadForms = new ArrayList<BundleFileUploadForm>();
for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) {
commit 1ad47adb952bab44b66c973f535f638c447ac492
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:19:44 2010 -0400
allow for a non-titled table
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
index 1c7c68c..e56c48f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
@@ -83,6 +83,10 @@ public class Table extends VLayout {
private ArrayList<TableActionInfo> tableActions = new ArrayList<TableActionInfo>();
+ public Table() {
+ this(null, null, null, null, true);
+ }
+
public Table(String tableTitle) {
this(tableTitle, null, null, null, true);
}
@@ -100,10 +104,11 @@ public class Table extends VLayout {
}
public Table(String tableTitle, Criteria criteria, SortSpecifier[] sortSpecifiers, String[] excludedFieldNames) {
- this(tableTitle,criteria,sortSpecifiers,excludedFieldNames,true);
+ this(tableTitle, criteria, sortSpecifiers, excludedFieldNames, true);
}
+
public Table(String tableTitle, Criteria criteria, SortSpecifier[] sortSpecifiers, String[] excludedFieldNames,
- boolean autoFetchData) {
+ boolean autoFetchData) {
super();
setWidth100();
@@ -111,11 +116,7 @@ public class Table extends VLayout {
// Title
title = new HTMLFlow();
- title.setWidth100();
- title.setHeight(35);
- title.setContents(tableTitle);
- title.setPadding(4);
- title.setStyleName("HeaderLabel");
+ setTableTitle(tableTitle);
// Grid
listGrid = new ListGrid();
@@ -169,7 +170,8 @@ public class Table extends VLayout {
public void onClick(ClickEvent clickEvent) {
if (tableAction.confirmMessage != null) {
- String message = tableAction.confirmMessage.replaceAll("\\#", String.valueOf(listGrid.getSelection().length));
+ String message = tableAction.confirmMessage.replaceAll("\\#", String.valueOf(listGrid
+ .getSelection().length));
SC.ask(message, new BooleanCallback() {
public void execute(Boolean confirmed) {
@@ -213,9 +215,8 @@ public class Table extends VLayout {
}
});
-
// TODO GH: This doesn't yet work as desired to force the fields to fit to the table when you resize one of them.
- if (false) { // If Force Fit
+ if (false) { // If Force Fit
listGrid.addDataArrivedHandler(new DataArrivedHandler() {
public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
for (ListGridField f : listGrid.getFields()) {
@@ -273,14 +274,30 @@ public class Table extends VLayout {
private ArrayList<Integer> fieldSizes = new ArrayList<Integer>();
private boolean autoSizing = false;
-
public void refresh(Criteria criteria) {
this.listGrid.setCriteria(criteria);
this.listGrid.markForRedraw();
}
- public void setTableTitle(String title) {
- this.title.setContents(title);
+ public void setTableTitle(String titleString) {
+ if (titleString == null) {
+ titleString = "";
+ }
+ if (titleString.length() > 0) {
+ title.setWidth100();
+ title.setHeight(35);
+ title.setContents(titleString);
+ title.setPadding(4);
+ title.setStyleName("HeaderLabel");
+ } else {
+ title.setWidth100();
+ title.setHeight(0);
+ title.setContents(null);
+ title.setPadding(0);
+ title.setStyleName("normal");
+ }
+
+ title.markForRedraw();
}
public void setDataSource(RPCDataSource dataSource) {
@@ -299,7 +316,8 @@ public class Table extends VLayout {
this.addTableAction(title, null, null, tableAction);
}
- public void addTableAction(String title, SelectionEnablement enablement, String confirmation, TableAction tableAction) {
+ public void addTableAction(String title, SelectionEnablement enablement, String confirmation,
+ TableAction tableAction) {
if (enablement == null) {
enablement = DEFAULT_SELECTION_ENABLEMENT;
}
@@ -313,27 +331,26 @@ public class Table extends VLayout {
for (TableActionInfo tableAction : tableActions) {
boolean enabled;
switch (tableAction.enablement) {
- case ALWAYS:
- enabled = true;
- break;
- case ANY:
- enabled = (count >= 1);
- break;
- case SINGLE:
- enabled = (count == 1);
- break;
- case MULTIPLE:
- enabled = (count > 1);
- break;
- default:
- throw new IllegalStateException("Unhandled SelectionEnablement: " + tableAction.enablement.name());
+ case ALWAYS:
+ enabled = true;
+ break;
+ case ANY:
+ enabled = (count >= 1);
+ break;
+ case SINGLE:
+ enabled = (count == 1);
+ break;
+ case MULTIPLE:
+ enabled = (count > 1);
+ break;
+ default:
+ throw new IllegalStateException("Unhandled SelectionEnablement: " + tableAction.enablement.name());
}
tableAction.actionButton.setDisabled(!enabled);
}
this.tableInfo.setContents("Total: " + listGrid.getTotalRows() + " (" + count + " selected)");
}
-
// -------------- Inner utility class -------------
private static class TableActionInfo {
commit cf3888c51458c009411d1ccee4e4b3becfe336c3
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 15:18:53 2010 -0400
put the summary data in the same location as the other steps (via margin)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
index ffa143a..c010952 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -41,6 +41,7 @@ public class BundleSummaryStep implements WizardStep {
DynamicForm form = new DynamicForm();
form.setNumCols(2);
+ form.setMargin(20);
StaticTextItem bundleTypeLabel = new StaticTextItem("bundleType", "Type");
bundleTypeLabel.setTitleAlign(Alignment.LEFT);
commit 74202995ca16b2edf797d7bf721e09e7b706fe22
Merge: e09ae65... 994a9db...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 14:48:35 2010 -0400
Merge branch 'gwt' into gwt-jay
commit e09ae659e017da3d4f32755e88685663680c782f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 14:47:48 2010 -0400
intermittent checkin
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
deleted file mode 100644
index 5c8cac5..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
+++ /dev/null
@@ -1,48 +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, 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.bundle;
-
-/**
- * Simple statuses for Bundle (Group) Deploy requests. When a request is first initiated, it will be considered in the
- * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
- * {@link #FAILURE}. For group deploy requests the status values are the same. Any individual failure will be
- * reflected as a group failure.
- *
- * @author Jay Shaughnessy
- */
-public enum BundlDeploymentStatus {
- INPROGRESS("In Progress"), //
- SUCCESS("Success"), //
- FAILURE("Failure"), //
- NOCHANGE("No Change");
-
- private String displayName;
-
- BundlDeploymentStatus(String displayName) {
- this.displayName = displayName;
- }
-
- public String toString() {
- return displayName;
- }
-}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
index 28d5adc..f1bb4d1 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
@@ -88,7 +88,7 @@ public class BundleDeployment implements Serializable {
@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
- protected BundlDeploymentStatus status;
+ protected BundleDeploymentStatus status;
@Column(name = "CTIME")
private Long ctime = -1L;
@@ -100,9 +100,7 @@ public class BundleDeployment implements Serializable {
}
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource) {
- this.bundleDeployDefinition = bundleDeploymentDef;
- this.resource = resource;
- this.status = BundlDeploymentStatus.INPROGRESS;
+ this(bundleDeploymentDef, resource, null);
}
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource,
@@ -110,6 +108,7 @@ public class BundleDeployment implements Serializable {
this.bundleDeployDefinition = bundleDeploymentDef;
this.resource = resource;
this.bundleGroupDeployment = bundleGroupDeployment;
+ this.status = BundleDeploymentStatus.INPROGRESS;
}
public BundleDeployDefinition getBundleDeployDefinition() {
@@ -172,11 +171,11 @@ public class BundleDeployment implements Serializable {
*
* @return the request status
*/
- public BundlDeploymentStatus getStatus() {
+ public BundleDeploymentStatus getStatus() {
return status;
}
- public void setStatus(BundlDeploymentStatus status) {
+ public void setStatus(BundleDeploymentStatus status) {
this.status = status;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java
new file mode 100644
index 0000000..66f8f68
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentStatus.java
@@ -0,0 +1,48 @@
+/*
+ * 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, 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.bundle;
+
+/**
+ * Simple statuses for Bundle (Group) Deploy requests. When a request is first initiated, it will be considered in the
+ * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
+ * {@link #FAILURE}. For group deploy requests the status values are the same. Any individual failure will be
+ * reflected as a group failure.
+ *
+ * @author Jay Shaughnessy
+ */
+public enum BundleDeploymentStatus {
+ INPROGRESS("In Progress"), //
+ SUCCESS("Success"), //
+ FAILURE("Failure"), //
+ NOCHANGE("No Change");
+
+ private String displayName;
+
+ BundleDeploymentStatus(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String toString() {
+ return displayName;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
index 6f8364d..d1fbc24 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
@@ -66,7 +66,7 @@ public class BundleGroupDeployment implements Serializable {
@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
- protected BundlDeploymentStatus status;
+ protected BundleDeploymentStatus status;
@Column(name = "ERROR_MESSAGE")
protected String errorMessage;
@@ -91,7 +91,7 @@ public class BundleGroupDeployment implements Serializable {
this.subjectName = subjectName;
this.bundleDeployDefinition = bundleDeployDefinition;
this.group = group;
- this.status = BundlDeploymentStatus.INPROGRESS;
+ this.status = BundleDeploymentStatus.INPROGRESS;
}
public int getId() {
@@ -108,11 +108,11 @@ public class BundleGroupDeployment implements Serializable {
*
* @return the request status
*/
- public BundlDeploymentStatus getStatus() {
+ public BundleDeploymentStatus getStatus() {
return status;
}
- public void setStatus(BundlDeploymentStatus status) {
+ public void setStatus(BundleDeploymentStatus status) {
this.status = status;
}
@@ -135,7 +135,7 @@ public class BundleGroupDeployment implements Serializable {
/**
* If not <code>null</code>, this is an error message (possibly a full stack trace) to indicate the overall error
* that occurred when the configuration update failed. This will normally be <code>null</code> unless the
- * {@link #getStatus() status} indicates a {@link BundlDeploymentStatus#FAILURE}.
+ * {@link #getStatus() status} indicates a {@link BundleDeploymentStatus#FAILURE}.
*
* @return overall error that occurred
*/
@@ -155,7 +155,7 @@ public class BundleGroupDeployment implements Serializable {
this.errorMessage = errorMessage;
if (this.errorMessage != null) {
- setStatus(BundlDeploymentStatus.FAILURE);
+ setStatus(BundleDeploymentStatus.FAILURE);
}
}
@@ -212,7 +212,7 @@ public class BundleGroupDeployment implements Serializable {
public long getDuration() {
long start = this.createdTime;
long end;
- if ((status == null) || (status == BundlDeploymentStatus.INPROGRESS)) {
+ if ((status == null) || (status == BundleDeploymentStatus.INPROGRESS)) {
end = System.currentTimeMillis();
} else {
end = this.modifiedTime;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 5990e61..a98d66e 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -555,9 +555,9 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert b1f1.getId() != b2f1.getId() : "should have been different bundle files";
assert b1f1.getPackageVersion().getId() != b2f1.getPackageVersion().getId() : "should be different PV";
- assert b1f1.getPackageVersion().getGeneralPackage().getId() == b2f1.getPackageVersion().getGeneralPackage()
+ assert b1f1.getPackageVersion().getGeneralPackage().getId() != b2f1.getPackageVersion().getGeneralPackage()
.getId() : "package IDs should be different";
- assert b1f1.getPackageVersion().getGeneralPackage().equals(b2f1.getPackageVersion().getGeneralPackage()) : "should be different packages";
+ assert !b1f1.getPackageVersion().getGeneralPackage().equals(b2f1.getPackageVersion().getGeneralPackage()) : "should be different packages";
}
@Test(enabled = TESTS_ENABLED)
commit 994a9dbec2327a21f0a4886dbac1c25fafd0670d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 14:05:09 2010 -0400
i can't figure out how to redraw this icon without hiding then showing it again. prior to doing this, the new icon would not show up
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
index 1d67a73..b0617f0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
@@ -178,14 +178,16 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
icon.setTooltip("Uploaded bundle file successfully");
CoreGUI.getMessageCenter().notify(
new Message("Uploaded bundle file successfully", results, Severity.Info));
- markForRedraw();
+ icon.hide();
+ icon.show();
} else {
uploadResults = Boolean.FALSE;
icon.setIcons(iconRed);
icon.setTooltip("Bundle file upload failed");
CoreGUI.getMessageCenter()
.notify(new Message("Bundle file upload failed", results, Severity.Error));
- markForRedraw();
+ icon.hide();
+ icon.show();
}
}
});
@@ -196,7 +198,8 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
icon.setIcons(iconRed);
icon.setTooltip("Bundle file upload failed");
CoreGUI.getMessageCenter().notify(new Message("Bundle file upload request failed", Severity.Error));
- markForRedraw();
+ icon.hide();
+ icon.show();
}
});
}
commit 3c3f0cf8380fad1be4200a4a97e2cb26037178af
Merge: 771a00d... 7258569...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 13:47:38 2010 -0400
Merge branch 'gwt' into gwt-jay
commit 771a00d5accc4234353bb257cd46994275b15912
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 13:46:26 2010 -0400
Intermittent check-in for deployment status work
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 f3bdf49..005bafb 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -586,6 +586,7 @@
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="BUNDLE_DEPLOY_DEF_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY_DEF" />
<column name="RESOURCE_ID" type="INTEGER" required="true" references="RHQ_RESOURCE" />
+ <column name="STATUS" type="VARCHAR2" required="true" size="16"/>
<column name="CTIME" type="LONG" required="true"/>
<column name="BUNDLE_GROUP_DEPLOY_ID" type="INTEGER" required="false" references="RHQ_BUNDLE_GROUP_DEPLOY"/>
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 18db292..326f3ba 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -2945,6 +2945,11 @@
</schema-directSQL>
</schemaSpec>
+ <schemaSpec version="2.78.6">
+ <schema-addColumn table="RHQ_BUNDLE_DEPLOY" column="STATUS" columnType="VARCHAR2" precision="16" />
+ <schema-alterColumn table="RHQ_BUNDLE_DEPLOY" column="STATUS" nullable="FALSE" />
+ </schemaSpec>
+
<schemaSpec version="2.79">
<schema-directSQL>
<statement desc="Normalizing resource group descriptions">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
new file mode 100644
index 0000000..5c8cac5
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundlDeploymentStatus.java
@@ -0,0 +1,48 @@
+/*
+ * 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, 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.bundle;
+
+/**
+ * Simple statuses for Bundle (Group) Deploy requests. When a request is first initiated, it will be considered in the
+ * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
+ * {@link #FAILURE}. For group deploy requests the status values are the same. Any individual failure will be
+ * reflected as a group failure.
+ *
+ * @author Jay Shaughnessy
+ */
+public enum BundlDeploymentStatus {
+ INPROGRESS("In Progress"), //
+ SUCCESS("Success"), //
+ FAILURE("Failure"), //
+ NOCHANGE("No Change");
+
+ private String displayName;
+
+ BundlDeploymentStatus(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String toString() {
+ return displayName;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
index 4bb964d..28d5adc 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
@@ -29,6 +29,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;
@@ -84,6 +86,10 @@ public class BundleDeployment implements Serializable {
@ManyToOne
private BundleGroupDeployment bundleGroupDeployment;
+ @Column(name = "STATUS", nullable = false)
+ @Enumerated(EnumType.STRING)
+ protected BundlDeploymentStatus status;
+
@Column(name = "CTIME")
private Long ctime = -1L;
@@ -96,6 +102,7 @@ public class BundleDeployment implements Serializable {
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource) {
this.bundleDeployDefinition = bundleDeploymentDef;
this.resource = resource;
+ this.status = BundlDeploymentStatus.INPROGRESS;
}
public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource,
@@ -159,6 +166,20 @@ public class BundleDeployment implements Serializable {
this.bundleGroupDeployment = bundleGroupDeployment;
}
+ /**
+ * The status of the request which indicates that the request is either still in progress, or it has completed and
+ * either succeeded or failed.
+ *
+ * @return the request status
+ */
+ public BundlDeploymentStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(BundlDeploymentStatus status) {
+ this.status = status;
+ }
+
@Override
public String toString() {
StringBuilder str = new StringBuilder("BundleDeployment: ");
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
index 8a0365f..6f8364d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
@@ -66,7 +66,7 @@ public class BundleGroupDeployment implements Serializable {
@Column(name = "STATUS", nullable = false)
@Enumerated(EnumType.STRING)
- protected BundleGroupDeploymentStatus status;
+ protected BundlDeploymentStatus status;
@Column(name = "ERROR_MESSAGE")
protected String errorMessage;
@@ -91,7 +91,7 @@ public class BundleGroupDeployment implements Serializable {
this.subjectName = subjectName;
this.bundleDeployDefinition = bundleDeployDefinition;
this.group = group;
- this.status = BundleGroupDeploymentStatus.INPROGRESS;
+ this.status = BundlDeploymentStatus.INPROGRESS;
}
public int getId() {
@@ -108,11 +108,11 @@ public class BundleGroupDeployment implements Serializable {
*
* @return the request status
*/
- public BundleGroupDeploymentStatus getStatus() {
+ public BundlDeploymentStatus getStatus() {
return status;
}
- public void setStatus(BundleGroupDeploymentStatus status) {
+ public void setStatus(BundlDeploymentStatus status) {
this.status = status;
}
@@ -135,7 +135,7 @@ public class BundleGroupDeployment implements Serializable {
/**
* If not <code>null</code>, this is an error message (possibly a full stack trace) to indicate the overall error
* that occurred when the configuration update failed. This will normally be <code>null</code> unless the
- * {@link #getStatus() status} indicates a {@link BundleGroupDeploymentStatus#FAILURE}.
+ * {@link #getStatus() status} indicates a {@link BundlDeploymentStatus#FAILURE}.
*
* @return overall error that occurred
*/
@@ -155,7 +155,7 @@ public class BundleGroupDeployment implements Serializable {
this.errorMessage = errorMessage;
if (this.errorMessage != null) {
- setStatus(BundleGroupDeploymentStatus.FAILURE);
+ setStatus(BundlDeploymentStatus.FAILURE);
}
}
@@ -212,7 +212,7 @@ public class BundleGroupDeployment implements Serializable {
public long getDuration() {
long start = this.createdTime;
long end;
- if ((status == null) || (status == BundleGroupDeploymentStatus.INPROGRESS)) {
+ if ((status == null) || (status == BundlDeploymentStatus.INPROGRESS)) {
end = System.currentTimeMillis();
} else {
end = this.modifiedTime;
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java
deleted file mode 100644
index 94f9113..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java
+++ /dev/null
@@ -1,47 +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, 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.bundle;
-
-/**
- * Simple statuses for Bundle Group Deploy requests. When a request is first initiated, it will be considered in the
- * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
- * {@link #FAILURE}.
- *
- * @author Jay Shaughnessy
- */
-public enum BundleGroupDeploymentStatus {
- INPROGRESS("In Progress"), //
- SUCCESS("Success"), //
- FAILURE("Failure"), //
- NOCHANGE("No Change");
-
- private String displayName;
-
- BundleGroupDeploymentStatus(String displayName) {
- this.displayName = displayName;
- }
-
- public String toString() {
- return displayName;
- }
-}
\ No newline at end of file
commit 7258569515eaf7cfa3021a487faa49ae8ff8dd41
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 13:42:53 2010 -0400
this new test breaks - it illustrates our problem with packages ignoring classification
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 163e9c6..5990e61 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -525,6 +525,42 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
}
@Test(enabled = TESTS_ENABLED)
+ public void testAddBundleFilesToDifferentBundles() throws Exception {
+ Bundle b1 = createBundle("one");
+ assertNotNull(b1);
+ BundleVersion bv1 = createBundleVersion(b1.getName(), "1.0", b1);
+ assertNotNull(bv1);
+ BundleFile b1f1 = bundleManager.addBundleFileViaByteArray(overlord, bv1.getId(), TEST_PREFIX + "-file1", "1.0",
+ null, "Bundle #1 File # 1".getBytes(), false);
+
+ // create a second bundle but create file of the same name as above
+ Bundle b2 = createBundle("two");
+ assertNotNull(b2);
+ BundleVersion bv2 = createBundleVersion(b2.getName(), "1.0", b2);
+ assertNotNull(bv2);
+ BundleFile b2f1 = bundleManager.addBundleFileViaByteArray(overlord, bv2.getId(), TEST_PREFIX + "-file1", "1.0",
+ null, "Bundle #2 File # 1".getBytes(), false);
+
+ BundleFileCriteria bfc = new BundleFileCriteria();
+ bfc.addFilterBundleVersionId(bv1.getId());
+ PageList<BundleFile> bundleFiles = bundleManager.findBundleFilesByCriteria(overlord, bfc);
+ assert bundleFiles.size() == 1 : bundleFiles;
+ assert bundleFiles.get(0).getId() == b1f1.getId() : bundleFiles;
+
+ bfc = new BundleFileCriteria();
+ bfc.addFilterBundleVersionId(bv2.getId());
+ bundleFiles = bundleManager.findBundleFilesByCriteria(overlord, bfc);
+ assert bundleFiles.size() == 1 : bundleFiles;
+ assert bundleFiles.get(0).getId() == b2f1.getId() : bundleFiles;
+
+ assert b1f1.getId() != b2f1.getId() : "should have been different bundle files";
+ assert b1f1.getPackageVersion().getId() != b2f1.getPackageVersion().getId() : "should be different PV";
+ assert b1f1.getPackageVersion().getGeneralPackage().getId() == b2f1.getPackageVersion().getGeneralPackage()
+ .getId() : "package IDs should be different";
+ assert b1f1.getPackageVersion().getGeneralPackage().equals(b2f1.getPackageVersion().getGeneralPackage()) : "should be different packages";
+ }
+
+ @Test(enabled = TESTS_ENABLED)
public void testCreateBundleDeploymentDef() throws Exception {
Bundle b1 = createBundle("one");
assertNotNull(b1);
commit 845c8f1b513eb481667fe6a0c3b7d9955bb931e9
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 13:42:25 2010 -0400
simplify the upload step, the icon still isn't redrawing when it should though
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
index 6f18f04..1d67a73 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
@@ -27,8 +27,6 @@ import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.HiddenItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.UploadItem;
-import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
-import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
@@ -48,6 +46,10 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
private final BundleVersion bundleVersion;
private final String name;
private final boolean showNameLabel;
+ private final FormItemIcon iconLoading;
+ private final FormItemIcon iconGreen;
+ private final FormItemIcon iconRed;
+ private final FormItemIcon iconGrey;
public BundleFileUploadForm(BundleVersion bundleVersion, String name, boolean showNameLabel,
Boolean isAlreadyUploaded) {
@@ -60,6 +62,26 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
setEncoding(Encoding.MULTIPART);
setAction(GWT.getModuleBaseURL() + "/BundleFileUploadServlet");
+
+ iconLoading = new FormItemIcon();
+ iconLoading.setSrc("ajax-loader.gif");
+ iconLoading.setWidth(16);
+ iconLoading.setHeight(16);
+
+ iconGreen = new FormItemIcon();
+ iconGreen.setSrc("/images/icons/availability_green_16.png");
+ iconGreen.setWidth(16);
+ iconGreen.setHeight(16);
+
+ iconRed = new FormItemIcon();
+ iconRed.setSrc("/images/icons/availability_red_16.png");
+ iconRed.setWidth(16);
+ iconRed.setHeight(16);
+
+ iconGrey = new FormItemIcon();
+ iconGrey.setSrc("/images/icons/availability_grey_16.png");
+ iconGrey.setWidth(16);
+ iconGrey.setHeight(16);
}
public BundleVersion getBundleVersion() {
@@ -86,10 +108,15 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
@Override
public void submitForm() {
- icon.setShowIcons(true);
- uploadButton.setDisabled(true);
- markForRedraw();
- super.submitForm();
+ Object value = bundleUploadItem.getValue();
+ if (value == null || value.toString().length() == 0) {
+ icon.setIcons(iconRed);
+ icon.setTooltip("Please select a file to upload");
+ } else {
+ icon.setIcons(iconLoading);
+ icon.setTooltip("Loading...");
+ super.submitForm();
+ }
}
@Override
@@ -117,7 +144,6 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
uploadButton = new ButtonItem("Upload");
uploadButton.setStartRow(false);
uploadButton.setEndRow(false);
- uploadButton.setDisabled(true);
uploadButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
submitForm();
@@ -127,28 +153,19 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
icon = new StaticTextItem("icon");
icon.setStartRow(false);
icon.setShowTitle(false);
-
- FormItemIcon loadingIcon = new FormItemIcon();
- loadingIcon.setSrc("ajax-loader.gif");
- loadingIcon.setWidth(16);
- loadingIcon.setHeight(16);
- icon.setIcons(loadingIcon);
- icon.setShowIcons(false);
-
- bundleUploadItem.addChangeHandler(new ChangeHandler() {
- public void onChange(ChangeEvent changeEvent) {
- if (uploadResults != null) {
- retrievalStatus(uploadResults.booleanValue());
- } else {
- uploadButton.setDisabled(false);
- icon.setShowIcons(false);
- }
- }
- });
-
if (uploadResults != null) {
- retrievalStatus(uploadResults.booleanValue());
+ if (uploadResults.booleanValue()) {
+ icon.setIcons(iconGreen);
+ icon.setTooltip("Bundle file has already been uploaded");
+ } else {
+ icon.setIcons(iconRed);
+ icon.setTooltip("Bundle file upload has previously failed");
+ }
+ } else {
+ icon.setIcons(iconGrey);
+ icon.setTooltip("Select a file to upload, then click the 'Upload' button or 'Next'");
}
+ icon.setShowIcons(true);
setItems(sessionIdField, bundleVersionIdField, nameField, versionField, bundleUploadItem, uploadButton, icon);
@@ -156,43 +173,31 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
public void onSubmitComplete(DynamicFormSubmitCompleteEvent event) {
String results = event.getResults();
if (!results.contains("Failed to upload bundle file")) {
- CoreGUI.getMessageCenter().notify(new Message("Uploaded bundle file successfully", Severity.Info));
- retrievalStatus(true);
+ uploadResults = Boolean.TRUE;
+ icon.setIcons(iconGreen);
+ icon.setTooltip("Uploaded bundle file successfully");
+ CoreGUI.getMessageCenter().notify(
+ new Message("Uploaded bundle file successfully", results, Severity.Info));
+ markForRedraw();
} else {
- CoreGUI.getMessageCenter().notify(new Message("Bundle file upload failed", Severity.Error));
- retrievalStatus(false);
+ uploadResults = Boolean.FALSE;
+ icon.setIcons(iconRed);
+ icon.setTooltip("Bundle file upload failed");
+ CoreGUI.getMessageCenter()
+ .notify(new Message("Bundle file upload failed", results, Severity.Error));
+ markForRedraw();
}
}
});
addFormSubmitFailedHandler(new FormSubmitFailedHandler() {
public void onFormSubmitFailed(FormSubmitFailedEvent event) {
- CoreGUI.getMessageCenter().notify(new Message("Bundle file upload failed", Severity.Error));
- retrievalStatus(false);
+ uploadResults = Boolean.FALSE;
+ icon.setIcons(iconRed);
+ icon.setTooltip("Bundle file upload failed");
+ CoreGUI.getMessageCenter().notify(new Message("Bundle file upload request failed", Severity.Error));
+ markForRedraw();
}
});
}
-
- /**
- * Call this when the last file retrieval status is known. <code>true</code> means successful,
- * <code>false</code> means an error occurred.
- * @param ok status
- */
- private void retrievalStatus(boolean ok) {
- uploadResults = Boolean.valueOf(ok);
-
- if (uploadButton != null) {
- FormItemIcon loadedIcon = new FormItemIcon();
- if (ok) {
- loadedIcon.setSrc("/images/icons/availability_green_16.png");
- } else {
- loadedIcon.setSrc("/images/icons/availability_red_16.png");
- }
- loadedIcon.setWidth(16);
- loadedIcon.setHeight(16);
- icon.setIcons(loadedIcon);
- icon.setShowIcons(true);
- uploadButton.setDisabled(uploadResults);
- }
- }
}
commit b1c8bfca1422d74c48b50d69dd902507007b8d45
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 13:41:55 2010 -0400
need to use the return obj from merge
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 8d19ad2..7b41da0 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
@@ -361,7 +361,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// set the PackageVersion's filename to the bundleFile name, it's left null by default
packageVersion.setFileName(name);
- entityManager.merge(packageVersion);
+ packageVersion = entityManager.merge(packageVersion);
// Create the mapping between the Bundle's Repo and the BundleFile's PackageVersion
Repo repo = bundle.getRepo();
commit 9941c387a8863aefbe5e80906098c749336b7993
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 10:50:56 2010 -0400
get the 'logged in as' message area formatted a bit better
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
index caf4ffb..e134f04 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
@@ -22,9 +22,11 @@ import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.Hyperlink;
-import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.Img;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
@@ -39,7 +41,7 @@ public class MenuBarView extends VLayout {
private AboutModalWindow aboutModalWindow;
- public static final String[] SECTIONS = {"Dashboard", "Demo", "Inventory", "Bundles", "Administration"};
+ public static final String[] SECTIONS = { "Dashboard", "Demo", "Inventory", "Bundles", "Administration" };
private String selected = "Dashboard";
@@ -65,14 +67,12 @@ public class MenuBarView extends VLayout {
protected void onDraw() {
super.onDraw();
-
ToolStrip topStrip = new ToolStrip();
topStrip.setHeight(34);
topStrip.setWidth100();
topStrip.setBackgroundImage("header/header_bg.png");
topStrip.setMembersMargin(20);
-
this.aboutModalWindow = new AboutModalWindow();
Img logo = new Img("header/rhq_logo_28px.png", 80, 28);
logo.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
@@ -82,7 +82,6 @@ public class MenuBarView extends VLayout {
});
topStrip.addMember(logo);
-
linksPane = new HTMLFlow();
linksPane.setContents(setupLinks());
@@ -90,12 +89,15 @@ public class MenuBarView extends VLayout {
topStrip.addMember(new LayoutSpacer());
- topStrip.addMember(new HTMLFlow("Logged in as " + CoreGUI.getSessionSubject().getName()));
-
- topStrip.addMember(new Hyperlink("Help", "Help"));
- topStrip.addMember(new Hyperlink("Preferences", "Preferences"));
- topStrip.addMember(new Hyperlink("Log Out", "LogOut"));
-
+ HLayout helpLayout = new HLayout();
+ Label loggedInAs = new Label("Logged in as " + CoreGUI.getSessionSubject().getName());
+ loggedInAs.setValign(VerticalAlignment.CENTER);
+ helpLayout.addMember(loggedInAs);
+ helpLayout.addMember(new Hyperlink("Help", "Help"));
+ helpLayout.addMember(new Hyperlink("Preferences", "Preferences"));
+ helpLayout.addMember(new Hyperlink("Log Out", "LogOut"));
+ helpLayout.setLayoutAlign(VerticalAlignment.CENTER);
+ topStrip.addMember(helpLayout);
/* DynamicForm links = new DynamicForm();
links.setNumCols(SECTIONS.length * 2);
@@ -128,9 +130,9 @@ public class MenuBarView extends VLayout {
markForRedraw();
}
-
private String setupLinks() {
- StringBuilder headerString = new StringBuilder("<table style=\"height: 34px;\" cellpadding=\"0\" cellspacing=\"0\"><tr>");
+ StringBuilder headerString = new StringBuilder(
+ "<table style=\"height: 34px;\" cellpadding=\"0\" cellspacing=\"0\"><tr>");
boolean first = true;
for (String section : SECTIONS) {
@@ -144,7 +146,6 @@ public class MenuBarView extends VLayout {
styleClass += "Selected";
}
-
headerString.append("<td class=\"" + styleClass + "\" onclick=\"document.location='#" + section + "'\" >");
headerString.append(section);
headerString.append("</td>\n");
commit a4843f881ec94bdfe97a44f6284d6b12b0bb2b01
Merge: 3b74570... aac77c4...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 09:27:00 2010 -0400
Merge branch 'gwt' into gwt-jay
commit aac77c4667585187cb1b24b769a36f628ec8cd1d
Merge: c319887... 7afbfa9...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 09:26:26 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit 3b745709e4be143524270f8f9825ab134228e4f6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 26 09:25:42 2010 -0400
Initial support for bundle group deployment. Needs more work around group
status tracking and possibly fault tolerance.
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 309c3cb..f3bdf49 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -570,6 +570,17 @@
</index>
</table>
+ <table name="RHQ_BUNDLE_GROUP_DEPLOY">
+ <column name="ID" type="INTEGER" required="true" default="sequence-only" initial="10001" primarykey="true"/>
+ <column name="GROUP_ID" type="INTEGER" required="true" references="RHQ_RESOURCE_GROUP"/>
+ <column name="BUNDLE_DEPLOY_DEF_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY_DEF" />
+ <column name="STATUS" type="VARCHAR2" required="true" size="16"/>
+ <column name="ERROR_MESSAGE" type="LONGVARCHAR" required="false"/>
+ <column name="SUBJECT_NAME" type="VARCHAR2" required="true" size="255"/>
+ <column name="CTIME" type="LONG" required="true"/>
+ <column name="MTIME" type="LONG" required="true"/>
+ </table>
+
<!-- Represents a bundle version that is deployed on a platform resource -->
<table name="RHQ_BUNDLE_DEPLOY">
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
@@ -584,17 +595,6 @@
</index>
</table>
- <table name="RHQ_BUNDLE_GROUP_DEPLOY">
- <column name="ID" type="INTEGER" required="true" default="sequence-only" initial="10001" primarykey="true"/>
- <column name="GROUP_ID" type="INTEGER" required="true" references="RHQ_RESOURCE_GROUP"/>
- <column name="BUNDLE_DEPLOY_DEF_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY_DEF" />
- <column name="STATUS" type="VARCHAR2" required="true" size="16"/>
- <column name="ERROR_MESSAGE" type="LONGVARCHAR" required="false"/>
- <column name="SUBJECT_NAME" type="VARCHAR2" required="true" size="255"/>
- <column name="CTIME" type="LONG" required="true"/>
- <column name="MTIME" type="LONG" required="true"/>
- </table>
-
<table name="RHQ_BUNDLE_DEPLOY_HIST">
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="BUNDLE_DEPLOY_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY" />
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployDefinition.java
index 5c11287..8f642ea 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployDefinition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployDefinition.java
@@ -103,6 +103,9 @@ public class BundleDeployDefinition implements Serializable {
@OneToMany(mappedBy = "bundleDeployDefinition", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<BundleDeployment> deployments = new ArrayList<BundleDeployment>();
+ @OneToMany(mappedBy = "bundleDeployDefinition", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ private List<BundleGroupDeployment> groupDeployments = new ArrayList<BundleGroupDeployment>();
+
public BundleDeployDefinition() {
// for JPA use
}
@@ -212,6 +215,19 @@ public class BundleDeployDefinition implements Serializable {
this.deployments = deployments;
}
+ public List<BundleGroupDeployment> getGroupDeployments() {
+ return groupDeployments;
+ }
+
+ public void addGroupDeployment(BundleGroupDeployment bundleGroupDeployment) {
+ this.groupDeployments.add(bundleGroupDeployment);
+ bundleGroupDeployment.setBundleDeployDefinition(this);
+ }
+
+ public void setGroupDeployments(List<BundleGroupDeployment> groupDeployments) {
+ this.groupDeployments = groupDeployments;
+ }
+
@Override
public String toString() {
return "BundleDeployDefinition[id=" + id + ", name=" + name + "]";
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
index 8f27723..8a0365f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
@@ -26,7 +26,6 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
@@ -58,11 +57,11 @@ public class BundleGroupDeployment implements Serializable {
private int id;
@JoinColumn(name = "GROUP_ID", referencedColumnName = "ID")
- @ManyToOne(cascade = { CascadeType.REMOVE })
+ @ManyToOne
private ResourceGroup group;
@JoinColumn(name = "BUNDLE_DEPLOY_DEF_ID", referencedColumnName = "ID", nullable = false)
- @ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.LAZY)
+ @ManyToOne
protected BundleDeployDefinition bundleDeployDefinition;
@Column(name = "STATUS", nullable = false)
@@ -81,7 +80,7 @@ public class BundleGroupDeployment implements Serializable {
@Column(name = "MTIME", nullable = false)
protected long modifiedTime = System.currentTimeMillis();
- @OneToMany(mappedBy = "bundleGroupDeployment", fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
+ @OneToMany(mappedBy = "bundleGroupDeployment", fetch = FetchType.LAZY)
private List<BundleDeployment> bundleDeployments = new ArrayList<BundleDeployment>();
// For JPA
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
index 9eae8e6..3c8c5c5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
@@ -404,10 +404,10 @@ public class ResourceGroup extends Group {
// by primary key which will also put the configuration updates in chronological order
private List<AbstractGroupConfigurationUpdate> configurationUpdates = new ArrayList<AbstractGroupConfigurationUpdate>();
- @OneToMany(mappedBy = "group", cascade = { CascadeType.ALL })
+ @OneToMany(mappedBy = "group", cascade = { CascadeType.REMOVE })
@OrderBy
- // by primary key which will also put the operation histories in chronological order
- private List<BundleGroupDeployment> bundleDeployments = new ArrayList<BundleGroupDeployment>();
+ // by primary key which will also put the bundle deployments in chronological order
+ private List<BundleGroupDeployment> bundleGroupDeployments = new ArrayList<BundleGroupDeployment>();
@JoinColumn(name = "GROUP_DEFINITION_ID", referencedColumnName = "ID", nullable = true)
@ManyToOne
@@ -554,12 +554,12 @@ public class ResourceGroup extends Group {
this.configurationUpdates = configurationUpdates;
}
- public List<BundleGroupDeployment> getBundleDeployments() {
- return bundleDeployments;
+ public List<BundleGroupDeployment> getBundleGroupDeployments() {
+ return bundleGroupDeployments;
}
- public void setBundleDeployments(List<BundleGroupDeployment> bundleDeployments) {
- this.bundleDeployments = bundleDeployments;
+ public void setBundleGroupDeployments(List<BundleGroupDeployment> bundleGroupDeployments) {
+ this.bundleGroupDeployments = bundleGroupDeployments;
}
public GroupDefinition getGroupDefinition() {
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
index 76e3f74..34986f1 100644
--- a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -26,7 +26,7 @@
* said platform.
*/
-var TestsEnabled = true;
+var TestsEnabled = false;
var bundleName = 'testScriptBundle';
@@ -82,6 +82,51 @@ function testDeployment() {
cleanupTestBundle();
}
+function testGroupDeployment() {
+// if ( !TestsEnabled ) {
+// return;
+// }
+
+ // delete the test bundle if it exists
+ cleanupTestBundle();
+
+ // create the test bundle
+ var testBundle = BundleManager.createBundle( bundleName, bundleName, getBundleType() );
+
+ // define the recipe for bundleVersion 1.0
+ var recipe = "file -s testBundle.war -d <%bundleTest.deployHome%>/group/testBundle.war"
+
+ // create bundleVersion 1.0
+ var testBundleVersion = BundleManager.createBundleVersion( testBundle.getId(), bundleName, bundleName, null, recipe);
+
+ // add the single bundleFile, the test war file
+ var fileBytes = scriptUtil.getFileBytes("./src/test/resources/testBundle.war");
+ var bundleFile = BundleManager.addBundleFileViaByteArray(testBundleVersion.getId(), "testBundle.war",
+ "1.0", null, fileBytes, false);
+
+ // create the config, setting the required properties from the recipe
+ var config = new Configuration();
+ var property = new PropertySimple("bundleTest.deployHome", "/tmp/bundle-test");
+ config.put( property );
+
+ // create a deploy def using the above config
+ var testDeployDef = BundleManager.createBundleDeployDefinition(testBundleVersion.getId(), "Deployment Test", "Deployment Test of testBundle WAR", config, false, -1, false);
+
+ // Find a target platform group
+ var rgc = new ResourceGroupCriteria();
+ rgc.addFilterName("platforms"); // wINdows, lINux
+ var groups = ResourceGroupManager.findResourceGroupsByCriteria(rgc);
+ Assert.assertTrue( groups.size() > 0 );
+ var groupId = groups.get(0).getId();
+
+ var bgd = BundleManager.scheduleBundleGroupDeployment(testDeployDef.getId(), groupId);
+ Assert.assertNotNull( bgd );
+
+ // delete the test bundle if it exists (after allowing agent audit messages to complete)
+ sleep( 5000 );
+ cleanupTestBundle();
+}
+
function getBundleType() {
var types = BundleManager.getAllBundleTypes();
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 fe4cca4..8d19ad2 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
@@ -458,7 +458,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// The BundleDeployment record must exist in the db before the agent request because the agent may try to
// add History to it during immediate deployments., so create and persist it (requires a new trans).
BundleDeployment deployment = bundleManager.createBundleDeployment(subject, deployDef.getId(), resourceId,
- bundleGroupDeployment.getId());
+ (null == bundleGroupDeployment) ? 0 : bundleGroupDeployment.getId());
// make sure the deployment contains the info required by the schedule service
BundleVersion bundleVersion = entityManager.find(BundleVersion.class, deployDef.getBundleVersion().getId());
@@ -516,10 +516,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
/*
- * we need to create and persist the group deployment entity in a new transaction before the rest of the
- * processing of this method; if we try to create and attach the deployment children
- * to the parent before this is persisted we'll get StaleStateExceptions
- * from Hibernate because of our use of flush/clear (we're trying to update it before it actually exists)
+ * we need to create the group deployment entity in a new transaction before the rest of the
+ * processing of this method; the individual deployments need to reference it.
*/
BundleGroupDeployment bundleGroupDeployment = new BundleGroupDeployment(subject.getName(), deployDef,
resourceGroup);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index c975d38..163e9c6 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -40,6 +40,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
@@ -152,6 +153,13 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleFile.class, ((BundleFile) removeMe).getId()));
}
+ // remove any orphaned bgds
+ q = em.createQuery("SELECT bgd FROM BundleGroupDeployment bgd WHERE bgd.bundleDeployDefinition.name LIKE '"
+ + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(BundleGroupDeployment.class, ((BundleGroupDeployment) removeMe).getId()));
+ }
// remove any orphaned bds
q = em.createQuery("SELECT bd FROM BundleDeployment bd WHERE bd.bundleDeployDefinition.name LIKE '"
+ TEST_PREFIX + "%'");
commit 7afbfa9b13b12e4d362c918571a35f88c118b9d9
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 26 03:43:20 2010 -0400
bundle file upload step in wizard works and looks nicer now
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
index 793cd5a..e241771 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
@@ -18,21 +18,22 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.create;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.events.FormSubmitFailedEvent;
import com.smartgwt.client.widgets.form.events.FormSubmitFailedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
import org.rhq.enterprise.gui.coregui.client.components.upload.BundleFileUploadForm;
import org.rhq.enterprise.gui.coregui.client.components.upload.DynamicFormHandler;
import org.rhq.enterprise.gui.coregui.client.components.upload.DynamicFormSubmitCompleteEvent;
@@ -45,25 +46,24 @@ public class BundleUploadDataStep implements WizardStep {
private final AbstractBundleCreateWizard wizard;
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- private DynamicForm form;
+ private ArrayList<BundleFileUploadForm> uploadForms;
public BundleUploadDataStep(AbstractBundleCreateWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
}
public Canvas getCanvas() {
- form = new DynamicForm();
-
- final VLayout layout = new VLayout();
- layout.setMargin(Integer.valueOf(20));
- layout.setAlign(Alignment.CENTER);
+ final VLayout mainLayout = new VLayout();
+ mainLayout.setMargin(Integer.valueOf(20));
+ mainLayout.setWidth100();
+ mainLayout.setHeight(10);
bundleServer.getAllBundleVersionFilenames(this.wizard.getBundleVersion().getId(),
new AsyncCallback<HashMap<String, Boolean>>() {
public void onSuccess(HashMap<String, Boolean> result) {
wizard.setAllBundleFilesStatus(result);
- prepareForm(layout);
+ prepareForm(mainLayout);
}
public void onFailure(Throwable caught) {
@@ -72,8 +72,7 @@ public class BundleUploadDataStep implements WizardStep {
}
});
- form.addChild(layout);
- return form;
+ return mainLayout;
}
public boolean nextPage() {
@@ -88,61 +87,82 @@ public class BundleUploadDataStep implements WizardStep {
if (wizard.getAllBundleFilesStatus() == null) {
return false;
}
+
+ boolean needToUpload = false;
+ for (BundleFileUploadForm uploadForm : this.uploadForms) {
+ if (uploadForm.getUploadResults() == null) {
+ uploadForm.submitForm();
+ needToUpload = true;
+ }
+ }
+ if (needToUpload) {
+ return false;
+ }
+
if (wizard.getAllBundleFilesStatus().containsValue(Boolean.FALSE)) {
return false;
}
return true;
}
- private void prepareForm(VLayout layout) {
+ private void prepareForm(VLayout mainLayout) {
// if there are no files to upload, immediately skip this step
final HashMap<String, Boolean> allFilesStatus = wizard.getAllBundleFilesStatus();
if (allFilesStatus != null && allFilesStatus.size() == 0) {
- // TODO: do something to tell the user they don't have to do anything for this step
+ HeaderLabel label = new HeaderLabel("No files need to be uploaded for this bundle");
+ label.setWidth100();
+ mainLayout.addMember(label);
+ uploadForms = null;
return;
}
- for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) {
- HLayout formLayout = new HLayout();
- layout.addMember(formLayout);
+ uploadForms = new ArrayList<BundleFileUploadForm>();
+ for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) {
String fileToBeUploaded = entry.getKey();
Boolean isAlreadyUploaded = entry.getValue();
- if (isAlreadyUploaded) {
- Label nameLabel = new Label(fileToBeUploaded + ": ");
- formLayout.addMember(nameLabel);
- Img img = new Img("/images/icons/availability_green_16.png", 16, 16);
- formLayout.addMember(img);
- } else {
- final BundleFileUploadForm uploadForm = new BundleFileUploadForm(this.wizard.getBundleVersion(),
- fileToBeUploaded);
- uploadForm.addFormHandler(new DynamicFormHandler() {
- public void onSubmitComplete(DynamicFormSubmitCompleteEvent event) {
- String results = event.getResults();
- if (!results.contains("Failed to upload bundle file")) {
- uploadForm.retrievalStatus(true);
- allFilesStatus.put(uploadForm.getName(), Boolean.TRUE);
- } else {
- uploadForm.retrievalStatus(false);
- allFilesStatus.put(uploadForm.getName(), Boolean.FALSE);
- CoreGUI.getMessageCenter().notify(
- new Message("Failed to upload bundle file", results, Message.Severity.Error));
- }
- }
- });
- uploadForm.addFormSubmitFailedHandler(new FormSubmitFailedHandler() {
- public void onFormSubmitFailed(FormSubmitFailedEvent event) {
- uploadForm.retrievalStatus(false);
+ HLayout indivLayout = new HLayout();
+ indivLayout.setWidth100();
+ indivLayout.setAutoHeight();
+
+ Label nameLabel = new Label(fileToBeUploaded + ": ");
+ nameLabel.setWidth("*");
+ nameLabel.setAlign(Alignment.RIGHT);
+ nameLabel.setLayoutAlign(VerticalAlignment.CENTER);
+ indivLayout.addMember(nameLabel);
+
+ final BundleFileUploadForm uploadForm = new BundleFileUploadForm(this.wizard.getBundleVersion(),
+ fileToBeUploaded, false, (isAlreadyUploaded) ? Boolean.TRUE : null);
+ uploadForm.setWidth("75%");
+ indivLayout.addMember(uploadForm);
+
+ uploadForm.addFormHandler(new DynamicFormHandler() {
+ public void onSubmitComplete(DynamicFormSubmitCompleteEvent event) {
+ String results = event.getResults();
+ if (!results.contains("Failed to upload bundle file")) {
+ allFilesStatus.put(uploadForm.getName(), Boolean.TRUE);
+ } else {
allFilesStatus.put(uploadForm.getName(), Boolean.FALSE);
CoreGUI.getMessageCenter().notify(
- new Message("Failed to upload file", null, Message.Severity.Error));
+ new Message("Failed to upload bundle file", results, Message.Severity.Error));
}
- });
+ }
+ });
+ uploadForm.addFormSubmitFailedHandler(new FormSubmitFailedHandler() {
+ public void onFormSubmitFailed(FormSubmitFailedEvent event) {
+ allFilesStatus.put(uploadForm.getName(), Boolean.FALSE);
+ CoreGUI.getMessageCenter().notify(
+ new Message("Failed to upload file", null, Message.Severity.Error));
+ }
+ });
- formLayout.addMember(uploadForm);
- }
+ uploadForms.add(uploadForm);
+
+ mainLayout.addMember(indivLayout);
}
+
+ return;
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
index a0c6add..6f18f04 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
@@ -20,9 +20,12 @@ package org.rhq.enterprise.gui.coregui.client.components.upload;
import com.google.gwt.core.client.GWT;
import com.smartgwt.client.types.Encoding;
+import com.smartgwt.client.widgets.form.events.FormSubmitFailedEvent;
+import com.smartgwt.client.widgets.form.events.FormSubmitFailedHandler;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.HiddenItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.UploadItem;
import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
@@ -36,18 +39,25 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
public class BundleFileUploadForm extends DynamicCallbackForm {
- private ButtonItem uploadButton;
private UploadItem bundleUploadItem;
+ private ButtonItem uploadButton;
+ private StaticTextItem icon;
+
+ private Boolean uploadResults;
- private BundleVersion bundleVersion;
- private String name;
+ private final BundleVersion bundleVersion;
+ private final String name;
+ private final boolean showNameLabel;
+
+ public BundleFileUploadForm(BundleVersion bundleVersion, String name, boolean showNameLabel,
+ Boolean isAlreadyUploaded) {
- public BundleFileUploadForm(BundleVersion bundleVersion, String name) {
super(name);
this.bundleVersion = bundleVersion;
this.name = name;
+ this.showNameLabel = showNameLabel;
+ this.uploadResults = isAlreadyUploaded; // null if unknown, false if error during previous upload attempt, true if already uploaded before
- setNumCols(8);
setEncoding(Encoding.MULTIPART);
setAction(GWT.getModuleBaseURL() + "/BundleFileUploadServlet");
}
@@ -65,6 +75,23 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
return name;
}
+ /**
+ * Returns true if the file was successfully uploaded, false if an error occurred.
+ * Returns null if this upload form has not be submitted yet (see {@link #submitForm()}).
+ * @return status of the upload request
+ */
+ public Boolean getUploadResults() {
+ return uploadResults;
+ }
+
+ @Override
+ public void submitForm() {
+ icon.setShowIcons(true);
+ uploadButton.setDisabled(true);
+ markForRedraw();
+ super.submitForm();
+ }
+
@Override
protected void onDraw() {
super.onDraw();
@@ -81,58 +108,91 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
HiddenItem versionField = new HiddenItem("version");
versionField.setValue("1.0");
- setNumCols(4);
+ setNumCols(7);
- bundleUploadItem = new UploadItem("bundleFile", name);
+ bundleUploadItem = new UploadItem("bundleFileUploadItem", name);
bundleUploadItem.setEndRow(false);
+ bundleUploadItem.setShowTitle(showNameLabel);
uploadButton = new ButtonItem("Upload");
uploadButton.setStartRow(false);
+ uploadButton.setEndRow(false);
uploadButton.setDisabled(true);
-
- bundleUploadItem.addChangeHandler(new ChangeHandler() {
- public void onChange(ChangeEvent changeEvent) {
- uploadButton.setDisabled(false);
- }
- });
-
uploadButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
- uploadButton.setShowIcons(true);
- markForRedraw();
submitForm();
}
});
+ icon = new StaticTextItem("icon");
+ icon.setStartRow(false);
+ icon.setShowTitle(false);
+
FormItemIcon loadingIcon = new FormItemIcon();
loadingIcon.setSrc("ajax-loader.gif");
loadingIcon.setWidth(16);
loadingIcon.setHeight(16);
- uploadButton.setIcons(loadingIcon);
- uploadButton.setShowIcons(false);
+ icon.setIcons(loadingIcon);
+ icon.setShowIcons(false);
+
+ bundleUploadItem.addChangeHandler(new ChangeHandler() {
+ public void onChange(ChangeEvent changeEvent) {
+ if (uploadResults != null) {
+ retrievalStatus(uploadResults.booleanValue());
+ } else {
+ uploadButton.setDisabled(false);
+ icon.setShowIcons(false);
+ }
+ }
+ });
+
+ if (uploadResults != null) {
+ retrievalStatus(uploadResults.booleanValue());
+ }
- setItems(sessionIdField, bundleVersionIdField, nameField, versionField, bundleUploadItem, uploadButton);
+ setItems(sessionIdField, bundleVersionIdField, nameField, versionField, bundleUploadItem, uploadButton, icon);
+
+ addFormHandler(new DynamicFormHandler() {
+ public void onSubmitComplete(DynamicFormSubmitCompleteEvent event) {
+ String results = event.getResults();
+ if (!results.contains("Failed to upload bundle file")) {
+ CoreGUI.getMessageCenter().notify(new Message("Uploaded bundle file successfully", Severity.Info));
+ retrievalStatus(true);
+ } else {
+ CoreGUI.getMessageCenter().notify(new Message("Bundle file upload failed", Severity.Error));
+ retrievalStatus(false);
+ }
+ }
+ });
+
+ addFormSubmitFailedHandler(new FormSubmitFailedHandler() {
+ public void onFormSubmitFailed(FormSubmitFailedEvent event) {
+ CoreGUI.getMessageCenter().notify(new Message("Bundle file upload failed", Severity.Error));
+ retrievalStatus(false);
+ }
+ });
}
/**
- * Call this when the file retrieval finished. <code>true</code> means successful,
+ * Call this when the last file retrieval status is known. <code>true</code> means successful,
* <code>false</code> means an error occurred.
* @param ok status
*/
- public void retrievalStatus(boolean ok) {
+ private void retrievalStatus(boolean ok) {
+ uploadResults = Boolean.valueOf(ok);
+
if (uploadButton != null) {
FormItemIcon loadedIcon = new FormItemIcon();
if (ok) {
loadedIcon.setSrc("/images/icons/availability_green_16.png");
- CoreGUI.getMessageCenter().notify(new Message("Uploaded bundle file successfully", Severity.Info));
} else {
loadedIcon.setSrc("/images/icons/availability_red_16.png");
- CoreGUI.getMessageCenter().notify(new Message("Bundle file upload failed", Severity.Error));
}
loadedIcon.setWidth(16);
loadedIcon.setHeight(16);
- uploadButton.setIcons(loadedIcon);
- uploadButton.setShowIcons(true);
+ icon.setIcons(loadedIcon);
+ icon.setShowIcons(true);
+ uploadButton.setDisabled(uploadResults);
}
}
}
commit 22bafe51d32a5f7ccacb0d5523c30b7b5ac2516c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Mar 25 17:05:43 2010 -0400
fix summary tab view
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
index 7a483e6..4d7575e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
@@ -23,8 +23,8 @@ import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.layout.HLayout;
-import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
@@ -39,8 +39,8 @@ public class BundleView extends VLayout {
private Label message = new Label("Select a bundle...");
private VLayout canvas;
private HeaderLabel headerLabel;
- private Label descriptionValue;
- private Label latestVersionValue;
+ private StaticTextItem descriptionItem;
+ private StaticTextItem latestVersionItem;
public BundleView() {
super();
@@ -87,42 +87,24 @@ public class BundleView extends VLayout {
private Tab createSummaryTab() {
Tab summaryTab = new Tab("Summary");
- VLayout top = new VLayout();
- top.setAutoHeight();
- top.setPadding(20);
- top.setWidth100();
-
- HLayout descriptionBox = new HLayout();
- descriptionBox.setWidth100();
- descriptionBox.setExtraSpace(10);
- Label descriptionLabel = new Label("Description:");
- descriptionLabel.setWidth("10%");
- descriptionLabel.setAlign(Alignment.LEFT);
- descriptionLabel.setWrap(false);
- descriptionValue = new Label("");
- descriptionValue.setWidth("90%");
- descriptionValue.setAlign(Alignment.LEFT);
- descriptionBox.addMember(descriptionLabel);
- descriptionBox.addMember(descriptionValue);
- top.addMember(descriptionBox);
- top.addMember(new LayoutSpacer());
-
- HLayout versionBox = new HLayout();
- versionBox.setWidth100();
- versionBox.setExtraSpace(10);
- Label versionLabel = new Label("Latest Version:");
- versionLabel.setWidth("10%");
- versionLabel.setAlign(Alignment.LEFT);
- versionLabel.setWrap(false);
- latestVersionValue = new Label("");
- latestVersionValue.setWidth("90%");
- latestVersionValue.setAlign(Alignment.LEFT);
- versionBox.addMember(versionLabel);
- versionBox.addMember(latestVersionValue);
- top.addMember(versionBox);
- top.addMember(new LayoutSpacer());
-
- summaryTab.setPane(top);
+ DynamicForm form = new DynamicForm();
+ form.setPadding(10);
+
+ descriptionItem = new StaticTextItem("description", "Description");
+ descriptionItem.setTitleAlign(Alignment.LEFT);
+ descriptionItem.setAlign(Alignment.LEFT);
+ descriptionItem.setWrap(false);
+ descriptionItem.setValue("");
+
+ latestVersionItem = new StaticTextItem("latestVersion", "Latest Version");
+ latestVersionItem.setTitleAlign(Alignment.LEFT);
+ latestVersionItem.setAlign(Alignment.LEFT);
+ latestVersionItem.setWrap(false);
+ latestVersionItem.setValue("");
+
+ form.setFields(descriptionItem, latestVersionItem);
+ summaryTab.setPane(form);
+
return summaryTab;
}
@@ -132,8 +114,8 @@ public class BundleView extends VLayout {
if (bundleBeingViewed != object.getBundleId()) {
headerLabel.setContents(object.getBundleName());
- latestVersionValue.setContents(object.getLatestVersion());
- descriptionValue.setContents(object.getBundleDescription());
+ latestVersionItem.setValue(object.getLatestVersion());
+ descriptionItem.setValue(object.getBundleDescription());
}
try {
commit b8614fbcfe231944e59e9d1be8dde1274ec879c3
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Mar 25 16:57:23 2010 -0400
i think i finally got the summary page to look like its supposed to now
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
index 3822718..ffa143a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -21,10 +21,8 @@ package org.rhq.enterprise.gui.coregui.client.bundle.create;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.layout.HLayout;
-import com.smartgwt.client.widgets.layout.LayoutSpacer;
-import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
@@ -41,94 +39,48 @@ public class BundleSummaryStep implements WizardStep {
public Canvas getCanvas() {
- VLayout top = new VLayout();
- top.setAutoHeight();
- top.setPadding(20);
- top.setWidth100();
+ DynamicForm form = new DynamicForm();
+ form.setNumCols(2);
- HLayout bundleTypeBox = new HLayout();
- bundleTypeBox.setWidth100();
- bundleTypeBox.setExtraSpace(10);
- Label bundleTypeLabel = new Label("Type:");
- bundleTypeLabel.setWidth("10%");
+ StaticTextItem bundleTypeLabel = new StaticTextItem("bundleType", "Type");
+ bundleTypeLabel.setTitleAlign(Alignment.LEFT);
bundleTypeLabel.setAlign(Alignment.LEFT);
bundleTypeLabel.setWrap(false);
- Label bundleTypeValue = new Label(wizard.getBundleType().getName());
- bundleTypeValue.setWidth("90%");
- bundleTypeValue.setAlign(Alignment.LEFT);
- bundleTypeBox.addMember(bundleTypeLabel);
- bundleTypeBox.addMember(bundleTypeValue);
- top.addMember(bundleTypeBox);
-
- HLayout nameBox = new HLayout();
- nameBox.setWidth100();
- nameBox.setExtraSpace(10);
- Label nameLabel = new Label("Name:");
- nameLabel.setWidth("10%");
+ bundleTypeLabel.setValue(wizard.getBundleType().getName());
+
+ StaticTextItem nameLabel = new StaticTextItem("name", "Name");
+ nameLabel.setTitleAlign(Alignment.LEFT);
nameLabel.setAlign(Alignment.LEFT);
nameLabel.setWrap(false);
- Label nameValue = new Label(wizard.getBundleName());
- nameValue.setWidth("90%");
- nameValue.setAlign(Alignment.LEFT);
- nameBox.addMember(nameLabel);
- nameBox.addMember(nameValue);
- top.addMember(nameBox);
- top.addMember(new LayoutSpacer());
-
- HLayout versionBox = new HLayout();
- versionBox.setWidth100();
- versionBox.setExtraSpace(10);
- Label versionLabel = new Label("Version:");
- versionLabel.setWidth("10%");
+ nameLabel.setValue(wizard.getBundleName());
+
+ StaticTextItem versionLabel = new StaticTextItem("Version");
+ versionLabel.setTitleAlign(Alignment.LEFT);
+ versionLabel.setTitleAlign(Alignment.LEFT);
versionLabel.setAlign(Alignment.LEFT);
versionLabel.setWrap(false);
- Label versionValue = new Label(wizard.getBundleVersionString());
- versionValue.setWidth("90%");
- versionValue.setAlign(Alignment.LEFT);
- versionBox.addMember(versionLabel);
- versionBox.addMember(versionValue);
- top.addMember(versionBox);
- top.addMember(new LayoutSpacer());
-
- HLayout descriptionBox = new HLayout();
- descriptionBox.setWidth100();
- descriptionBox.setExtraSpace(10);
- Label descriptionLabel = new Label("Description:");
- descriptionLabel.setWidth("10%");
+ versionLabel.setValue(wizard.getBundleVersionString());
+
+ StaticTextItem descriptionLabel = new StaticTextItem("Description");
+ descriptionLabel.setTitleAlign(Alignment.LEFT);
descriptionLabel.setAlign(Alignment.LEFT);
descriptionLabel.setWrap(false);
- Label descriptionValue = new Label(wizard.getBundleDescription());
- descriptionValue.setWidth("90%");
- descriptionValue.setAlign(Alignment.LEFT);
- descriptionBox.addMember(descriptionLabel);
- descriptionBox.addMember(descriptionValue);
- top.addMember(descriptionBox);
- top.addMember(new LayoutSpacer());
-
- HLayout filesBox = new HLayout();
- filesBox.setWidth100();
- filesBox.setExtraSpace(10);
- Label filesLabel = new Label("Files:");
- filesLabel.setWidth("10%");
+ descriptionLabel.setValue(wizard.getBundleDescription());
+
+ StaticTextItem filesLabel = new StaticTextItem("Files");
+ filesLabel.setTitleVAlign(VerticalAlignment.TOP);
+ filesLabel.setTitleAlign(Alignment.LEFT);
filesLabel.setAlign(Alignment.LEFT);
- filesLabel.setValign(VerticalAlignment.TOP);
filesLabel.setWrap(false);
- VLayout filesValues = new VLayout();
- filesValues.setWidth("90%");
- filesValues.setAutoHeight();
+ StringBuilder filesValueStr = new StringBuilder();
for (String filename : wizard.getAllBundleFilesStatus().keySet()) {
- Label fileNameValue = new Label(filename);
- fileNameValue.setAlign(Alignment.LEFT);
- fileNameValue.setValign(VerticalAlignment.TOP);
- fileNameValue.setWrap(false);
- fileNameValue.setHeight(10);
- filesValues.addMember(fileNameValue);
+ filesValueStr.append(filename + "<br/>\n");
}
- filesBox.addMember(filesLabel);
- filesBox.addMember(filesValues);
- top.addMember(filesBox);
+ filesLabel.setValue(filesValueStr.toString());
+
+ form.setFields(bundleTypeLabel, nameLabel, versionLabel, descriptionLabel, filesLabel);
- return top;
+ return form;
}
public boolean nextPage() {
commit f68be0be9b6e91823b44ebd2b3bf84310592c21b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Mar 25 16:04:17 2010 -0400
get the summary page's list of files to look right
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
index 45002c1..3822718 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.gui.coregui.client.bundle.create;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.layout.HLayout;
@@ -110,6 +111,7 @@ public class BundleSummaryStep implements WizardStep {
Label filesLabel = new Label("Files:");
filesLabel.setWidth("10%");
filesLabel.setAlign(Alignment.LEFT);
+ filesLabel.setValign(VerticalAlignment.TOP);
filesLabel.setWrap(false);
VLayout filesValues = new VLayout();
filesValues.setWidth("90%");
@@ -117,7 +119,9 @@ public class BundleSummaryStep implements WizardStep {
for (String filename : wizard.getAllBundleFilesStatus().keySet()) {
Label fileNameValue = new Label(filename);
fileNameValue.setAlign(Alignment.LEFT);
+ fileNameValue.setValign(VerticalAlignment.TOP);
fileNameValue.setWrap(false);
+ fileNameValue.setHeight(10);
filesValues.addMember(fileNameValue);
}
filesBox.addMember(filesLabel);
commit 45b2d2862527df40a6480432d3f8c6ca4a21a45c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Mar 25 12:32:38 2010 -0400
forgot to pass in the name in the log message
diff --git a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java
index 5e812c2..bf2fef0 100644
--- a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java
+++ b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/PluginUpdate.java
@@ -315,7 +315,7 @@ public class PluginUpdate {
}
}
}
- LOG.info(AgentI18NResourceKeys.DOWNLOADING_PLUGIN_COMPLETE, plugin.getPath());
+ LOG.info(AgentI18NResourceKeys.DOWNLOADING_PLUGIN_COMPLETE, plugin.getName(), plugin.getPath());
}
/**
commit f587e2c89652e7445eba5debeaba33f8a12d0900
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 17:35:40 2010 -0400
add start of the "bundle" view at the bottom of bundle list
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
index a0c565b..45002c1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -18,9 +18,9 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.create;
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.Label;
+import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;
@@ -50,11 +50,11 @@ public class BundleSummaryStep implements WizardStep {
bundleTypeBox.setExtraSpace(10);
Label bundleTypeLabel = new Label("Type:");
bundleTypeLabel.setWidth("10%");
- bundleTypeLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
- bundleTypeLabel.setWordWrap(false);
+ bundleTypeLabel.setAlign(Alignment.LEFT);
+ bundleTypeLabel.setWrap(false);
Label bundleTypeValue = new Label(wizard.getBundleType().getName());
bundleTypeValue.setWidth("90%");
- bundleTypeValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ bundleTypeValue.setAlign(Alignment.LEFT);
bundleTypeBox.addMember(bundleTypeLabel);
bundleTypeBox.addMember(bundleTypeValue);
top.addMember(bundleTypeBox);
@@ -64,11 +64,11 @@ public class BundleSummaryStep implements WizardStep {
nameBox.setExtraSpace(10);
Label nameLabel = new Label("Name:");
nameLabel.setWidth("10%");
- nameLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
- nameLabel.setWordWrap(false);
+ nameLabel.setAlign(Alignment.LEFT);
+ nameLabel.setWrap(false);
Label nameValue = new Label(wizard.getBundleName());
nameValue.setWidth("90%");
- nameValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ nameValue.setAlign(Alignment.LEFT);
nameBox.addMember(nameLabel);
nameBox.addMember(nameValue);
top.addMember(nameBox);
@@ -79,11 +79,11 @@ public class BundleSummaryStep implements WizardStep {
versionBox.setExtraSpace(10);
Label versionLabel = new Label("Version:");
versionLabel.setWidth("10%");
- versionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
- versionLabel.setWordWrap(false);
+ versionLabel.setAlign(Alignment.LEFT);
+ versionLabel.setWrap(false);
Label versionValue = new Label(wizard.getBundleVersionString());
versionValue.setWidth("90%");
- versionValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ versionValue.setAlign(Alignment.LEFT);
versionBox.addMember(versionLabel);
versionBox.addMember(versionValue);
top.addMember(versionBox);
@@ -94,11 +94,11 @@ public class BundleSummaryStep implements WizardStep {
descriptionBox.setExtraSpace(10);
Label descriptionLabel = new Label("Description:");
descriptionLabel.setWidth("10%");
- descriptionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
- descriptionLabel.setWordWrap(false);
+ descriptionLabel.setAlign(Alignment.LEFT);
+ descriptionLabel.setWrap(false);
Label descriptionValue = new Label(wizard.getBundleDescription());
descriptionValue.setWidth("90%");
- descriptionValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ descriptionValue.setAlign(Alignment.LEFT);
descriptionBox.addMember(descriptionLabel);
descriptionBox.addMember(descriptionValue);
top.addMember(descriptionBox);
@@ -109,15 +109,15 @@ public class BundleSummaryStep implements WizardStep {
filesBox.setExtraSpace(10);
Label filesLabel = new Label("Files:");
filesLabel.setWidth("10%");
- filesLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
- filesLabel.setWordWrap(false);
+ filesLabel.setAlign(Alignment.LEFT);
+ filesLabel.setWrap(false);
VLayout filesValues = new VLayout();
filesValues.setWidth("90%");
filesValues.setAutoHeight();
for (String filename : wizard.getAllBundleFilesStatus().keySet()) {
Label fileNameValue = new Label(filename);
- fileNameValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
- fileNameValue.setWordWrap(false);
+ fileNameValue.setAlign(Alignment.LEFT);
+ fileNameValue.setWrap(false);
filesValues.addMember(fileNameValue);
}
filesBox.addMember(filesLabel);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
new file mode 100644
index 0000000..7a483e6
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
@@ -0,0 +1,153 @@
+/*
+ * 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.gui.coregui.client.bundle.list;
+
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.tab.Tab;
+import com.smartgwt.client.widgets.tab.TabSet;
+
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
+
+public class BundleView extends VLayout {
+
+ private int bundleBeingViewed = 0;
+ private Label message = new Label("Select a bundle...");
+ private VLayout canvas;
+ private HeaderLabel headerLabel;
+ private Label descriptionValue;
+ private Label latestVersionValue;
+
+ public BundleView() {
+ super();
+ setPadding(10);
+ setOverflow(Overflow.AUTO);
+ }
+
+ @Override
+ protected void onInit() {
+ super.onInit();
+ addMember(message);
+ addMember(buildCanvas());
+ canvas.hide();
+ }
+
+ private Canvas buildCanvas() {
+ canvas = new VLayout();
+
+ headerLabel = new HeaderLabel("<bundle name>");
+
+ TabSet tabs = new TabSet();
+ Tab summaryTab = createSummaryTab();
+ tabs.addTab(summaryTab);
+
+ Tab versionsTab = createVersionsTab();
+ tabs.addTab(versionsTab);
+
+ Tab deploymentsTab = createDeploymentsTab();
+ tabs.addTab(deploymentsTab);
+
+ canvas.addMember(headerLabel);
+ canvas.addMember(tabs);
+ return canvas;
+ }
+
+ private Tab createDeploymentsTab() {
+ return new Tab("Deployments");
+ }
+
+ private Tab createVersionsTab() {
+ return new Tab("Versions");
+ }
+
+ private Tab createSummaryTab() {
+ Tab summaryTab = new Tab("Summary");
+
+ VLayout top = new VLayout();
+ top.setAutoHeight();
+ top.setPadding(20);
+ top.setWidth100();
+
+ HLayout descriptionBox = new HLayout();
+ descriptionBox.setWidth100();
+ descriptionBox.setExtraSpace(10);
+ Label descriptionLabel = new Label("Description:");
+ descriptionLabel.setWidth("10%");
+ descriptionLabel.setAlign(Alignment.LEFT);
+ descriptionLabel.setWrap(false);
+ descriptionValue = new Label("");
+ descriptionValue.setWidth("90%");
+ descriptionValue.setAlign(Alignment.LEFT);
+ descriptionBox.addMember(descriptionLabel);
+ descriptionBox.addMember(descriptionValue);
+ top.addMember(descriptionBox);
+ top.addMember(new LayoutSpacer());
+
+ HLayout versionBox = new HLayout();
+ versionBox.setWidth100();
+ versionBox.setExtraSpace(10);
+ Label versionLabel = new Label("Latest Version:");
+ versionLabel.setWidth("10%");
+ versionLabel.setAlign(Alignment.LEFT);
+ versionLabel.setWrap(false);
+ latestVersionValue = new Label("");
+ latestVersionValue.setWidth("90%");
+ latestVersionValue.setAlign(Alignment.LEFT);
+ versionBox.addMember(versionLabel);
+ versionBox.addMember(latestVersionValue);
+ top.addMember(versionBox);
+ top.addMember(new LayoutSpacer());
+
+ summaryTab.setPane(top);
+ return summaryTab;
+ }
+
+ public void viewRecord(Record record) {
+ final BundleWithLatestVersionComposite object;
+ object = (BundleWithLatestVersionComposite) record.getAttributeAsObject("object");
+
+ if (bundleBeingViewed != object.getBundleId()) {
+ headerLabel.setContents(object.getBundleName());
+ latestVersionValue.setContents(object.getLatestVersion());
+ descriptionValue.setContents(object.getBundleDescription());
+ }
+
+ try {
+ message.hide();
+ canvas.show();
+ markForRedraw();
+ } catch (Throwable t) {
+ CoreGUI.getErrorHandler().handleError("Cannot view bundle record", t);
+ }
+ }
+
+ public void viewNone() {
+ message.show();
+ canvas.hide();
+ markForRedraw();
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index e3c4c0f..21b04bf 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -19,9 +19,12 @@
package org.rhq.enterprise.gui.coregui.client.bundle.list;
import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
+import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.Bundle;
@@ -51,6 +54,9 @@ public class BundlesListView extends VLayout {
super.onDraw();
final Table table = new Table("Bundles");
+ table.setHeight("50%");
+ table.setShowResizeBar(true);
+ table.setResizeBarTarget("next");
table.setDataSource(new BundlesWithLatestVersionDataSource());
@@ -147,5 +153,15 @@ public class BundlesListView extends VLayout {
});
addMember(table);
+
+ final BundleView bundleView = new BundleView();
+ bundleView.setOverflow(Overflow.AUTO);
+ addMember(bundleView);
+
+ table.getListGrid().addRecordClickHandler(new RecordClickHandler() {
+ public void onRecordClick(RecordClickEvent event) {
+ bundleView.viewRecord(event.getRecord());
+ }
+ });
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
index d67e38d..a0c6add 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/upload/BundleFileUploadForm.java
@@ -78,6 +78,9 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
HiddenItem nameField = new HiddenItem("name");
nameField.setValue(this.name);
+ HiddenItem versionField = new HiddenItem("version");
+ versionField.setValue("1.0");
+
setNumCols(4);
bundleUploadItem = new UploadItem("bundleFile", name);
@@ -108,7 +111,7 @@ public class BundleFileUploadForm extends DynamicCallbackForm {
uploadButton.setIcons(loadingIcon);
uploadButton.setShowIcons(false);
- setItems(sessionIdField, bundleVersionIdField, nameField, bundleUploadItem, uploadButton);
+ setItems(sessionIdField, bundleVersionIdField, nameField, versionField, bundleUploadItem, uploadButton);
}
/**
commit 7ef0eb7296676fd02a713d327b16413f8be9cb3f
Merge: b58b413... c319887...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 24 16:30:37 2010 -0400
Merge branch 'gwt' into gwt-jay
commit c3198879d399d8edbb9e6a8879d84855d7c35780
Merge: d3e8405... 99ac8e8...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 24 16:30:08 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit b58b413fbaa08657c3df2127e085aa3ee0f438f2
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 24 16:29:30 2010 -0400
Work on infra for bundle group deploy
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 178013b..309c3cb 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -576,8 +576,7 @@
<column name="BUNDLE_DEPLOY_DEF_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY_DEF" />
<column name="RESOURCE_ID" type="INTEGER" required="true" references="RHQ_RESOURCE" />
<column name="CTIME" type="LONG" required="true"/>
- <!-- for group history -->
- <column name="GROUP_ID" type="INTEGER" required="false" references="RHQ_RESOURCE_GROUP"/>
+ <column name="BUNDLE_GROUP_DEPLOY_ID" type="INTEGER" required="false" references="RHQ_BUNDLE_GROUP_DEPLOY"/>
<index name="RHQ_DEPLOY_DEF_RESOURCE_IDX" unique="true">
<field ref="BUNDLE_DEPLOY_DEF_ID"/>
@@ -585,6 +584,17 @@
</index>
</table>
+ <table name="RHQ_BUNDLE_GROUP_DEPLOY">
+ <column name="ID" type="INTEGER" required="true" default="sequence-only" initial="10001" primarykey="true"/>
+ <column name="GROUP_ID" type="INTEGER" required="true" references="RHQ_RESOURCE_GROUP"/>
+ <column name="BUNDLE_DEPLOY_DEF_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY_DEF" />
+ <column name="STATUS" type="VARCHAR2" required="true" size="16"/>
+ <column name="ERROR_MESSAGE" type="LONGVARCHAR" required="false"/>
+ <column name="SUBJECT_NAME" type="VARCHAR2" required="true" size="255"/>
+ <column name="CTIME" type="LONG" required="true"/>
+ <column name="MTIME" type="LONG" required="true"/>
+ </table>
+
<table name="RHQ_BUNDLE_DEPLOY_HIST">
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="BUNDLE_DEPLOY_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY" />
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 da47976..18db292 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -2819,7 +2819,7 @@
<!-- RHQ_BUNDLE_DEPLOY_HIST -->
<schema-directSQL>
<statement desc="Creating table RHQ_BUNDLE_DEPLOY_HIST">
- CREATE TABLE RHQ_BUNDLE_DEPLOY_HIST ( ID INTEGER )
+ CREATE TABLE RHQ_BUNDLE_DEPLOY_HIST ( ID INTEGER PRIMARY KEY )
</statement>
</schema-directSQL>
<schema-alterColumn table="RHQ_BUNDLE_DEPLOY_HIST" column="ID" nullable="FALSE" />
@@ -2899,7 +2899,50 @@
</schemaSpec>
<schemaSpec version="2.78.5">
- <schema-addColumn table="RHQ_BUNDLE_DEPLOY" column="RESOURCE_GROUP_ID" columnType="INTEGER" />
+ <!-- RHQ_BUNDLE_GROUP_DEPLOY -->
+ <schema-directSQL>
+ <statement desc="Creating table RHQ_BUNDLE_GROUP_DEPLOY">
+ CREATE TABLE RHQ_BUNDLE_GROUP_DEPLOY ( ID INTEGER PRIMARY KEY )
+ </statement>
+ </schema-directSQL>
+ <schema-alterColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="ID" nullable="FALSE" />
+ <schema-addColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="GROUP_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="GROUP_ID" nullable="FALSE" />
+ <schema-addColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="BUNDLE_DEPLOY_DEF_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="BUNDLE_DEPLOY_DEF_ID" nullable="FALSE" />
+ <schema-addColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="STATUS" columnType="VARCHAR2" precision="16" />
+ <schema-alterColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="STATUS" nullable="FALSE" />
+ <schema-addColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="ERROR_MESSAGE" columnType="LONGVARCHAR" />
+ <schema-addColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="SUBJECT_NAME" columnType="VARCHAR2" precision="255" />
+ <schema-alterColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="SUBJECT_NAME" nullable="FALSE" />
+ <schema-addColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="CTIME" columnType="LONG" />
+ <schema-alterColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="CTIME" nullable="FALSE" />
+ <schema-addColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="MTIME" columnType="LONG" />
+ <schema-alterColumn table="RHQ_BUNDLE_GROUP_DEPLOY" column="MTIME" nullable="FALSE" />
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE_GROUP_DEPLOY foreign key relation to RHQ_RESOURCE_GROUP">
+ ALTER TABLE RHQ_BUNDLE_GROUP_DEPLOY
+ ADD CONSTRAINT RHQ_RESOURCE_GROUP_FK
+ FOREIGN KEY (GROUP_ID)
+ REFERENCES RHQ_RESOURCE_GROUP (ID)
+ </statement>
+ <statement desc="Creating RHQ_BUNDLE_GROUP_DEPLOY foreign key relation to RHQ_BUNDLE_DEPLOY_DEF">
+ ALTER TABLE RHQ_BUNDLE_GROUP_DEPLOY
+ ADD CONSTRAINT RHQ_BUNDLE_DEPLOY_DEF_FK
+ FOREIGN KEY (BUNDLE_DEPLOY_DEF_ID)
+ REFERENCES RHQ_BUNDLE_DEPLOY_DEF (ID)
+ </statement>
+ </schema-directSQL>
+
+ <schema-addColumn table="RHQ_BUNDLE_DEPLOY" column="BUNDLE_GROUP_DEPLOY_ID" columnType="INTEGER" />
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE_DEPLOY foreign key relation to RHQ_BUNDLE_GROUP_DEPLOY">
+ ALTER TABLE RHQ_BUNDLE_DEPLOY
+ ADD CONSTRAINT RHQ_BUNDLE_GROUP_DEPLOY_FK
+ FOREIGN KEY (BUNDLE_GROUP_DEPLOY_ID)
+ REFERENCES RHQ_BUNDLE_GROUP_DEPLOY (ID)
+ </statement>
+ </schema-directSQL>
</schemaSpec>
<schemaSpec version="2.79">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
index 45389af..4bb964d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
@@ -80,6 +80,10 @@ public class BundleDeployment implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
private Resource resource;
+ @JoinColumn(name = "BUNDLE_GROUP_DEPLOY_ID", referencedColumnName = "ID", nullable = true)
+ @ManyToOne
+ private BundleGroupDeployment bundleGroupDeployment;
+
@Column(name = "CTIME")
private Long ctime = -1L;
@@ -94,6 +98,13 @@ public class BundleDeployment implements Serializable {
this.resource = resource;
}
+ public BundleDeployment(BundleDeployDefinition bundleDeploymentDef, Resource resource,
+ BundleGroupDeployment bundleGroupDeployment) {
+ this.bundleDeployDefinition = bundleDeploymentDef;
+ this.resource = resource;
+ this.bundleGroupDeployment = bundleGroupDeployment;
+ }
+
public BundleDeployDefinition getBundleDeployDefinition() {
return bundleDeployDefinition;
}
@@ -140,6 +151,14 @@ public class BundleDeployment implements Serializable {
this.histories.add(history);
}
+ public BundleGroupDeployment getBundleGroupDeployment() {
+ return bundleGroupDeployment;
+ }
+
+ public void setBundleGroupDeployment(BundleGroupDeployment bundleGroupDeployment) {
+ this.bundleGroupDeployment = bundleGroupDeployment;
+ }
+
@Override
public String toString() {
StringBuilder str = new StringBuilder("BundleDeployment: ");
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
new file mode 100644
index 0000000..8f27723
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeployment.java
@@ -0,0 +1,292 @@
+/*
+ * 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.domain.bundle;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+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;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.resource.group.ResourceGroup;
+
+@Entity
+@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_BUNDLE_GROUP_DEPLOY_ID_SEQ")
+@Table(name = "RHQ_BUNDLE_GROUP_DEPLOY")
+public class BundleGroupDeployment implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @GeneratedValue(generator = "SEQ", strategy = GenerationType.AUTO)
+ @Id
+ private int id;
+
+ @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID")
+ @ManyToOne(cascade = { CascadeType.REMOVE })
+ private ResourceGroup group;
+
+ @JoinColumn(name = "BUNDLE_DEPLOY_DEF_ID", referencedColumnName = "ID", nullable = false)
+ @ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.LAZY)
+ protected BundleDeployDefinition bundleDeployDefinition;
+
+ @Column(name = "STATUS", nullable = false)
+ @Enumerated(EnumType.STRING)
+ protected BundleGroupDeploymentStatus status;
+
+ @Column(name = "ERROR_MESSAGE")
+ protected String errorMessage;
+
+ @Column(name = "SUBJECT_NAME")
+ protected String subjectName;
+
+ @Column(name = "CTIME", nullable = false)
+ protected long createdTime = System.currentTimeMillis();
+
+ @Column(name = "MTIME", nullable = false)
+ protected long modifiedTime = System.currentTimeMillis();
+
+ @OneToMany(mappedBy = "bundleGroupDeployment", fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
+ private List<BundleDeployment> bundleDeployments = new ArrayList<BundleDeployment>();
+
+ // For JPA
+ public BundleGroupDeployment() {
+ }
+
+ public BundleGroupDeployment(String subjectName, BundleDeployDefinition bundleDeployDefinition, ResourceGroup group) {
+ this.subjectName = subjectName;
+ this.bundleDeployDefinition = bundleDeployDefinition;
+ this.group = group;
+ this.status = BundleGroupDeploymentStatus.INPROGRESS;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ /**
+ * The status of the request which indicates that the request is either still in progress, or it has completed and
+ * either succeeded or failed.
+ *
+ * @return the request status
+ */
+ public BundleGroupDeploymentStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(BundleGroupDeploymentStatus status) {
+ this.status = status;
+ }
+
+ public ResourceGroup getGroup() {
+ return group;
+ }
+
+ public void setGroup(ResourceGroup group) {
+ this.group = group;
+ }
+
+ public BundleDeployDefinition getBundleDeployDefinition() {
+ return bundleDeployDefinition;
+ }
+
+ public void setBundleDeployDefinition(BundleDeployDefinition bundleDeployDefinition) {
+ this.bundleDeployDefinition = bundleDeployDefinition;
+ }
+
+ /**
+ * If not <code>null</code>, this is an error message (possibly a full stack trace) to indicate the overall error
+ * that occurred when the configuration update failed. This will normally be <code>null</code> unless the
+ * {@link #getStatus() status} indicates a {@link BundleGroupDeploymentStatus#FAILURE}.
+ *
+ * @return overall error that occurred
+ */
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ /**
+ * Calling this method with a non-<code>null</code> error message implies that the request's status is
+ * {@link ConfigurationUpdateStatus#FAILURE}. The inverse is <i>not</i> true - that is, if you set the error message
+ * to <code>null</code>, the status is left as-is; it will not assume that a <code>null</code> error message means
+ * the status is successful.
+ *
+ * @param errorMessage
+ */
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+
+ if (this.errorMessage != null) {
+ setStatus(BundleGroupDeploymentStatus.FAILURE);
+ }
+ }
+
+ /**
+ * For auditing purposes, this method tells you the username of the person that created the request. This is not a
+ * relationship to an actual Subject because we want to maintain the audit trail, even if a Subject has been deleted
+ * from the database.
+ *
+ * @return the actual name string of the submitter of the request
+ */
+ public String getSubjectName() {
+ return subjectName;
+ }
+
+ /**
+ * The time this entity was originally created; in other words, when the request was originally made.
+ *
+ * @return creation time
+ */
+ public long getCreatedTime() {
+ return this.createdTime;
+ }
+
+ /**
+ * The time this entity was last modified. This is the last time the status was updated. If the status has never
+ * been updated, this will be the {@link #getCreatedTime() created time}.
+ *
+ * @return last modified time
+ */
+ public long getModifiedTime() {
+ return this.modifiedTime;
+ }
+
+ public List<BundleDeployment> getBundleDeployments() {
+ return bundleDeployments;
+ }
+
+ public void setBundleDeployments(List<BundleDeployment> bundleDeployments) {
+ this.bundleDeployments = bundleDeployments;
+ }
+
+ public void addBundleDeployment(BundleDeployment bundleDeployment) {
+ bundleDeployment.setBundleGroupDeployment(this);
+ this.bundleDeployments.add(bundleDeployment);
+ }
+
+ /**
+ * The duration of the configuration update request which simply is the difference between the
+ * {@link #getCreatedTime()} and the {@link #getModifiedTime()}. If the request hasn't completed yet, this will be
+ * the difference between the current time and the created time.
+ *
+ * @return the duration of time that the request took or is taking to complete
+ */
+ public long getDuration() {
+ long start = this.createdTime;
+ long end;
+ if ((status == null) || (status == BundleGroupDeploymentStatus.INPROGRESS)) {
+ end = System.currentTimeMillis();
+ } else {
+ end = this.modifiedTime;
+ }
+
+ return end - start;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = (PRIME * result) + (int) (createdTime ^ (createdTime >>> 32));
+ result = (PRIME * result) + ((subjectName == null) ? 0 : subjectName.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if ((obj == null) || !(obj instanceof BundleGroupDeployment)) {
+ return false;
+ }
+
+ final BundleGroupDeployment other = (BundleGroupDeployment) obj;
+
+ if (this.createdTime != other.createdTime) {
+ return false;
+ }
+
+ if (this.subjectName == null) {
+ if (other.subjectName != null) {
+ return false;
+ }
+ } else if (!this.subjectName.equals(other.subjectName)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @PrePersist
+ void onPersist() {
+ // don't set createdTime - we use it in equals/hashCode - it is already set at instantiation time
+ this.modifiedTime = System.currentTimeMillis();
+ }
+
+ @PreUpdate
+ void onUpdate() {
+ this.modifiedTime = System.currentTimeMillis();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder str = new StringBuilder("BundleGroupDeployment [");
+ str.append("id=").append(this.id);
+ str.append(", status=").append(this.status);
+ str.append(", resourceGroup=").append(this.group);
+ str.append(", deployDef=").append(this.getBundleDeployDefinition());
+ str.append(", subjectName=").append(this.subjectName);
+ str.append(", createdTime=").append(this.createdTime);
+ str.append(", modifiedTime=").append(this.modifiedTime);
+
+ String err = this.errorMessage;
+ if ((err != null) && (err.indexOf('\n') > -1)) {
+ err = err.substring(0, err.indexOf('\n')) + "...";
+ }
+ str.append(", errorMessage=").append(err);
+ str.append(']');
+
+ return str.toString();
+ }
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java
new file mode 100644
index 0000000..94f9113
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleGroupDeploymentStatus.java
@@ -0,0 +1,47 @@
+/*
+ * 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, 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.bundle;
+
+/**
+ * Simple statuses for Bundle Group Deploy requests. When a request is first initiated, it will be considered in the
+ * {@link #INPROGRESS} state. When the request has completed, it will have been either a {@link #SUCCESS} or
+ * {@link #FAILURE}.
+ *
+ * @author Jay Shaughnessy
+ */
+public enum BundleGroupDeploymentStatus {
+ INPROGRESS("In Progress"), //
+ SUCCESS("Success"), //
+ FAILURE("Failure"), //
+ NOCHANGE("No Change");
+
+ private String displayName;
+
+ BundleGroupDeploymentStatus(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String toString() {
+ return displayName;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/GroupBundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/GroupBundleDeployment.java
deleted file mode 100644
index 67ad13f..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/GroupBundleDeployment.java
+++ /dev/null
@@ -1,73 +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, 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.bundle;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-
-import org.rhq.core.domain.resource.group.ResourceGroup;
-
-@DiscriminatorValue("group")
-@Entity
-public class GroupBundleDeployment extends BundleDeployment {
-
- private static final long serialVersionUID = 1L;
-
- @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID")
- @ManyToOne
- private ResourceGroup group;
-
- @OneToMany(mappedBy = "groupBundleHistory", cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
- private List<BundleDeployment> bundleDeployments = new ArrayList<BundleDeployment>();
-
- protected GroupBundleDeployment() {
- }
-
- public ResourceGroup getGroup() {
- return group;
- }
-
- public void setGroup(ResourceGroup group) {
- this.group = group;
- }
-
- public List<BundleDeployment> getBundleDeployments() {
- return bundleDeployments;
- }
-
- public void setBundleDeployments(List<BundleDeployment> bundleDeployments) {
- this.bundleDeployments = bundleDeployments;
- }
-
- public void addBundleDeployments(BundleDeployment bundleDeployment) {
- this.bundleDeployments.add(bundleDeployment);
- }
-
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
index 7a10422..9eae8e6 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
@@ -55,7 +55,7 @@ import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.authz.Role;
-import org.rhq.core.domain.bundle.GroupBundleDeployment;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.resource.Resource;
@@ -407,7 +407,7 @@ public class ResourceGroup extends Group {
@OneToMany(mappedBy = "group", cascade = { CascadeType.ALL })
@OrderBy
// by primary key which will also put the operation histories in chronological order
- private List<GroupBundleDeployment> bundleDeployments = new ArrayList<GroupBundleDeployment>();
+ private List<BundleGroupDeployment> bundleDeployments = new ArrayList<BundleGroupDeployment>();
@JoinColumn(name = "GROUP_DEFINITION_ID", referencedColumnName = "ID", nullable = true)
@ManyToOne
@@ -554,11 +554,11 @@ public class ResourceGroup extends Group {
this.configurationUpdates = configurationUpdates;
}
- public List<GroupBundleDeployment> getBundleDeployments() {
+ public List<BundleGroupDeployment> getBundleDeployments() {
return bundleDeployments;
}
- public void setBundleDeployments(List<GroupBundleDeployment> bundleDeployments) {
+ public void setBundleDeployments(List<BundleGroupDeployment> bundleDeployments) {
this.bundleDeployments = bundleDeployments;
}
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 bab247a..8e6e479 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
@@ -50,6 +50,7 @@ import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
@@ -67,6 +68,7 @@ import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.NumberUtil;
import org.rhq.enterprise.server.RHQConstants;
@@ -431,25 +433,32 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return (PackageType) packageTypeQuery.getSingleResult();
}
- @RequiredPermission(Permission.MANAGE_INVENTORY)
public BundleDeployment scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
throws Exception {
-
BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
if (null == deployDef) {
throw new IllegalArgumentException("Invalid bundleDeployDefinitionId: " + bundleDeployDefinitionId);
}
+
Resource resource = (Resource) entityManager.find(Resource.class, resourceId);
if (null == resource) {
throw new IllegalArgumentException("Invalid resourceId (Resource does not exist): " + resourceId);
}
+ return scheduleBundleDeployment(subject, deployDef, resource, null);
+ }
+
+ private BundleDeployment scheduleBundleDeployment(Subject subject, BundleDeployDefinition deployDef,
+ Resource resource, BundleGroupDeployment bundleGroupDeployment) throws Exception {
+
+ int resourceId = resource.getId();
AgentClient agentClient = agentManager.getAgentClient(resourceId);
BundleAgentService bundleAgentService = agentClient.getBundleAgentService();
// The BundleDeployment record must exist in the db before the agent request because the agent may try to
// add History to it during immediate deployments., so create and persist it (requires a new trans).
- BundleDeployment deployment = bundleManager.createBundleDeployment(subject, deployDef.getId(), resourceId);
+ BundleDeployment deployment = bundleManager.createBundleDeployment(subject, deployDef.getId(), resourceId,
+ bundleGroupDeployment.getId());
// make sure the deployment contains the info required by the schedule service
BundleVersion bundleVersion = entityManager.find(BundleVersion.class, deployDef.getBundleVersion().getId());
@@ -492,10 +501,44 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return deployment;
}
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public BundleGroupDeployment scheduleBundleGroupDeployment(Subject subject, int bundleDeployDefinitionId,
+ int resourceGroupId) throws Exception {
+
+ BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
+ if (null == deployDef) {
+ throw new IllegalArgumentException("Invalid bundleDeployDefinitionId: " + bundleDeployDefinitionId);
+ }
+ ResourceGroup resourceGroup = (ResourceGroup) entityManager.find(ResourceGroup.class, resourceGroupId);
+ if (null == resourceGroup) {
+ throw new IllegalArgumentException("Invalid resourceGroupId (ResourceGroup does not exist): "
+ + resourceGroupId);
+ }
+
+ /*
+ * we need to create and persist the group deployment entity in a new transaction before the rest of the
+ * processing of this method; if we try to create and attach the deployment children
+ * to the parent before this is persisted we'll get StaleStateExceptions
+ * from Hibernate because of our use of flush/clear (we're trying to update it before it actually exists)
+ */
+ BundleGroupDeployment bundleGroupDeployment = new BundleGroupDeployment(subject.getName(), deployDef,
+ resourceGroup);
+ bundleGroupDeployment = bundleManager.createBundleGroupDeployment(bundleGroupDeployment);
+
+ // Create and persist updates for each of the group members.
+ for (Resource resource : resourceGroup.getExplicitResources()) {
+ BundleDeployment bundleDeployment = scheduleBundleDeployment(subject, deployDef, resource,
+ bundleGroupDeployment);
+ bundleGroupDeployment.addBundleDeployment(bundleDeployment);
+ }
+
+ return bundleGroupDeployment;
+ }
+
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public BundleDeployment createBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
- throws Exception {
+ public BundleDeployment createBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId,
+ int bundleGroupDeploymentId) throws Exception {
BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
if (null == deployDef) {
@@ -506,12 +549,22 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
throw new IllegalArgumentException("Invalid resourceId (Resource does not exist): " + resourceId);
}
- BundleDeployment deployment = new BundleDeployment(deployDef, resource);
+ BundleGroupDeployment bundleGroupDeployment = (BundleGroupDeployment) entityManager.find(
+ BundleGroupDeployment.class, bundleGroupDeploymentId);
+
+ BundleDeployment deployment = new BundleDeployment(deployDef, resource, bundleGroupDeployment);
entityManager.persist(deployment);
return deployment;
}
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ public BundleGroupDeployment createBundleGroupDeployment(BundleGroupDeployment bundleGroupDeployment)
+ throws Exception {
+ entityManager.persist(bundleGroupDeployment);
+ return bundleGroupDeployment;
+ }
+
@RequiredPermission(Permission.MANAGE_INVENTORY)
public Set<String> getBundleVersionFilenames(Subject subject, int bundleVersionId, boolean withoutBundleFileOnly)
throws Exception {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
index fc4d224..b265f0e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
@@ -25,6 +25,7 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
/**
@@ -65,11 +66,17 @@ public interface BundleManagerLocal extends BundleManagerRemote {
BundleType createBundleType(Subject subject, String name, int resourceTypeId) throws Exception;
/**
- * This is typically not called directly, typically deployBundle() is called externally. This executes
- * in a New Transaction and supports deployBundle.
+ * This is typically not called directly, typically scheduleBundleDeployment() is called externally. This executes
+ * in a New Transaction and supports scheduleBundleDeployment.
*/
- BundleDeployment createBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
- throws Exception;
+ BundleDeployment createBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId,
+ int bundleGroupDeploymentId) throws Exception;
+
+ /**
+ * This is typically not called directly, typically scheduleBundleGroupDeployment() is called externally.
+ * This executes in a New Transaction and supports scheduleBundleGroupDeployment.
+ */
+ BundleGroupDeployment createBundleGroupDeployment(BundleGroupDeployment bundleGroupDeployment) throws Exception;
// added here because the same method in @Remote was commented out to bypass a WSProvide issue
Map<String, Boolean> getAllBundleVersionFilenames(Subject subject, int bundleVersionId) throws Exception;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index b3a84ff..6184a6c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -33,6 +33,7 @@ import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
@@ -296,4 +297,23 @@ public interface BundleManagerRemote {
@WebParam(name = "bundleDeployDefinitionId") int bundleDeployDefinitionId, //
@WebParam(name = "resourceId") int resourceId) throws Exception;
+ /**
+ * Deploy the bundle as described in the provided deploy definition to all of the resources in the
+ * specified resource group.
+ * Deployment is asynchronous so return of this method does not indicate deployments are complete. The
+ * returned BundleGroupDeployment can be used to track the history of the deployments.
+ *
+ * TODO: Add the scheduling capability, currently it's Immediate.
+ *
+ * @param subject must be InventoryManager
+ * @param bundleDeployDefinitionId the BundleDeployDefinition being used to guide the deployments
+ * @param resourceGroupId the target resourceGroup (must exist), typically platforms, for the deployments
+ * @return the BundleGroupDeployment created to track the deployments.
+ * @throws Exception
+ */
+ @WebMethod
+ BundleGroupDeployment scheduleBundleGroupDeployment( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleDeployDefinitionId") int bundleDeployDefinitionId, //
+ @WebParam(name = "resourceGroupId") int resourceGroupId) throws Exception;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 6521e5b..06b59c6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -42,6 +42,7 @@ import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroupDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
@@ -425,7 +426,12 @@ public class WebservicesManagerBean implements WebservicesRemote {
return bundleManager.scheduleBundleDeployment(subject, bundleDeployDefinitionId, resourceId);
}
- //BUNDLEMANAGER: END ----------------------------------
+ public BundleGroupDeployment scheduleBundleGroupDeployment(Subject subject, int bundleDeployDefinitionId,
+ int resourceGroupId) throws Exception {
+ return bundleManager.scheduleBundleGroupDeployment(subject, bundleDeployDefinitionId, resourceGroupId);
+ }
+
+ //BUNDLEMANAGER: END ----------------------------------
//CALLTIMEDATAMANAGER: BEGIN ----------------------------------
public PageList<CallTimeDataComposite> findCallTimeDataForResource(Subject subject, int scheduleId, long beginTime,
commit 99ac8e813983478838882e54621b77adc2b17c3c
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 16:21:48 2010 -0400
better button labels
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index cf0d561..e3c4c0f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -63,7 +63,7 @@ public class BundlesListView extends VLayout {
table.getListGrid().setSelectionType(SelectionStyle.SIMPLE);
table.getListGrid().setSelectionAppearance(SelectionAppearance.CHECKBOX);
- table.addTableAction("Create New Bundle", Table.SelectionEnablement.ALWAYS, null, new TableAction() {
+ table.addTableAction("New", Table.SelectionEnablement.ALWAYS, null, new TableAction() {
public void executeAction(ListGridRecord[] selection) {
new BundleCreateWizard().startBundleWizard();
@@ -91,7 +91,7 @@ public class BundlesListView extends VLayout {
}
});
- table.addTableAction("Create New Version", Table.SelectionEnablement.SINGLE, null, new TableAction() {
+ table.addTableAction("New Version", Table.SelectionEnablement.SINGLE, null, new TableAction() {
public void executeAction(ListGridRecord[] selection) {
BundlesWithLatestVersionDataSource ds = (BundlesWithLatestVersionDataSource) table.getDataSource();
final BundleWithLatestVersionComposite object = ds.copyValues(selection[0]);
commit b599b8bf8c37f25c60b80ec409a441a6e1578e05
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 15:44:03 2010 -0400
icons for the new resource and type views
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_16.png
new file mode 100644
index 0000000..af73da1
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_24.png
new file mode 100644
index 0000000..66627f8
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_down_24.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_16.png
new file mode 100644
index 0000000..223b0b3
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_24.png
new file mode 100644
index 0000000..fb50a9d
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Platform_up_24.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_16.png
new file mode 100644
index 0000000..69a4d9f
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_24.png
new file mode 100644
index 0000000..660e4b8
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_down_24.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_16.png
new file mode 100644
index 0000000..132e4ce
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_24.png
new file mode 100644
index 0000000..83da6ad
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Server_up_24.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_16.png
new file mode 100644
index 0000000..d09143b
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_24.png
new file mode 100644
index 0000000..24b1d98
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_down_24.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_16.png
new file mode 100644
index 0000000..bbebc5c
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_24.png
new file mode 100644
index 0000000..7df5599
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/Service_up_24.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_16.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_16.png
new file mode 100644
index 0000000..35bbd70
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_16.png differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_24.png b/modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_24.png
new file mode 100644
index 0000000..0dd5e93
Binary files /dev/null and b/modules/enterprise/gui/coregui/src/main/webapp/images/types/plugin_24.png differ
commit fd07e05ac93f368163b45ae95e26f9faed1c80b4
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 15:40:09 2010 -0400
Fixed some bugs in but enablement
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
index 77952a0..a309ce1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
@@ -66,6 +66,11 @@ public class ResourceSelector extends HLayout {
private ListGrid availableGrid;
private ListGrid assignedGrid;
+ private TransferImgButton addButton;
+ private TransferImgButton removeButton;
+ private TransferImgButton addAllButton;
+ private TransferImgButton removeAllButton;
+
private Criteria latestCriteria;
public ResourceSelector() {
@@ -82,16 +87,15 @@ public class ResourceSelector extends HLayout {
availableFilterForm.setNumCols(6);
final TextItem search = new TextItem("search", "Search");
- IPickTreeItem typeSelectItem = new IPickTreeItem("type","Type");
+ IPickTreeItem typeSelectItem = new IPickTreeItem("type", "Type");
typeSelectItem.setDataSource(new ResourceTypeTreeDataSource());
typeSelectItem.setValueField("id");
typeSelectItem.setCanSelectParentItems(true);
typeSelectItem.setLoadDataOnDemand(false);
-
- SelectItem categorySelect = new SelectItem("category","Category");
- categorySelect.setValueMap("Platform","Server","Service");
+ SelectItem categorySelect = new SelectItem("category", "Category");
+ categorySelect.setValueMap("Platform", "Server", "Service");
categorySelect.setAllowEmptyValue(true);
availableFilterForm.setItems(search, typeSelectItem, categorySelect);
@@ -117,13 +121,12 @@ public class ResourceSelector extends HLayout {
addMember(availableLayout);
-
availableFilterForm.addItemChangedHandler(new ItemChangedHandler() {
public void onItemChanged(ItemChangedEvent itemChangedEvent) {
latestCriteria = new Criteria();
- latestCriteria.setAttribute("name",availableFilterForm.getValue("search"));
- latestCriteria.setAttribute("type",availableFilterForm.getValue("type"));
- latestCriteria.setAttribute("category",availableFilterForm.getValue("category"));
+ latestCriteria.setAttribute("name", availableFilterForm.getValue("search"));
+ latestCriteria.setAttribute("type", availableFilterForm.getValue("type"));
+ latestCriteria.setAttribute("category", availableFilterForm.getValue("category"));
Timer t = new Timer() {
@Override
@@ -140,20 +143,17 @@ public class ResourceSelector extends HLayout {
});
-
-
-
-
VStack moveButtonStack = new VStack(6);
moveButtonStack.setAlign(VerticalAlignment.CENTER);
moveButtonStack.setWidth(40);
- final TransferImgButton addButton = new TransferImgButton(TransferImgButton.RIGHT);
+ addButton = new TransferImgButton(TransferImgButton.RIGHT);
addButton.setDisabled(true);
- final TransferImgButton removeButton = new TransferImgButton(TransferImgButton.LEFT);
+ removeButton = new TransferImgButton(TransferImgButton.LEFT);
removeButton.setDisabled(true);
- TransferImgButton addAllButton = new TransferImgButton(TransferImgButton.RIGHT_ALL);
- TransferImgButton removeAllButton = new TransferImgButton(TransferImgButton.LEFT_ALL);
+ addAllButton = new TransferImgButton(TransferImgButton.RIGHT_ALL);
+ removeAllButton = new TransferImgButton(TransferImgButton.LEFT_ALL);
+ removeAllButton.setDisabled(true);
moveButtonStack.addMember(addButton);
moveButtonStack.addMember(removeButton);
@@ -163,7 +163,6 @@ public class ResourceSelector extends HLayout {
addMember(moveButtonStack);
-
VLayout assignedLayout = new VLayout();
assignedLayout.addMember(new LayoutSpacer());
@@ -181,16 +180,19 @@ public class ResourceSelector extends HLayout {
addMember(assignedLayout);
+
addButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
assignedGrid.transferSelectedData(availableGrid);
select(assignedGrid.getSelection());
+ updateButtons();
}
});
removeButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
deselect(assignedGrid.getSelection());
assignedGrid.removeSelectedData();
+ updateButtons();
}
});
addAllButton.addClickHandler(new ClickHandler() {
@@ -198,6 +200,7 @@ public class ResourceSelector extends HLayout {
availableGrid.selectAllRecords();
assignedGrid.transferSelectedData(availableGrid);
select(availableGrid.getSelection());
+ updateButtons();
}
});
removeAllButton.addClickHandler(new ClickHandler() {
@@ -205,18 +208,19 @@ public class ResourceSelector extends HLayout {
assignedGrid.selectAllRecords();
deselect(assignedGrid.getSelection());
assignedGrid.removeSelectedData();
+ updateButtons();
}
});
availableGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
- addButton.setDisabled(!availableGrid.anySelected());
+ updateButtons();
}
});
assignedGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
- removeButton.setDisabled(!assignedGrid.anySelected());
+ updateButtons();
}
});
@@ -237,6 +241,13 @@ public class ResourceSelector extends HLayout {
});
}
+ private void updateButtons() {
+ addButton.setDisabled(!availableGrid.anySelected() || availableGrid.getTotalRows() == 0);
+ removeButton.setDisabled(!assignedGrid.anySelected() || assignedGrid.getTotalRows() == 0);
+ addAllButton.setDisabled(availableGrid.getTotalRows() == 0);
+ removeAllButton.setDisabled(assignedGrid.getTotalRows() == 0);
+ }
+
private void select(ListGridRecord[] records) {
availableGrid.deselectAllRecords();
for (ListGridRecord record : records) {
commit f19b182733dff62648fe8b332c5be0dda6927a02
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:16:14 2010 -0400
New resource selection component (left-right boxes, drag-n-drop, search and filter, selection indicator)
Resource selector demo'ed on the Demo canvas
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java
index 9b4539a..f192c58 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/DemoCanvas.java
@@ -20,6 +20,8 @@ package org.rhq.enterprise.gui.coregui.client;
import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceSelector;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeTreeView;
import com.smartgwt.client.types.Side;
import com.smartgwt.client.types.TabBarControls;
@@ -50,22 +52,27 @@ public class DemoCanvas extends Canvas {
// topTabSet.setTop(50);
- Tab tableTab = new Tab("Resource Search Table");
+ Tab selectorTab = new Tab("Selector");
+ Tab typeTree = new Tab("Type Tree");
Tab treeTab = new Tab("Resource Tree");
final Tab configTab = new Tab("Configuration Editor");
//Tab alertHistoryTab = new Tab("Alert History");
+
+ selectorTab.setPane(new ResourceSelector());
+
// Agent: resource (10005) type (10060)
// Raw: 10003 / 10023
// both: 10002 / 10022
//configTab.setPane(new ConfigurationEditor(10005, 10060, ConfigurationEditor.ConfigType.plugin));
//treeTab.setPane(new ResourceTreeView(new Resource(10001)));
- tableTab.setPane(new ResourceSearchView());
+ typeTree.setPane(new ResourceTypeTreeView());
//alertHistoryTab.setPane(new AbstractAlertsView());
+ topTabSet.addTab(selectorTab);
+ topTabSet.addTab(typeTree);
topTabSet.addTab(configTab);
- topTabSet.addTab(tableTab);
topTabSet.addTab(treeTab);
//topTabSet.addTab(alertHistoryTab);
//topTabSet.selectTab(alertHistoryTab);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
new file mode 100644
index 0000000..77952a0
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
@@ -0,0 +1,280 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.selection;
+
+import java.util.HashSet;
+
+import com.google.gwt.user.client.Timer;
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.DragDataAction;
+import com.smartgwt.client.types.DragTrackerMode;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.widgets.ImgProperties;
+import com.smartgwt.client.widgets.TransferImgButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.events.KeyPressEvent;
+import com.smartgwt.client.widgets.events.KeyPressHandler;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
+import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
+import com.smartgwt.client.widgets.form.fields.IPickTreeItem;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.RecordDropEvent;
+import com.smartgwt.client.widgets.grid.events.RecordDropHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.layout.VStack;
+
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeTreeDataSource;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceSelector extends HLayout {
+
+ private HashSet<Integer> selection = new HashSet<Integer>();
+
+ private ListGrid availableGrid;
+ private ListGrid assignedGrid;
+
+ private Criteria latestCriteria;
+
+ public ResourceSelector() {
+ setAlign(VerticalAlignment.BOTTOM);
+ setHeight(380);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+
+ final DynamicForm availableFilterForm = new DynamicForm();
+ availableFilterForm.setNumCols(6);
+ final TextItem search = new TextItem("search", "Search");
+
+ IPickTreeItem typeSelectItem = new IPickTreeItem("type","Type");
+ typeSelectItem.setDataSource(new ResourceTypeTreeDataSource());
+ typeSelectItem.setValueField("id");
+ typeSelectItem.setCanSelectParentItems(true);
+ typeSelectItem.setLoadDataOnDemand(false);
+
+
+
+ SelectItem categorySelect = new SelectItem("category","Category");
+ categorySelect.setValueMap("Platform","Server","Service");
+ categorySelect.setAllowEmptyValue(true);
+ availableFilterForm.setItems(search, typeSelectItem, categorySelect);
+
+ VLayout availableLayout = new VLayout();
+ availableLayout.addMember(new LayoutSpacer());
+
+ availableLayout.addMember(availableFilterForm);
+
+ availableGrid = new ListGrid();
+ availableGrid.setHeight(350);
+ availableGrid.setCanDragRecordsOut(true);
+ availableGrid.setDragTrackerMode(DragTrackerMode.ICON);
+ availableGrid.setTrackerImage(new ImgProperties("types/Service_up_16.png", 16, 16));
+ availableGrid.setDragDataAction(DragDataAction.COPY);
+ availableGrid.setDataSource(new SelectedResourceDataSource());
+ availableGrid.setFetchDelay(700);
+
+ availableGrid.setAutoFetchData(true);
+ availableGrid.setFields(new ListGridField("icon", 50), new ListGridField("name"));
+
+ availableLayout.addMember(availableGrid);
+
+ addMember(availableLayout);
+
+
+
+ availableFilterForm.addItemChangedHandler(new ItemChangedHandler() {
+ public void onItemChanged(ItemChangedEvent itemChangedEvent) {
+ latestCriteria = new Criteria();
+ latestCriteria.setAttribute("name",availableFilterForm.getValue("search"));
+ latestCriteria.setAttribute("type",availableFilterForm.getValue("type"));
+ latestCriteria.setAttribute("category",availableFilterForm.getValue("category"));
+
+ Timer t = new Timer() {
+ @Override
+ public void run() {
+ if (latestCriteria != null) {
+ Criteria c = latestCriteria;
+ latestCriteria = null;
+ availableGrid.fetchData(c);
+ }
+ }
+ };
+ t.schedule(500);
+ }
+ });
+
+
+
+
+
+
+ VStack moveButtonStack = new VStack(6);
+ moveButtonStack.setAlign(VerticalAlignment.CENTER);
+ moveButtonStack.setWidth(40);
+
+ final TransferImgButton addButton = new TransferImgButton(TransferImgButton.RIGHT);
+ addButton.setDisabled(true);
+ final TransferImgButton removeButton = new TransferImgButton(TransferImgButton.LEFT);
+ removeButton.setDisabled(true);
+ TransferImgButton addAllButton = new TransferImgButton(TransferImgButton.RIGHT_ALL);
+ TransferImgButton removeAllButton = new TransferImgButton(TransferImgButton.LEFT_ALL);
+
+ moveButtonStack.addMember(addButton);
+ moveButtonStack.addMember(removeButton);
+ moveButtonStack.addMember(addAllButton);
+ moveButtonStack.addMember(removeAllButton);
+
+ addMember(moveButtonStack);
+
+
+
+ VLayout assignedLayout = new VLayout();
+ assignedLayout.addMember(new LayoutSpacer());
+
+ assignedGrid = new ListGrid();
+ assignedGrid.setHeight(350);
+ assignedGrid.setCanReorderRecords(true);
+ assignedGrid.setCanDragRecordsOut(true);
+
+ assignedGrid.setCanAcceptDroppedRecords(true);
+ ListGridField iconField = new ListGridField("icon", 50);
+ iconField.setType(ListGridFieldType.ICON);
+ assignedGrid.setFields(iconField, new ListGridField("name"));
+
+ assignedLayout.addMember(assignedGrid);
+ addMember(assignedLayout);
+
+
+ addButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ assignedGrid.transferSelectedData(availableGrid);
+ select(assignedGrid.getSelection());
+ }
+ });
+ removeButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ deselect(assignedGrid.getSelection());
+ assignedGrid.removeSelectedData();
+ }
+ });
+ addAllButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ availableGrid.selectAllRecords();
+ assignedGrid.transferSelectedData(availableGrid);
+ select(availableGrid.getSelection());
+ }
+ });
+ removeAllButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ assignedGrid.selectAllRecords();
+ deselect(assignedGrid.getSelection());
+ assignedGrid.removeSelectedData();
+ }
+ });
+
+ availableGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ addButton.setDisabled(!availableGrid.anySelected());
+ }
+ });
+
+ assignedGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ removeButton.setDisabled(!assignedGrid.anySelected());
+ }
+ });
+
+ assignedGrid.addKeyPressHandler(new KeyPressHandler() {
+ public void onKeyPress(KeyPressEvent event) {
+ if ("Delete".equals(event.getKeyName())) {
+ deselect(assignedGrid.getSelection());
+ assignedGrid.removeSelectedData();
+ }
+ }
+ });
+
+
+ assignedGrid.addRecordDropHandler(new RecordDropHandler() {
+ public void onRecordDrop(RecordDropEvent recordDropEvent) {
+ select(recordDropEvent.getDropRecords());
+ }
+ });
+ }
+
+ private void select(ListGridRecord[] records) {
+ availableGrid.deselectAllRecords();
+ for (ListGridRecord record : records) {
+ record.setEnabled(false);
+ selection.add(record.getAttributeAsInt("id"));
+ }
+ }
+
+ private void deselect(ListGridRecord[] records) {
+ HashSet<Integer> toRemove = new HashSet<Integer>();
+ for (ListGridRecord record : records) {
+ toRemove.add(record.getAttributeAsInt("id"));
+ }
+ selection.removeAll(toRemove);
+
+
+ for (Integer id : toRemove) {
+ Record r = availableGrid.getDataAsRecordList().find("id", id);
+ if (r != null) {
+ ((ListGridRecord) r).setEnabled(true);
+ }
+ }
+ availableGrid.markForRedraw();
+ }
+
+
+ private class SelectedResourceDataSource extends ResourceDatasource {
+
+
+ @Override
+ public ListGridRecord[] buildRecords(PageList<Resource> resources) {
+ ListGridRecord[] records = super.buildRecords(resources);
+ for (ListGridRecord record : records) {
+ if (selection.contains(record.getAttributeAsInt("id"))) {
+ record.setEnabled(false);
+ }
+ }
+ return records;
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SelectedResourceDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SelectedResourceDataSource.java
new file mode 100644
index 0000000..742a83f
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/SelectedResourceDataSource.java
@@ -0,0 +1,73 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.selection;
+
+import java.util.ArrayList;
+
+import com.smartgwt.client.widgets.events.DropEvent;
+import com.smartgwt.client.widgets.events.DropHandler;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.RecordDropEvent;
+import com.smartgwt.client.widgets.grid.events.RecordDropHandler;
+
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDatasource;
+
+/**
+ * @author Greg Hinkle
+ */
+public class SelectedResourceDataSource extends ResourceDatasource {
+
+ private ArrayList<Integer> selection;
+
+
+ ListGrid availableGrid;
+ ListGrid assignedGrid;
+
+
+ public SelectedResourceDataSource(ArrayList<Integer> selection, ListGrid availableGrid, ListGrid assignedGrid) {
+ this.selection = selection;
+ if (this.selection == null) {
+ selection = new ArrayList<Integer>();
+ }
+ this.availableGrid = availableGrid;
+ this.assignedGrid = assignedGrid;
+
+
+ assignedGrid.addRecordDropHandler(new RecordDropHandler() {
+ public void onRecordDrop(RecordDropEvent recordDropEvent) {
+ for (ListGridRecord record : recordDropEvent.getDropRecords()) {
+
+ record.setCanDrag(false);
+ record.setEnabled(false);
+
+ SelectedResourceDataSource.this.selection.add(record.getAttributeAsInt("id"));
+ }
+ }
+ });
+ }
+
+
+
+
+
+
+
+
+}
commit baac2f3668e15df88893f1e426f2c7198beb9265
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:15:13 2010 -0400
avoid npe for mismatched component depths
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 66772ea..3be0f48 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
@@ -190,7 +190,7 @@ public class CoreGUI implements EntryPoint {
}
}
int startIndex;
- View parentView;
+ View parentView = null;
if (commonBasePathSize > 0) {
// The requested path shares a common base path with the current view, so skip rendering of
// views corresponding to this common base path. For example, if the current view is
@@ -198,7 +198,10 @@ public class CoreGUI implements EntryPoint {
// only on for the Monitor and Graphs components of the path.
startIndex = commonBasePathSize;
int subViewsToRenderPathSize = viewIdNames.size() - commonBasePathSize;
- parentView = CoreGUI.this.currentView;
+ View view = CoreGUI.this.currentView;
+ if (view != null) {
+ parentView = view;
+ }
for (int i = 0; i < subViewsToRenderPathSize; i++) {
parentView = parentView.getParent();
}
commit 84f4742ec27a15d37912207db9d4cbb1a1ad91ea
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:14:53 2010 -0400
Plugin and Type tree (for type pick list)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeDataSource.java
new file mode 100644
index 0000000..dc1cbe9
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeDataSource.java
@@ -0,0 +1,260 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.type;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.DataSource;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.types.DSDataFormat;
+import com.smartgwt.client.types.DSProtocol;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.core.domain.util.PageOrdering;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTServiceAsync;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceTypeTreeDataSource extends DataSource {
+
+
+ private ResourceTypeGWTServiceAsync resourceTypeService = GWTServiceLookup.getResourceTypeGWTService();
+
+ public ResourceTypeTreeDataSource() {
+
+ setClientOnly(false);
+ setDataProtocol(DSProtocol.CLIENTCUSTOM);
+ setDataFormat(DSDataFormat.CUSTOM);
+
+
+ DataSourceTextField idField = new DataSourceTextField("id", "ID");
+ idField.setPrimaryKey(true);
+
+ DataSourceTextField parentIdField = new DataSourceTextField("parentId", "Parent ID");
+ parentIdField.setForeignKey("id");
+
+ DataSourceTextField resourceNameField = new DataSourceTextField("name", "Name");
+
+ DataSourceTextField resourceKeyField = new DataSourceTextField("plugin", "Plugin");
+
+ DataSourceTextField resourceTypeField = new DataSourceTextField("category", "Category");
+
+
+ setFields(idField, parentIdField, resourceNameField, resourceKeyField, resourceTypeField);
+ }
+
+ protected Object transformRequest(DSRequest request) {
+ DSResponse response = new DSResponse();
+ response.setAttribute("clientContext", request.getAttributeAsObject("clientContext"));
+ // Asume success
+ response.setStatus(0);
+ switch (request.getOperationType()) {
+ case FETCH:
+ executeFetch(request, response);
+ break;
+ default:
+ break;
+ }
+
+ return request.getData();
+ }
+
+
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+
+ String parentIdString = request.getCriteria().getAttributeAsString("parentId");
+ if (parentIdString != null) {
+ processResponse(request.getRequestId(), response);
+ } else {
+
+
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ criteria.fetchParentResourceTypes(true);
+ criteria.setPageControl(PageControl.getUnlimitedInstance());
+
+ resourceTypeService.findResourceTypesByCriteria(criteria,
+ new AsyncCallback<PageList<ResourceType>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load resource type tree data", caught);
+ }
+
+ public void onSuccess(PageList<ResourceType> result) {
+ response.setData(buildNodes(result));
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+ }
+
+
+ public static TreeNode[] buildNodes(PageList<ResourceType> result) {
+
+ HashMap<String, PluginTreeNode> pluginNodes = new HashMap<String, PluginTreeNode>();
+
+ HashSet<TreeNode> nodes = new HashSet<TreeNode>();
+ for (ResourceType type : result) {
+
+ PluginTreeNode pluginNode = pluginNodes.get(type.getPlugin());
+ if (pluginNode == null) {
+ pluginNode = new PluginTreeNode(type.getPlugin());
+ pluginNodes.put(type.getPlugin(), pluginNode);
+ nodes.add(pluginNode);
+ }
+
+
+ if (type.getParentResourceTypes() == null || type.getParentResourceTypes().isEmpty()) {
+ nodes.add(new ResourceTypeTreeNode(type, type.getPlugin()));
+ } else {
+ for (ResourceType parent : type.getParentResourceTypes()) {
+ nodes.add(new ResourceTypeTreeNode(type, String.valueOf(parent.getId())));
+ }
+ }
+ }
+
+ TreeNode[] treeNodes = nodes.toArray(new TreeNode[nodes.size()]);
+ return treeNodes;
+ }
+
+
+ /**
+ * Returns a prepopulated PageControl based on the provided DSRequest. This will set sort fields,
+ * pagination, but *not* filter fields.
+ *
+ * @param request the request to turn into a page control
+ * @return the page control for passing to criteria and other queries
+ */
+ protected PageControl getPageControl(DSRequest request) {
+ // Initialize paging.
+ PageControl pageControl;
+ if (request.getStartRow() == null || request.getEndRow() == null) {
+ pageControl = new PageControl();
+ } else {
+ pageControl = PageControl.getExplicitPageControl(request.getStartRow(), request.getEndRow() - request.getStartRow());
+ }
+
+ // Initialize sorting.
+ String sortBy = request.getAttribute("sortBy");
+ if (sortBy != null) {
+ String[] sorts = sortBy.split(",");
+ for (String sort : sorts) {
+ PageOrdering ordering = (sort.startsWith("-")) ? PageOrdering.DESC : PageOrdering.ASC;
+ String columnName = (ordering == PageOrdering.DESC) ? sort.substring(1) : sort;
+ pageControl.addDefaultOrderingField(columnName, ordering);
+ }
+ }
+
+ return pageControl;
+ }
+
+
+ public static class PluginTreeNode extends TreeNode {
+
+ String id;
+
+ PluginTreeNode(String pluginName) {
+
+ setID(pluginName);
+ this.id = pluginName;
+ setParentID(null);
+
+ setAttribute("name", pluginName);
+// setAttribute("plugin",pluginName);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ PluginTreeNode that = (PluginTreeNode) o;
+
+ if (!id.equals(that.id)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+ }
+
+ public static class ResourceTypeTreeNode extends TreeNode {
+
+ private ResourceType resourceType;
+ String id;
+ String parentId;
+
+ private ResourceTypeTreeNode(ResourceType resourceType, String parentId) {
+ this.resourceType = resourceType;
+
+ String id = String.valueOf(resourceType.getId());
+
+ setID(id);
+ this.id = id;
+ setParentID(parentId);
+ this.parentId = parentId;
+
+ setAttribute("id", id);
+ setAttribute("parentId", parentId);
+ setAttribute("name", resourceType.getName());
+ setAttribute("plugin", resourceType.getPlugin());
+ setAttribute("category", resourceType.getCategory().getDisplayName());
+
+ setIsFolder(true);
+ }
+
+
+ public ResourceType getResourceType() {
+ return resourceType;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ResourceTypeTreeNode that = (ResourceTypeTreeNode) o;
+
+ if (!id.equals(that.id)) return false;
+ if (parentId != null ? !parentId.equals(that.parentId) : that.parentId != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id.hashCode();
+ result = 31 * result + (parentId != null ? parentId.hashCode() : 0);
+ return result;
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeView.java
new file mode 100644
index 0000000..5a78a23
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeTreeView.java
@@ -0,0 +1,115 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.type;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeGridField;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+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.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTServiceAsync;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceTypeTreeView extends VLayout {
+
+ private ResourceTypeGWTServiceAsync resourceTypeService = GWTServiceLookup.getResourceTypeGWTService();
+
+ public ResourceTypeTreeView() {
+ setWidth100();
+ setHeight100();
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+
+ final TreeGrid treeGrid = new CustomResourceTypeTreeGrid();
+
+ treeGrid.setHeight100();
+
+ treeGrid.setTitle("Resource Types");
+ treeGrid.setAnimateFolders(false);
+ treeGrid.setResizeFieldsInRealTime(true);
+
+
+ final TreeGridField name, plugin, category;
+ name = new TreeGridField("name");
+ plugin = new TreeGridField("plugin");
+ category = new TreeGridField("category");
+
+ treeGrid.setFields(name, plugin, category);
+
+ addMember(treeGrid);
+
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ criteria.fetchParentResourceTypes(true);
+ criteria.setPageControl(PageControl.getUnlimitedInstance());
+
+ resourceTypeService.findResourceTypesByCriteria(criteria,
+ new AsyncCallback<PageList<ResourceType>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load inventory discovery queue", caught);
+ }
+
+ public void onSuccess(PageList<ResourceType> result) {
+
+ treeGrid.getTree().linkNodes(ResourceTypeTreeDataSource.buildNodes(result));
+
+ }
+ });
+ }
+
+
+ public static class CustomResourceTypeTreeGrid extends TreeGrid {
+ @Override
+ protected String getIcon(Record record, boolean defaultState) {
+
+ if (record instanceof TreeNode) {
+ boolean open = getTree().isOpen((TreeNode) record);
+
+ if (record instanceof ResourceTypeTreeDataSource.ResourceTypeTreeNode) {
+ ResourceType resourceType = ((ResourceTypeTreeDataSource.ResourceTypeTreeNode) record).getResourceType();
+
+ switch (resourceType.getCategory()) {
+ case PLATFORM:
+ return "types/Platform_up_16.png";
+ case SERVER:
+ return "types/Server_up_16.png";
+ case SERVICE:
+ return "types/Service_up_16.png";
+ }
+ } else if (record instanceof ResourceTypeTreeDataSource.PluginTreeNode) {
+ return "types/plugin_16.png";
+ }
+ }
+ return null;
+ }
+ }
+}
commit 2b960960767a03e8f7cbe7c31a6dc7a22d22e7a9
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:14:14 2010 -0400
Summary traits on overview as per jeremy's updated design
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 47a7ab8..f6c31da 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
@@ -45,6 +45,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configura
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.GraphListView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.calltime.CallTimeView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.OperationHistoryView;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.overview.ResourceOverviewView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import com.google.gwt.user.client.History;
@@ -67,9 +68,6 @@ public class ResourceDetailView extends VLayout implements ViewRenderer, Resourc
private ResourcePermission permissions;
private ResourceType type;
- private SimpleCollapsiblePanel summaryPanel;
- private ResourceSummaryView summaryView;
-
private TwoLevelTab summaryTab;
private TwoLevelTab monitoringTab;
private TwoLevelTab inventoryTab;
@@ -97,9 +95,6 @@ public class ResourceDetailView extends VLayout implements ViewRenderer, Resourc
setWidth100();
setHeight100();
- // The header section
- summaryView = new ResourceSummaryView();
- summaryPanel = new SimpleCollapsiblePanel("Summary", summaryView);
// The Tabs section
@@ -142,8 +137,6 @@ public class ResourceDetailView extends VLayout implements ViewRenderer, Resourc
titleBar = new ResourceTitleBar();
addMember(titleBar);
- addMember(summaryPanel);
-
addMember(topTabSet);
// CoreGUI.addBreadCrumb(getPlace());
@@ -153,16 +146,13 @@ public class ResourceDetailView extends VLayout implements ViewRenderer, Resourc
this.resource = resource;
- this.summaryView.onResourceSelected(resource);
-
titleBar.setResource(resource);
int selectedTab = topTabSet.getSelectedTabNumber();
- FullHTMLPane summaryPane = new FullHTMLPane("/rhq/resource/summary/overview-plain.xhtml?id=" + resource.getId());
FullHTMLPane timelinePane = new FullHTMLPane("/rhq/resource/summary/timeline-plain.xhtml?id=" + resource.getId());
- summaryTab.updateSubTab("Overview", summaryPane);
+ summaryTab.updateSubTab("Overview", new ResourceOverviewView(resource));
summaryTab.updateSubTab("Timeline", timelinePane);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceSummaryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceSummaryView.java
deleted file mode 100644
index 58d0d08..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceSummaryView.java
+++ /dev/null
@@ -1,186 +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.gui.coregui.client.inventory.resource.detail;
-
-import org.rhq.core.domain.measurement.DataType;
-import org.rhq.core.domain.measurement.DisplayType;
-import org.rhq.core.domain.measurement.MeasurementDataTrait;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.util.SC;
-import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.fields.FormItem;
-import com.smartgwt.client.widgets.form.fields.SpacerItem;
-import com.smartgwt.client.widgets.form.fields.StaticTextItem;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.List;
-
-/**
- * @author Greg Hinkle
- */
-public class ResourceSummaryView extends DynamicForm implements ResourceSelectListener {
-
- private Resource resource;
-
- @Override
- protected void onDraw() {
- super.onDraw();
-
- setNumCols(4);
- setWrapItemTitles(false);
- setLeft("10%");
- setWidth("80%");
- }
-
-
- public void onResourceSelected(Resource resource) {
-
- this.resource = resource;
-
- ResourceTypeRepository.Cache.getInstance().getResourceTypes(resource.getResourceType().getId(),
- EnumSet.of(ResourceTypeRepository.MetadataType.measurements),
- new ResourceTypeRepository.TypeLoadedCallback() {
- public void onTypesLoaded(ResourceType type) {
- try {
- buildForm(type);
- loadValues();
- } catch (Exception e) {
- SC.say("Form load failure");
- e.printStackTrace();
- }
- }
- });
-
-
- markForRedraw();
- }
-
- private void loadValues() {
- GWTServiceLookup.getMeasurementDataService().findCurrentTraitsForResource(
- resource.getId(),
- DisplayType.SUMMARY,
- new AsyncCallback<List<MeasurementDataTrait>>() {
- public void onFailure(Throwable caught) {
- SC.say("Failed to load traits");
- CoreGUI.getErrorHandler().handleError("Failed to load traits information for resource",caught);
- }
-
- public void onSuccess(List<MeasurementDataTrait> result) {
- // TODO: Implement this method.
- for (MeasurementDataTrait trait : result) {
- String formId = trait.getName().replaceAll("\\.", "_").replaceAll(" ", "__");
- FormItem item = getItem(formId);
-
- if (item != null) {
- setValue(formId, trait.getValue());
- }
- }
- markForRedraw();
- }
- }
- );
-
- }
-
- private void buildForm(ResourceType type) {
- ArrayList<MeasurementDefinition> traits = new ArrayList<MeasurementDefinition>();
-
- for (MeasurementDefinition measurement : type.getMetricDefinitions()) {
- if (measurement.getDataType() == DataType.TRAIT && measurement.getDisplayType() == DisplayType.SUMMARY) {
- traits.add(measurement);
- }
- }
-
- Collections.sort(traits, new Comparator<MeasurementDefinition>() {
- public int compare(MeasurementDefinition o1, MeasurementDefinition o2) {
- return new Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
- }
- });
-
-
- ArrayList<FormItem> formItems = new ArrayList<FormItem>();
- ArrayList<String> itemIds = new ArrayList<String>();
-
-
- StaticTextItem typeItem = new StaticTextItem("typeItem", "Type");
- typeItem.setTooltip("Plugin: " + type.getPlugin() + "\n<br>" + "Type: " + type.getName());
- typeItem.setValue(type.getName() + " (" + type.getPlugin() + ")");
- formItems.add(typeItem);
- itemIds.add(typeItem.getName());
-
- StaticTextItem descriptionItem = new StaticTextItem("descriptionItem", "Description");
- descriptionItem.setValue(resource.getDescription());
- formItems.add(descriptionItem);
- itemIds.add(descriptionItem.getName());
-
-
- StaticTextItem versionItem = new StaticTextItem("versionItem", "Version");
- formItems.add(versionItem);
- itemIds.add(versionItem.getName());
-
-
- StaticTextItem parentItem = new StaticTextItem("parentItem", "Parent");
- formItems.add(parentItem);
- itemIds.add(parentItem.getName());
-
-
- for (MeasurementDefinition trait : traits) {
-
- String id = trait.getDisplayName().replaceAll("\\.", "_").replaceAll(" ", "__");
- itemIds.add(id);
-
- StaticTextItem item = new StaticTextItem(id, trait.getDisplayName());
- item.setTooltip(trait.getDescription());
- formItems.add(item);
-// item.setValue("?");
- }
-
-// SectionItem section = new SectionItem("Summary", "Summary");
-// section.setTitle("Summary");
-// section.setDefaultValue("Summary");
-// section.setCanCollapse(true);
-// section.setCellStyle("HidablePlainSectionHeader");
-// section.setItemIds(itemIds.toArray(new String[itemIds.size()]));
-// formItems.add(0, section);
-
- formItems.add(new SpacerItem());
- setItems(formItems.toArray(new FormItem[formItems.size()]));
-
-
- setValue("typeItem", type.getName() + " (" + type.getPlugin() + ")");
- setValue("descriptionItem", resource.getDescription());
- setValue("versionItem", resource.getVersion());
- setValue("parentItem", resource.getParentResource() == null ? null :
- ("<a href=\"#Resource/" + resource.getParentResource().getId() + "\">" +
- resource.getParentResource().getName() + "</a>"));
-
-
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java
new file mode 100644
index 0000000..3f5cf5f
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java
@@ -0,0 +1,57 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.detail.overview;
+
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
+import org.rhq.enterprise.gui.coregui.client.components.SimpleCollapsiblePanel;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceOverviewView extends VLayout {
+
+ private Resource resource;
+
+
+ public ResourceOverviewView(Resource resource) {
+ this.resource = resource;
+ }
+
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ ResourceSummaryView summaryView = new ResourceSummaryView();
+ summaryView.onResourceSelected(resource);
+ SimpleCollapsiblePanel summaryPanel = new SimpleCollapsiblePanel("Summary", summaryView);
+
+
+ addMember(summaryPanel);
+
+
+ FullHTMLPane summaryPane = new FullHTMLPane("/rhq/resource/summary/overview-plain.xhtml?id=" + resource.getId());
+ addMember(summaryPane);
+
+
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java
new file mode 100644
index 0000000..c2c2560
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java
@@ -0,0 +1,186 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.detail.overview;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.List;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.util.SC;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.SpacerItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+
+import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.DisplayType;
+import org.rhq.core.domain.measurement.MeasurementDataTrait;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceSummaryView extends DynamicForm implements ResourceSelectListener {
+
+ private Resource resource;
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ setNumCols(4);
+ setWrapItemTitles(false);
+ setLeft("10%");
+ setWidth("80%");
+ }
+
+
+ public void onResourceSelected(Resource resource) {
+
+ this.resource = resource;
+
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(resource.getResourceType().getId(),
+ EnumSet.of(ResourceTypeRepository.MetadataType.measurements),
+ new ResourceTypeRepository.TypeLoadedCallback() {
+ public void onTypesLoaded(ResourceType type) {
+ try {
+ buildForm(type);
+ loadValues();
+ } catch (Exception e) {
+ SC.say("Form load failure");
+ e.printStackTrace();
+ }
+ }
+ });
+
+
+ markForRedraw();
+ }
+
+ private void loadValues() {
+ GWTServiceLookup.getMeasurementDataService().findCurrentTraitsForResource(
+ resource.getId(),
+ DisplayType.SUMMARY,
+ new AsyncCallback<List<MeasurementDataTrait>>() {
+ public void onFailure(Throwable caught) {
+ SC.say("Failed to load traits");
+ CoreGUI.getErrorHandler().handleError("Failed to load traits information for resource",caught);
+ }
+
+ public void onSuccess(List<MeasurementDataTrait> result) {
+ // TODO: Implement this method.
+ for (MeasurementDataTrait trait : result) {
+ String formId = trait.getName().replaceAll("\\.", "_").replaceAll(" ", "__");
+ FormItem item = getItem(formId);
+
+ if (item != null) {
+ setValue(formId, trait.getValue());
+ }
+ }
+ markForRedraw();
+ }
+ }
+ );
+
+ }
+
+ private void buildForm(ResourceType type) {
+ ArrayList<MeasurementDefinition> traits = new ArrayList<MeasurementDefinition>();
+
+ for (MeasurementDefinition measurement : type.getMetricDefinitions()) {
+ if (measurement.getDataType() == DataType.TRAIT && measurement.getDisplayType() == DisplayType.SUMMARY) {
+ traits.add(measurement);
+ }
+ }
+
+ Collections.sort(traits, new Comparator<MeasurementDefinition>() {
+ public int compare(MeasurementDefinition o1, MeasurementDefinition o2) {
+ return new Integer(o1.getDisplayOrder()).compareTo(o2.getDisplayOrder());
+ }
+ });
+
+
+ ArrayList<FormItem> formItems = new ArrayList<FormItem>();
+ ArrayList<String> itemIds = new ArrayList<String>();
+
+
+ StaticTextItem typeItem = new StaticTextItem("typeItem", "Type");
+ typeItem.setTooltip("Plugin: " + type.getPlugin() + "\n<br>" + "Type: " + type.getName());
+ typeItem.setValue(type.getName() + " (" + type.getPlugin() + ")");
+ formItems.add(typeItem);
+ itemIds.add(typeItem.getName());
+
+ StaticTextItem descriptionItem = new StaticTextItem("descriptionItem", "Description");
+ descriptionItem.setValue(resource.getDescription());
+ formItems.add(descriptionItem);
+ itemIds.add(descriptionItem.getName());
+
+
+ StaticTextItem versionItem = new StaticTextItem("versionItem", "Version");
+ formItems.add(versionItem);
+ itemIds.add(versionItem.getName());
+
+
+ StaticTextItem parentItem = new StaticTextItem("parentItem", "Parent");
+ formItems.add(parentItem);
+ itemIds.add(parentItem.getName());
+
+
+ for (MeasurementDefinition trait : traits) {
+
+ String id = trait.getDisplayName().replaceAll("\\.", "_").replaceAll(" ", "__");
+ itemIds.add(id);
+
+ StaticTextItem item = new StaticTextItem(id, trait.getDisplayName());
+ item.setTooltip(trait.getDescription());
+ formItems.add(item);
+// item.setValue("?");
+ }
+
+// SectionItem section = new SectionItem("Summary", "Summary");
+// section.setTitle("Summary");
+// section.setDefaultValue("Summary");
+// section.setCanCollapse(true);
+// section.setCellStyle("HidablePlainSectionHeader");
+// section.setItemIds(itemIds.toArray(new String[itemIds.size()]));
+// formItems.add(0, section);
+
+ formItems.add(new SpacerItem());
+ setItems(formItems.toArray(new FormItem[formItems.size()]));
+
+
+ setValue("typeItem", type.getName() + " (" + type.getPlugin() + ")");
+ setValue("descriptionItem", resource.getDescription());
+ setValue("versionItem", resource.getVersion());
+ setValue("parentItem", resource.getParentResource() == null ? null :
+ ("<a href=\"#Resource/" + resource.getParentResource().getId() + "\">" +
+ resource.getParentResource().getName() + "</a>"));
+
+
+ }
+}
commit 380b61e9546f636950bd8e4458e50055cd8fd9fd
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:13:42 2010 -0400
Dashboard demo work. summary and discovery queue added
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
index 560935b..35c75be 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
@@ -29,21 +29,25 @@ import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;
+
import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.RecentlyAddedView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.SmallGraphView;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.AutodiscoveryQueueDataSource;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.ResourceAutodiscoveryView;
+import org.rhq.enterprise.gui.coregui.client.inventory.summary.SummaryCountsView;
/**
* @author Greg Hinkle
*/
public class DashboardView extends VLayout {
- private static String[] colors = new String[]{
- "FF6600", "808000", "008000", "008080", "0000FF", "666699",
- "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF",
- "800080", "969696", "FF00FF", "FFCC00", "FFFF00", "00FF00",
- "00FFFF", "00CCFF", "993366", "C0C0C0", "FF99CC", "FFCC99",
- "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"
- };
+ private static String[] colors = new String[]{
+ "FF6600", "808000", "008000", "008080", "0000FF", "666699",
+ "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF",
+ "800080", "969696", "FF00FF", "FFCC00", "FFFF00", "00FF00",
+ "00FFFF", "00CCFF", "993366", "C0C0C0", "FF99CC", "FFCC99",
+ "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"
+ };
public DashboardView() {
setOverflow(Overflow.AUTO);
@@ -55,10 +59,25 @@ public class DashboardView extends VLayout {
setHeight100();
- final PortalLayout portalLayout = new PortalLayout(3);
+ final PortalLayout portalLayout = new PortalLayout(2);
portalLayout.setWidth100();
portalLayout.setHeight100();
+
+ Portlet summaryPortlet = new Portlet();
+ summaryPortlet.setTitle("Inventory Summary");
+ summaryPortlet.addItem(new SummaryCountsView());
+ summaryPortlet.setHeight(300);
+ portalLayout.addPortlet(summaryPortlet);
+
+
+ Portlet adPortlet = new Portlet();
+ adPortlet.setTitle("Auto Discovery Queue");
+ adPortlet.addItem(new ResourceAutodiscoveryView(true));
+ adPortlet.setHeight(250);
+ portalLayout.addPortlet(adPortlet);
+
+
// create portlets...
for (int i = 1; i <= 2; i++) {
Portlet portlet = new Portlet();
@@ -69,7 +88,7 @@ public class DashboardView extends VLayout {
// label.setLayoutAlign(VerticalAlignment.CENTER);
// label.setContents("Portlet contents");
// label.setBackgroundColor(colors[Random.nextInt(colors.length - 1)]);
-
+
portlet.addItem(new SmallGraphView());
portlet.setHeight(400);
portalLayout.addPortlet(portlet);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java
index a1932b8..1720962 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java
@@ -27,7 +27,11 @@ public class PortalLayout extends HLayout {
public PortalLayout(int numColumns) {
setMembersMargin(6);
for (int i = 0; i < numColumns; i++) {
- addMember(new PortalColumn());
+ PortalColumn column = new PortalColumn();
+ if (i == 0) {
+ column.setWidth("30%");
+ }
+ addMember(column);
}
}
commit 8026166c76593ca6f5a6bc83e59d6766b338ad0c
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:13:17 2010 -0400
Autodiscovery queue. tree view. import, ignore, unignore buttons
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java
index 5a5e0d4..9fcb5cc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java
@@ -21,13 +21,18 @@ package org.rhq.enterprise.gui.coregui.client.gwt;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.composite.RecentlyAddedResourceComposite;
+import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import com.google.gwt.user.client.rpc.RemoteService;
+import java.util.EnumSet;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
/**
* @author Greg Hinkle
@@ -48,4 +53,11 @@ public interface ResourceGWTService extends RemoteService {
void createResource(int parentResourceId, int newResourceTypeId, String newResourceName, Configuration newResourceConfiguration);
+ Map<Resource, List<Resource>> getQueuedPlatformsAndServers(HashSet<InventoryStatus> statuses, PageControl pc);
+
+ void importResources(Integer[] resourceIds);
+
+ void ignoreResources(Integer[] resourceIds);
+
+ void unignoreResources(Integer[] resourceIds);
}
\ No newline at end of file
commit 5691f3427c38620b78172f20d6381db5324429eb
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:12:50 2010 -0400
Autodiscovery queue. tree view. import, ignore, unignore buttons
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 bf580ed..ff6f3ee 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,6 +27,7 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesView;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersView;
import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.ResourceAutodiscoveryView;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.widgets.Canvas;
@@ -112,11 +113,11 @@ public class AdministrationView extends HLayout implements ViewRenderer {
Tree tree = new Tree();
final TreeNode manageUsersNode = new TreeNode("Manage Users");
final TreeNode manageRolesNode = new TreeNode("Manage Roles");
- final TreeNode manageGroups = new TreeNode("Resource Groups");
+ final TreeNode discoveryQueue = new TreeNode("Auto Discovery Queue");
tree.setRoot(new TreeNode("security",
manageUsersNode,
manageRolesNode,
- manageGroups));
+ discoveryQueue));
securityTreeGrid.setData(tree);
@@ -128,8 +129,8 @@ public class AdministrationView extends HLayout implements ViewRenderer {
content = new UsersView();
} else if (selectionEvent.getRecord() == manageRolesNode) {
content = new RolesView();
- } else if (selectionEvent.getRecord() == manageGroups) {
- content = new RolesView();
+ } else if (selectionEvent.getRecord() == discoveryQueue) {
+ content = new ResourceAutodiscoveryView();
} else {
throw new IllegalStateException("Unknown record selected: " + selectionEvent.getRecord());
}
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
new file mode 100644
index 0000000..01a5ad3
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/AutodiscoveryQueueDataSource.java
@@ -0,0 +1,221 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.discovery;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.DataSource;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.types.DSDataFormat;
+import com.smartgwt.client.types.DSProtocol;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+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.PageControl;
+import org.rhq.core.domain.util.PageOrdering;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync;
+
+/**
+ * @author Greg Hinkle
+ */
+public class AutodiscoveryQueueDataSource extends DataSource {
+
+
+ private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
+
+ public AutodiscoveryQueueDataSource() {
+ setClientOnly(false);
+ setDataProtocol(DSProtocol.CLIENTCUSTOM);
+ setDataFormat(DSDataFormat.CUSTOM);
+
+
+ DataSourceTextField idField = new DataSourceTextField("id", "ID");
+ idField.setPrimaryKey(true);
+
+ DataSourceTextField parentIdField = new DataSourceTextField("parentId", "Parent ID");
+ parentIdField.setForeignKey("id");
+
+ DataSourceTextField resourceNameField = new DataSourceTextField("name", "Resource Name");
+
+ DataSourceTextField resourceKeyField = new DataSourceTextField("resourceKey", "Resource Key");
+
+ DataSourceTextField resourceTypeField = new DataSourceTextField("typeName", "Type");
+
+ DataSourceTextField descriptionField = new DataSourceTextField("description", "Description");
+
+ DataSourceTextField timestampField = new DataSourceTextField("ctime", "Discovery Time");
+
+ DataSourceTextField statusField = new DataSourceTextField("status", "Inventory Status");
+
+ setFields(idField, parentIdField, resourceNameField, resourceKeyField, resourceTypeField, descriptionField, statusField, timestampField);
+ }
+
+ protected Object transformRequest(DSRequest request) {
+ DSResponse response = new DSResponse();
+ response.setAttribute("clientContext", request.getAttributeAsObject("clientContext"));
+ // Asume success
+ response.setStatus(0);
+ switch (request.getOperationType()) {
+ case FETCH:
+ executeFetch(request, response);
+ break;
+ default:
+ break;
+ }
+
+ return request.getData();
+ }
+
+
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+ PageControl pc = getPageControl(request);
+
+ HashSet<InventoryStatus> statuses = new HashSet<InventoryStatus>();
+
+ String statusesString = request.getCriteria().getAttributeAsString("statuses");
+ if (statusesString != null) {
+ if ("New".equals(statusesString)) {
+ statuses.add(InventoryStatus.NEW);
+ } else if ("Ignored".equals(statusesString)) {
+ statuses.add(InventoryStatus.IGNORED);
+ } else {
+ statuses.add(InventoryStatus.NEW);
+ statuses.add(InventoryStatus.IGNORED);
+ }
+ } else {
+ statuses.add(InventoryStatus.NEW);
+ }
+
+
+ resourceService.getQueuedPlatformsAndServers(statuses, pc,
+ new AsyncCallback<Map<Resource, List<Resource>>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load inventory discovery queue", caught);
+ }
+
+ public void onSuccess(Map<Resource, List<Resource>> result) {
+ response.setData(buildNodes(result));
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+
+
+ private TreeNode[] buildNodes(Map<Resource, List<Resource>> result) {
+
+ ArrayList<ResourceTreeNode> nodes = new ArrayList<ResourceTreeNode>();
+ for (Resource platform : result.keySet()) {
+ nodes.add(new ResourceTreeNode(platform));
+
+ for (Resource child : result.get(platform)) {
+ ResourceTreeNode childNode = new ResourceTreeNode(child);
+ childNode.setIsFolder(false);
+ nodes.add(childNode);
+ }
+ }
+
+ TreeNode[] treeNodes = nodes.toArray(new TreeNode[nodes.size()]);
+ return treeNodes;
+ }
+
+
+ /**
+ * Returns a prepopulated PageControl based on the provided DSRequest. This will set sort fields,
+ * pagination, but *not* filter fields.
+ *
+ * @param request the request to turn into a page control
+ * @return the page control for passing to criteria and other queries
+ */
+ protected PageControl getPageControl(DSRequest request) {
+ // Initialize paging.
+ PageControl pageControl;
+ if (request.getStartRow() == null || request.getEndRow() == null) {
+ pageControl = new PageControl();
+ } else {
+ pageControl = PageControl.getExplicitPageControl(request.getStartRow(), request.getEndRow() - request.getStartRow());
+ }
+
+ // Initialize sorting.
+ String sortBy = request.getAttribute("sortBy");
+ if (sortBy != null) {
+ String[] sorts = sortBy.split(",");
+ for (String sort : sorts) {
+ PageOrdering ordering = (sort.startsWith("-")) ? PageOrdering.DESC : PageOrdering.ASC;
+ String columnName = (ordering == PageOrdering.DESC) ? sort.substring(1) : sort;
+ pageControl.addDefaultOrderingField(columnName, ordering);
+ }
+ }
+
+ return pageControl;
+ }
+
+
+ public static class ResourceTreeNode extends TreeNode {
+
+ private Resource resource;
+
+ private ResourceTreeNode(Resource resource) {
+ this.resource = resource;
+
+ String id = String.valueOf(resource.getId());
+ String parentId = resource.getParentResource() == null ? null
+ : String.valueOf((resource.getParentResource().getId()));
+
+ setID(id);
+ setParentID(parentId);
+
+ setAttribute("id", id);
+ setAttribute("parentId", parentId);
+ setAttribute("name", resource.getName());
+ setAttribute("typeName", resource.getResourceType().getName());
+ setAttribute("resourceKey", resource.getResourceKey());
+ setAttribute("description", resource.getDescription());
+ setAttribute("ctime", new Date(resource.getCtime()));
+ setAttribute("status", resource.getInventoryStatus().name());
+ }
+
+ public Resource getResource() {
+ return resource;
+ }
+
+ public void setResource(Resource resource) {
+ this.resource = resource;
+ }
+
+ public ResourceType getResourceType() {
+ return resource.getResourceType();
+ }
+
+ public String getParentId() {
+ return getAttribute("parentId");
+ }
+ }
+}
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
new file mode 100644
index 0000000..6ef0606
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/discovery/ResourceAutodiscoveryView.java
@@ -0,0 +1,229 @@
+/*
+ * 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.gui.coregui.client.inventory.resource.discovery;
+
+import java.util.ArrayList;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.types.SelectionAppearance;
+import com.smartgwt.client.widgets.HTMLFlow;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeGridField;
+
+import org.rhq.core.domain.resource.InventoryStatus;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+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.util.message.Message;
+
+/**
+ * @author Greg Hinkle
+ */
+public class ResourceAutodiscoveryView extends VLayout {
+
+ private boolean simple = false;
+ private TreeGrid treeGrid;
+ private ToolStrip footer;
+
+ private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService();
+
+
+ public ResourceAutodiscoveryView() {
+ setWidth100();
+ setHeight100();
+ }
+
+ public ResourceAutodiscoveryView(boolean simple) {
+ this();
+ this.simple = simple;
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+
+ HLayout titleLayout = new HLayout(150);
+
+ HTMLFlow title = new HTMLFlow();
+ title.setWidth100();
+ title.setHeight(35);
+ title.setContents("Auto Discovery Queue");
+ title.setPadding(4);
+ title.setStyleName("HeaderLabel");
+ titleLayout.addMember(title);
+
+
+ DynamicForm form = new DynamicForm();
+ final SelectItem statusSelectItem = new SelectItem("statuses", "Displayed Statuses");
+ statusSelectItem.setValueMap("New", "Ignored", "New and Ignored");
+ statusSelectItem.setValue("New");
+ form.setItems(statusSelectItem);
+ if (!simple)
+ titleLayout.addMember(form);
+
+
+ addMember(titleLayout);
+
+ treeGrid = new TreeGrid();
+
+ treeGrid.setHeight100();
+
+ treeGrid.setDataSource(new AutodiscoveryQueueDataSource());
+ treeGrid.setAutoFetchData(true);
+ treeGrid.setTitle("Auto Discovery Queue");
+ treeGrid.setResizeFieldsInRealTime(true);
+
+ final TreeGridField name, key, type, description, status, ctime;
+ name = new TreeGridField("name");
+ key = new TreeGridField("resourceKey");
+ type = new TreeGridField("typeName");
+ description = new TreeGridField("description");
+ status = new TreeGridField("status");
+ ctime = new TreeGridField("ctime");
+
+ if (!simple) {
+ treeGrid.setFields(name, key, type, description, status, ctime);
+ } else {
+ treeGrid.setFields(name, key, type, status);
+ }
+
+ treeGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
+ treeGrid.setShowSelectedStyle(false);
+ treeGrid.setShowPartialSelection(true);
+ treeGrid.setCascadeSelection(true);
+
+
+ addMember(treeGrid);
+
+ footer = new ToolStrip();
+ footer.setPadding(5);
+ footer.setWidth100();
+ footer.setMembersMargin(15);
+
+ addMember(footer);
+
+
+ final IButton importButton = new IButton("Import");
+ final IButton ignoreButton = new IButton("Ignore");
+ final IButton unignoreButton = new IButton("Unignore");
+
+
+ footer.addMember(importButton);
+ footer.addMember(ignoreButton);
+ footer.addMember(unignoreButton);
+
+
+ importButton.setDisabled(true);
+ ignoreButton.setDisabled(true);
+ unignoreButton.setDisabled(true);
+
+ treeGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
+ public void onSelectionChanged(SelectionEvent selectionEvent) {
+ boolean noneSelected = treeGrid.getSelection().length == 0;
+ importButton.setDisabled(noneSelected);
+ ignoreButton.setDisabled(noneSelected);
+ unignoreButton.setDisabled(noneSelected);
+ }
+ });
+
+
+ importButton.addClickHandler(
+ new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ resourceService.importResources(getSelectedIds(), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to import resources", caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(new Message("Successfully imported the selected resources", Message.Severity.Info));
+ treeGrid.invalidateCache();
+ }
+ });
+ }
+ }
+ );
+
+
+ ignoreButton.addClickHandler(
+ new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ resourceService.ignoreResources(getSelectedIds(), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to ignore resources", caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(new Message("Successfully ignored the selected resources", Message.Severity.Info));
+ treeGrid.invalidateCache();
+ }
+ });
+ }
+ }
+ );
+
+ unignoreButton.addClickHandler(
+ new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ resourceService.unignoreResources(getSelectedIds(), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to unignore resources", caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(new Message("Successfully unignored the selected resources", Message.Severity.Info));
+ treeGrid.invalidateCache();
+ }
+ });
+ }
+ }
+ );
+
+ statusSelectItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent changedEvent) {
+ treeGrid.fetchData(new Criteria("statuses", (String) statusSelectItem.getValue()));
+ }
+ });
+ }
+
+ private Integer[] getSelectedIds() {
+ ArrayList<Integer> selected = new ArrayList<Integer>();
+ for (ListGridRecord node : treeGrid.getSelection()) {
+ if (!InventoryStatus.COMMITTED.name().equals(node.getAttributeAsString("status"))) {
+ selected.add(Integer.parseInt(node.getAttributeAsString("id")));
+ }
+ }
+ return selected.toArray(new Integer[selected.size()]);
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java
index 484b434..3434a67 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java
@@ -18,16 +18,20 @@
*/
package org.rhq.enterprise.gui.coregui.server.gwt;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.composite.RecentlyAddedResourceComposite;
+import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
+import org.rhq.enterprise.server.discovery.DiscoveryBossLocal;
import org.rhq.enterprise.server.resource.ResourceFactoryManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -37,8 +41,10 @@ import javax.servlet.ServletException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -48,7 +54,7 @@ public class ResourceGWTServiceImpl extends AbstractGWTServiceImpl implements Re
private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
private ResourceFactoryManagerLocal resourceFactoryManager = LookupUtil.getResourceFactoryManager();
-
+ private DiscoveryBossLocal discoveryBoss = LookupUtil.getDiscoveryBoss();
private static String[] importantFields = {
"serialVersionUID",
@@ -178,4 +184,27 @@ public class ResourceGWTServiceImpl extends AbstractGWTServiceImpl implements Re
}
+
+ public Map<Resource, List<Resource>> getQueuedPlatformsAndServers(HashSet<InventoryStatus> statuses, PageControl pc) {
+ return SerialUtility.prepare(
+ discoveryBoss.getQueuedPlatformsAndServers(
+ getSessionSubject(),
+ EnumSet.copyOf(statuses),
+ pc),
+ "ResoruceService.getQueuedPlatformsAndServers");
+ }
+
+ public void importResources(Integer[] resourceIds) {
+ discoveryBoss.importResources(getSessionSubject(), resourceIds);
+ }
+
+ public void ignoreResources(Integer[] resourceIds) {
+ discoveryBoss.ignoreResources(getSessionSubject(), resourceIds);
+ }
+
+ public void unignoreResources(Integer[] resourceIds) {
+ discoveryBoss.unignoreResources(getSessionSubject(), resourceIds);
+ }
+
+
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
index 0597c7a..8864505 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
@@ -164,28 +164,31 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot
return syncInfo;
}
+
@RequiredPermission(Permission.MANAGE_INVENTORY)
public Map<Resource, List<Resource>> getQueuedPlatformsAndServers(Subject user, PageControl pc) {
+ return getQueuedPlatformsAndServers(user, EnumSet.of(InventoryStatus.NEW), pc);
+ }
+
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public Map<Resource, List<Resource>> getQueuedPlatformsAndServers(Subject user, EnumSet<InventoryStatus> statuses, PageControl pc) {
// pc.initDefaultOrderingField("res.ctime", PageOrdering.DESC); // this is set in getQueuedPlatforms,
// maps a platform to a list of child servers
Map<Resource, List<Resource>> queuedResources = new HashMap<Resource, List<Resource>>();
- List<Resource> queuedPlatforms = getQueuedPlatforms(user, EnumSet.of(InventoryStatus.NEW), pc);
+ List<Resource> queuedPlatforms = getQueuedPlatforms(user, statuses, pc);
for (Resource platform : queuedPlatforms) {
- List<Resource> queuedServers = getQueuedPlatformChildServers(user, InventoryStatus.NEW, platform);
-
- ArrayList<Resource> servers = new ArrayList<Resource>();
- for (Resource server : queuedServers) {
- servers.add(server);
+ List<Resource> queuedServers = new ArrayList<Resource>();
+ for (InventoryStatus status : statuses) {
+ queuedServers.addAll(getQueuedPlatformChildServers(user, status, platform));
}
-
- queuedResources.put(platform, servers);
+ queuedResources.put(platform, queuedServers);
}
-
return queuedResources;
}
+
@RequiredPermission(Permission.MANAGE_INVENTORY)
@SuppressWarnings("unchecked")
public PageList<Resource> getQueuedPlatforms(Subject user, EnumSet<InventoryStatus> statuses, PageControl pc) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java
index ad85062..c29833f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossLocal.java
@@ -71,6 +71,16 @@ public interface DiscoveryBossLocal {
*/
Map<Resource, List<Resource>> getQueuedPlatformsAndServers(Subject user, PageControl pc);
+
+ /**
+ * Like the above method, but can find ignored, commited or both
+ * @param user
+ * @param statuses
+ * @param pc
+ * @return
+ */
+ Map<Resource, List<Resource>> getQueuedPlatformsAndServers(Subject user, EnumSet<InventoryStatus> statuses, PageControl pc);
+
/**
* This returns all platform resources that either have the given status themselves or one or more of their child
* servers have that status. Use this to find those platforms that need to be shown in the auto-discovery pages
commit 7bd4d3a695ec940ec69d7c363573249f0d890f56
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Wed Mar 24 12:11:42 2010 -0400
Support for filtering resource list by resourceTypeId
Fixed bug in criteria resourceTypeId should be int, not string
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java
index e5534dc..69be135 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java
@@ -50,7 +50,7 @@ public class ResourceCriteria extends Criteria {
private InventoryStatus filterInventoryStatus = InventoryStatus.COMMITTED; // default
private String filterVersion;
private String filterDescription;
- private String filterResourceTypeId; // needs overrides
+ private Integer filterResourceTypeId; // needs overrides
private String filterResourceTypeName; // needs overrides
private ResourceCategory filterResourceCategory; // needs overrides
private String filterPluginName; // needs overrides
@@ -146,7 +146,7 @@ public class ResourceCriteria extends Criteria {
this.filterDescription = filterDescription;
}
- public void addFilterResourceTypeId(String filterResourceTypeId) {
+ public void addFilterResourceTypeId(Integer filterResourceTypeId) {
this.filterResourceTypeId = filterResourceTypeId;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
index 89bee8b..d465cb8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java
@@ -53,6 +53,10 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
DataSourceField idDataField = new DataSourceIntegerField("id", "ID", 20);
idDataField.setPrimaryKey(true);
+
+ DataSourceImageField iconField = new DataSourceImageField("icon");
+ iconField.setImageURLPrefix("types/");
+
DataSourceTextField nameDataField = new DataSourceTextField("name", "Name", 200);
nameDataField.setCanEdit(false);
@@ -67,7 +71,7 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
availabilityDataField.setCanEdit(false);
- setFields(idDataField, nameDataField, descriptionDataField, typeNameDataField, pluginNameDataField,
+ setFields(idDataField, iconField, nameDataField, descriptionDataField, typeNameDataField, pluginNameDataField,
categoryDataField, availabilityDataField);
}
@@ -104,6 +108,10 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
.get("availability")).toUpperCase()));
}
+ if (request.getCriteria().getValues().get("type") != null) {
+ criteria.addFilterResourceTypeId(Integer.parseInt(((String)request.getCriteria().getValues().get("type"))));
+ }
+
resourceService.findResourcesByCriteria(criteria, new AsyncCallback<PageList<Resource>>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError("Failed to fetch resource data", caught);
@@ -138,6 +146,9 @@ public class ResourceDatasource extends RPCDataSource<Resource> {
record.setAttribute("typeName", from.getResourceType().getName());
record.setAttribute("pluginName", from.getResourceType().getPlugin());
record.setAttribute("category", from.getResourceType().getCategory().getDisplayName());
+ record.setAttribute("icon", from.getResourceType().getCategory().getDisplayName() + "_" +
+ (from.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? "up" : "down") + "_16.png");
+
record
.setAttribute(
commit 5eef84472eb5d226fd99af92f48ed38240b51ed2
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Mon Mar 22 16:17:14 2010 -0400
Cleanup experiment with embedding gwt in jsf
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/discovery/queue.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/discovery/queue.xhtml
index c283940..0025417 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/discovery/queue.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/discovery/queue.xhtml
@@ -28,10 +28,6 @@
</ui:define>
<ui:define name="body">
-
-
- <iframe src="/coregui/CoreGUI.html"></iframe>
-
<script language="JavaScript" type="text/javascript">
commit 71e1218efc9e0c4d0928a01a526650125853811f
Author: Greg Hinkle <ghinkle(a)redhat.com>
Date: Sat Mar 20 18:38:57 2010 -0400
cleanup menu more
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
index 0990111..caf4ffb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
@@ -43,7 +43,7 @@ public class MenuBarView extends VLayout {
private String selected = "Dashboard";
- HTMLFlow linksPane;
+ private HTMLFlow linksPane;
public MenuBarView() {
super(5);
@@ -135,23 +135,21 @@ public class MenuBarView extends VLayout {
boolean first = true;
for (String section : SECTIONS) {
if (first) {
- headerString.append("<td style=\"width: 1px;\"><img src=\"http://localhost:7080/coregui/images/header/header_bg_line.png\"/></td>");
+ headerString.append("<td style=\"width: 1px;\"><img src=\"images/header/header_bg_line.png\"/></td>");
}
first = false;
- String bg = "";
String styleClass = "TopSectionLink";
if (section.equals(selected)) {
- bg = " background-image: url('http://localhost:7080/coregui/images/header/header_bg_selected.png');";
styleClass += "Selected";
}
- headerString.append("<td style=\"vertical-align: bottom; padding:5px; padding-left: 15px; padding-right: 15px;" + bg + "\"onclick=\"document.location='#" + section + "'\" >");
- headerString.append("<a class=\"" + styleClass + "\" href=\"#" + section + "\">" + section + "</a>");
+ headerString.append("<td class=\"" + styleClass + "\" onclick=\"document.location='#" + section + "'\" >");
+ headerString.append(section);
headerString.append("</td>\n");
- headerString.append("<td style=\"width: 1px;\"><img src=\"http://localhost:7080/coregui/images/header/header_bg_line.png\"/></td>");
+ headerString.append("<td style=\"width: 1px;\"><img src=\"images/header/header_bg_line.png\"/></td>");
}
headerString.append("</tr></table>");
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
index dcd511f..63c2089 100644
--- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
+++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css
@@ -96,17 +96,21 @@ a:hover {
}
-A.TopSectionLink {
+.TopSectionLink, .topsectionlinkselected {
+ vertical-align: bottom;
+ padding:5px;
+ padding-left: 15px;
+ padding-right: 15px;
+
+ cursor: pointer;
font-size: 10pt;
font-weight: bold;
text-decoration: none;
- color: black;
+ color: #4A5D75;
}
-A.TopSectionLinkSelected {
- font-size: 10pt;
- font-weight: bold;
- text-decoration: none;
+.TopSectionLinkSelected {
+ background-image: url('images/header/header_bg_selected.png');
color: white;
}
commit e6979c22719a31de9a7792ea57802f44800b21ca
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 13:42:05 2010 -0400
get the finish button to close the wizard; remove isNext/Previous methods - they are obsolete/no longer needed
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployDefinitionInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployDefinitionInfoStep.java
index ceda488..ef3afb6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployDefinitionInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployDefinitionInfoStep.java
@@ -82,8 +82,4 @@ public class BundleDeployDefinitionInfoStep implements WizardStep {
public boolean nextPage() {
return form.validate();
}
-
- public boolean isPreviousEnabled() {
- return false;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/CreateConfigStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/CreateConfigStep.java
index 8b8f46e..7456625 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/CreateConfigStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/CreateConfigStep.java
@@ -54,12 +54,4 @@ public class CreateConfigStep implements WizardStep {
wizard.setConfig(editor.getConfiguration());
return true;
}
-
- public boolean isPreviousEnabled() {
- return true;
- }
-
- public boolean isNextEnabled() {
- return true;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
index 55d1a7f..aacf46f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
@@ -73,8 +73,4 @@ public class DeployNowStep implements WizardStep {
public boolean nextPage() {
return form.validate();
}
-
- public boolean isPreviousEnabled() {
- return true;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
index f06e278..bf3b8b1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
@@ -116,15 +116,7 @@ public class DeployStep implements WizardStep {
return canvas;
}
- public boolean isNextEnabled() {
- return false;
- }
-
- public boolean isPreviousEnabled() {
- return true;
- }
-
public boolean nextPage() {
- return false;
+ return true;
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
index 0b71de1..52f7c5b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectBundleVersionStep.java
@@ -148,14 +148,6 @@ public class SelectBundleVersionStep implements WizardStep {
}
public boolean nextPage() {
- return form.validate();
- }
-
- public boolean isNextEnabled() {
- return (null != this.wizard.getBundleVersion());
- }
-
- public boolean isPreviousEnabled() {
- return false;
+ return form.validate() && (null != this.wizard.getBundleVersion());
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
index 94a4707..1e38fab 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
@@ -68,8 +68,4 @@ public class SelectPlatformsStep implements WizardStep {
public boolean nextPage() {
return form.validate();
}
-
- public boolean isPreviousEnabled() {
- return true;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectTemplateStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectTemplateStep.java
index ffc6adc..64efeaa 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectTemplateStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectTemplateStep.java
@@ -86,8 +86,4 @@ public class SelectTemplateStep implements WizardStep {
public boolean nextPage() {
return form.validate();
}
-
- public boolean isPreviousEnabled() {
- return true;
- }
}
commit 5fc81509e8651a7fd52c1883f57d6af990c5eaba
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 03:03:16 2010 -0400
finishing up create bundle wizard. the summary page is almost done - can't get the vlayout of the file list to look right, need to fix that
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
index bddf61b..a0c565b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -18,12 +18,12 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.create;
-import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.types.TitleOrientation;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.Label;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.fields.TextAreaItem;
-import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.LayoutSpacer;
+import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
@@ -32,7 +32,6 @@ import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
*/
public class BundleSummaryStep implements WizardStep {
- private DynamicForm form;
private final AbstractBundleCreateWizard wizard;
public BundleSummaryStep(AbstractBundleCreateWizard bundleCreationWizard) {
@@ -40,41 +39,92 @@ public class BundleSummaryStep implements WizardStep {
}
public Canvas getCanvas() {
- TextItem nameTextItem;
- TextItem versionTextItem;
- TextAreaItem descriptionTextAreaItem;
- TextItem bundleTypeTextItem;
- form = new DynamicForm();
- form.setPadding(20);
- form.setWidth100();
- form.setNumCols(2);
+ VLayout top = new VLayout();
+ top.setAutoHeight();
+ top.setPadding(20);
+ top.setWidth100();
- bundleTypeTextItem = new TextItem("bundleTypeItem", "Bundle Type");
- bundleTypeTextItem.setValue(wizard.getBundleType().getName());
- bundleTypeTextItem.setDisabled(true);
- bundleTypeTextItem.setTitleAlign(Alignment.LEFT);
+ HLayout bundleTypeBox = new HLayout();
+ bundleTypeBox.setWidth100();
+ bundleTypeBox.setExtraSpace(10);
+ Label bundleTypeLabel = new Label("Type:");
+ bundleTypeLabel.setWidth("10%");
+ bundleTypeLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ bundleTypeLabel.setWordWrap(false);
+ Label bundleTypeValue = new Label(wizard.getBundleType().getName());
+ bundleTypeValue.setWidth("90%");
+ bundleTypeValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ bundleTypeBox.addMember(bundleTypeLabel);
+ bundleTypeBox.addMember(bundleTypeValue);
+ top.addMember(bundleTypeBox);
- nameTextItem = new TextItem("name", "Name");
- nameTextItem.setValue(wizard.getBundleName());
- nameTextItem.setDisabled(true);
- nameTextItem.setTitleAlign(Alignment.LEFT);
+ HLayout nameBox = new HLayout();
+ nameBox.setWidth100();
+ nameBox.setExtraSpace(10);
+ Label nameLabel = new Label("Name:");
+ nameLabel.setWidth("10%");
+ nameLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ nameLabel.setWordWrap(false);
+ Label nameValue = new Label(wizard.getBundleName());
+ nameValue.setWidth("90%");
+ nameValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ nameBox.addMember(nameLabel);
+ nameBox.addMember(nameValue);
+ top.addMember(nameBox);
+ top.addMember(new LayoutSpacer());
- versionTextItem = new TextItem("version", "Version");
- versionTextItem.setValue(wizard.getBundleVersionString());
- versionTextItem.setDisabled(true);
- versionTextItem.setTitleAlign(Alignment.LEFT);
+ HLayout versionBox = new HLayout();
+ versionBox.setWidth100();
+ versionBox.setExtraSpace(10);
+ Label versionLabel = new Label("Version:");
+ versionLabel.setWidth("10%");
+ versionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ versionLabel.setWordWrap(false);
+ Label versionValue = new Label(wizard.getBundleVersionString());
+ versionValue.setWidth("90%");
+ versionValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ versionBox.addMember(versionLabel);
+ versionBox.addMember(versionValue);
+ top.addMember(versionBox);
+ top.addMember(new LayoutSpacer());
- descriptionTextAreaItem = new TextAreaItem("description", "Description");
- descriptionTextAreaItem.setValue(wizard.getBundleDescription());
- descriptionTextAreaItem.setDisabled(true);
- descriptionTextAreaItem.setTitleOrientation(TitleOrientation.TOP);
- descriptionTextAreaItem.setColSpan(2);
- descriptionTextAreaItem.setWidth(300);
+ HLayout descriptionBox = new HLayout();
+ descriptionBox.setWidth100();
+ descriptionBox.setExtraSpace(10);
+ Label descriptionLabel = new Label("Description:");
+ descriptionLabel.setWidth("10%");
+ descriptionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ descriptionLabel.setWordWrap(false);
+ Label descriptionValue = new Label(wizard.getBundleDescription());
+ descriptionValue.setWidth("90%");
+ descriptionValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ descriptionBox.addMember(descriptionLabel);
+ descriptionBox.addMember(descriptionValue);
+ top.addMember(descriptionBox);
+ top.addMember(new LayoutSpacer());
- form.setItems(bundleTypeTextItem, nameTextItem, versionTextItem, descriptionTextAreaItem);
+ HLayout filesBox = new HLayout();
+ filesBox.setWidth100();
+ filesBox.setExtraSpace(10);
+ Label filesLabel = new Label("Files:");
+ filesLabel.setWidth("10%");
+ filesLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ filesLabel.setWordWrap(false);
+ VLayout filesValues = new VLayout();
+ filesValues.setWidth("90%");
+ filesValues.setAutoHeight();
+ for (String filename : wizard.getAllBundleFilesStatus().keySet()) {
+ Label fileNameValue = new Label(filename);
+ fileNameValue.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
+ fileNameValue.setWordWrap(false);
+ filesValues.addMember(fileNameValue);
+ }
+ filesBox.addMember(filesLabel);
+ filesBox.addMember(filesValues);
+ top.addMember(filesBox);
- return form;
+ return top;
}
public boolean nextPage() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index d702b9b..cf0d561 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -25,7 +25,11 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
+import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.bundle.create.BundleCreateWizard;
import org.rhq.enterprise.gui.coregui.client.bundle.create.BundleUpdateWizard;
@@ -59,14 +63,14 @@ public class BundlesListView extends VLayout {
table.getListGrid().setSelectionType(SelectionStyle.SIMPLE);
table.getListGrid().setSelectionAppearance(SelectionAppearance.CHECKBOX);
- table.addTableAction("Create Bundle", Table.SelectionEnablement.ALWAYS, null, new TableAction() {
+ table.addTableAction("Create New Bundle", Table.SelectionEnablement.ALWAYS, null, new TableAction() {
public void executeAction(ListGridRecord[] selection) {
new BundleCreateWizard().startBundleWizard();
}
});
- table.addTableAction("Delete Bundle", Table.SelectionEnablement.ANY, "Are You Sure?", new TableAction() {
+ table.addTableAction("Delete", Table.SelectionEnablement.ANY, "Are You Sure?", new TableAction() {
public void executeAction(ListGridRecord[] selections) {
BundlesWithLatestVersionDataSource ds = (BundlesWithLatestVersionDataSource) table.getDataSource();
for (ListGridRecord selection : selections) {
@@ -87,17 +91,58 @@ public class BundlesListView extends VLayout {
}
});
- table.addTableAction("Update Bundle", Table.SelectionEnablement.SINGLE, null, new TableAction() {
+ table.addTableAction("Create New Version", Table.SelectionEnablement.SINGLE, null, new TableAction() {
public void executeAction(ListGridRecord[] selection) {
- Bundle bundle = (Bundle) selection[0].getAttributeAsObject("entity");
- BundleUpdateWizard bundleUpdateWizard = new BundleUpdateWizard(null);
- bundleUpdateWizard.startBundleWizard();
+ BundlesWithLatestVersionDataSource ds = (BundlesWithLatestVersionDataSource) table.getDataSource();
+ final BundleWithLatestVersionComposite object = ds.copyValues(selection[0]);
+ BundleVersionCriteria bvc = new BundleVersionCriteria();
+ bvc.addFilterBundleId(object.getBundleId());
+ bvc.addFilterVersion(object.getLatestVersion());
+ BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
+ bundleManager.findBundleVersionsByCriteria(bvc, new AsyncCallback<PageList<BundleVersion>>() {
+ public void onSuccess(PageList<BundleVersion> result) {
+ if (result == null || result.size() != 1) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Failed to get last bundle version [" + object.getLatestVersion() + "]",
+ Severity.Error));
+ return;
+ }
+
+ BundleUpdateWizard bundleUpdateWizard = new BundleUpdateWizard(result.get(0));
+ bundleUpdateWizard.startBundleWizard();
+ }
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to load last bundle version [" + object.getLatestVersion() + "]", caught);
+ }
+ });
}
});
- table.addTableAction("Deploy Selected Bundle", Table.SelectionEnablement.SINGLE, null, new TableAction() {
+ table.addTableAction("Deploy", Table.SelectionEnablement.SINGLE, null, new TableAction() {
public void executeAction(ListGridRecord[] selection) {
- new BundleDeployWizard((Bundle) selection[0].getAttributeAsObject("object")).startBundleWizard();
+ BundlesWithLatestVersionDataSource ds = (BundlesWithLatestVersionDataSource) table.getDataSource();
+ final BundleWithLatestVersionComposite object = ds.copyValues(selection[0]);
+ BundleCriteria bc = new BundleCriteria();
+ bc.addFilterId(object.getBundleId());
+ BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
+ bundleManager.findBundlesByCriteria(bc, new AsyncCallback<PageList<Bundle>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to load bundle to deploy [" + object.getBundleName() + "]", caught);
+ }
+
+ public void onSuccess(PageList<Bundle> result) {
+ if (result == null || result.size() != 1) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Failed to get bundle to deploy [" + object.getBundleName() + "]",
+ Severity.Error));
+ return;
+ }
+ new BundleDeployWizard(result.get(0)).startBundleWizard();
+ }
+ });
}
});
commit ea7f26cca66aa0849c5613fad2ec73144f72b0a2
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 03:02:22 2010 -0400
was seeing erroneous behavior when deleting bundles - changing impl and added unit test
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java
index 3c74dfe..e3b7520 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java
@@ -70,7 +70,8 @@ import org.rhq.core.domain.content.Distribution;
+ " WHERE bv.bundle.id = :bundleId " //
+ " ORDER BY bv.versionOrder DESC "), //
@NamedQuery(name = BundleVersion.QUERY_FIND_ALL, query = "SELECT bv FROM BundleVersion bv "), //
- @NamedQuery(name = BundleVersion.QUERY_FIND_BY_NAME, query = "SELECT bv FROM BundleVersion bv WHERE bv.name = :name ") //
+ @NamedQuery(name = BundleVersion.QUERY_FIND_BY_NAME, query = "SELECT bv FROM BundleVersion bv WHERE bv.name = :name "), //
+ @NamedQuery(name = BundleVersion.QUERY_FIND_BY_BUNDLE_ID, query = "SELECT bv FROM BundleVersion bv WHERE bv.bundle.id = :bundleId ") //
})
@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_BUNDLE_VERSION_ID_SEQ")
@Table(name = "RHQ_BUNDLE_VERSION")
@@ -83,6 +84,7 @@ public class BundleVersion implements Serializable {
public static final String QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID = "BundleVersion.findVersionsByBundleId";
public static final String QUERY_FIND_ALL = "BundleVersion.findAll";
public static final String QUERY_FIND_BY_NAME = "BundleVersion.findByName";
+ public static final String QUERY_FIND_BY_BUNDLE_ID = "BundleVersion.findByBundleId";
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ")
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 e52e3b6..a6be5ca 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
@@ -673,7 +673,10 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return;
}
- for (BundleVersion bv : bundle.getBundleVersions()) {
+ Query q = entityManager.createNamedQuery(BundleVersion.QUERY_FIND_BY_BUNDLE_ID);
+ q.setParameter("bundleId", bundleId);
+ List<BundleVersion> bvs = q.getResultList();
+ for (BundleVersion bv : bvs) {
bundleManager.deleteBundleVersion(subject, bv.getId(), false);
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 0d99b17..c975d38 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -271,6 +271,35 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
}
@Test(enabled = TESTS_ENABLED)
+ public void testDeleteBundle() throws Exception {
+ Bundle b1 = createBundle("one");
+ assertNotNull(b1);
+ BundleVersion bv1 = createBundleVersion(b1.getName() + "-1", null, b1);
+ assertNotNull(bv1);
+ assertEquals("1.0", bv1.getVersion());
+ BundleVersion bv2 = createBundleVersion(b1.getName() + "-2", null, b1);
+ assertNotNull(bv2);
+ assertEquals("1.1", bv2.getVersion());
+
+ // let's add a bundle file so we can ensure our deletion will also delete the file too
+ bundleManager.addBundleFileViaByteArray(overlord, bv2.getId(), "testDeleteBundle", "1.0", new Architecture(
+ "noarch"), "content".getBytes(), false);
+ BundleFileCriteria bfCriteria = new BundleFileCriteria();
+ bfCriteria.addFilterBundleVersionId(bv2.getId());
+ bfCriteria.fetchPackageVersion(true);
+ PageList<BundleFile> files = bundleManager.findBundleFilesByCriteria(overlord, bfCriteria);
+ assert files.size() == 1 : files;
+ assert files.get(0).getPackageVersion().getGeneralPackage().getName().equals("testDeleteBundle") : files;
+
+ bundleManager.deleteBundle(overlord, b1.getId());
+
+ BundleCriteria bCriteria = new BundleCriteria();
+ bCriteria.addFilterId(b1.getId());
+ PageList<Bundle> bResults = bundleManager.findBundlesByCriteria(overlord, bCriteria);
+ assert bResults.size() == 0;
+ }
+
+ @Test(enabled = TESTS_ENABLED)
public void testDeleteBundleVersion() throws Exception {
Bundle b1 = createBundle("one");
assertNotNull(b1);
@@ -282,14 +311,14 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertEquals("1.1", bv2.getVersion());
// let's add a bundle file so we can ensure our deletion will also delete the file too
- bundleManager.addBundleFileViaByteArray(overlord, bv2.getId(), "testfile", "1.0", new Architecture("noarch"),
- "content".getBytes(), false);
+ bundleManager.addBundleFileViaByteArray(overlord, bv2.getId(), "testDeleteBundleVersion", "1.0",
+ new Architecture("noarch"), "content".getBytes(), false);
BundleFileCriteria bfCriteria = new BundleFileCriteria();
bfCriteria.addFilterBundleVersionId(bv2.getId());
bfCriteria.fetchPackageVersion(true);
PageList<BundleFile> files = bundleManager.findBundleFilesByCriteria(overlord, bfCriteria);
assert files.size() == 1 : files;
- assert files.get(0).getPackageVersion().getGeneralPackage().getName().equals("testfile") : files;
+ assert files.get(0).getPackageVersion().getGeneralPackage().getName().equals("testDeleteBundleVersion") : files;
BundleVersionCriteria bvCriteria = new BundleVersionCriteria();
BundleCriteria bCriteria = new BundleCriteria();
commit 96029cb050daaa619cf97053191df67aefc91955
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 01:19:18 2010 -0400
don't refresh title if the view hasn't been rendered yet
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java
index afd1f47..7bacb3b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java
@@ -58,7 +58,9 @@ public abstract class AbstractBundleWizard implements Wizard {
public void setSubtitle(String subtitle) {
this.subtitle = subtitle;
- this.view.refreshTitleLabelContents();
+ if (this.view != null) {
+ this.view.refreshTitleLabelContents();
+ }
}
public List<WizardStep> getSteps() {
commit f799588e682c83802916a9cd8f117265402837d4
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 00:49:05 2010 -0400
get end-to-end bundle create wizard to work. still need to pretty up the upload file step, but this commit has end-to-end working with the ability to cancel at any point in the wizard
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
index 01e2598..c33e4d5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
@@ -18,6 +18,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.create;
+import java.util.HashMap;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.rhq.core.domain.bundle.BundleType;
@@ -38,6 +40,7 @@ public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
private String bundleDescription;
private String recipe;
private BundleVersion bundleVersion;
+ private HashMap<String, Boolean> allBundleFilesStatus; // bundle file names with their upload status (true=they were uploaded)
public BundleType getBundleType() {
return bundleType;
@@ -87,12 +90,20 @@ public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
this.bundleVersion = bv;
}
+ public HashMap<String, Boolean> getAllBundleFilesStatus() {
+ return allBundleFilesStatus;
+ }
+
+ public void setAllBundleFilesStatus(HashMap<String, Boolean> allBundleFilesStatus) {
+ this.allBundleFilesStatus = allBundleFilesStatus;
+ }
+
public void cancel() {
final BundleVersion bv = getBundleVersion();
if (bv != null) {
// the user must have created it already after verification step, delete it
BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
+ bundleServer.deleteBundleVersion(bv.getId(), true, new AsyncCallback<Void>() {
public void onSuccess(Void result) {
CoreGUI.getMessageCenter().notify(
new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
index e76dc7f..43f7407 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
@@ -32,6 +32,7 @@ public class BundleCreateWizard extends AbstractBundleCreateWizard {
steps.add(new BundleInfoStep(this));
steps.add(new BundleUploadRecipeStep(this));
steps.add(new BundleUploadDataStep(this));
+ steps.add(new BundleSummaryStep(this));
setSteps(steps);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
index 2bfc93d..58c4e66 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
@@ -38,6 +38,8 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* @author John Mazzitelli
@@ -128,6 +130,13 @@ public class BundleInfoStep implements WizardStep {
if (wizard.getBundleType() == null) {
bundleServer.getAllBundleTypes(new AsyncCallback<ArrayList<BundleType>>() {
public void onSuccess(ArrayList<BundleType> result) {
+ if (result == null || result.size() == 0) {
+ wizard.setBundleType(null);
+ CoreGUI.getMessageCenter().notify(
+ new Message("No bundle types are supported", Severity.Error));
+ return;
+ }
+
for (BundleType bundleType : result) {
knownBundleTypes.put(bundleType.getName(), bundleType);
if (wizard.getBundleType() == null) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
new file mode 100644
index 0000000..bddf61b
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -0,0 +1,87 @@
+/*
+ * 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.gui.coregui.client.bundle.create;
+
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.TitleOrientation;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.TextAreaItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+
+import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
+
+/**
+ * @author John Mazzitelli
+ */
+public class BundleSummaryStep implements WizardStep {
+
+ private DynamicForm form;
+ private final AbstractBundleCreateWizard wizard;
+
+ public BundleSummaryStep(AbstractBundleCreateWizard bundleCreationWizard) {
+ this.wizard = bundleCreationWizard;
+ }
+
+ public Canvas getCanvas() {
+ TextItem nameTextItem;
+ TextItem versionTextItem;
+ TextAreaItem descriptionTextAreaItem;
+ TextItem bundleTypeTextItem;
+
+ form = new DynamicForm();
+ form.setPadding(20);
+ form.setWidth100();
+ form.setNumCols(2);
+
+ bundleTypeTextItem = new TextItem("bundleTypeItem", "Bundle Type");
+ bundleTypeTextItem.setValue(wizard.getBundleType().getName());
+ bundleTypeTextItem.setDisabled(true);
+ bundleTypeTextItem.setTitleAlign(Alignment.LEFT);
+
+ nameTextItem = new TextItem("name", "Name");
+ nameTextItem.setValue(wizard.getBundleName());
+ nameTextItem.setDisabled(true);
+ nameTextItem.setTitleAlign(Alignment.LEFT);
+
+ versionTextItem = new TextItem("version", "Version");
+ versionTextItem.setValue(wizard.getBundleVersionString());
+ versionTextItem.setDisabled(true);
+ versionTextItem.setTitleAlign(Alignment.LEFT);
+
+ descriptionTextAreaItem = new TextAreaItem("description", "Description");
+ descriptionTextAreaItem.setValue(wizard.getBundleDescription());
+ descriptionTextAreaItem.setDisabled(true);
+ descriptionTextAreaItem.setTitleOrientation(TitleOrientation.TOP);
+ descriptionTextAreaItem.setColSpan(2);
+ descriptionTextAreaItem.setWidth(300);
+
+ form.setItems(bundleTypeTextItem, nameTextItem, versionTextItem, descriptionTextAreaItem);
+
+ return form;
+ }
+
+ public boolean nextPage() {
+ return true; // this is the last page, we are done
+ }
+
+ public String getName() {
+ return "Summary";
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
index 2a6a7c5..793cd5a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
@@ -46,7 +46,6 @@ public class BundleUploadDataStep implements WizardStep {
private final AbstractBundleCreateWizard wizard;
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
private DynamicForm form;
- private Map<String, Boolean> allFilesStatus;
public BundleUploadDataStep(AbstractBundleCreateWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -63,14 +62,12 @@ public class BundleUploadDataStep implements WizardStep {
new AsyncCallback<HashMap<String, Boolean>>() {
public void onSuccess(HashMap<String, Boolean> result) {
- allFilesStatus = result;
+ wizard.setAllBundleFilesStatus(result);
prepareForm(layout);
- enableNextButtonWhenAppropriate();
}
public void onFailure(Throwable caught) {
- allFilesStatus = null;
- enableNextButtonWhenAppropriate();
+ wizard.setAllBundleFilesStatus(null);
CoreGUI.getErrorHandler().handleError("Cannot obtain bundle file information from server", caught);
}
});
@@ -80,33 +77,33 @@ public class BundleUploadDataStep implements WizardStep {
}
public boolean nextPage() {
- return true; // TODO: Implement this method.
+ return isFinished();
}
public String getName() {
return "Upload Bundle Files";
}
- public boolean isNextEnabled() {
- if (this.allFilesStatus == null) {
+ private boolean isFinished() {
+ if (wizard.getAllBundleFilesStatus() == null) {
return false;
}
- if (this.allFilesStatus.containsValue(Boolean.FALSE)) {
+ if (wizard.getAllBundleFilesStatus().containsValue(Boolean.FALSE)) {
return false;
}
return true;
}
- public boolean isPreviousEnabled() {
- return true;
- }
+ private void prepareForm(VLayout layout) {
+ // if there are no files to upload, immediately skip this step
+ final HashMap<String, Boolean> allFilesStatus = wizard.getAllBundleFilesStatus();
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
+ if (allFilesStatus != null && allFilesStatus.size() == 0) {
+ // TODO: do something to tell the user they don't have to do anything for this step
+ return;
+ }
- private void prepareForm(VLayout layout) {
- for (Map.Entry<String, Boolean> entry : this.allFilesStatus.entrySet()) {
+ for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) {
HLayout formLayout = new HLayout();
layout.addMember(formLayout);
@@ -133,7 +130,6 @@ public class BundleUploadDataStep implements WizardStep {
CoreGUI.getMessageCenter().notify(
new Message("Failed to upload bundle file", results, Message.Severity.Error));
}
- enableNextButtonWhenAppropriate();
}
});
uploadForm.addFormSubmitFailedHandler(new FormSubmitFailedHandler() {
@@ -142,7 +138,6 @@ public class BundleUploadDataStep implements WizardStep {
allFilesStatus.put(uploadForm.getName(), Boolean.FALSE);
CoreGUI.getMessageCenter().notify(
new Message("Failed to upload file", null, Message.Severity.Error));
- enableNextButtonWhenAppropriate();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index c257909..5743653 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -47,9 +47,9 @@ public interface BundleGWTService extends RemoteService {
BundleVersion createBundleVersion(int bundleId, String name, String version, String recipe) throws Exception;
- void deleteBundle(int bundleId);
+ void deleteBundle(int bundleId) throws Exception;
- void deleteBundleVersion(int bundleVersionId);
+ void deleteBundleVersion(int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception;
PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws Exception;
@@ -60,7 +60,7 @@ public interface BundleGWTService extends RemoteService {
HashMap<String, Boolean> getAllBundleVersionFilenames(int bundleVersionId) throws Exception;
- ArrayList<BundleType> getAllBundleTypes();
+ ArrayList<BundleType> getAllBundleTypes() throws Exception;
BundleDeployment scheduleBundleDeployment(int bundleDeployDefinitionId, int resourceId) throws Exception;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index 25eba1c..5473a94 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -89,7 +89,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
return SerialUtility.prepare(results, "createBundleVersion");
}
- public void deleteBundle(int bundleId) {
+ public void deleteBundle(int bundleId) throws Exception {
try {
bundleManager.deleteBundle(getSessionSubject(), bundleId);
} catch (Exception e) {
@@ -97,15 +97,15 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
- public void deleteBundleVersion(int bundleVersionId) {
+ public void deleteBundleVersion(int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception {
try {
- bundleManager.deleteBundleVersion(getSessionSubject(), bundleVersionId);
+ bundleManager.deleteBundleVersion(getSessionSubject(), bundleVersionId, deleteBundleIfEmpty);
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
- public PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) {
+ public PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws Exception {
try {
PageList<Bundle> results = bundleManager.findBundlesByCriteria(getSessionSubject(), criteria);
return SerialUtility.prepare(results, "findBundlesByCriteria");
@@ -114,7 +114,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
- public PageList<BundleVersion> findBundleVersionsByCriteria(BundleVersionCriteria criteria) {
+ public PageList<BundleVersion> findBundleVersionsByCriteria(BundleVersionCriteria criteria) throws Exception {
try {
PageList<BundleVersion> results = bundleManager.findBundleVersionsByCriteria(getSessionSubject(), criteria);
return SerialUtility.prepare(results, "findBundleVersionsByCriteria");
@@ -124,7 +124,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
public PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(
- BundleCriteria criteria) {
+ BundleCriteria criteria) throws Exception {
try {
PageList<BundleWithLatestVersionComposite> results;
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(getSessionSubject(), criteria);
@@ -134,7 +134,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
- public ArrayList<BundleType> getAllBundleTypes() {
+ public ArrayList<BundleType> getAllBundleTypes() throws Exception {
try {
ArrayList<BundleType> bundleTypes = new ArrayList<BundleType>();
bundleTypes.addAll(bundleManager.getAllBundleTypes(getSessionSubject()));
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 440eee6..e52e3b6 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
@@ -674,7 +674,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
for (BundleVersion bv : bundle.getBundleVersions()) {
- bundleManager.deleteBundleVersion(subject, bv.getId());
+ bundleManager.deleteBundleVersion(subject, bv.getId(), false);
}
// we need to whack the Repo once the Bundle no longer refers to it
@@ -687,23 +687,28 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public void deleteBundleVersion(Subject subject, int bundleVersionId) throws Exception {
+ public void deleteBundleVersion(Subject subject, int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception {
BundleVersion bundleVersion = this.entityManager.find(BundleVersion.class, bundleVersionId);
if (null == bundleVersion) {
return;
}
- int bundleId = bundleVersion.getBundle().getId();
+ int bundleId = 0;
+ if (deleteBundleIfEmpty) {
+ bundleId = bundleVersion.getBundle().getId(); // note that we lazy load this if we never plan to delete the bundle
+ }
// remove the bundle version - cascade remove the deploy defs which will cascade remove the deployments.
this.entityManager.remove(bundleVersion);
- this.entityManager.flush();
- Query q = entityManager.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
- q.setParameter("bundleId", bundleId);
- if (q.getResultList().size() == 0) {
- // there are no more bundle versions left, blow away the bundle and all repo/bundle files associated with it
- deleteBundle(subject, bundleId);
+ if (deleteBundleIfEmpty) {
+ this.entityManager.flush();
+ Query q = entityManager.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
+ q.setParameter("bundleId", bundleId);
+ if (q.getResultList().size() == 0) {
+ // there are no more bundle versions left, blow away the bundle and all repo/bundle files associated with it
+ deleteBundle(subject, bundleId);
+ }
}
return;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index b3a84ff..efde215 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -204,12 +204,15 @@ public interface BundleManagerRemote {
*
* @param subject
* @param bundleVersionId
+ * @param deleteBundleIfEmpty if <code>true</code> and if this method deletes the last bundle version for its
+ * bundle, then that bundle entity itself will be completely purged
* @throws Exception if any part of the removal fails.
*/
@WebMethod
void deleteBundleVersion( //
@WebParam(name = "subject") Subject subject, //
- @WebParam(name = "bundleVersionId") int bundleVersionId) throws Exception;
+ @WebParam(name = "bundleVersionId") int bundleVersionId, //
+ @WebParam(name = "deleteBundleIfEmpty") boolean deleteBundleIfEmpty) throws Exception;
@WebMethod
PageList<Bundle> findBundlesByCriteria( //
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 6521e5b..17d3c96 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -375,8 +375,8 @@ public class WebservicesManagerBean implements WebservicesRemote {
bundleManager.deleteBundle(subject, bundleId);
}
- public void deleteBundleVersion(Subject subject, int bundleVersionId) throws Exception {
- bundleManager.deleteBundleVersion(subject, bundleVersionId);
+ public void deleteBundleVersion(Subject subject, int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception {
+ bundleManager.deleteBundleVersion(subject, bundleVersionId, deleteBundleIfEmpty);
}
public PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria(Subject subject,
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 833d844..0d99b17 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -295,7 +295,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
BundleCriteria bCriteria = new BundleCriteria();
// delete the first one - this deletes the BV but the bundle should remain intact
- bundleManager.deleteBundleVersion(overlord, bv2.getId());
+ bundleManager.deleteBundleVersion(overlord, bv2.getId(), true);
bvCriteria.addFilterId(bv2.getId());
PageList<BundleVersion> bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
assert bvResults.size() == 0;
@@ -304,7 +304,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert bResults.size() == 1 : "Should not have deleted bundle yet, 1 version still exists";
// delete the second one - this deletes last BV thus the bundle should also get deleted
- bundleManager.deleteBundleVersion(overlord, bv1.getId());
+ bundleManager.deleteBundleVersion(overlord, bv1.getId(), true);
bvCriteria.addFilterId(bv1.getId());
bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
assert bvResults.size() == 0;
commit 0b503904be650eae0418dd646a617b4fed1c9e9e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 00:48:19 2010 -0400
get the wizard framework to know when the wizard is finished and to close the dialog when it is
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
index b30e6a7..e0f3f92 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
@@ -125,24 +125,23 @@ public class WizardView extends VLayout {
cancelButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
wizard.cancel();
- wizardWindow.destroy();
+ closeDialog();
}
});
previousButton = new IButton("Previous");
previousButton.setDisabled(true);
previousButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
- setStep(currentStep - 1);
+ decrementStep();
}
});
nextButton = new IButton("Next");
- nextButton.setDisabled(true);
nextButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
WizardStep step = wizard.getSteps().get(currentStep);
if (step.nextPage()) {
- setStep(currentStep + 1);
+ incrementStep();
}
}
});
@@ -154,18 +153,31 @@ public class WizardView extends VLayout {
}
- public void setStep(int stepIndex) {
+ private void setStep(int stepIndex) {
currentStep = stepIndex;
- stepLabel.setContents("Step " + (stepIndex + 1) + " of " + wizard.getSteps().size());
- WizardStep step = wizard.getSteps().get(currentStep);
+ List<WizardStep> wizardSteps = wizard.getSteps();
+
+ // determine if we are "finished" - that is, going past our last step
+ if (currentStep >= wizardSteps.size()) {
+ closeDialog();
+ return;
+ }
+
+ stepLabel.setContents("Step " + (stepIndex + 1) + " of " + wizardSteps.size());
+
+ WizardStep step = wizardSteps.get(currentStep);
stepTitleLabel.setContents(step.getName());
previousButton.setDisabled(stepIndex == 0);
- boolean last = (stepIndex == (wizard.getSteps().size() - 1));
- nextButton.setDisabled(last);
+ boolean last = (stepIndex == (wizardSteps.size() - 1));
+ if (last) {
+ nextButton.setTitle("Finish");
+ } else {
+ nextButton.setTitle("Next");
+ }
for (IButton button : customButtons) {
buttonBar.removeMember(button);
@@ -182,7 +194,7 @@ public class WizardView extends VLayout {
if (currentCanvas != null) {
contentLayout.removeMember(currentCanvas);
}
- currentCanvas = wizard.getSteps().get(currentStep).getCanvas();
+ currentCanvas = wizardSteps.get(currentStep).getCanvas();
contentLayout.addMember(currentCanvas);
markForRedraw();
@@ -201,7 +213,7 @@ public class WizardView extends VLayout {
wizardWindow.addCloseClickHandler(new CloseClickHandler() {
public void onCloseClick(CloseClientEvent closeClientEvent) {
wizard.cancel();
- wizardWindow.destroy();
+ closeDialog();
}
});
wizardWindow.addItem(this);
@@ -232,4 +244,8 @@ public class WizardView extends VLayout {
public void incrementStep() {
setStep(currentStep + 1);
}
+
+ public void decrementStep() {
+ setStep(currentStep - 1);
+ }
}
commit b39be42983f7a27932ff270c7ee5021e2ef38338
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 23:48:39 2010 -0400
remove the obsolete/unused isNext/PreviousEnabled methods from the steps classes
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java
index 6ae3921..42de0a4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java
@@ -67,12 +67,4 @@ public class OperationParametersStep implements WizardStep {
public Configuration getParameterConfiguration() {
return configurationEditor != null ? configurationEditor.getConfiguration() : null;
}
-
- public boolean isNextEnabled() {
- return true;
- }
-
- public boolean isPreviousEnabled() {
- return true;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java
index e923b08..c1546a8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java
@@ -42,7 +42,7 @@ import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.TimeItem;
import com.smartgwt.client.widgets.form.validator.CustomValidator;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
/**
@@ -66,12 +66,12 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setWidth100();
form.setPadding(10);
form.setNumCols(3);
-// form.setColWidths("15%", "35%", "15%", "*");
+ // form.setColWidths("15%", "35%", "15%", "*");
form.setValidateOnChange(true);
final RadioGroupItem start = new RadioGroupItem("start", "Start");
start.setColSpan(3);
- start.setValueMap(enumValueMap(ExecutionSchedule.Start.class)); // "Immediately", "Future"
+ start.setValueMap(enumValueMap(ExecutionSchedule.Start.class)); // "Immediately", "Future"
start.setRedrawOnChange(true);
start.setValue("Immediately");
@@ -84,7 +84,7 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
});
RadioGroupItem recurr = new RadioGroupItem("recurr", "Recurrence");
- recurr.setValueMap(enumValueMap(ExecutionSchedule.Recurr.class)); // "Once", "EveryNMinutes", "Hourly", "Daily", "Weekly", "Monthly");
+ recurr.setValueMap(enumValueMap(ExecutionSchedule.Recurr.class)); // "Once", "EveryNMinutes", "Hourly", "Daily", "Weekly", "Monthly");
recurr.setRedrawOnChange(true);
recurr.setValue("Once");
recurr.setShowIfCondition(new FormItemIfFunction() {
@@ -93,26 +93,23 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
}
});
-
-
CanvasItem onceForm = new CanvasItem("once", "Run At");
onceForm.setShowTitle(false);
onceForm.setCanvas(getOnceForm());
onceForm.setShowIfCondition(new FormItemIfFunction() {
public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) {
- return !"Immediately".equals(form.getValueAsString("start")) &&
- ExecutionSchedule.Recurr.Once.name().equals(form.getValueAsString("recurr"));
+ return !"Immediately".equals(form.getValueAsString("start"))
+ && ExecutionSchedule.Recurr.Once.name().equals(form.getValueAsString("recurr"));
}
});
-
CanvasItem everyNMinuteForm = new CanvasItem("everyNMinutesForm", "NMinutes");
everyNMinuteForm.setShowTitle(false);
everyNMinuteForm.setCanvas(getEveryNMinutesForm());
everyNMinuteForm.setShowIfCondition(new FormItemIfFunction() {
public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) {
- return !"Immediately".equals(form.getValueAsString("start")) &&
- ExecutionSchedule.Recurr.EveryNMinutes.name().equals(form.getValueAsString("recurr"));
+ return !"Immediately".equals(form.getValueAsString("start"))
+ && ExecutionSchedule.Recurr.EveryNMinutes.name().equals(form.getValueAsString("recurr"));
}
});
@@ -121,8 +118,8 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
hourlyForm.setCanvas(getHourlyForm());
hourlyForm.setShowIfCondition(new FormItemIfFunction() {
public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) {
- return !"Immediately".equals(form.getValueAsString("start")) &&
- ExecutionSchedule.Recurr.Hourly.name().equals(form.getValueAsString("recurr"));
+ return !"Immediately".equals(form.getValueAsString("start"))
+ && ExecutionSchedule.Recurr.Hourly.name().equals(form.getValueAsString("recurr"));
}
});
@@ -136,7 +133,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
}
});
-
CanvasItem weeklyForm = new CanvasItem("weekly", "Weekly");
weeklyForm.setShowTitle(false);
weeklyForm.setCanvas(getWeeklyForm());
@@ -212,12 +208,8 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
messageItem.setShowTitle(false);
messageItem.setCellStyle("HeaderLabel");
- form.setItems(start, scheduleHeader, recurr,
- onceForm, everyNMinuteForm, hourlyForm, dailyForm, weeklyForm, monthlyForm,
- rangeHeader, startDate, end, endDate,
- new SpacerItem(), messageItem);
-
-
+ form.setItems(start, scheduleHeader, recurr, onceForm, everyNMinuteForm, hourlyForm, dailyForm, weeklyForm,
+ monthlyForm, rangeHeader, startDate, end, endDate, new SpacerItem(), messageItem);
form.addItemChangedHandler(this);
}
@@ -255,7 +247,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Every N Minutes");
form.addItemChangedHandler(this);
-
form.setWrapItemTitles(false);
form.setNumCols(2);
@@ -276,7 +267,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Hourly At");
form.addItemChangedHandler(this);
-
form.setWrapItemTitles(false);
form.setNumCols(2);
@@ -289,7 +279,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
return form;
}
-
private DynamicForm getDailyForm() {
DynamicForm form = new DynamicForm();
form.setValuesManager(valuesManager);
@@ -308,7 +297,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
return form;
}
-
private DynamicForm getWeeklyForm() {
DynamicForm form = new DynamicForm();
form.setValuesManager(valuesManager);
@@ -317,7 +305,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Weekly On");
form.addItemChangedHandler(this);
-
form.setWrapItemTitles(false);
TimeItem timeOfDay = new TimeItem("timeOfDay", "Time Of Day");
@@ -347,7 +334,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Monthly On");
form.addItemChangedHandler(this);
-
IntegerItem dayItem = new IntegerItem();
dayItem.setName("dayOfMonth");
dayItem.setTitle("Day of Month");
@@ -370,21 +356,11 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
return "Schedule";
}
- public boolean isNextEnabled() {
- return true;
- }
-
- public boolean isPreviousEnabled() {
- return true;
- }
-
public void onItemChanged(ItemChangedEvent itemChangeEvent) {
-
executionSchedule.setStart(ExecutionSchedule.Start.valueOf(valuesManager.getValueAsString("start")));
executionSchedule.setRecurr(ExecutionSchedule.Recurr.valueOf(valuesManager.getValueAsString("recurr")));
-
Date onceDate = (Date) valuesManager.getValues().get("onceStartDate");
executionSchedule.setOnceDateTime(onceDate);
@@ -394,7 +370,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
executionSchedule.setTimeOfDay((Date) valuesManager.getValues().get("timeOfDay"));
-
HashSet<ExecutionSchedule.DayOfWeek> selectedDays = new HashSet<ExecutionSchedule.DayOfWeek>(); //.noneOf(ExecutionSchedule.DayOfWeek.class);
for (ExecutionSchedule.DayOfWeek d : EnumSet.allOf(ExecutionSchedule.DayOfWeek.class)) {
if (valuesManager.getValues().containsKey(d.name())) {
@@ -403,29 +378,24 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
}
executionSchedule.setDaysOfWeek(selectedDays);
-
-
executionSchedule.setDayOfMonth(Integer.parseInt(valuesManager.getValueAsString("dayOfMonth")));
-
-
- executionSchedule.setStartDate((Date)valuesManager.getValues().get("startDate"));
+ executionSchedule.setStartDate((Date) valuesManager.getValues().get("startDate"));
if ("Never".equals(valuesManager.getValues().get("endType"))) {
executionSchedule.setEndDate(null);
} else {
- executionSchedule.setEndDate((Date)valuesManager.getValues().get("endDate"));
+ executionSchedule.setEndDate((Date) valuesManager.getValues().get("endDate"));
}
- form.setValue("message",executionSchedule.getMessage());
+ form.setValue("message", executionSchedule.getMessage());
}
-
- private LinkedHashMap<String,String> enumValueMap(Class<? extends Enum> e) {
- LinkedHashMap<String,String> map = new LinkedHashMap<String, String>();
+ private LinkedHashMap<String, String> enumValueMap(Class<? extends Enum> e) {
+ LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
for (Object o : EnumSet.allOf(e)) {
Enum v = (Enum) o;
- map.put(v.name(),v.name()); // localize
+ map.put(v.name(), v.name()); // localize
}
return map;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java
index 33ddebe..0d466d3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java
@@ -18,15 +18,10 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.factory;
-import java.util.Map;
-
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.fields.SelectItem;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
@@ -61,14 +56,6 @@ public class ConfigurationStep implements WizardStep {
return "Edit Configuration";
}
- public boolean isPreviousEnabled() {
- return true;
- }
-
- public boolean isNextEnabled() {
- return false;
- }
-
public Configuration getConfiguration() {
return editor.getConfiguration();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java
index eee603a..a9182ee 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java
@@ -51,7 +51,7 @@ public class ConfigurationTemplateStep implements WizardStep {
TextItem nameItem = new TextItem("resourceName", "Resource Name");
nameItem.setRequired(true);
- SelectItem templateSelect = new SelectItem("template","Template");
+ SelectItem templateSelect = new SelectItem("template", "Template");
ConfigurationDefinition definition = wizard.getConfigurationDefinition();
@@ -77,14 +77,6 @@ public class ConfigurationTemplateStep implements WizardStep {
return "Select a Template";
}
- public boolean isPreviousEnabled() {
- return false;
- }
-
- public boolean isNextEnabled() {
- return true;
- }
-
public Configuration getConfiguration() {
return templates.get(form.getValueAsString("template")).createConfiguration();
}
commit 24b38a17ceca586ad9df9bf5b2e6209e2c64a4af
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 23:28:24 2010 -0400
delete the bundle if, when deleting a BV it turns out there are no more bundle versions for that bundle
this includes a unit test to make sure deleting BVs work
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 bab247a..440eee6 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
@@ -677,7 +677,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
bundleManager.deleteBundleVersion(subject, bv.getId());
}
- // we need to whack the Repo once the Bundle no longe refers to it
+ // we need to whack the Repo once the Bundle no longer refers to it
Repo bundleRepo = bundle.getRepo();
this.entityManager.remove(bundle);
@@ -686,14 +686,26 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
repoManager.deleteRepo(subject, bundleRepo.getId());
}
- public void deleteBundleVersion(Subject subject, int bundleVersionId) {
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public void deleteBundleVersion(Subject subject, int bundleVersionId) throws Exception {
BundleVersion bundleVersion = this.entityManager.find(BundleVersion.class, bundleVersionId);
if (null == bundleVersion) {
return;
}
- // remove the bundle version, this will cascade remove the deploy defs which will cascade remove
- // the deployments.
+ int bundleId = bundleVersion.getBundle().getId();
+
+ // remove the bundle version - cascade remove the deploy defs which will cascade remove the deployments.
this.entityManager.remove(bundleVersion);
+ this.entityManager.flush();
+
+ Query q = entityManager.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
+ q.setParameter("bundleId", bundleId);
+ if (q.getResultList().size() == 0) {
+ // there are no more bundle versions left, blow away the bundle and all repo/bundle files associated with it
+ deleteBundle(subject, bundleId);
+ }
+
+ return;
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index c2284d9..833d844 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -45,11 +45,13 @@ import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.Package;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.InventoryStatus;
@@ -269,6 +271,49 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
}
@Test(enabled = TESTS_ENABLED)
+ public void testDeleteBundleVersion() throws Exception {
+ Bundle b1 = createBundle("one");
+ assertNotNull(b1);
+ BundleVersion bv1 = createBundleVersion(b1.getName() + "-1", null, b1);
+ assertNotNull(bv1);
+ assertEquals("1.0", bv1.getVersion());
+ BundleVersion bv2 = createBundleVersion(b1.getName() + "-2", null, b1);
+ assertNotNull(bv2);
+ assertEquals("1.1", bv2.getVersion());
+
+ // let's add a bundle file so we can ensure our deletion will also delete the file too
+ bundleManager.addBundleFileViaByteArray(overlord, bv2.getId(), "testfile", "1.0", new Architecture("noarch"),
+ "content".getBytes(), false);
+ BundleFileCriteria bfCriteria = new BundleFileCriteria();
+ bfCriteria.addFilterBundleVersionId(bv2.getId());
+ bfCriteria.fetchPackageVersion(true);
+ PageList<BundleFile> files = bundleManager.findBundleFilesByCriteria(overlord, bfCriteria);
+ assert files.size() == 1 : files;
+ assert files.get(0).getPackageVersion().getGeneralPackage().getName().equals("testfile") : files;
+
+ BundleVersionCriteria bvCriteria = new BundleVersionCriteria();
+ BundleCriteria bCriteria = new BundleCriteria();
+
+ // delete the first one - this deletes the BV but the bundle should remain intact
+ bundleManager.deleteBundleVersion(overlord, bv2.getId());
+ bvCriteria.addFilterId(bv2.getId());
+ PageList<BundleVersion> bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
+ assert bvResults.size() == 0;
+ bCriteria.addFilterId(b1.getId());
+ PageList<Bundle> bResults = bundleManager.findBundlesByCriteria(overlord, bCriteria);
+ assert bResults.size() == 1 : "Should not have deleted bundle yet, 1 version still exists";
+
+ // delete the second one - this deletes last BV thus the bundle should also get deleted
+ bundleManager.deleteBundleVersion(overlord, bv1.getId());
+ bvCriteria.addFilterId(bv1.getId());
+ bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
+ assert bvResults.size() == 0;
+ bCriteria.addFilterId(b1.getId());
+ bResults = bundleManager.findBundlesByCriteria(overlord, bCriteria);
+ assert bResults.size() == 0 : "Should have deleted bundle since no versions exists anymore";
+ }
+
+ @Test(enabled = TESTS_ENABLED)
public void testCreateBundleVersionOrdering() throws Exception {
Bundle b1 = createBundle("one");
assertNotNull(b1);
commit 1531142b056f293af50fddc51352cda5a4132869
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 23:27:44 2010 -0400
fix bundle file criteria - name of field should be "general"Package
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
index 8341922..8abe728 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
@@ -41,7 +41,7 @@ public class BundleFileCriteria extends Criteria {
private boolean fetchBundleVersion;
private boolean fetchPackageVersion;
- private boolean fetchPackage;
+ private boolean fetchGeneralPackage;
public BundleFileCriteria() {
super();
@@ -76,8 +76,8 @@ public class BundleFileCriteria extends Criteria {
this.fetchBundleVersion = fetchBundleVersion;
}
- public void fetchPackage(boolean fetchPackage) {
- this.fetchPackage = fetchPackage;
+ public void fetchPackage(boolean fetchGeneralPackage) {
+ this.fetchGeneralPackage = fetchGeneralPackage;
}
public void fetchPackageVersion(boolean fetchPackageVersion) {
commit d3e840578d34c8de89352e6502aa7227cfa58165
Merge: 0212483... 89d3004...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 23 17:03:54 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit 02124836fdb9776037c4c184262493553694200b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 23 17:02:07 2010 -0400
Some stuff for group bundle deploy
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 75675ef..178013b 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -575,7 +575,9 @@
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="BUNDLE_DEPLOY_DEF_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_DEPLOY_DEF" />
<column name="RESOURCE_ID" type="INTEGER" required="true" references="RHQ_RESOURCE" />
- <column name="CTIME" type="LONG" required="true"/>
+ <column name="CTIME" type="LONG" required="true"/>
+ <!-- for group history -->
+ <column name="GROUP_ID" type="INTEGER" required="false" references="RHQ_RESOURCE_GROUP"/>
<index name="RHQ_DEPLOY_DEF_RESOURCE_IDX" unique="true">
<field ref="BUNDLE_DEPLOY_DEF_ID"/>
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 2b8848f..da47976 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -2898,7 +2898,11 @@
<schema-alterColumn table="RHQ_BUNDLE_VERSION" column="VERSION_ORDER" nullable="FALSE" />
</schemaSpec>
- <schemaSpec version="2.79">
+ <schemaSpec version="2.78.5">
+ <schema-addColumn table="RHQ_BUNDLE_DEPLOY" column="RESOURCE_GROUP_ID" columnType="INTEGER" />
+ </schemaSpec>
+
+ <schemaSpec version="2.79">
<schema-directSQL>
<statement desc="Normalizing resource group descriptions">
UPDATE RHQ_RESOURCE_GROUP SET DESCRIPTION = NULL WHERE DESCRIPTION = ''
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/GroupBundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/GroupBundleDeployment.java
new file mode 100644
index 0000000..67ad13f
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/GroupBundleDeployment.java
@@ -0,0 +1,73 @@
+/*
+ * 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.domain.bundle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+import org.rhq.core.domain.resource.group.ResourceGroup;
+
+@DiscriminatorValue("group")
+@Entity
+public class GroupBundleDeployment extends BundleDeployment {
+
+ private static final long serialVersionUID = 1L;
+
+ @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID")
+ @ManyToOne
+ private ResourceGroup group;
+
+ @OneToMany(mappedBy = "groupBundleHistory", cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
+ private List<BundleDeployment> bundleDeployments = new ArrayList<BundleDeployment>();
+
+ protected GroupBundleDeployment() {
+ }
+
+ public ResourceGroup getGroup() {
+ return group;
+ }
+
+ public void setGroup(ResourceGroup group) {
+ this.group = group;
+ }
+
+ public List<BundleDeployment> getBundleDeployments() {
+ return bundleDeployments;
+ }
+
+ public void setBundleDeployments(List<BundleDeployment> bundleDeployments) {
+ this.bundleDeployments = bundleDeployments;
+ }
+
+ public void addBundleDeployments(BundleDeployment bundleDeployment) {
+ this.bundleDeployments.add(bundleDeployment);
+ }
+
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
index 63f229c..7a10422 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
@@ -55,6 +55,7 @@ import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.bundle.GroupBundleDeployment;
import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.resource.Resource;
@@ -403,6 +404,11 @@ public class ResourceGroup extends Group {
// by primary key which will also put the configuration updates in chronological order
private List<AbstractGroupConfigurationUpdate> configurationUpdates = new ArrayList<AbstractGroupConfigurationUpdate>();
+ @OneToMany(mappedBy = "group", cascade = { CascadeType.ALL })
+ @OrderBy
+ // by primary key which will also put the operation histories in chronological order
+ private List<GroupBundleDeployment> bundleDeployments = new ArrayList<GroupBundleDeployment>();
+
@JoinColumn(name = "GROUP_DEFINITION_ID", referencedColumnName = "ID", nullable = true)
@ManyToOne
private GroupDefinition groupDefinition;
@@ -548,6 +554,14 @@ public class ResourceGroup extends Group {
this.configurationUpdates = configurationUpdates;
}
+ public List<GroupBundleDeployment> getBundleDeployments() {
+ return bundleDeployments;
+ }
+
+ public void setBundleDeployments(List<GroupBundleDeployment> bundleDeployments) {
+ this.bundleDeployments = bundleDeployments;
+ }
+
public GroupDefinition getGroupDefinition() {
return groupDefinition;
}
commit 89d3004322b490efcccdd2a107b3dcddd7dad37b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 15:02:49 2010 -0400
get the wizard to cancel when you click the X
get the bundle types to show in selection
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
index 81d13ca..01e2598 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
@@ -18,9 +18,16 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.create;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.bundle.AbstractBundleWizard;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
@@ -79,4 +86,24 @@ public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
public void setBundleVersion(BundleVersion bv) {
this.bundleVersion = bv;
}
+
+ public void cancel() {
+ final BundleVersion bv = getBundleVersion();
+ if (bv != null) {
+ // the user must have created it already after verification step, delete it
+ BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
+ Severity.Info));
+ }
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to fully cancel - bundle may still exist in the database", caught);
+ }
+ });
+ }
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
index e2fe45f..e76dc7f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
@@ -20,18 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.bundle.create;
import java.util.ArrayList;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.widgets.IButton;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-
-import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
public class BundleCreateWizard extends AbstractBundleCreateWizard {
@@ -42,35 +31,7 @@ public class BundleCreateWizard extends AbstractBundleCreateWizard {
ArrayList<WizardStep> steps = new ArrayList<WizardStep>();
steps.add(new BundleInfoStep(this));
steps.add(new BundleUploadRecipeStep(this));
-// steps.add(new BundleVerificationStep(this));
steps.add(new BundleUploadDataStep(this));
setSteps(steps);
}
-
- @Override
- public void startBundleWizard() {
- super.startBundleWizard();
- IButton cancelButton = getView().getCancelButton();
- cancelButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- final BundleVersion bv = getBundleVersion();
- if (bv != null) {
- // the user must have created it already after verification step, delete it
- BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
- Severity.Info));
- }
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- "Failed to fully cancel - bundle may still exist in the database", caught);
- }
- });
- }
- }
- });
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
index e5e2653..2bfc93d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
@@ -19,12 +19,14 @@
package org.rhq.enterprise.gui.coregui.client.bundle.create;
import java.util.ArrayList;
+import java.util.HashMap;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.TitleOrientation;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
@@ -46,9 +48,12 @@ public class BundleInfoStep implements WizardStep {
private final AbstractBundleCreateWizard wizard;
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ private final HashMap<String, BundleType> knownBundleTypes = new HashMap<String, BundleType>();
+
private TextItem nameTextItem;
private TextItem versionTextItem;
private TextAreaItem descriptionTextAreaItem;
+ private SelectItem bundleTypeDropDownMenu;
public BundleInfoStep(AbstractBundleCreateWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -61,6 +66,19 @@ public class BundleInfoStep implements WizardStep {
form.setWidth100();
form.setNumCols(2);
+ bundleTypeDropDownMenu = new SelectItem("bundleTypeDropDownMenu", "Bundle Type");
+ bundleTypeDropDownMenu.setVisible(false);
+ bundleTypeDropDownMenu.setDisabled(true);
+ bundleTypeDropDownMenu.setTitleAlign(Alignment.LEFT);
+ bundleTypeDropDownMenu.setAllowEmptyValue(false);
+ bundleTypeDropDownMenu.setMultiple(false);
+ bundleTypeDropDownMenu.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ BundleType bundleType = knownBundleTypes.get(event.getValue());
+ wizard.setBundleType(bundleType);
+ }
+ });
+
nameTextItem = new TextItem("name", "Name");
nameTextItem.setRequired(true);
nameTextItem.setTitleAlign(Alignment.LEFT);
@@ -83,7 +101,8 @@ public class BundleInfoStep implements WizardStep {
descriptionTextAreaItem.setColSpan(2);
descriptionTextAreaItem.setWidth(300);
- form.setItems(nameTextItem, previousVersionTextItem, versionTextItem, descriptionTextAreaItem);
+ form.setItems(bundleTypeDropDownMenu, nameTextItem, previousVersionTextItem, versionTextItem,
+ descriptionTextAreaItem);
BundleVersion initialBundleVersion = wizard.getBundleVersion();
if (initialBundleVersion != null) {
@@ -107,11 +126,23 @@ public class BundleInfoStep implements WizardStep {
}
if (wizard.getBundleType() == null) {
- // TODO: we should get all bundle types in a drop down menu and let the user pick
- // for now assume we always get one (the filetemplate one) and use it
bundleServer.getAllBundleTypes(new AsyncCallback<ArrayList<BundleType>>() {
public void onSuccess(ArrayList<BundleType> result) {
- wizard.setBundleType(result.get(0));
+ for (BundleType bundleType : result) {
+ knownBundleTypes.put(bundleType.getName(), bundleType);
+ if (wizard.getBundleType() == null) {
+ wizard.setBundleType(bundleType);
+ bundleTypeDropDownMenu.setDefaultValue(bundleType.getName());
+ bundleTypeDropDownMenu.setValue(bundleType.getName());
+ }
+ }
+ bundleTypeDropDownMenu.setValueMap(knownBundleTypes.keySet().toArray(new String[0]));
+ bundleTypeDropDownMenu.setDisabled(false);
+ // don't bother showing the menu if there is only one item
+ if (knownBundleTypes.size() > 1) {
+ bundleTypeDropDownMenu.setVisible(true);
+ bundleTypeDropDownMenu.show(); // in case we've already been rendered
+ }
}
public void onFailure(Throwable caught) {
@@ -123,9 +154,10 @@ public class BundleInfoStep implements WizardStep {
} else {
if (wizard.getBundleVersion() != null) {
// we are traversing back to this step - don't allow changes if we've already created the bundle version
- nameTextItem.setDisabled(Boolean.TRUE);
- versionTextItem.setDisabled(Boolean.TRUE);
- descriptionTextAreaItem.setDisabled(Boolean.TRUE);
+ bundleTypeDropDownMenu.setDisabled(true);
+ nameTextItem.setDisabled(true);
+ versionTextItem.setDisabled(true);
+ descriptionTextAreaItem.setDisabled(true);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java
index dfb8c15..95152bc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java
@@ -20,18 +20,8 @@ package org.rhq.enterprise.gui.coregui.client.bundle.create;
import java.util.ArrayList;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.widgets.IButton;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-
import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
public class BundleUpdateWizard extends AbstractBundleCreateWizard {
@@ -47,31 +37,4 @@ public class BundleUpdateWizard extends AbstractBundleCreateWizard {
steps.add(new BundleUploadDataStep(this));
setSteps(steps);
}
-
- @Override
- public void startBundleWizard() {
- super.startBundleWizard();
- IButton cancelButton = getView().getCancelButton();
- cancelButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- final BundleVersion bv = getBundleVersion();
- if (bv != null) {
- // the user must have created it already after verification step, delete it
- BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
- Severity.Info));
- }
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- "Failed to fully cancel - bundle may still exist in the database", caught);
- }
- });
- }
- }
- });
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
index 1d0749e..284d94c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
@@ -21,10 +21,6 @@ package org.rhq.enterprise.gui.coregui.client.bundle.deploy;
import java.util.ArrayList;
import java.util.List;
-import com.smartgwt.client.widgets.IButton;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -81,18 +77,12 @@ public class BundleDeployWizard extends AbstractBundleDeployWizard {
return steps;
}
- @Override
- public void startBundleWizard() {
- super.startBundleWizard();
- IButton cancelButton = getView().getCancelButton();
- cancelButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- BundleDeployDefinition bdd = getBundleDeployDefinition();
- if (bdd != null && isNewDefinition()) {
- // the user must have created it already after verification step, delete it
- }
- }
- });
+ public void cancel() {
+ BundleDeployDefinition bdd = getBundleDeployDefinition();
+ if (bdd != null && isNewDefinition()) {
+ // the user must have created it already after verification step, delete it
+ // TODO
+ }
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java
index e57b4f9..b82ebd4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java
@@ -37,4 +37,8 @@ public interface Wizard {
List<IButton> getCustomButtons(int step);
+ /**
+ * This is called when the cancel button or the wizard window's "X" close button is clicked.
+ */
+ void cancel();
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
index c92c0f2..b30e6a7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
@@ -18,8 +18,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.components.wizard;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
@@ -116,7 +116,7 @@ public class WizardView extends VLayout {
*/
public void refreshTitleLabelContents() {
this.titleLabel.setContents("<span class=\"HeaderLabel\">" + wizard.getTitle() + "</span><br/>"
- + (wizard.getSubtitle() != null ? wizard.getSubtitle() : ""));
+ + (wizard.getSubtitle() != null ? wizard.getSubtitle() : ""));
}
private void setupButtons() {
@@ -124,6 +124,7 @@ public class WizardView extends VLayout {
cancelButton.setDisabled(false);
cancelButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
+ wizard.cancel();
wizardWindow.destroy();
}
});
@@ -199,6 +200,7 @@ public class WizardView extends VLayout {
wizardWindow.centerInPage();
wizardWindow.addCloseClickHandler(new CloseClickHandler() {
public void onCloseClick(CloseClientEvent closeClientEvent) {
+ wizard.cancel();
wizardWindow.destroy();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java
index fb17747..d273596 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java
@@ -123,29 +123,26 @@ public class OperationCreateWizard implements Wizard {
Configuration parameters = parametersStep.getParameterConfiguration();
final ExecutionSchedule schedule = schedulingStep.getExecutionSchedule();
- GWTServiceLookup.getOperationService().scheduleResourceOperation(
- resource.getId(),
- operationDefinition.getName(),
- parameters,
- schedule,
- " testing ",
- 0,
- new AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to schedule operation execution",caught);
- }
-
- public void onSuccess(Void result) {
-
- String message = "Schedule operation [" + operationDefinition.getName()
- + "] on resource [" + resource.getId() + "] with cron string [" + schedule.getCronString() + "]";
-
- CoreGUI.getMessageCenter().notify(new Message(message, Message.Severity.Info));
- }
+ GWTServiceLookup.getOperationService().scheduleResourceOperation(resource.getId(),
+ operationDefinition.getName(), parameters, schedule, " testing ", 0, new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to schedule operation execution", caught);
}
- );
+ public void onSuccess(Void result) {
+
+ String message = "Schedule operation [" + operationDefinition.getName() + "] on resource ["
+ + resource.getId() + "] with cron string [" + schedule.getCronString() + "]";
+
+ CoreGUI.getMessageCenter().notify(new Message(message, Message.Severity.Info));
+ }
+ });
view.closeDialog();
}
+
+ @Override
+ public void cancel() {
+ // TODO: revert back to original state
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java
index 363bb3e..b84a44e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java
@@ -165,4 +165,8 @@ public class ResourceFactoryCreateWizard implements Wizard {
public ResourceType getCreateType() {
return createType;
}
+
+ public void cancel() {
+ // TODO: revert back to original state
+ }
}
commit ab83afe6697b693ecf22ce16e3c05ed3f6ac694f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 12:17:17 2010 -0400
explicitly support some standard java sysprops
diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
index c997d57..6ec0dd9 100644
--- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
+++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
@@ -129,29 +129,51 @@ public class RecipeParserTest {
}
public void testSimpleRecipeReplaceJavaSystemPropertyReplacementVariables() throws Exception {
- addRecipeCommand("deploy -f jboss1.tar -d <%java.io.tmpdir%>");
- addRecipeCommand("deploy -f jboss2.tar -d <%custom.sysprop%>");
+ /*
+ java.util.Properties sysprops = System.getProperties();
+ for (Map.Entry<Object, Object> sysprop : sysprops.entrySet()) {
+ if (sysprop.getValue().toString().length() < 60) {
+ System.out.println("==>" + sysprop.getKey() + "=" + sysprop.getValue());
+ }
+ }
+ */
+
+ addRecipeCommand("deploy -f jboss1.tar -d <%rhq.system.sysprop.java.io.tmpdir%>");
+ addRecipeCommand("deploy -f jboss2.tar -d <%rhq.system.sysprop.file.separator%>");
+ //addRecipeCommand("deploy -f jboss3.tar -d <%rhq.system.sysprop.line.separator%>"); // can't test this here
+ addRecipeCommand("deploy -f jboss4.tar -d <%rhq.system.sysprop.path.separator%>");
+ addRecipeCommand("deploy -f jboss5.tar -d <%rhq.system.sysprop.java.home%>");
+ addRecipeCommand("deploy -f jboss6.tar -d <%rhq.system.sysprop.java.version%>");
+ //addRecipeCommand("deploy -f jboss7.tar -d <%rhq.system.sysprop.user.timezone%>"); // sometimes this is empty
+ //addRecipeCommand("deploy -f jboss8.tar -d <%rhq.system.sysprop.user.region%>"); // sometimes this doesn't exist
+ addRecipeCommand("deploy -f jboss9.tar -d <%rhq.system.sysprop.user.country%>");
+ addRecipeCommand("deploy -f jboss10.tar -d <%rhq.system.sysprop.user.language%>");
+ addRecipeCommand("deploy -f jboss11.tar -d <%rhq.system.sysprop.custom.sysprop%>"); // non-standard sysprop
RecipeParser parser = new RecipeParser();
parser.setReplaceReplacementVariables(true);
RecipeContext context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
Map<String, String> files = context.getDeployFiles();
- assert files.containsKey("jboss1.tar") : files;
assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
- assert files.containsKey("jboss2.tar") : files;
- assert files.get("jboss2.tar").equals("<%custom.sysprop%>") : files;
+ assert files.get("jboss2.tar").equals(System.getProperty("file.separator")) : files;
+ //assert files.get("jboss3.tar").equals(System.getProperty("line.separator")) : files;
+ assert files.get("jboss4.tar").equals(System.getProperty("path.separator")) : files;
+ assert files.get("jboss5.tar").equals(System.getProperty("java.home")) : files;
+ assert files.get("jboss6.tar").equals(System.getProperty("java.version")) : files;
+ //assert files.get("jboss7.tar").equals(System.getProperty("user.timezone")) : files;
+ //assert files.get("jboss8.tar").equals(System.getProperty("user.region")) : files;
+ assert files.get("jboss9.tar").equals(System.getProperty("user.country")) : files;
+ assert files.get("jboss10.tar").equals(System.getProperty("user.language")) : files;
+ assert files.get("jboss11.tar").equals("<%rhq.system.sysprop.custom.sysprop%>") : files;
- // now set our custom system property and see that it gets replaced properly
+ // now set a custom system property and see that it does NOT get replaced - we ignore custom sysprops!
System.setProperty("custom.sysprop", "MY/CUSTOM/PROPERTY/HERE");
parser = new RecipeParser();
parser.setReplaceReplacementVariables(true);
context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
files = context.getDeployFiles();
- assert files.containsKey("jboss1.tar") : files;
- assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
- assert files.containsKey("jboss2.tar") : files;
- assert files.get("jboss2.tar").equals("MY/CUSTOM/PROPERTY/HERE") : files;
+ assert files.get("jboss11.tar").equals("<%rhq.system.sysprop.custom.sysprop%>") : files;
}
public void testSimpleRecipe() throws Exception {
diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
index 3783495..8d9e05d 100644
--- a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
+++ b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
@@ -365,8 +365,16 @@ public class SystemInfoFactory {
SystemInfo systemInfo = createSystemInfo();
Map<String, String> tokens = new HashMap<String, String>();
- tokens.put(TOKEN_PREFIX + "hostname", systemInfo.getHostname());
+ // support several standard Java system properties
+ String[] syspropsToSupport = new String[] { "java.io.tmpdir", "file.separator", "line.separator",
+ "path.separator", "java.home", "java.version", "user.timezone", "user.region", "user.country",
+ "user.language" };
+ for (String sysprop : syspropsToSupport) {
+ tokens.put(TOKEN_PREFIX + "sysprop." + sysprop, System.getProperty(sysprop, sysprop)); // default is the name itself, just to show it wasn't there
+ }
+
+ tokens.put(TOKEN_PREFIX + "hostname", systemInfo.getHostname());
tokens.put(TOKEN_PREFIX + "os.name", systemInfo.getOperatingSystemName());
tokens.put(TOKEN_PREFIX + "os.version", systemInfo.getOperatingSystemVersion());
tokens.put(TOKEN_PREFIX + "os.type", systemInfo.getOperatingSystemType().toString());
commit 35b93622b191bbc8a8014f35f83aea6e47df60d7
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 12:16:45 2010 -0400
never mind, don't support sysprop fallback
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index 6f2a3e0..d748463 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -48,12 +48,6 @@ public class TemplateEngine implements Serializable {
String value = tokens.get(key);
if (value != null) {
next = value;
- } else {
- // fallback is to see if the replacement key represents a Java system prop
- value = System.getProperty(key);
- if (value != null) {
- next = value;
- }
}
}
//If we didn't find a replacement for the key
commit cdfc55d9f42b1bc43ca5b6afae39f75eabce343d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:35:18 2010 -0400
test the different gnu getop ways to specify the args
diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
index d36831b..c997d57 100644
--- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
+++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
@@ -41,23 +41,27 @@ public class RecipeParserTest {
}
public void testConfigDefRecipe() throws Exception {
+ addRecipeCommand("configdef --name=my.first.property");
addRecipeCommand("configdef -n custom.prop");
RecipeParser parser = new RecipeParser();
RecipeContext context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
Set<String> vars = context.getReplacementVariables();
- assert vars.size() == 1 : vars;
+ assert vars.size() == 2 : vars;
+ assert vars.contains("my.first.property");
assert vars.contains("custom.prop");
}
public void testRealizeRecipe() throws Exception {
addRecipeCommand("realize --file=<%opt.dir%>/config.ini");
+ addRecipeCommand("realize -f <%opt2.dir%>/config2.ini");
RecipeParser parser = new RecipeParser();
RecipeContext context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
Set<String> files = context.getRealizedFiles();
- assert files.size() == 1 : files;
+ assert files.size() == 2 : files;
assert files.contains("<%opt.dir%>/config.ini") : files;
+ assert files.contains("<%opt2.dir%>/config2.ini") : files;
}
public void testFileRecipe() throws Exception {
commit 716420b870b9eb6ce9a6b39cd6973cafbf0267e1
Merge: 0eb9524... 9b6a941...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:20:21 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit 0eb9524ead03b9323a27aa6dc3c18f8fe49526b4
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:19:40 2010 -0400
add new configdef recipe command so we can specify a replacement variable that may exist in bundle files that are to be realized
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java
new file mode 100644
index 0000000..54f297c
--- /dev/null
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java
@@ -0,0 +1,81 @@
+/*
+ * 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, 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.bundle.filetemplate.recipe;
+
+import gnu.getopt.Getopt;
+import gnu.getopt.LongOpt;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ConfigDefRecipeCommand implements RecipeCommand {
+
+ public String getName() {
+ return "configdef";
+ }
+
+ public void parse(RecipeParser parser, RecipeContext context, String[] args) {
+ String sopts = ":n:";
+ LongOpt[] lopts = { new LongOpt("name", LongOpt.REQUIRED_ARGUMENT, null, 'n') };
+
+ String replacementVariableName = null;
+
+ Getopt getopt = new Getopt(getName(), args, sopts, lopts);
+ int code;
+
+ while ((code = getopt.getopt()) != -1) {
+ switch (code) {
+ case ':':
+ case '?': {
+ throw new IllegalArgumentException("Bad recipe command.");
+ }
+
+ case 1: {
+ throw new IllegalArgumentException("Bad recipe command!");
+ }
+
+ case 'n': {
+ replacementVariableName = getopt.getOptarg();
+ break;
+ }
+
+ default: {
+ throw new IllegalArgumentException("Unexpected error in recipe command");
+ }
+
+ }
+ }
+
+ if (replacementVariableName == null) {
+ throw new IllegalArgumentException(
+ "Did not specify the name of the configuration definition replacement variable");
+ }
+
+ Set<String> replacementVariableNames = new HashSet<String>(1);
+ replacementVariableNames.add(replacementVariableName);
+ context.addReplacementVariables(replacementVariableNames);
+
+ return;
+ }
+}
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
index d48c3ba..ea9464d 100644
--- a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
@@ -129,6 +129,7 @@ public class RecipeParser {
HashMap<String, RecipeCommand> commands = new HashMap<String, RecipeCommand>();
RecipeCommand[] knownCommands = new RecipeCommand[] { new ScriptRecipeCommand(), //
+ new ConfigDefRecipeCommand(), //
new CommandRecipeCommand(), //
new FileRecipeCommand(), //
new RealizeRecipeCommand(), //
diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
index bfa58e6..d36831b 100644
--- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
+++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
@@ -40,6 +40,16 @@ public class RecipeParserTest {
cleanRecipe();
}
+ public void testConfigDefRecipe() throws Exception {
+ addRecipeCommand("configdef -n custom.prop");
+ RecipeParser parser = new RecipeParser();
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
+ Set<String> vars = context.getReplacementVariables();
+ assert vars.size() == 1 : vars;
+ assert vars.contains("custom.prop");
+ }
+
public void testRealizeRecipe() throws Exception {
addRecipeCommand("realize --file=<%opt.dir%>/config.ini");
RecipeParser parser = new RecipeParser();
@@ -114,6 +124,32 @@ public class RecipeParserTest {
assert files.get("jboss3.tar").equals(SystemInfoFactory.createSystemInfo().getHostname() + "/jboss") : files;
}
+ public void testSimpleRecipeReplaceJavaSystemPropertyReplacementVariables() throws Exception {
+ addRecipeCommand("deploy -f jboss1.tar -d <%java.io.tmpdir%>");
+ addRecipeCommand("deploy -f jboss2.tar -d <%custom.sysprop%>");
+ RecipeParser parser = new RecipeParser();
+ parser.setReplaceReplacementVariables(true);
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
+ Map<String, String> files = context.getDeployFiles();
+ assert files.containsKey("jboss1.tar") : files;
+ assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
+ assert files.containsKey("jboss2.tar") : files;
+ assert files.get("jboss2.tar").equals("<%custom.sysprop%>") : files;
+
+ // now set our custom system property and see that it gets replaced properly
+ System.setProperty("custom.sysprop", "MY/CUSTOM/PROPERTY/HERE");
+ parser = new RecipeParser();
+ parser.setReplaceReplacementVariables(true);
+ context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
+ files = context.getDeployFiles();
+ assert files.containsKey("jboss1.tar") : files;
+ assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
+ assert files.containsKey("jboss2.tar") : files;
+ assert files.get("jboss2.tar").equals("MY/CUSTOM/PROPERTY/HERE") : files;
+ }
+
public void testSimpleRecipe() throws Exception {
addRecipeCommand("deploy -f jboss.tar -d /opt/jboss");
addRecipeCommand("deploy -f tomcat.tar -d /opt/tomcat");
commit c165b0103c5171b004700db50363d9bc56632931
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:18:44 2010 -0400
all for recipe replacement variables to represent Java system properties
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index 113771d..6f2a3e0 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -5,7 +5,7 @@ import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-public class TemplateEngine implements Serializable{
+public class TemplateEngine implements Serializable {
/**
*
*/
@@ -48,6 +48,12 @@ public class TemplateEngine implements Serializable{
String value = tokens.get(key);
if (value != null) {
next = value;
+ } else {
+ // fallback is to see if the replacement key represents a Java system prop
+ value = System.getProperty(key);
+ if (value != null) {
+ next = value;
+ }
}
}
//If we didn't find a replacement for the key
commit 9b6a9419e52a21fce453ac6f638541298f9e3a94
Merge: 5ca5f89... 986f0d2...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:25:08 2010 -0400
Merge branch 'gwt' into gwt-jay
commit 5ca5f894d2473a61d93c8bee15ab40bd41468683
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:22:22 2010 -0400
First version of deploy wizard that actually deploys something!
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
index e3bc504..55d1a7f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
@@ -27,15 +27,14 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
public class DeployNowStep implements WizardStep {
- private DynamicForm form;
- private final BundleDeployWizard wizard;
+ static private final String DEPLOY_LATER = "later";
+ static private final String DEPLOY_NOW = "now";
- private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ private final BundleDeployWizard wizard;
+ private DynamicForm form;
public DeployNowStep(BundleDeployWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -52,16 +51,17 @@ public class DeployNowStep implements WizardStep {
form.setNumCols(2);
form.setColWidths("50%", "*");
- LinkedHashMap<String, Boolean> values = new LinkedHashMap<String, Boolean>();
- values.put("Deploy Now", Boolean.TRUE);
- values.put("Save Definition and Deploy Later", Boolean.FALSE);
- final RadioGroupItem radioGroupItem = new RadioGroupItem("options", "Deploy Options");
+ RadioGroupItem radioGroupItem = new RadioGroupItem("deployTime", "Deployment Time");
+ LinkedHashMap<String, String> radioGroupValues = new LinkedHashMap<String, String>();
+ radioGroupValues.put(DEPLOY_NOW, "Deploy Now");
+ radioGroupValues.put(DEPLOY_LATER, "Save Definition and Deploy Later");
radioGroupItem.setRequired(true);
- radioGroupItem.setValueMap(values);
+ radioGroupItem.setValueMap(radioGroupValues);
+ radioGroupItem.setValue(DEPLOY_NOW);
+ wizard.setDeployNow(true);
radioGroupItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
- wizard.setDeployNow((Boolean) event.getValue());
- enableNextButtonWhenAppropriate();
+ wizard.setDeployNow(DEPLOY_NOW.equals(event.getValue()));
}
});
@@ -74,19 +74,7 @@ public class DeployNowStep implements WizardStep {
return form.validate();
}
- public boolean isNextEnabled() {
- return (null != this.wizard.getDeployNow());
- }
-
public boolean isPreviousEnabled() {
return true;
}
-
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
-
- private boolean isNotEmpty(String s) {
- return (s != null && s.trim().length() > 0);
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
index bbf30bf..f06e278 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
@@ -46,6 +46,10 @@ public class DeployStep implements WizardStep {
this.wizard = bundleCreationWizard;
}
+ public String getName() {
+ return "Deploy Bundle to Target Platforms";
+ }
+
public Canvas getCanvas() {
if (canvas == null) {
canvas = new VLayout();
@@ -66,7 +70,7 @@ public class DeployStep implements WizardStep {
if (wizard.isNewDefinition()) {
bundleServer.createBundleDeployDefinition(wizard.getBundleVersion().getId(), wizard.getName(), wizard
- .getDescription(), wizard.getConfig(), false, -1, false,
+ .getDescription(), wizard.getConfig(), false, -1, false, //
new AsyncCallback<BundleDeployDefinition>() {
public void onSuccess(BundleDeployDefinition result) {
deployingImage.setSrc("/images/status_complete.gif");
@@ -75,62 +79,52 @@ public class DeployStep implements WizardStep {
new Message("Created deploy definition [" + result.getName() + "] description ["
+ result.getDescription(), Severity.Info));
wizard.setBundleDeployDefinition(result);
- enableNextButtonWhenAppropriate();
+
+ bundleServer.scheduleBundleDeployment(wizard.getBundleDeployDefinition().getId(), wizard
+ .getPlatformId(), //
+ new AsyncCallback<BundleDeployment>() {
+ public void onSuccess(BundleDeployment result) {
+ deployingImage.setSrc("/images/status_complete.gif");
+ deployingMessage.setText("Bundle Deployment Scheduled!");
+ CoreGUI.getMessageCenter().notify(
+ new Message("Schedule bundle deployment ["
+ + wizard.getBundleDeployDefinition().getName() + "] resource ["
+ + result.getResource() + "]", Severity.Info));
+ wizard.setBundleDeployment(result);
+ }
+
+ public void onFailure(Throwable caught) {
+ deployingImage.setSrc("/images/status_error.gif");
+ deployingMessage.setText("Failed to Schedule Deployment!");
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to schedule deployment: " + caught.getMessage(), caught);
+ wizard.setBundleDeployment(null);
+ }
+ });
}
public void onFailure(Throwable caught) {
deployingImage.setSrc("/images/status_error.gif");
- deployingMessage.setText("Failed to create deply definition!");
+ deployingMessage.setText("Failed to create deploy definition!");
CoreGUI.getErrorHandler().handleError(
"Failed to create deploy definition: " + caught.getMessage(), caught);
- enableNextButtonWhenAppropriate();
}
});
}
-
- bundleServer.scheduleBundleDeployment(wizard.getBundleDeployDefinition().getId(), wizard.getPlatformId(),
- new AsyncCallback<BundleDeployment>() {
- public void onSuccess(BundleDeployment result) {
- deployingImage.setSrc("/images/status_complete.gif");
- deployingMessage.setText("Bundle Deployment Scheduled!");
- CoreGUI.getMessageCenter().notify(
- new Message("Schedule bundle deployment [" + wizard.getBundleDeployDefinition().getName()
- + "] resource [" + result.getResource() + "]", Severity.Info));
- wizard.setBundleDeployment(result);
- enableNextButtonWhenAppropriate();
- }
-
- public void onFailure(Throwable caught) {
- deployingImage.setSrc("/images/status_error.gif");
- deployingMessage.setText("Failed to Schedule Deployment!");
- CoreGUI.getErrorHandler().handleError("Failed to schedule deployment: " + caught.getMessage(),
- caught);
- wizard.setBundleDeployment(null);
- enableNextButtonWhenAppropriate();
- }
- });
}
return canvas;
}
- public boolean nextPage() {
- return this.wizard.getBundleVersion() != null;
- }
-
- public String getName() {
- return "Deploy Bundle to Target Platforms";
- }
-
public boolean isNextEnabled() {
- return this.wizard.getBundleDeployment() != null;
+ return false;
}
public boolean isPreviousEnabled() {
return true;
}
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
+ public boolean nextPage() {
+ return false;
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
index d523fbe..94a4707 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
@@ -25,20 +25,20 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
public class SelectPlatformsStep implements WizardStep {
- private DynamicForm form;
private final BundleDeployWizard wizard;
-
- private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ private DynamicForm form;
public SelectPlatformsStep(BundleDeployWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
}
+ public String getName() {
+ return "Select Target Platforms";
+ }
+
public Canvas getCanvas() {
if (form == null) {
form = new DynamicForm();
@@ -55,9 +55,7 @@ public class SelectPlatformsStep implements WizardStep {
if (value == null) {
value = "";
}
- wizard.setSubtitle(value.toString());
wizard.setPlatformId(Integer.valueOf(value.toString()));
- enableNextButtonWhenAppropriate();
}
});
@@ -71,19 +69,7 @@ public class SelectPlatformsStep implements WizardStep {
return form.validate();
}
- public String getName() {
- return "Select Target Platforms";
- }
-
- public boolean isNextEnabled() {
- return (null != this.wizard.getPlatformId());
- }
-
public boolean isPreviousEnabled() {
return true;
}
-
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
}
commit 2717080092cbcd4c08f5c0ac7940e284401bc11c
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:21:46 2010 -0400
Make sure display name is set for recipe config items, otherwise the
ConfigurationEditor will display nulls.
diff --git a/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java b/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
index 342b5b1..a4d7bc9 100644
--- a/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
+++ b/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
@@ -85,8 +85,9 @@ public class BundleServerPluginComponent implements ServerPluginComponent, Bundl
if (recipeContext.getReplacementVariables() != null) {
configDef = new ConfigurationDefinition("replacementVariables", null);
for (String replacementVar : recipeContext.getReplacementVariables()) {
- PropertyDefinitionSimple prop = new PropertyDefinitionSimple(replacementVar, null, false,
- PropertySimpleType.STRING);
+ PropertyDefinitionSimple prop = new PropertyDefinitionSimple(replacementVar,
+ "Needed by bundle recipe.", false, PropertySimpleType.STRING);
+ prop.setDisplayName(replacementVar);
configDef.put(prop);
}
}
commit 2c7d193fcb8a1e92e6171af2a151ff1208ab0df0
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:20:27 2010 -0400
make sure the replacement string is escaped such that regex characters are
taken as literals (to handle, for example, windows paths)
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
index d48c3ba..ae6c0a5 100644
--- a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
@@ -188,7 +188,7 @@ public class RecipeParser {
}
// If we didn't find a replacement for the key then leave the original value unchanged
- matcher.appendReplacement(buffer, next);
+ matcher.appendReplacement(buffer, Matcher.quoteReplacement(next));
}
matcher.appendTail(buffer);
return buffer.toString();
commit 986f0d22343472822ed6d86f812ba3504e14df10
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 22 17:06:00 2010 -0400
get gwt to use the new criteria and show things like the latest version
also get the delete button to work - you can delete a bundle
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
index 40ca18d..cc16d2d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
@@ -31,16 +31,20 @@ public class BundleWithLatestVersionComposite implements Serializable {
private String bundleName;
private String bundleDescription;
private String latestVersion;
- private Long deploymentCount;
+ private Long versionsCount;
+
+ public BundleWithLatestVersionComposite() {
+ // GWT needs this
+ }
public BundleWithLatestVersionComposite(Integer bundleId, String bundleName, String bundleDescription,
- String latestVersion, Long deploymentCount) {
+ String latestVersion, Long versionsCount) {
this.bundleId = bundleId;
this.bundleName = bundleName;
this.bundleDescription = bundleDescription;
this.latestVersion = latestVersion;
- this.deploymentCount = deploymentCount;
+ this.versionsCount = versionsCount;
}
public Integer getBundleId() {
@@ -75,12 +79,12 @@ public class BundleWithLatestVersionComposite implements Serializable {
this.latestVersion = latestVersion;
}
- public Long getDeploymentCount() {
- return deploymentCount;
+ public Long getVersionsCount() {
+ return versionsCount;
}
- public void setDeploymentCount(Long deploymentCount) {
- this.deploymentCount = deploymentCount;
+ public void setVersionsCount(Long versionsCount) {
+ this.versionsCount = versionsCount;
}
public String toString() {
@@ -89,7 +93,7 @@ public class BundleWithLatestVersionComposite implements Serializable {
builder.append(", bundleName=").append(bundleName);
builder.append(", bundleDescription=").append(bundleDescription);
builder.append(", latestVersion=").append(latestVersion);
- builder.append(", deploymentCount=").append(deploymentCount);
+ builder.append(", versionsCount=").append(versionsCount);
builder.append("]");
return builder.toString();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleVerificationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleVerificationStep.java
deleted file mode 100644
index 4bdc68b..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleVerificationStep.java
+++ /dev/null
@@ -1,93 +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.gui.coregui.client.bundle.create;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.Label;
-import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Img;
-import com.smartgwt.client.widgets.layout.VLayout;
-
-import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
-
-public class BundleVerificationStep implements WizardStep {
-
- private final BundleCreateWizard wizard;
-
- private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- private VLayout canvas;
-
- public BundleVerificationStep(BundleCreateWizard bundleCreationWizard) {
- this.wizard = bundleCreationWizard;
- }
-
- public Canvas getCanvas() {
- if (canvas != null && wizard.getBundleVersion() != null) {
- // if we've already got a persisted bundle version, don't verify it again or try to create it again
- return canvas;
- }
-
- canvas = new VLayout();
- canvas.setWidth100();
- canvas.setHeight100();
- canvas.setAlign(Alignment.CENTER);
-
- final Img verifyingImage = new Img("/images/status-bar.gif");
- verifyingImage.setLayoutAlign(Alignment.CENTER);
- verifyingImage.setWidth(50);
- verifyingImage.setHeight(15);
-
- final Label verifiedMessage = new Label("Verifying...");
- verifiedMessage.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
-
- canvas.addMember(verifyingImage);
- canvas.addMember(verifiedMessage);
-
-
- return canvas;
- }
-
- public boolean nextPage() {
- return this.wizard.getBundleVersion() != null;
- }
-
- public String getName() {
- return "Verify Recipe";
- }
-
- public boolean isNextEnabled() {
- return this.wizard.getBundleVersion() != null;
- }
-
- public boolean isPreviousEnabled() {
- return true;
- }
-
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index 155dcdd..d702b9b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -18,17 +18,24 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.list;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.bundle.create.BundleCreateWizard;
-import org.rhq.enterprise.gui.coregui.client.bundle.deploy.BundleDeployWizard;
import org.rhq.enterprise.gui.coregui.client.bundle.create.BundleUpdateWizard;
+import org.rhq.enterprise.gui.coregui.client.bundle.deploy.BundleDeployWizard;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* @author Greg Hinkle
@@ -39,13 +46,15 @@ public class BundlesListView extends VLayout {
protected void onDraw() {
super.onDraw();
- Table table = new Table("Bundles");
+ final Table table = new Table("Bundles");
- table.setDataSource(new BundlesDataSource());
+ table.setDataSource(new BundlesWithLatestVersionDataSource());
table.getListGrid().getField("id").setWidth("60");
table.getListGrid().getField("name").setWidth("25%");
- table.getListGrid().getField("description").setWidth("*");
+ table.getListGrid().getField("description").setWidth("25%");
+ table.getListGrid().getField("latestVersion").setWidth("25%");
+ table.getListGrid().getField("versionsCount").setWidth("*");
table.getListGrid().setSelectionType(SelectionStyle.SIMPLE);
table.getListGrid().setSelectionAppearance(SelectionAppearance.CHECKBOX);
@@ -57,6 +66,27 @@ public class BundlesListView extends VLayout {
}
});
+ table.addTableAction("Delete Bundle", Table.SelectionEnablement.ANY, "Are You Sure?", new TableAction() {
+ public void executeAction(ListGridRecord[] selections) {
+ BundlesWithLatestVersionDataSource ds = (BundlesWithLatestVersionDataSource) table.getDataSource();
+ for (ListGridRecord selection : selections) {
+ BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
+ final BundleWithLatestVersionComposite object = ds.copyValues(selection);
+ bundleManager.deleteBundle(object.getBundleId(), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to delete bundle [" + object.getBundleName() + "]", caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Deleted bundle [" + object.getBundleName() + "]", Severity.Info));
+ }
+ });
+ }
+ }
+ });
+
table.addTableAction("Update Bundle", Table.SelectionEnablement.SINGLE, null, new TableAction() {
public void executeAction(ListGridRecord[] selection) {
Bundle bundle = (Bundle) selection[0].getAttributeAsObject("entity");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java
new file mode 100644
index 0000000..9f8b106
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java
@@ -0,0 +1,112 @@
+/*
+ * 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.gui.coregui.client.bundle.list;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
+import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author John Mazzitelli
+ */
+public class BundlesWithLatestVersionDataSource extends RPCDataSource<BundleWithLatestVersionComposite> {
+
+ private BundleGWTServiceAsync bundleService = GWTServiceLookup.getBundleService();
+
+ public BundlesWithLatestVersionDataSource() {
+
+ DataSourceIntegerField idField = new DataSourceIntegerField("id", "ID");
+ idField.setPrimaryKey(true);
+ addField(idField);
+
+ DataSourceTextField nameField = new DataSourceTextField("name", "Name");
+ addField(nameField);
+
+ DataSourceTextField descriptionField = new DataSourceTextField("description", "Description");
+ addField(descriptionField);
+
+ DataSourceTextField latestVersionField = new DataSourceTextField("latestVersion", "Latest Version");
+ addField(latestVersionField);
+
+ DataSourceIntegerField deploymentCountField = new DataSourceIntegerField("versionsCount", "Versions Count");
+ addField(deploymentCountField);
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+
+ BundleCriteria criteria = new BundleCriteria();
+ criteria.setPageControl(getPageControl(request));
+
+ bundleService.findBundlesWithLastestVersionCompositesByCriteria(criteria,
+ new AsyncCallback<PageList<BundleWithLatestVersionComposite>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load bundle-with-latest-version data", caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(PageList<BundleWithLatestVersionComposite> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+
+ }
+
+ @Override
+ public BundleWithLatestVersionComposite copyValues(ListGridRecord from) {
+ Integer idAttrib = from.getAttributeAsInt("id");
+ String nameAttrib = from.getAttribute("name");
+ String descriptionAttrib = from.getAttribute("description");
+ String latestVersionAttrib = from.getAttribute("latestVersion");
+ Integer versionsCountAttrib = from.getAttributeAsInt("versionsCount");
+
+ return new BundleWithLatestVersionComposite(idAttrib, nameAttrib, descriptionAttrib, latestVersionAttrib,
+ versionsCountAttrib.longValue());
+ }
+
+ @Override
+ public ListGridRecord copyValues(BundleWithLatestVersionComposite from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute("id", from.getBundleId());
+ record.setAttribute("name", from.getBundleName());
+ record.setAttribute("description", from.getBundleDescription());
+ record.setAttribute("latestVersion", from.getLatestVersion());
+ record.setAttribute("versionsCount", Integer.valueOf(from.getVersionsCount().intValue())); // want int, not long
+
+ record.setAttribute("object", from);
+
+ return record;
+
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index 82d6166..c257909 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -28,6 +28,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
@@ -46,12 +47,17 @@ public interface BundleGWTService extends RemoteService {
BundleVersion createBundleVersion(int bundleId, String name, String version, String recipe) throws Exception;
+ void deleteBundle(int bundleId);
+
void deleteBundleVersion(int bundleVersionId);
PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws Exception;
PageList<BundleVersion> findBundleVersionsByCriteria(BundleVersionCriteria criteria) throws Exception;
+ PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(BundleCriteria criteria)
+ throws Exception;
+
HashMap<String, Boolean> getAllBundleVersionFilenames(int bundleVersionId) throws Exception;
ArrayList<BundleType> getAllBundleTypes();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index 4cc3293..25eba1c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -26,6 +26,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
@@ -88,6 +89,14 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
return SerialUtility.prepare(results, "createBundleVersion");
}
+ public void deleteBundle(int bundleId) {
+ try {
+ bundleManager.deleteBundle(getSessionSubject(), bundleId);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public void deleteBundleVersion(int bundleVersionId) {
try {
bundleManager.deleteBundleVersion(getSessionSubject(), bundleVersionId);
@@ -114,6 +123,17 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ public PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(
+ BundleCriteria criteria) {
+ try {
+ PageList<BundleWithLatestVersionComposite> results;
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(getSessionSubject(), criteria);
+ return SerialUtility.prepare(results, "findBundlesWithLastestVersionCompositesByCriteria");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public ArrayList<BundleType> getAllBundleTypes() {
try {
ArrayList<BundleType> bundleTypes = new ArrayList<BundleType>();
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index e0190e6..c2284d9 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -282,7 +282,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion() == null;
- assert results.get(0).getDeploymentCount().longValue() == 0L;
+ assert results.get(0).getVersionsCount().longValue() == 0L;
BundleVersion bv1 = createBundleVersion(b1.getName() + "-1", "1.0", b1);
assertNotNull(bv1);
@@ -293,7 +293,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("1.0");
- assert results.get(0).getDeploymentCount().longValue() == 1L;
+ assert results.get(0).getVersionsCount().longValue() == 1L;
BundleVersion bv2 = createBundleVersion(b1.getName() + "-2", "2.0", b1);
assertNotNull(bv2);
@@ -304,7 +304,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 2L;
+ assert results.get(0).getVersionsCount().longValue() == 2L;
BundleVersion bv3 = createBundleVersion(b1.getName() + "-3", "1.5", b1);
assertNotNull(bv3);
@@ -315,7 +315,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 3L;
+ assert results.get(0).getVersionsCount().longValue() == 3L;
BundleVersionCriteria c = new BundleVersionCriteria();
PageList<BundleVersion> bvs = null;
@@ -376,12 +376,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getVersionsCount().longValue() == 4L;
assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion() == null;
- assert results.get(1).getDeploymentCount().longValue() == 0L;
+ assert results.get(1).getVersionsCount().longValue() == 0L;
BundleVersion b2_bv1 = createBundleVersion(b2.getName() + "-5", "9.1", b2);
assertNotNull(b2_bv1);
@@ -393,12 +393,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getVersionsCount().longValue() == 4L;
assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion().equals("9.1");
- assert results.get(1).getDeploymentCount().longValue() == 1L;
+ assert results.get(1).getVersionsCount().longValue() == 1L;
// test sorting of the BundleWithLastestVersionComposite
criteria.addSortName(PageOrdering.DESC);
@@ -408,12 +408,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(1).getBundleName().equals(b1.getName());
assert results.get(1).getBundleDescription().equals(b1.getDescription());
assert results.get(1).getLatestVersion().equals("2.0");
- assert results.get(1).getDeploymentCount().longValue() == 4L;
+ assert results.get(1).getVersionsCount().longValue() == 4L;
assert results.get(0).getBundleId().equals(b2.getId());
assert results.get(0).getBundleName().equals(b2.getName());
assert results.get(0).getBundleDescription().equals(b2.getDescription());
assert results.get(0).getLatestVersion().equals("9.1");
- assert results.get(0).getDeploymentCount().longValue() == 1L;
+ assert results.get(0).getVersionsCount().longValue() == 1L;
criteria.addSortName(PageOrdering.ASC);
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
@@ -422,12 +422,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getVersionsCount().longValue() == 4L;
assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion().equals("9.1");
- assert results.get(1).getDeploymentCount().longValue() == 1L;
+ assert results.get(1).getVersionsCount().longValue() == 1L;
}
@Test(enabled = TESTS_ENABLED)
commit 4d79a6360bbe0ee959fb8cb3841e64db5dd1eb19
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 22 15:53:19 2010 -0400
add bundle id to the bundle-last-ver composite query
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
index 9f6304d..40ca18d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
@@ -27,20 +27,30 @@ import java.io.Serializable;
public class BundleWithLatestVersionComposite implements Serializable {
private static final long serialVersionUID = 1L;
+ private Integer bundleId;
private String bundleName;
private String bundleDescription;
private String latestVersion;
private Long deploymentCount;
- public BundleWithLatestVersionComposite(String bundleName, String bundleDescription, String latestVersion,
- Long deploymentCount) {
+ public BundleWithLatestVersionComposite(Integer bundleId, String bundleName, String bundleDescription,
+ String latestVersion, Long deploymentCount) {
+ this.bundleId = bundleId;
this.bundleName = bundleName;
this.bundleDescription = bundleDescription;
this.latestVersion = latestVersion;
this.deploymentCount = deploymentCount;
}
+ public Integer getBundleId() {
+ return bundleId;
+ }
+
+ public void setBundleId(Integer bundleId) {
+ this.bundleId = bundleId;
+ }
+
public String getBundleName() {
return bundleName;
}
@@ -75,7 +85,8 @@ public class BundleWithLatestVersionComposite implements Serializable {
public String toString() {
StringBuilder builder = new StringBuilder();
- builder.append("BundleWithLatestVersionComposite [bundleName=").append(bundleName);
+ builder.append("BundleWithLatestVersionComposite [bundleId=").append(bundleId);
+ builder.append(", bundleName=").append(bundleName);
builder.append(", bundleDescription=").append(bundleDescription);
builder.append(", latestVersion=").append(latestVersion);
builder.append(", deploymentCount=").append(deploymentCount);
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 1ef2d13..bab247a 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
@@ -652,6 +652,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
String replacementSelectList = ""
+ " new org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite( "
+ + " bundle.id,"
+ " bundle.name,"
+ " bundle.description,"
+ " ( SELECT bv1.version FROM bundle.bundleVersions bv1 WHERE bv1.versionOrder = (SELECT MAX(bv2.versionOrder) FROM BundleVersion bv2 WHERE bv2.bundle.id = bundle.id) ) AS latestVersion,"
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 09a3a14..e0190e6 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -278,6 +278,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
// verify there are no bundle versions yet
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleId().equals(b1.getId());
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion() == null;
@@ -288,6 +289,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertEquals("1.0", bv1.getVersion());
assert 0 == bv1.getVersionOrder();
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleId().equals(b1.getId());
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("1.0");
@@ -298,6 +300,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertEquals("2.0", bv2.getVersion());
assert 1 == bv2.getVersionOrder();
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleId().equals(b1.getId());
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
@@ -308,6 +311,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertEquals("1.5", bv3.getVersion());
assert 1 == bv3.getVersionOrder();
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleId().equals(b1.getId());
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
@@ -368,10 +372,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertNotNull(b2);
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
assert results.size() == 2 : results;
+ assert results.get(0).getBundleId().equals(b1.getId());
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion() == null;
@@ -383,10 +389,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
assert results.size() == 2 : results;
+ assert results.get(0).getBundleId().equals(b1.getId());
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion().equals("9.1");
@@ -396,10 +404,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
criteria.addSortName(PageOrdering.DESC);
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
assert results.size() == 2 : results;
+ assert results.get(1).getBundleId().equals(b1.getId());
assert results.get(1).getBundleName().equals(b1.getName());
assert results.get(1).getBundleDescription().equals(b1.getDescription());
assert results.get(1).getLatestVersion().equals("2.0");
assert results.get(1).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getBundleId().equals(b2.getId());
assert results.get(0).getBundleName().equals(b2.getName());
assert results.get(0).getBundleDescription().equals(b2.getDescription());
assert results.get(0).getLatestVersion().equals("9.1");
@@ -408,10 +418,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
criteria.addSortName(PageOrdering.ASC);
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
assert results.size() == 2 : results;
+ assert results.get(0).getBundleId().equals(b1.getId());
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion().equals("9.1");
commit 3e0ec702441d9d4895d5f903eff28072bd52a684
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 22 15:32:55 2010 -0400
allow bundle criteria to sort by name or description
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
index f4336da..a6b2292 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
@@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.util.PageOrdering;
/**
* @author Jay Shaughnessy
@@ -42,6 +43,9 @@ public class BundleCriteria extends Criteria {
private boolean fetchBundleVersions;
private boolean fetchRepo;
+ private PageOrdering sortName;
+ private PageOrdering sortDescription;
+
public BundleCriteria() {
filterOverrides.put("bundleTypeId", "bundleType.id = ?");
filterOverrides.put("bundleTypeName", "bundleType.name like ?");
@@ -80,4 +84,13 @@ public class BundleCriteria extends Criteria {
this.fetchRepo = fetchRepo;
}
+ public void addSortName(PageOrdering sortName) {
+ addSortField("name");
+ this.sortName = sortName;
+ }
+
+ public void addSortDescription(PageOrdering sortDescription) {
+ addSortField("description");
+ this.sortDescription = sortDescription;
+ }
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 8d67758..09a3a14 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -57,6 +57,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
+import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.metadata.test.UpdateSubsytemTestBase;
@@ -390,6 +391,31 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion().equals("9.1");
assert results.get(1).getDeploymentCount().longValue() == 1L;
+
+ // test sorting of the BundleWithLastestVersionComposite
+ criteria.addSortName(PageOrdering.DESC);
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.size() == 2 : results;
+ assert results.get(1).getBundleName().equals(b1.getName());
+ assert results.get(1).getBundleDescription().equals(b1.getDescription());
+ assert results.get(1).getLatestVersion().equals("2.0");
+ assert results.get(1).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getBundleName().equals(b2.getName());
+ assert results.get(0).getBundleDescription().equals(b2.getDescription());
+ assert results.get(0).getLatestVersion().equals("9.1");
+ assert results.get(0).getDeploymentCount().longValue() == 1L;
+
+ criteria.addSortName(PageOrdering.ASC);
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.size() == 2 : results;
+ assert results.get(0).getBundleName().equals(b1.getName());
+ assert results.get(0).getBundleDescription().equals(b1.getDescription());
+ assert results.get(0).getLatestVersion().equals("2.0");
+ assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(1).getBundleName().equals(b2.getName());
+ assert results.get(1).getBundleDescription().equals(b2.getDescription());
+ assert results.get(1).getLatestVersion().equals("9.1");
+ assert results.get(1).getDeploymentCount().longValue() == 1L;
}
@Test(enabled = TESTS_ENABLED)
commit 682d8e19c2ad0af2abd6e858f9a651f272153a3b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 22 15:10:12 2010 -0400
start of the bundle-with-latest-version composite query and SLSB finder
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
new file mode 100644
index 0000000..9f6304d
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
@@ -0,0 +1,86 @@
+/*
+ * 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, 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.bundle.composite;
+
+import java.io.Serializable;
+
+public class BundleWithLatestVersionComposite implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String bundleName;
+ private String bundleDescription;
+ private String latestVersion;
+ private Long deploymentCount;
+
+ public BundleWithLatestVersionComposite(String bundleName, String bundleDescription, String latestVersion,
+ Long deploymentCount) {
+
+ this.bundleName = bundleName;
+ this.bundleDescription = bundleDescription;
+ this.latestVersion = latestVersion;
+ this.deploymentCount = deploymentCount;
+ }
+
+ public String getBundleName() {
+ return bundleName;
+ }
+
+ public void setBundleName(String bundleName) {
+ this.bundleName = bundleName;
+ }
+
+ public String getBundleDescription() {
+ return bundleDescription;
+ }
+
+ public void setBundleDescription(String bundleDescription) {
+ this.bundleDescription = bundleDescription;
+ }
+
+ public String getLatestVersion() {
+ return latestVersion;
+ }
+
+ public void setLatestVersion(String latestVersion) {
+ this.latestVersion = latestVersion;
+ }
+
+ public Long getDeploymentCount() {
+ return deploymentCount;
+ }
+
+ public void setDeploymentCount(Long deploymentCount) {
+ this.deploymentCount = deploymentCount;
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("BundleWithLatestVersionComposite [bundleName=").append(bundleName);
+ builder.append(", bundleDescription=").append(bundleDescription);
+ builder.append(", latestVersion=").append(latestVersion);
+ builder.append(", deploymentCount=").append(deploymentCount);
+ builder.append("]");
+ return builder.toString();
+ }
+
+}
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 da167f0..1ef2d13 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
@@ -52,6 +52,7 @@ import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.content.Architecture;
@@ -645,6 +646,24 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return queryRunner.execute();
}
+ public PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(
+ Subject subject, BundleCriteria criteria) {
+
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
+ String replacementSelectList = ""
+ + " new org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite( "
+ + " bundle.name,"
+ + " bundle.description,"
+ + " ( SELECT bv1.version FROM bundle.bundleVersions bv1 WHERE bv1.versionOrder = (SELECT MAX(bv2.versionOrder) FROM BundleVersion bv2 WHERE bv2.bundle.id = bundle.id) ) AS latestVersion,"
+ + " ( SELECT COUNT(bv3) FROM bundle.bundleVersions bv3 WHERE bv3.bundle.id = bundle.id) AS deploymentCount ) ";
+ generator.alterProjection(replacementSelectList);
+
+ CriteriaQueryRunner<BundleWithLatestVersionComposite> queryRunner = new CriteriaQueryRunner<BundleWithLatestVersionComposite>(
+ criteria, generator, entityManager);
+ PageList<BundleWithLatestVersionComposite> results = queryRunner.execute();
+ return results;
+ }
+
// TODO This is not adequate!!!
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void deleteBundle(Subject subject, int bundleId) throws Exception {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 61a9032..b3a84ff 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -35,6 +35,7 @@ import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.criteria.BundleCriteria;
@@ -236,6 +237,11 @@ public interface BundleManagerRemote {
@WebParam(name = "criteria") BundleVersionCriteria criteria);
@WebMethod
+ PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "criteria") BundleCriteria criteria);
+
+ @WebMethod
List<BundleType> getAllBundleTypes( //
@WebParam(name = "subject") Subject subject);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 3eff81a..6521e5b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -44,6 +44,7 @@ import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
@@ -399,6 +400,11 @@ public class WebservicesManagerBean implements WebservicesRemote {
return bundleManager.findBundleVersionsByCriteria(subject, criteria);
}
+ public PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(
+ Subject subject, BundleCriteria criteria) {
+ return bundleManager.findBundlesWithLastestVersionCompositesByCriteria(subject, criteria);
+ }
+
public List<BundleType> getAllBundleTypes(Subject subject) {
return bundleManager.getAllBundleTypes(subject);
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 24f4a50..8d67758 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -42,6 +42,7 @@ import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.content.Package;
@@ -270,18 +271,46 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
public void testCreateBundleVersionOrdering() throws Exception {
Bundle b1 = createBundle("one");
assertNotNull(b1);
+
+ BundleCriteria criteria = new BundleCriteria();
+ PageList<BundleWithLatestVersionComposite> results;
+
+ // verify there are no bundle versions yet
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleName().equals(b1.getName());
+ assert results.get(0).getBundleDescription().equals(b1.getDescription());
+ assert results.get(0).getLatestVersion() == null;
+ assert results.get(0).getDeploymentCount().longValue() == 0L;
+
BundleVersion bv1 = createBundleVersion(b1.getName() + "-1", "1.0", b1);
assertNotNull(bv1);
assertEquals("1.0", bv1.getVersion());
assert 0 == bv1.getVersionOrder();
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleName().equals(b1.getName());
+ assert results.get(0).getBundleDescription().equals(b1.getDescription());
+ assert results.get(0).getLatestVersion().equals("1.0");
+ assert results.get(0).getDeploymentCount().longValue() == 1L;
+
BundleVersion bv2 = createBundleVersion(b1.getName() + "-2", "2.0", b1);
assertNotNull(bv2);
assertEquals("2.0", bv2.getVersion());
assert 1 == bv2.getVersionOrder();
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleName().equals(b1.getName());
+ assert results.get(0).getBundleDescription().equals(b1.getDescription());
+ assert results.get(0).getLatestVersion().equals("2.0");
+ assert results.get(0).getDeploymentCount().longValue() == 2L;
+
BundleVersion bv3 = createBundleVersion(b1.getName() + "-3", "1.5", b1);
assertNotNull(bv3);
assertEquals("1.5", bv3.getVersion());
assert 1 == bv3.getVersionOrder();
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.get(0).getBundleName().equals(b1.getName());
+ assert results.get(0).getBundleDescription().equals(b1.getDescription());
+ assert results.get(0).getLatestVersion().equals("2.0");
+ assert results.get(0).getDeploymentCount().longValue() == 3L;
BundleVersionCriteria c = new BundleVersionCriteria();
PageList<BundleVersion> bvs = null;
@@ -332,6 +361,35 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertNotNull(bvs);
assertEquals(1, bvs.size());
assert bvs.get(0).getVersionOrder() == 3; // 4th is the 2.0 version
+
+ // verify our composite criteria query can return more than one item
+ Bundle b2 = createBundle("two");
+ assertNotNull(b2);
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
+ assert results.size() == 2 : results;
+ assert results.get(0).getBundleName().equals(b1.getName());
+ assert results.get(0).getBundleDescription().equals(b1.getDescription());
+ assert results.get(0).getLatestVersion().equals("2.0");
+ assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(1).getBundleName().equals(b2.getName());
+ assert results.get(1).getBundleDescription().equals(b2.getDescription());
+ assert results.get(1).getLatestVersion() == null;
+ assert results.get(1).getDeploymentCount().longValue() == 0L;
+
+ BundleVersion b2_bv1 = createBundleVersion(b2.getName() + "-5", "9.1", b2);
+