etc/m2/settings.xml
| 4
modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/TimeUtil.java
| 1
modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/units/DurationFormatter.java
| 2
modules/core/dbutils/src/main/java/org/rhq/core/db/H2DatabaseType.java
| 2
modules/core/domain/src/main/java/org/rhq/core/domain/server/EntitySerializer.java
| 296 +++++
modules/core/domain/src/main/java/org/rhq/core/domain/server/ExternalizableStrategy.java
| 64 +
modules/core/domain/src/main/java/org/rhq/core/domain/server/H2CustomDialect.java
| 45
modules/core/domain/src/main/java/org/rhq/core/domain/server/PersistenceUtility.java
| 563 ++++++++++
modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
| 2
modules/core/domain/src/main/java/org/rhq/core/server/EntitySerializer.java
| 296 -----
modules/core/domain/src/main/java/org/rhq/core/server/ExternalizableStrategy.java
| 64 -
modules/core/domain/src/main/java/org/rhq/core/server/H2CustomDialect.java
| 45
modules/core/domain/src/main/java/org/rhq/core/server/PersistenceUtility.java
| 563 ----------
modules/core/domain/src/test/java/org/rhq/core/domain/test/QueryAllTest.java
| 2
modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationServicesAdapter.java
| 2
modules/core/util/src/main/java/org/rhq/core/clientapi/util/StringUtil.java
| 552 ---------
modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java
| 552 +++++++++
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/ExternalizableStrategyCommandPreprocessor.java
| 2
modules/enterprise/binding/src/main/java/org/rhq/bindings/client/ResourceClientFactory.java
| 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/core/RHQDomain.gwt.xml
| 1
modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/error/GenericErrorUIBean.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/Portal.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserPreferences.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/events/EventDetailsAction.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/PortalAction.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/PortalAction.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsDisplayAction.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsFilterForm.java
| 3
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/beans/OptionItem.java
| 3
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/taglib/RemovePrefixTag.java
| 3
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/StartupServlet.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/util/StatisticsUtility.java
| 2
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
| 2
modules/enterprise/gui/portal-war/src/main/webapp/admin/test/hibernate.jsp
| 2
modules/enterprise/gui/portal-war/src/main/webapp/admin/test/sql.jsp
| 2
modules/enterprise/gui/portal-war/src/main/webapp/common/Error.jsp
| 2
modules/enterprise/gui/portal-war/src/main/webapp/common/GenericError.jsp
| 2
modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/clientapi/RemoteClientProxy.java
| 2
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
| 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
| 2
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
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/prefs/SubjectPreferencesBase.java
| 2
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/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
| 2
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/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
| 2
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/discovery/DiscoveryBossBean.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/MeasurementPreferences.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/operation/OperationManagerBean.java
| 2
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/ResourceFactoryManagerBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
| 2
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/CoreTestBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
| 2
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/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java
| 108 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/SystemSettingsImporterTest.java
| 2
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
| 2
89 files changed, 1674 insertions(+), 1636 deletions(-)
New commits:
commit 6777c10c3d2d8e0c39e03b1c9ecfbdf69eb2b8ea
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 30 14:57:58 2012 -0400
put the test methods in another, unique, group - trying to get testng to work the way
we want
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java
index 34c247e..b4fdf46 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java
@@ -52,7 +52,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class ResourceMetadataManagerBeanTest extends MetadataBeanTest {
- @Test(groups = { "plugin.metadata", "NewPlugin" })
+ @Test(groups = { "plugin.resource.metadata.test",
"plugin.metadata", "NewPlugin" })
public void testRemovalOfObsoleteBundleAndDriftConfig() throws Exception {
// create the initial type that has bundle and drift definitions
createPlugin("test-plugin.jar", "1.0",
"remove_bundle_drift_config_v1.xml");
@@ -107,7 +107,7 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
}
}
- @Test(groups = { "plugin.metadata", "NewPlugin" })
+ @Test(groups = { "plugin.resource.metadata.test",
"plugin.metadata", "NewPlugin" })
public void registerPluginWithDuplicateDriftDefinitions() {
try {
createPlugin("test-plugin.jar", "1.0",
"dup_drift.xml");
@@ -117,19 +117,20 @@ public class ResourceMetadataManagerBeanTest extends
MetadataBeanTest {
}
}
- @Test(dependsOnMethods = { "registerPluginWithDuplicateDriftDefinitions" },
groups = { "plugin.metadata",
- "NewPlugin" })
+ @Test(dependsOnMethods = { "registerPluginWithDuplicateDriftDefinitions" },
groups = {
+ "plugin.resource.metadata.test", "plugin.metadata",
"NewPlugin" })
public void registerPlugin() throws Exception {
createPlugin("test-plugin.jar", "1.0",
"plugin_v1.xml");
}
- @Test(dependsOnMethods = { "registerPlugin" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "registerPlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistNewTypes() {
List<String> newTypes = asList("ServerA", "ServerB");
assertTypesPersisted("Failed to persist new types", newTypes,
"TestPlugin");
}
- // @Test(dependsOnMethods = {"persistNewTypes"}, groups =
{"plugin.metadata", "NewPlugin"})
+ // @Test(dependsOnMethods = {"persistNewTypes"}, groups =
{"plugin.resource.metadata.test", "plugin.metadata",
"NewPlugin"})
// public void persistSubcategories() throws Exception {
// assertResourceTypeAssociationEquals(
// "ServerA",
@@ -139,29 +140,34 @@ public class ResourceMetadataManagerBeanTest extends
MetadataBeanTest {
// );
// }
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistMeasurementDefinitions() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"metricDefinitions",
asList("metric1", "metric2",
"rhq.availability"));
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistEventDefinitions() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"eventDefinitions",
asList("logAEntry", "logBEntry"));
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistOperationDefinitions() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"operationDefinitions", asList("start", "stop"));
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistProcessScans() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"processScans", asList("serverA"));
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistDriftDefinitionTemplates() throws Exception {
ResourceType type = assertResourceTypeAssociationEquals("ServerA",
"TestPlugin", "driftDefinitionTemplates",
asList("drift-pc", "drift-fs"));
@@ -200,7 +206,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
}
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistBundleTargetConfigurations() throws Exception {
String resourceTypeName = "ServerA";
String plugin = "TestPlugin";
@@ -235,55 +242,64 @@ public class ResourceMetadataManagerBeanTest extends
MetadataBeanTest {
}
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistChildTypes() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"childResourceTypes", asList("Child1", "Child2"));
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistPluginConfigurationDefinition() throws Exception {
assertAssociationExists("ServerA",
"pluginConfigurationDefinition");
}
- @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.metadata", "NewPlugin" })
+ @Test(dependsOnMethods = { "persistNewTypes" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "NewPlugin" })
public void persistPackageTypes() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"packageTypes",
asList("ServerA.Content.1", "ServerA.Content.2"));
}
- @Test(groups = { "plugin.metadata", "UpgradePlugin" },
dependsOnGroups = { "NewPlugin" })
+ @Test(groups = { "plugin.resource.metadata.test",
"plugin.metadata", "UpgradePlugin" }, dependsOnGroups = {
"NewPlugin" })
public void upgradePlugin() throws Exception {
createPlugin("test-plugin.jar", "2.0",
"plugin_v2.xml");
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradeOperationDefinitions() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"operationDefinitions",
asList("start", "shutdown", "restart"));
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradeChildResources() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"childResourceTypes", asList("Child1", "Child3"));
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradeParentTypeOfChild() throws Exception {
assertResourceTypeAssociationEquals("ServerB", "TestPlugin",
"childResourceTypes", asList("Child2"));
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradeEventDefinitions() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"eventDefinitions",
asList("logAEntry", "logCEntry"));
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradeProcessScans() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"processScans", asList("processA", "processB"));
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradeDriftDefinitionTemplates() throws Exception {
ResourceType type = assertResourceTypeAssociationEquals("ServerA",
"TestPlugin", "driftDefinitionTemplates",
asList("drift-rc", "drift-mt"));
@@ -313,7 +329,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
}
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradeBundleTargetConfigurations() throws Exception {
String resourceTypeName = "ServerA";
String plugin = "TestPlugin";
@@ -348,7 +365,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
}
}
- @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.metadata", "UpgradePlugin" })
+ @Test(dependsOnMethods = { "upgradePlugin" }, groups = {
"plugin.resource.metadata.test", "plugin.metadata",
+ "UpgradePlugin" })
public void upgradePackageTypes() throws Exception {
assertResourceTypeAssociationEquals("ServerA", "TestPlugin",
"packageTypes",
asList("ServerA.Content.1", "ServerA.Content.3"));
@@ -367,7 +385,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
createPlugin("remove-types-plugin", "2.0",
"remove_types_v2.xml");
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteOperationDefsForRemovedType() throws Exception {
OperationManagerLocal operationMgr = LookupUtil.getOperationManager();
SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
@@ -382,7 +401,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("The operation definition should have been deleted", 0,
operationDefs.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteEventDefsForRemovedType() throws Exception {
List<?> results = getEntityManager()
.createQuery("from EventDefinition e where e.name = :ename and
e.resourceType.name = :rname")
@@ -391,7 +411,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("The event definition(s) should have been deleted", 0,
results.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteParent() throws Exception {
SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
ResourceTypeManagerLocal resourceTypeMgr = LookupUtil.getResourceTypeManager();
@@ -424,7 +445,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
return null;
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteTypeAndAllItsDescedantTypes() throws Exception {
List<?> typesNotRemoved = getEntityManager()
.createQuery("from ResourceType t where t.plugin = :plugin and t.name in
(:resourceTypes)")
@@ -435,7 +457,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("Failed to delete resource type or one or more of its
descendant types", 0, typesNotRemoved.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteProcessScans() {
List<?> processScans = getEntityManager()
.createQuery("from ProcessScan p where p.name = :name1 or p.name =
:name2").setParameter("name1", "scan1")
@@ -444,7 +467,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("The process scans should have been deleted", 0,
processScans.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteSubcategories() {
List<?> subcategories = getEntityManager()
.createQuery("from ResourceSubCategory r where r.name = :name1 or r.name
= :name2 or r.name = :name3")
@@ -453,7 +477,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("The subcategories should have been deleted", 0,
subcategories.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteResources() {
ResourceManagerLocal resourceMgr = LookupUtil.getResourceManager();
SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager();
@@ -478,7 +503,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
}
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteBundles() {
List<?> bundles = getEntityManager().createQuery("from Bundle b where
b.bundleType.name = :name")
.setParameter("name", "Test Bundle").getResultList();
@@ -486,7 +512,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("Failed to delete the bundles", 0, bundles.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteBundleTypes() {
List<?> bundleTypes = getEntityManager().createQuery("from BundleType
b where b.name = :name")
.setParameter("name", "Test Bundle").getResultList();
@@ -494,7 +521,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("The bundle type should have been deleted", 0,
bundleTypes.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deletePackages() {
List<?> packages = getEntityManager().createQuery("from Package p
where p.name = :name")
.setParameter("name",
"ServerC::test-package").getResultList();
@@ -502,7 +530,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("All packages should have been deleted", 0,
packages.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deletePackageTypes() {
List<?> packageTypes = getEntityManager().createQuery("from
PackageType p where p.name = :name")
.setParameter("name",
"ServerC.Content").getResultList();
@@ -510,7 +539,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("All package types should have been deleted", 0,
packageTypes.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteResourceGroups() {
List<?> groups = getEntityManager()
.createQuery("from ResourceGroup g where g.name = :name and
g.resourceType.name = :typeName")
@@ -519,7 +549,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("All resource groups should have been deleted", 0,
groups.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteAlertTemplates() {
List<?> templates = getEntityManager()
.createQuery("from AlertDefinition a where a.name = :name and
a.resourceType.name = :typeName")
@@ -528,7 +559,8 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest
{
assertEquals("Alert templates should have been deleted.", 0,
templates.size());
}
- @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.metadata", "RemoveTypes" })
+ @Test(dependsOnMethods = { "upgradePluginWithTypesRemoved" }, groups = {
"plugin.resource.metadata.test",
+ "plugin.metadata", "RemoveTypes" })
public void deleteMeasurementDefinitions() {
List<?> measurementDefs = getEntityManager().createQuery("from
MeasurementDefinition m where m.name = :name")
.setParameter("name",
"ServerC::metric1").getResultList();
commit bb92f0d2bf0ab28e71c775b8b3abef3adc5ff864
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 30 14:57:09 2012 -0400
[BZ 759615] remove the last duplicate package across multiple jars
diff --git
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/TimeUtil.java
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/TimeUtil.java
index cf31a5f..183f8d5 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/TimeUtil.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/TimeUtil.java
@@ -31,6 +31,7 @@ import org.rhq.core.clientapi.util.units.ScaleConstants;
import org.rhq.core.clientapi.util.units.UnitNumber;
import org.rhq.core.clientapi.util.units.UnitsConstants;
import org.rhq.core.clientapi.util.units.UnitsFormat;
+import org.rhq.core.util.StringUtil;
public class TimeUtil {
public static final String DATE_FORMAT = "MM-dd-yy-HH-mm-ss";
diff --git
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/units/DurationFormatter.java
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/units/DurationFormatter.java
index 9e9e4de..98c90aa 100644
---
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/units/DurationFormatter.java
+++
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/util/units/DurationFormatter.java
@@ -27,7 +27,7 @@ import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
import org.rhq.core.clientapi.util.ArrayUtil;
-import org.rhq.core.clientapi.util.StringUtil;
+import org.rhq.core.util.StringUtil;
/**
* Format a value into a duration.
diff --git
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationServicesAdapter.java
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationServicesAdapter.java
index d8ce6d5..5828a04 100644
---
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationServicesAdapter.java
+++
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationServicesAdapter.java
@@ -26,7 +26,6 @@ import java.util.HashMap;
import java.util.Map;
import org.rhq.core.clientapi.server.operation.OperationServerService;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.operation.OperationDefinition;
@@ -34,6 +33,7 @@ import org.rhq.core.pluginapi.operation.OperationContext;
import org.rhq.core.pluginapi.operation.OperationServices;
import org.rhq.core.pluginapi.operation.OperationServicesResult;
import org.rhq.core.pluginapi.operation.OperationServicesResultCode;
+import org.rhq.core.util.StringUtil;
import org.rhq.core.util.exception.ExceptionPackage;
/**
diff --git a/modules/core/util/src/main/java/org/rhq/core/clientapi/util/StringUtil.java
b/modules/core/util/src/main/java/org/rhq/core/clientapi/util/StringUtil.java
deleted file mode 100644
index ecfed35..0000000
--- a/modules/core/util/src/main/java/org/rhq/core/clientapi/util/StringUtil.java
+++ /dev/null
@@ -1,552 +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.clientapi.util;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-public class StringUtil {
-
- private static final Log log = LogFactory.getLog(StringUtil.class);
-
- /**
- * @param source The source string to perform replacements on.
- * @param find The substring to find in source.
- * @param replace The string to replace 'find' within source
- *
- * @return The source string, with all occurrences of 'find' replaced with
'replace'
- */
- public static String replace(String source, String find, String replace) {
- if ((source == null) || (find == null) || (replace == null)) {
- return source;
- }
-
- int sourceLen = source.length();
- int findLen = find.length();
- if ((sourceLen == 0) || (findLen == 0)) {
- return source;
- }
-
- StringBuilder buffer = new StringBuilder();
-
- int idx;
- int fromIndex;
-
- for (fromIndex = 0; (idx = source.indexOf(find, fromIndex)) != -1; fromIndex =
idx + findLen) {
- buffer.append(source.substring(fromIndex, idx));
- buffer.append(replace);
- }
-
- if (fromIndex == 0) {
- return source;
- }
-
- buffer.append(source.substring(fromIndex));
-
- return buffer.toString();
- }
-
- /**
- * @param source The source string to perform replacements on.
- * @param find The substring to find in source.
- *
- * @return The source string, with all occurrences of 'find' removed
- */
- public static String remove(String source, String find) {
- if ((source == null) || (find == null)) {
- return source;
- }
-
- String retVal = null;
- int sourceLen = source.length();
- int findLen = find.length();
- StringBuilder remove = new StringBuilder(source);
-
- try {
- if ((sourceLen > 0) && (findLen > 0)) {
- int fromIndex;
- int idx;
-
- for (fromIndex = 0, idx = 0; (fromIndex = source.indexOf(find, idx)) !=
-1; idx = fromIndex + findLen) {
- remove.delete(fromIndex, findLen + fromIndex);
- }
-
- retVal = remove.toString();
- }
- } catch (Exception e) {
- log.error("This should not have happened.", e);
- retVal = null;
- }
-
- return retVal;
- }
-
- /**
- * Print out everything in an Iterator in a user-friendly string format.
- *
- * @param i An iterator to print out.
- * @param delim The delimiter to use between elements.
- *
- * @return The Iterator's elements in a user-friendly string format.
- */
- public static String iteratorToString(Iterator i, String delim) {
- return iteratorToString(i, delim, "");
- }
-
- /**
- * Print out everything in an Iterator in a user-friendly string format.
- *
- * @param i An iterator to print out.
- * @param delim The delimiter to use between elements.
- * @param quoteChar The character to quote each element with.
- *
- * @return The Iterator's elements in a user-friendly string format.
- */
- public static String iteratorToString(Iterator i, String delim, String quoteChar) {
- Object elt = null;
- StringBuilder rstr = new StringBuilder();
- String s;
-
- while (i.hasNext()) {
- if (rstr.length() > 0) {
- rstr.append(delim);
- }
-
- elt = i.next();
- if (elt == null) {
- rstr.append("NULL");
- } else {
- s = elt.toString();
- if (quoteChar != null) {
- rstr.append(quoteChar).append(s).append(quoteChar);
- } else {
- rstr.append(s);
- }
- }
- }
-
- return rstr.toString();
- }
-
- /**
- * Print out a List in a user-friendly string format.
- *
- * @param list A List to print out.
- * @param delim The delimiter to use between elements.
- *
- * @return The List in a user-friendly string format.
- */
- public static String listToString(List list, String delim) {
- if (list == null) {
- return "NULL";
- }
-
- Iterator i = list.iterator();
- return iteratorToString(i, delim, null);
- }
-
- public static String collectionToString(Collection collection, String delim) {
- if (collection == null) {
- return "NULL";
- }
-
- Iterator i = collection.iterator();
- return iteratorToString(i, delim, null);
- }
-
- /**
- * Print out a List in a user-friendly string format.
- *
- * @param list A List to print out.
- *
- * @return The List in a user-friendly string format.
- */
- public static String listToString(List list) {
- return listToString(list, ",");
- }
-
- public static String collectionToString(Collection collection) {
- return collectionToString(collection, ",");
- }
-
- /**
- * Print out an array as a String
- */
- public static String arrayToString(Object[] array) {
- return arrayToString(array, ',');
- }
-
- /**
- * Print out an array as a String
- */
- public static String arrayToString(boolean[] array) {
- if (array == null) {
- return "null";
- }
-
- String rstr = "";
- char delim = ',';
- for (int i = 0; i < array.length; i++) {
- if (i > 0) {
- rstr += delim;
- }
-
- rstr += array[i];
- }
-
- return rstr;
- }
-
- /**
- * Print out an array as a String
- *
- * @param array The array to print out
- * @param delim The delimiter to use between elements.
- */
- public static String arrayToString(Object[] array, char delim) {
- if (array == null) {
- return "null";
- }
-
- StringBuilder rstr = new StringBuilder();
- for (int i = 0; i < array.length; i++) {
- if (i > 0) {
- rstr.append(delim);
- }
-
- rstr.append(array[i]);
- }
-
- return rstr.toString();
- }
-
- /**
- * Print out an array as a String
- */
- public static String arrayToString(int[] array) {
- if (array == null) {
- return "null";
- }
-
- StringBuilder rstr = new StringBuilder();
- for (int i = 0; i < array.length; i++) {
- if (i > 0) {
- rstr.append(",");
- }
-
- rstr.append(array[i]);
- }
-
- return rstr.toString();
- }
-
- /**
- * Create a string formulated by inserting a delimiter in between consecutive array
elements.
- *
- * @param objs List of objects to implode (elements may not be null)
- * @param delim String to place inbetween elements
- *
- * @return A string with objects in the list seperated by delim
- */
- public static String implode(List objs, String delim) {
- StringBuilder buf = new StringBuilder();
- int size = objs.size();
-
- for (int i = 0; i < (size - 1); i++) {
- buf.append(objs.get(i).toString());
- buf.append( delim);
- }
-
- if (size != 0) {
- buf.append(objs.get(size - 1).toString());
- }
-
- return buf.toString();
- }
-
- /**
- * Split a string on delimiter boundaries, and place each element into a List.
- *
- * @param s String to split up
- * @param delim Delimiting token, ala StringTokenizer
- *
- * @return a List comprised of elements split by the tokenizing
- */
-
- public static List<String> explode(String s, String delim) {
- List<String> res = new ArrayList<String>();
- if (s == null)
- return res;
-
- StringTokenizer tok = new StringTokenizer(s, delim);
-
- while (tok.hasMoreTokens()) {
- res.add(tok.nextToken());
- }
-
- return res;
- }
-
- /**
- * Split a string on delimiter boundaries, and place each element into an Array.
- *
- * @param toExplode String to split up
- * @param delim Delimiting token, ala StringTokenizer
- *
- * @return an Array comprised of elements split by the tokenizing
- */
- public static String[] explodeToArray(String toExplode, String delim) {
- List<String> strings = explode(toExplode, delim);
- String[] ret;
- ret = strings.toArray(new String[strings.size()]);
- return ret;
- }
-
- /**
- * Split a string up by whitespace, taking into account quoted subcomponents. If
there is an uneven number of
- * quotes, a parse error will be thrown.
- *
- * @param arg String to parse
- *
- * @return an array of elements, the argument was split into
- *
- * @throws IllegalArgumentException indicating there was a quoting error
- */
-
- public static String[] explodeQuoted(String arg) throws IllegalArgumentException {
- List<String> res = new ArrayList<String>();
- StringTokenizer quoteTok;
- boolean inQuote = false;
-
- arg = arg.trim();
- quoteTok = new StringTokenizer(arg, "\"", true);
-
- while (quoteTok.hasMoreTokens()) {
- String elem = (String) quoteTok.nextElement();
-
- if (elem.equals("\"")) {
- inQuote = !inQuote;
- continue;
- }
-
- if (inQuote) {
- res.add(elem);
- } else {
- StringTokenizer spaceTok = new StringTokenizer(elem.trim());
-
- while (spaceTok.hasMoreTokens()) {
- res.add(spaceTok.nextToken());
- }
- }
- }
-
- if (inQuote) {
- throw new IllegalArgumentException("Unbalanced quotation marks");
- }
-
- return res.toArray(new String[res.size()]);
- }
-
- /**
- * Remove a prefix from a string. If value starts with prefix, it will be removed,
the resultant string is trimmed
- * and returned.
- *
- * @return If value starts with prefix, then this method returns value with the
prefix removed, and the resultant
- * string trimmed. If value does not start with prefix, value is returned
as-is.
- */
- public static String removePrefix(String value, String prefix) {
- if (!value.startsWith(prefix)) {
- return value;
- }
-
- return value.substring(prefix.length()).trim();
- }
-
- /**
- * @return the plural of word. This is done by applying a few rules. These cover most
(but not all) cases: 1. If the
- * word ends in s, ss, x, o, or ch, append es 2. If the word ends in a
consonant followed by y, drop the y
- * and add ies 3. Append an s and call it a day. The ultimate references is
at
- *
http://en.wikipedia.org/wiki/English_plural
- */
- public static String pluralize(String word) {
- if (word.endsWith("s") || word.endsWith("x") ||
word.endsWith("o") || word.endsWith("ch")) {
- return word + "es";
- }
-
- if (word.endsWith("y")) {
- // Odd case to avoid StringIndexOutOfBounds later
- if (word.length() == 1) {
- return word;
- }
-
- // Check next-to-last letter
- char next2last = word.charAt(word.length() - 2);
- if ((next2last != 'a') && (next2last != 'e')
&& (next2last != 'i') && (next2last != 'o')
- && (next2last != 'u') && (next2last !=
'y')) {
- return word.substring(0, word.length() - 1) + "ies";
- }
- }
-
- return word + "s";
- }
-
- /**
- * @return The stack trace for the given Throwable as a String.
- */
- public static String getStackTrace(Throwable t) {
- if (t == null) {
- return "THROWABLE-WAS-NULL (at " + getStackTrace(new Exception()) +
")";
- }
-
- try {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
-
- t.printStackTrace(pw);
-
- Throwable cause = t.getCause();
- if (cause != null) {
- return sw.toString() + getStackTrace(cause);
- }
-
- return sw.toString();
- } catch (Exception e) {
- return "\n\nStringUtil.getStackTrace " + "GENERATED EXCEPTION:
'" + e.toString() + "' \n\n";
- }
- }
-
- /**
- * @return The stack trace for the given Throwable as a String.
- */
- public static String getFirstStackTrace(Throwable t) {
- if (t == null) {
- return null;
- }
-
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- t.printStackTrace(pw);
-
- return sw.toString();
- }
-
- /**
- * @param s A string that might contain unix-style path separators.
- *
- * @return The correct path for this platform (i.e, if win32, replace / with \).
- */
- public static String normalizePath(String s) {
- return StringUtil.replace(s, "/", File.separator);
- }
-
- public static String formatDuration(long duration) {
- return formatDuration(duration, 0, false);
- }
-
- public static String formatDuration(long duration, int scale, boolean minDigits) {
- long hours;
- long mins;
- int digits;
- double millis;
-
- hours = duration / 3600000;
- duration -= hours * 3600000;
-
- mins = duration / 60000;
- duration -= mins * 60000;
-
- millis = (double) duration / 1000;
-
- StringBuilder buf = new StringBuilder();
-
- if ((hours > 0) || (minDigits == false)) {
- buf.append(((hours < 10) && (minDigits == false)) ? ("0"
+ hours) : String.valueOf(hours)).append(':');
- minDigits = false;
- }
-
- if ((mins > 0) || (minDigits == false)) {
- buf.append(((mins < 10) && (minDigits == false)) ? ("0"
+ mins) : String.valueOf(mins)).append(':');
- minDigits = false;
- }
-
- // Format seconds and milliseconds
- NumberFormat fmt = NumberFormat.getInstance();
- digits = (((minDigits == false) || ((scale == 0) && (millis >= 9.5)))
? 2 : 1);
- fmt.setMinimumIntegerDigits(digits);
- fmt.setMaximumIntegerDigits(2); // Max of 2
- fmt.setMinimumFractionDigits(0); // Don't need any
- fmt.setMaximumFractionDigits(scale);
-
- buf.append(fmt.format(millis));
-
- return buf.toString();
- }
-
- public static String repeatChars(char c, int nTimes) {
- char[] arr = new char[nTimes];
-
- for (int i = 0; i < nTimes; i++) {
- arr[i] = c;
- }
-
- return new String(arr);
- }
-
- /**
- * Capitalizes the first letter of str.
- *
- * @param str The string to capitalize.
- *
- * @return A new string that is <code>str</code> capitalized. Returns
<code>null</code> if str is null.
- */
- public static String capitalize(String str) {
- if (str == null) {
- return null;
- } else if (str.trim().equals("")) {
- return str;
- }
-
- String result = str.substring(0, 1).toUpperCase() + str.substring(1,
str.length());
-
- return result;
- }
-
- public static String truncate(String s, int truncLength, boolean removeWhiteSpace) {
- String temp = ((s.length() > truncLength) ? (s.substring(0, truncLength) +
"...") : s);
- if (removeWhiteSpace) {
- temp = temp.replaceAll("\\s+", " ");
- }
-
- return temp;
- }
-}
\ No newline at end of file
diff --git a/modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java
b/modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java
new file mode 100644
index 0000000..7944bbd
--- /dev/null
+++ b/modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java
@@ -0,0 +1,552 @@
+/*
+ * 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.util;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class StringUtil {
+
+ private static final Log log = LogFactory.getLog(StringUtil.class);
+
+ /**
+ * @param source The source string to perform replacements on.
+ * @param find The substring to find in source.
+ * @param replace The string to replace 'find' within source
+ *
+ * @return The source string, with all occurrences of 'find' replaced with
'replace'
+ */
+ public static String replace(String source, String find, String replace) {
+ if ((source == null) || (find == null) || (replace == null)) {
+ return source;
+ }
+
+ int sourceLen = source.length();
+ int findLen = find.length();
+ if ((sourceLen == 0) || (findLen == 0)) {
+ return source;
+ }
+
+ StringBuilder buffer = new StringBuilder();
+
+ int idx;
+ int fromIndex;
+
+ for (fromIndex = 0; (idx = source.indexOf(find, fromIndex)) != -1; fromIndex =
idx + findLen) {
+ buffer.append(source.substring(fromIndex, idx));
+ buffer.append(replace);
+ }
+
+ if (fromIndex == 0) {
+ return source;
+ }
+
+ buffer.append(source.substring(fromIndex));
+
+ return buffer.toString();
+ }
+
+ /**
+ * @param source The source string to perform replacements on.
+ * @param find The substring to find in source.
+ *
+ * @return The source string, with all occurrences of 'find' removed
+ */
+ public static String remove(String source, String find) {
+ if ((source == null) || (find == null)) {
+ return source;
+ }
+
+ String retVal = null;
+ int sourceLen = source.length();
+ int findLen = find.length();
+ StringBuilder remove = new StringBuilder(source);
+
+ try {
+ if ((sourceLen > 0) && (findLen > 0)) {
+ int fromIndex;
+ int idx;
+
+ for (fromIndex = 0, idx = 0; (fromIndex = source.indexOf(find, idx)) !=
-1; idx = fromIndex + findLen) {
+ remove.delete(fromIndex, findLen + fromIndex);
+ }
+
+ retVal = remove.toString();
+ }
+ } catch (Exception e) {
+ log.error("This should not have happened.", e);
+ retVal = null;
+ }
+
+ return retVal;
+ }
+
+ /**
+ * Print out everything in an Iterator in a user-friendly string format.
+ *
+ * @param i An iterator to print out.
+ * @param delim The delimiter to use between elements.
+ *
+ * @return The Iterator's elements in a user-friendly string format.
+ */
+ public static String iteratorToString(Iterator i, String delim) {
+ return iteratorToString(i, delim, "");
+ }
+
+ /**
+ * Print out everything in an Iterator in a user-friendly string format.
+ *
+ * @param i An iterator to print out.
+ * @param delim The delimiter to use between elements.
+ * @param quoteChar The character to quote each element with.
+ *
+ * @return The Iterator's elements in a user-friendly string format.
+ */
+ public static String iteratorToString(Iterator i, String delim, String quoteChar) {
+ Object elt = null;
+ StringBuilder rstr = new StringBuilder();
+ String s;
+
+ while (i.hasNext()) {
+ if (rstr.length() > 0) {
+ rstr.append(delim);
+ }
+
+ elt = i.next();
+ if (elt == null) {
+ rstr.append("NULL");
+ } else {
+ s = elt.toString();
+ if (quoteChar != null) {
+ rstr.append(quoteChar).append(s).append(quoteChar);
+ } else {
+ rstr.append(s);
+ }
+ }
+ }
+
+ return rstr.toString();
+ }
+
+ /**
+ * Print out a List in a user-friendly string format.
+ *
+ * @param list A List to print out.
+ * @param delim The delimiter to use between elements.
+ *
+ * @return The List in a user-friendly string format.
+ */
+ public static String listToString(List list, String delim) {
+ if (list == null) {
+ return "NULL";
+ }
+
+ Iterator i = list.iterator();
+ return iteratorToString(i, delim, null);
+ }
+
+ public static String collectionToString(Collection collection, String delim) {
+ if (collection == null) {
+ return "NULL";
+ }
+
+ Iterator i = collection.iterator();
+ return iteratorToString(i, delim, null);
+ }
+
+ /**
+ * Print out a List in a user-friendly string format.
+ *
+ * @param list A List to print out.
+ *
+ * @return The List in a user-friendly string format.
+ */
+ public static String listToString(List list) {
+ return listToString(list, ",");
+ }
+
+ public static String collectionToString(Collection collection) {
+ return collectionToString(collection, ",");
+ }
+
+ /**
+ * Print out an array as a String
+ */
+ public static String arrayToString(Object[] array) {
+ return arrayToString(array, ',');
+ }
+
+ /**
+ * Print out an array as a String
+ */
+ public static String arrayToString(boolean[] array) {
+ if (array == null) {
+ return "null";
+ }
+
+ String rstr = "";
+ char delim = ',';
+ for (int i = 0; i < array.length; i++) {
+ if (i > 0) {
+ rstr += delim;
+ }
+
+ rstr += array[i];
+ }
+
+ return rstr;
+ }
+
+ /**
+ * Print out an array as a String
+ *
+ * @param array The array to print out
+ * @param delim The delimiter to use between elements.
+ */
+ public static String arrayToString(Object[] array, char delim) {
+ if (array == null) {
+ return "null";
+ }
+
+ StringBuilder rstr = new StringBuilder();
+ for (int i = 0; i < array.length; i++) {
+ if (i > 0) {
+ rstr.append(delim);
+ }
+
+ rstr.append(array[i]);
+ }
+
+ return rstr.toString();
+ }
+
+ /**
+ * Print out an array as a String
+ */
+ public static String arrayToString(int[] array) {
+ if (array == null) {
+ return "null";
+ }
+
+ StringBuilder rstr = new StringBuilder();
+ for (int i = 0; i < array.length; i++) {
+ if (i > 0) {
+ rstr.append(",");
+ }
+
+ rstr.append(array[i]);
+ }
+
+ return rstr.toString();
+ }
+
+ /**
+ * Create a string formulated by inserting a delimiter in between consecutive array
elements.
+ *
+ * @param objs List of objects to implode (elements may not be null)
+ * @param delim String to place inbetween elements
+ *
+ * @return A string with objects in the list seperated by delim
+ */
+ public static String implode(List objs, String delim) {
+ StringBuilder buf = new StringBuilder();
+ int size = objs.size();
+
+ for (int i = 0; i < (size - 1); i++) {
+ buf.append(objs.get(i).toString());
+ buf.append( delim);
+ }
+
+ if (size != 0) {
+ buf.append(objs.get(size - 1).toString());
+ }
+
+ return buf.toString();
+ }
+
+ /**
+ * Split a string on delimiter boundaries, and place each element into a List.
+ *
+ * @param s String to split up
+ * @param delim Delimiting token, ala StringTokenizer
+ *
+ * @return a List comprised of elements split by the tokenizing
+ */
+
+ public static List<String> explode(String s, String delim) {
+ List<String> res = new ArrayList<String>();
+ if (s == null)
+ return res;
+
+ StringTokenizer tok = new StringTokenizer(s, delim);
+
+ while (tok.hasMoreTokens()) {
+ res.add(tok.nextToken());
+ }
+
+ return res;
+ }
+
+ /**
+ * Split a string on delimiter boundaries, and place each element into an Array.
+ *
+ * @param toExplode String to split up
+ * @param delim Delimiting token, ala StringTokenizer
+ *
+ * @return an Array comprised of elements split by the tokenizing
+ */
+ public static String[] explodeToArray(String toExplode, String delim) {
+ List<String> strings = explode(toExplode, delim);
+ String[] ret;
+ ret = strings.toArray(new String[strings.size()]);
+ return ret;
+ }
+
+ /**
+ * Split a string up by whitespace, taking into account quoted subcomponents. If
there is an uneven number of
+ * quotes, a parse error will be thrown.
+ *
+ * @param arg String to parse
+ *
+ * @return an array of elements, the argument was split into
+ *
+ * @throws IllegalArgumentException indicating there was a quoting error
+ */
+
+ public static String[] explodeQuoted(String arg) throws IllegalArgumentException {
+ List<String> res = new ArrayList<String>();
+ StringTokenizer quoteTok;
+ boolean inQuote = false;
+
+ arg = arg.trim();
+ quoteTok = new StringTokenizer(arg, "\"", true);
+
+ while (quoteTok.hasMoreTokens()) {
+ String elem = (String) quoteTok.nextElement();
+
+ if (elem.equals("\"")) {
+ inQuote = !inQuote;
+ continue;
+ }
+
+ if (inQuote) {
+ res.add(elem);
+ } else {
+ StringTokenizer spaceTok = new StringTokenizer(elem.trim());
+
+ while (spaceTok.hasMoreTokens()) {
+ res.add(spaceTok.nextToken());
+ }
+ }
+ }
+
+ if (inQuote) {
+ throw new IllegalArgumentException("Unbalanced quotation marks");
+ }
+
+ return res.toArray(new String[res.size()]);
+ }
+
+ /**
+ * Remove a prefix from a string. If value starts with prefix, it will be removed,
the resultant string is trimmed
+ * and returned.
+ *
+ * @return If value starts with prefix, then this method returns value with the
prefix removed, and the resultant
+ * string trimmed. If value does not start with prefix, value is returned
as-is.
+ */
+ public static String removePrefix(String value, String prefix) {
+ if (!value.startsWith(prefix)) {
+ return value;
+ }
+
+ return value.substring(prefix.length()).trim();
+ }
+
+ /**
+ * @return the plural of word. This is done by applying a few rules. These cover most
(but not all) cases: 1. If the
+ * word ends in s, ss, x, o, or ch, append es 2. If the word ends in a
consonant followed by y, drop the y
+ * and add ies 3. Append an s and call it a day. The ultimate references is
at
+ *
http://en.wikipedia.org/wiki/English_plural
+ */
+ public static String pluralize(String word) {
+ if (word.endsWith("s") || word.endsWith("x") ||
word.endsWith("o") || word.endsWith("ch")) {
+ return word + "es";
+ }
+
+ if (word.endsWith("y")) {
+ // Odd case to avoid StringIndexOutOfBounds later
+ if (word.length() == 1) {
+ return word;
+ }
+
+ // Check next-to-last letter
+ char next2last = word.charAt(word.length() - 2);
+ if ((next2last != 'a') && (next2last != 'e')
&& (next2last != 'i') && (next2last != 'o')
+ && (next2last != 'u') && (next2last !=
'y')) {
+ return word.substring(0, word.length() - 1) + "ies";
+ }
+ }
+
+ return word + "s";
+ }
+
+ /**
+ * @return The stack trace for the given Throwable as a String.
+ */
+ public static String getStackTrace(Throwable t) {
+ if (t == null) {
+ return "THROWABLE-WAS-NULL (at " + getStackTrace(new Exception()) +
")";
+ }
+
+ try {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+
+ t.printStackTrace(pw);
+
+ Throwable cause = t.getCause();
+ if (cause != null) {
+ return sw.toString() + getStackTrace(cause);
+ }
+
+ return sw.toString();
+ } catch (Exception e) {
+ return "\n\nStringUtil.getStackTrace " + "GENERATED EXCEPTION:
'" + e.toString() + "' \n\n";
+ }
+ }
+
+ /**
+ * @return The stack trace for the given Throwable as a String.
+ */
+ public static String getFirstStackTrace(Throwable t) {
+ if (t == null) {
+ return null;
+ }
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ t.printStackTrace(pw);
+
+ return sw.toString();
+ }
+
+ /**
+ * @param s A string that might contain unix-style path separators.
+ *
+ * @return The correct path for this platform (i.e, if win32, replace / with \).
+ */
+ public static String normalizePath(String s) {
+ return StringUtil.replace(s, "/", File.separator);
+ }
+
+ public static String formatDuration(long duration) {
+ return formatDuration(duration, 0, false);
+ }
+
+ public static String formatDuration(long duration, int scale, boolean minDigits) {
+ long hours;
+ long mins;
+ int digits;
+ double millis;
+
+ hours = duration / 3600000;
+ duration -= hours * 3600000;
+
+ mins = duration / 60000;
+ duration -= mins * 60000;
+
+ millis = (double) duration / 1000;
+
+ StringBuilder buf = new StringBuilder();
+
+ if ((hours > 0) || (minDigits == false)) {
+ buf.append(((hours < 10) && (minDigits == false)) ? ("0"
+ hours) : String.valueOf(hours)).append(':');
+ minDigits = false;
+ }
+
+ if ((mins > 0) || (minDigits == false)) {
+ buf.append(((mins < 10) && (minDigits == false)) ? ("0"
+ mins) : String.valueOf(mins)).append(':');
+ minDigits = false;
+ }
+
+ // Format seconds and milliseconds
+ NumberFormat fmt = NumberFormat.getInstance();
+ digits = (((minDigits == false) || ((scale == 0) && (millis >= 9.5)))
? 2 : 1);
+ fmt.setMinimumIntegerDigits(digits);
+ fmt.setMaximumIntegerDigits(2); // Max of 2
+ fmt.setMinimumFractionDigits(0); // Don't need any
+ fmt.setMaximumFractionDigits(scale);
+
+ buf.append(fmt.format(millis));
+
+ return buf.toString();
+ }
+
+ public static String repeatChars(char c, int nTimes) {
+ char[] arr = new char[nTimes];
+
+ for (int i = 0; i < nTimes; i++) {
+ arr[i] = c;
+ }
+
+ return new String(arr);
+ }
+
+ /**
+ * Capitalizes the first letter of str.
+ *
+ * @param str The string to capitalize.
+ *
+ * @return A new string that is <code>str</code> capitalized. Returns
<code>null</code> if str is null.
+ */
+ public static String capitalize(String str) {
+ if (str == null) {
+ return null;
+ } else if (str.trim().equals("")) {
+ return str;
+ }
+
+ String result = str.substring(0, 1).toUpperCase() + str.substring(1,
str.length());
+
+ return result;
+ }
+
+ public static String truncate(String s, int truncLength, boolean removeWhiteSpace) {
+ String temp = ((s.length() > truncLength) ? (s.substring(0, truncLength) +
"...") : s);
+ if (removeWhiteSpace) {
+ temp = temp.replaceAll("\\s+", " ");
+ }
+
+ return temp;
+ }
+}
\ No newline at end of file
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/error/GenericErrorUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/error/GenericErrorUIBean.java
index a13e89a..2c4c7b8 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/error/GenericErrorUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/common/error/GenericErrorUIBean.java
@@ -28,7 +28,7 @@ import javax.faces.context.FacesContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.core.clientapi.util.StringUtil;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.server.alert.engine.internal.Tuple;
/**
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/Portal.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/Portal.java
index 203c929..88b434d 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/Portal.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/Portal.java
@@ -23,7 +23,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import org.rhq.core.clientapi.util.StringUtil;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.gui.legacy.util.DashboardUtils;
/**
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserPreferences.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserPreferences.java
index 5d317b0..6c31434 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserPreferences.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/WebUserPreferences.java
@@ -8,12 +8,12 @@ import java.util.List;
import java.util.ListIterator;
import java.util.StringTokenizer;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.composite.ResourceIdFlyWeight;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
+import org.rhq.core.util.StringUtil;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.gui.common.paging.PageControlView;
import org.rhq.enterprise.gui.legacy.action.resource.hub.HubView;
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/events/EventDetailsAction.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/events/EventDetailsAction.java
index df45f52..470975b 100755
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/events/EventDetailsAction.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/events/EventDetailsAction.java
@@ -30,7 +30,6 @@ import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.clientapi.util.TimeUtil;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.EntityContext;
@@ -38,6 +37,7 @@ import org.rhq.core.domain.event.EventSeverity;
import org.rhq.core.domain.event.composite.EventComposite;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.gui.legacy.AttrConstants;
import org.rhq.enterprise.gui.legacy.DefaultConstants;
import org.rhq.enterprise.gui.legacy.ParamConstants;
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/PortalAction.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/PortalAction.java
index cb1e04e..e516033 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/PortalAction.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/PortalAction.java
@@ -30,7 +30,6 @@ import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.auth.Subject;
@@ -38,6 +37,7 @@ import org.rhq.core.domain.criteria.AlertCriteria;
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.util.StringUtil;
import org.rhq.enterprise.gui.legacy.AttrConstants;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.ParamConstants;
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/PortalAction.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/PortalAction.java
index f134028..2aefb23 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/PortalAction.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/alerts/config/PortalAction.java
@@ -32,12 +32,12 @@ import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.alert.AlertDefinition;
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.resource.group.ResourceGroup;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.Portal;
import org.rhq.enterprise.gui.legacy.Portlet;
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsDisplayAction.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsDisplayAction.java
index a1970ba..83afbd8 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsDisplayAction.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsDisplayAction.java
@@ -29,9 +29,9 @@ import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.ParamConstants;
import org.rhq.enterprise.gui.legacy.WebUser;
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsFilterForm.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsFilterForm.java
index 1055210..a6b3230 100755
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsFilterForm.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/MetricsFilterForm.java
@@ -21,7 +21,8 @@ package
org.rhq.enterprise.gui.legacy.action.resource.common.monitor.visibility;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.ImageButtonBean;
-import org.rhq.core.clientapi.util.StringUtil;
+
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.server.legacy.measurement.MeasurementConstants;
/**
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java
index 9ec74ee..3f9f998 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/action/resource/common/monitor/visibility/ViewChartFormPrepareAction.java
@@ -35,7 +35,6 @@ import org.apache.struts.action.ActionMapping;
import org.apache.struts.tiles.ComponentContext;
import org.rhq.core.clientapi.util.ArrayUtil;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.measurement.MeasurementBaseline;
import org.rhq.core.domain.measurement.MeasurementDefinition;
@@ -51,6 +50,7 @@ import org.rhq.core.domain.resource.group.Group;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.server.MeasurementConverter;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.gui.common.servlet.HighLowMetricValue;
import org.rhq.enterprise.gui.legacy.AttrConstants;
import org.rhq.enterprise.gui.legacy.DefaultConstants;
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/beans/OptionItem.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/beans/OptionItem.java
index 28e1f8d..d4c86e1 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/beans/OptionItem.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/beans/OptionItem.java
@@ -28,7 +28,8 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.struts.util.LabelValueBean;
-import org.rhq.core.clientapi.util.StringUtil;
+
+import org.rhq.core.util.StringUtil;
/**
* This bean is for use with html:options.
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/taglib/RemovePrefixTag.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/taglib/RemovePrefixTag.java
index 261af53..cf2fe2c 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/taglib/RemovePrefixTag.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/taglib/RemovePrefixTag.java
@@ -24,7 +24,8 @@ import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.taglibs.standard.tag.common.core.NullAttributeException;
import org.apache.taglibs.standard.tag.el.core.ExpressionUtil;
-import org.rhq.core.clientapi.util.StringUtil;
+
+import org.rhq.core.util.StringUtil;
public class RemovePrefixTag extends TagSupport {
private String prefix = null;
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/sql.jsp
b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/sql.jsp
index 2699f8e..7a0f490 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/sql.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/sql.jsp
@@ -13,7 +13,7 @@ $Header$
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.servlet.ServletRequest" %>
-<%@ page import="org.rhq.core.clientapi.util.StringUtil" %>
+<%@ page import="org.rhq.core.util.StringUtil" %>
<%@ page import="org.rhq.enterprise.server.RHQConstants"%>
<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
<%@ page import="org.rhq.core.db.DatabaseTypeFactory" %>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/common/Error.jsp
b/modules/enterprise/gui/portal-war/src/main/webapp/common/Error.jsp
index 915510d..cc2f790 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/common/Error.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/common/Error.jsp
@@ -1,7 +1,7 @@
<%@ page language="java" %>
<%@ page isErrorPage="true" %>
<%@ page import="javax.servlet.ServletException" %>
-<%@ page import="org.rhq.core.clientapi.util.StringUtil" %>
+<%@ page import="org.rhq.core.util.StringUtil" %>
<%@ page
import="org.rhq.enterprise.server.auth.SessionNotFoundException"%>
<%@ page
import="org.rhq.enterprise.server.auth.SessionTimeoutException"%>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/common/GenericError.jsp
b/modules/enterprise/gui/portal-war/src/main/webapp/common/GenericError.jsp
index 5f05378..eafb2e1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/common/GenericError.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/common/GenericError.jsp
@@ -1,7 +1,7 @@
<%@ page language="java" %>
<%@ page isErrorPage="true" %>
<%@ page import="java.util.Enumeration"%>
-<%@ page import="org.rhq.core.clientapi.util.StringUtil" %>
+<%@ page import="org.rhq.core.util.StringUtil" %>
<%@ page import="org.rhq.enterprise.gui.legacy.WebUser" %>
<%@ page import="org.rhq.enterprise.gui.legacy.WebUserPreferences" %>
<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/prefs/SubjectPreferencesBase.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/prefs/SubjectPreferencesBase.java
index d92e7ba..5b1b980 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/prefs/SubjectPreferencesBase.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/prefs/SubjectPreferencesBase.java
@@ -27,9 +27,9 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.util.StringUtil;
public abstract class SubjectPreferencesBase {
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementPreferences.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementPreferences.java
index 2e47466..fe59053 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementPreferences.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementPreferences.java
@@ -3,8 +3,8 @@ package org.rhq.enterprise.server.measurement;
import java.util.Arrays;
import java.util.List;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.server.auth.prefs.SubjectPreferencesBase;
import org.rhq.enterprise.server.measurement.util.MeasurementUtils;
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/SystemSettingsImporterTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/SystemSettingsImporterTest.java
index 711fb75..7935e5f 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/SystemSettingsImporterTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/sync/test/SystemSettingsImporterTest.java
@@ -27,11 +27,11 @@ import java.util.Properties;
import org.jmock.Expectations;
import org.testng.annotations.Test;
-import org.rhq.core.clientapi.util.StringUtil;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.sync.entity.SystemSettings;
+import org.rhq.core.util.StringUtil;
import org.rhq.enterprise.server.sync.importers.SystemSettingsImporter;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.test.JMockTest;
commit 3266294b4768113f529df1d77b03e056579389e5
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Mar 30 11:07:13 2012 -0400
[BZ 759615] put our dynamic class definition in a separate package to avoid conflict
with signed packages
diff --git
a/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/ResourceClientFactory.java
b/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/ResourceClientFactory.java
index 2c1258d..74c0019 100644
---
a/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/ResourceClientFactory.java
+++
b/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/ResourceClientFactory.java
@@ -144,9 +144,10 @@ public class ResourceClientFactory {
private Class<?> defineCustomInterface(ResourceClientProxy proxy) {
try {
- // define the dynamic class
+ // define the dynamic class - do not put it in any known rhq package in case
our jars are signed (see BZ-794503)
ClassPool pool = ClassPool.getDefault();
- CtClass customClass = pool.makeInterface(ResourceClientProxy.class.getName()
+ proxy.fingerprint);
+ CtClass customClass =
pool.makeInterface("org.rhq.bindings.client.dynamic."
+ + ResourceClientProxy.class.getSimpleName() + proxy.fingerprint);
for (String key : proxy.allProperties.keySet()) {
Object prop = proxy.allProperties.get(key);
commit b0bcb5d6f5ef3f3c28e00a2bee24e3e0599de525
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Mar 29 17:50:17 2012 -0400
[BZ 759615] refactor the domain jar's org.rhq.core.server package name to
org.rhq.core.domain.server
diff --git a/etc/m2/settings.xml b/etc/m2/settings.xml
index 1bbc1e2..af1441e 100644
--- a/etc/m2/settings.xml
+++ b/etc/m2/settings.xml
@@ -154,7 +154,7 @@
<rhq.test.ds.port>9092</rhq.test.ds.port>
<rhq.test.ds.db-name>rhq</rhq.test.ds.db-name>
<!-- This custom dialect is required for proper operation using H2, see
class JavaDoc for more info -->
-
<rhq.test.ds.hibernate-dialect>org.rhq.core.server.H2CustomDialect</rhq.test.ds.hibernate-dialect>
+
<rhq.test.ds.hibernate-dialect>org.rhq.core.domain.server.H2CustomDialect</rhq.test.ds.hibernate-dialect>
<!-- quartz properties -->
<rhq.test.quartz.driverDelegateClass>org.quartz.impl.jdbcjobstore.StdJDBCDelegate</rhq.test.quartz.driverDelegateClass>
<rhq.test.quartz.selectWithLockSQL>SELECT * FROM {0}LOCKS ROWLOCK WHERE
LOCK_NAME = ? FOR UPDATE</rhq.test.quartz.selectWithLockSQL>
@@ -170,7 +170,7 @@
<rhq.dev.ds.port>9092</rhq.dev.ds.port>
<rhq.dev.ds.db-name>rhq</rhq.dev.ds.db-name>
<!-- This custom dialect is required for proper operation using H2, see
class JavaDoc for more info -->
-
<rhq.dev.ds.hibernate-dialect>org.rhq.core.server.H2CustomDialect</rhq.dev.ds.hibernate-dialect>
+
<rhq.dev.ds.hibernate-dialect>org.rhq.core.domain.server.H2CustomDialect</rhq.dev.ds.hibernate-dialect>
<!-- quartz properties -->
<rhq.dev.quartz.driverDelegateClass>org.quartz.impl.jdbcjobstore.StdJDBCDelegate</rhq.dev.quartz.driverDelegateClass>
<rhq.dev.quartz.selectWithLockSQL>SELECT * FROM {0}LOCKS ROWLOCK WHERE
LOCK_NAME = ? FOR UPDATE</rhq.dev.quartz.selectWithLockSQL>
diff --git a/modules/core/dbutils/src/main/java/org/rhq/core/db/H2DatabaseType.java
b/modules/core/dbutils/src/main/java/org/rhq/core/db/H2DatabaseType.java
index e7258bd..05f8de4 100644
--- a/modules/core/dbutils/src/main/java/org/rhq/core/db/H2DatabaseType.java
+++ b/modules/core/dbutils/src/main/java/org/rhq/core/db/H2DatabaseType.java
@@ -46,7 +46,7 @@ public abstract class H2DatabaseType extends DatabaseType {
}
public String getHibernateDialect() {
- return "org.rhq.core.server.H2CustomDialect";
+ return "org.rhq.core.domain.server.H2CustomDialect";
}
/**
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/server/EntitySerializer.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/server/EntitySerializer.java
new file mode 100644
index 0000000..5c05c57
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/server/EntitySerializer.java
@@ -0,0 +1,296 @@
+/*
+ * 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.server;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Id;
+
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.server.ExternalizableStrategy.Subsystem;
+
+/**
+ * A utility specifically tailored to entities which will iterate over its persistence
fields with a consistent
+ * ordering for serialization and deserialization. If this class is passed a non-entity
object, it will ignore
+ * field-level annotations and just serialize and deserialize all fields in that object.
+ *
+ * @author Joseph Marques
+ */
+public class EntitySerializer {
+ private static Set<Class<? extends Annotation>> PERSISTENCE_ANNOTATIONS =
new HashSet<Class<? extends Annotation>>();
+ static {
+ PERSISTENCE_ANNOTATIONS.add(Id.class);
+ PERSISTENCE_ANNOTATIONS.add(Column.class);
+ PERSISTENCE_ANNOTATIONS.add(ManyToOne.class);
+ PERSISTENCE_ANNOTATIONS.add(OneToMany.class);
+ PERSISTENCE_ANNOTATIONS.add(ManyToMany.class);
+ }
+
+ private static Set<Class<?>> BASIC_TYPES = new
HashSet<Class<?>>();
+ static {
+ BASIC_TYPES.add(Byte.TYPE);
+ BASIC_TYPES.add(Short.TYPE);
+ BASIC_TYPES.add(Integer.TYPE);
+ BASIC_TYPES.add(Long.TYPE);
+ BASIC_TYPES.add(Float.TYPE);
+ BASIC_TYPES.add(Double.TYPE);
+ BASIC_TYPES.add(Boolean.TYPE);
+ }
+
+ private static Comparator<Field> fieldComparator = new
Comparator<Field>() {
+ public int compare(Field first, Field second) {
+ return first.getName().compareTo(second.getName());
+ }
+ };
+
+ private static Field[] getFields(Object object) {
+ Class<?> objectClass = object.getClass();
+ Entity entityAnnotation = objectClass.getAnnotation(Entity.class);
+
+ List<Field> serializableFields;
+ if (entityAnnotation == null) {
+ serializableFields = getNonEntityFieldList(object);
+ } else {
+ serializableFields = getEntityFieldList(object);
+ }
+
+ Collections.sort(serializableFields, fieldComparator);
+
+ Field[] results = serializableFields.toArray(new
Field[serializableFields.size()]);
+ return results;
+ }
+
+ private static List<Field> getNonEntityFieldList(Object object) {
+ Class<?> objectClass = object.getClass();
+ Field[] fields = objectClass.getDeclaredFields();
+ List<Field> serializableFields = new ArrayList<Field>();
+
+ for (Field field : fields) {
+ serializableFields.add(field);
+ field.setAccessible(true);
+ }
+
+ return serializableFields;
+ }
+
+ private static List<Field> getEntityFieldList(Object entity) {
+ Class<?> entityClass = entity.getClass();
+ Entity entityAnnotation = entityClass.getAnnotation(Entity.class);
+ if (entityAnnotation == null) {
+ throw new IllegalArgumentException("EntitySerializer only introspects
objects annotated with @Entity ");
+ }
+
+ List<Field> serializableFields = new ArrayList<Field>();
+
+ while (entityClass != null) {
+
+ Field[] fields = entityClass.getDeclaredFields();
+ for (Field field : fields) {
+ Annotation[] fieldAnnotations = field.getAnnotations();
+ for (Annotation fieldAnnotation : fieldAnnotations) {
+ if
(PERSISTENCE_ANNOTATIONS.contains(fieldAnnotation.annotationType())) {
+ serializableFields.add(field);
+ field.setAccessible(true);
+ break;
+ }
+ }
+ }
+ entityClass = entityClass.getSuperclass();
+ }
+
+ return serializableFields;
+ }
+
+ public static void writeExternalRemote(Object object, ObjectOutput out) throws
IOException {
+ Field[] fields = getFields(object);
+ for (Field field : fields) {
+ //System.out.println("Serializing " + field.getName() +
"...");
+ try {
+ Class<?> type = field.getType();
+ Object value = field.get(object);
+
+ if (BASIC_TYPES.contains(type)) {
+ if (type.equals(Byte.TYPE)) {
+ out.writeByte((Byte) value);
+ } else if (type.equals(Short.TYPE)) {
+ out.writeShort((Short) value);
+ } else if (type.equals(Integer.TYPE)) {
+ out.writeInt((Integer) value);
+ } else if (type.equals(Long.TYPE)) {
+ out.writeLong((Long) value);
+ } else if (type.equals(Float.TYPE)) {
+ out.writeFloat((Float) value);
+ } else if (type.equals(Double.TYPE)) {
+ out.writeDouble((Double) value);
+ } else if (type.equals(Boolean.TYPE)) {
+ out.writeBoolean((Boolean) value);
+ } else {
+ throw new IllegalStateException(
+ "BASIC_TYPES contains an entry that doesn't have
serialization support: " + type);
+ }
+ continue;
+ }
+
+ // either a string, an enum, numeric wrapper, collection, or some other
object
+ out.writeObject(value);
+ } catch (IllegalAccessException iae) {
+ throw new IllegalStateException("Could not access field '"
+ field.getName() + "' for serialization");
+ }
+ }
+ }
+
+ public static void readExternalRemote(Object object, ObjectInput in) throws
IOException, ClassNotFoundException {
+ Field[] fields = getFields(object);
+ for (Field field : fields) {
+ //System.out.println("Deserializing " + field.getName() +
"...");
+ try {
+ Class<?> type = field.getType();
+
+ if (BASIC_TYPES.contains(type)) {
+ if (type.equals(Byte.TYPE)) {
+ field.setByte(object, in.readByte());
+ } else if (type.equals(Short.TYPE)) {
+ field.setShort(object, in.readShort());
+ } else if (type.equals(Integer.TYPE)) {
+ field.setInt(object, in.readInt());
+ } else if (type.equals(Long.TYPE)) {
+ field.setLong(object, in.readLong());
+ } else if (type.equals(Float.TYPE)) {
+ field.setFloat(object, in.readFloat());
+ } else if (type.equals(Double.TYPE)) {
+ field.setDouble(object, in.readDouble());
+ } else if (type.equals(Boolean.TYPE)) {
+ field.setBoolean(object, in.readBoolean());
+ } else {
+ throw new IllegalStateException(
+ "BASIC_TYPES contains an entry that doesn't have
deserialization support: " + type);
+ }
+ continue;
+ }
+
+ // either a string, an enum, numeric wrapper, collection, or some other
object
+ field.set(object, in.readObject());
+ } catch (IllegalAccessException iae) {
+ throw new IllegalStateException("Could not access field '"
+ field.getName() + "' for deserialization");
+ }
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ ExternalizableStrategy.setStrategy(Subsystem.REFLECTIVE_SERIALIZATION);
+
+ // create objects
+ Agent writeAgent = new Agent("reflectiveAgent",
"reflectiveAddress", 0, "reflectiveEndpoint",
"reflectiveToken");
+
+ ResourceType writeResourceType = new ResourceType();
+ writeResourceType.setName("reflectiveType");
+ writeResourceType.setPlugin("reflectivePlugin");
+ writeResourceType.setId(7);
+
+ Resource writeParentResource = new Resource();
+ writeParentResource.setId(11);
+ writeParentResource.setName("reflectiveParentResource");
+ writeParentResource.setResourceKey("reflectiveParentKey");
+
+ Resource writeResource = new Resource();
+ writeResource.setId(42);
+ writeResource.setName("reflectiveResource");
+ writeResource.setResourceKey("reflectiveKey");
+
+ // setup relationships
+ writeResource.setAgent(writeAgent);
+ writeResource.setResourceType(writeResourceType);
+ writeResource.setParentResource(writeParentResource);
+
+ System.out.println("BEFORE");
+ System.out.println(writeResource.toString());
+ System.out.println("BEFORE");
+
+ String tempDir = System.getProperty("java.io.tmpdir");
+ File tempFile = new File(tempDir, "entitySerializerTest.txt");
+
+ FileOutputStream fos = new FileOutputStream(tempFile);
+ try {
+ ObjectOutput output = new ObjectOutputStream(fos);
+ try {
+ writeExternalRemote(writeResource, output);
+ } finally {
+ output.close();
+ }
+ } finally {
+ fos.close();
+ }
+
+ Resource readResource = new Resource();
+ FileInputStream fis = new FileInputStream(tempFile);
+ try {
+ ObjectInput ois = new ObjectInputStream(fis);
+ try {
+ readExternalRemote(readResource, ois);
+ } finally {
+ ois.close();
+ }
+ } finally {
+ fis.close();
+ }
+
+ // quick verification
+ System.out.println("AFTER");
+ System.out.println(readResource.toString());
+ System.out.println("AFTER");
+
+ // deeper verification
+ boolean equalsResource = writeResource.equals(readResource);
+ boolean equalsParentResource =
writeParentResource.equals(readResource.getParentResource());
+ boolean equalsResourceType =
writeResourceType.equals(readResource.getResourceType());
+ boolean equalsAgent = writeAgent.equals(readResource.getAgent());
+
+ System.out.println("equalsResource: " + equalsResource);
+ System.out.println("equalsParentResource: " + equalsParentResource);
+ System.out.println("equalsResourceType: " + equalsResourceType);
+ System.out.println("equalsAgent: " + equalsAgent);
+ }
+
+}
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/server/ExternalizableStrategy.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/server/ExternalizableStrategy.java
new file mode 100644
index 0000000..f7ad860
--- /dev/null
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/server/ExternalizableStrategy.java
@@ -0,0 +1,64 @@
+/*
+ * 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.server;
+
+/**
+ * This uses a ThreadLocal to bind an externalization strategy based on the invoking
subsystem. In other
+ * words, when we know we're serializing for Server-Agent communication then set to
AGENT, when we know we're
+ * serializing for RemoteClient-Server communication set to REMOTEAPI. By keeping this
info on the thread
+ * we avoid having to tag all of the relevant objects that will be serialized.
+ *
+ * @author jay shaughnessy
+ */
+public class ExternalizableStrategy {
+
+ public enum Subsystem {
+ AGENT((char) 1), // set bidirectionally for agent<--->server communication
+ REFLECTIVE_SERIALIZATION((char) 3); // set unidirectionally for both
CLI-->server and WS-->server communication
+
+ private char id;
+
+ Subsystem(char id) {
+ this.id = id;
+ }
+
+ public char id() {
+ return id;
+ }
+ }
+
+ private static ThreadLocal<Subsystem> strategy = new
ThreadLocal<Subsystem>() {
+
+ protected ExternalizableStrategy.Subsystem initialValue() {
+ return Subsystem.AGENT;
+ }
+ };
+
+ public static Subsystem getStrategy() {
+ return strategy.get();
+ }
+
+ public static void setStrategy(Subsystem newStrategy) {
+ strategy.set(newStrategy);
+ }
+}
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/server/H2CustomDialect.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/server/H2CustomDialect.java
new file mode 100644
index 0000000..cb73aef
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/server/H2CustomDialect.java
@@ -0,0 +1,45 @@
+/*
+ * 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.core.domain.server;
+
+import org.hibernate.dialect.H2Dialect;
+
+/**
+ * This class extends the basic H2Dialect that comes in the
+ * Hibernate core distribution to force it to use sequences
+ * for H2 database.
+ *
+ * @author Joseph Marques
+ */
+public class H2CustomDialect extends H2Dialect {
+
+ @Override
+ public boolean supportsIdentityColumns() {
+ /*
+ * By default, GeneratorType.AUTO strategy will choose IDENTITY if a database
supports it.
+ * However, the embedded database was originally written using sequences. Later,
SQL Server
+ * support was added which required changing the generation strategy from
SEQUENCE to AUTO.
+ * This broke support for the embedded database because the H2Dialect was trying
to use
+ * identity data types for key columns, which the H2DatabaseType did not support.
This hack
+ * basically tricks Hibernate into believing that H2 doesn't support identity
types, which
+ * then forces it to fall back to using the SEQUENCE strategy.
+ */
+ return false;
+ }
+}
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/server/PersistenceUtility.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/server/PersistenceUtility.java
new file mode 100644
index 0000000..662d97c
--- /dev/null
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/server/PersistenceUtility.java
@@ -0,0 +1,563 @@
+/*
+ * 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.server;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.ObjectName;
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.ejb.EntityManagerImpl;
+import org.hibernate.engine.NamedQueryDefinition;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.jmx.StatisticsService;
+import org.hibernate.stat.Statistics;
+import org.hibernate.type.CustomType;
+import org.hibernate.type.EntityType;
+import org.hibernate.type.PrimitiveType;
+import org.hibernate.type.Type;
+
+import org.rhq.core.domain.util.OrderingField;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.core.domain.util.PageOrdering;
+
+/**
+ * Various persistence utility methods - mostly Hibernate-specific.
+ *
+ * @author Heiko Rupp
+ * @author Joseph Marques
+ * @author Greg Hinkle
+ */
+public class PersistenceUtility {
+ private static final Log LOG = LogFactory.getLog(PersistenceUtility.class);
+
+ private static final Pattern COUNT_QUERY_PATTERN =
Pattern.compile("^(\\s*SELECT\\s+)(.*?)(\\s+FROM.*)",
+ Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
+ private static final Pattern COUNT_QUERY_REMOVE_FETCH =
Pattern.compile("FETCH", Pattern.CASE_INSENSITIVE
+ | Pattern.MULTILINE | Pattern.DOTALL);
+
+ public static final String HIBERNATE_STATISTICS_MBEAN_OBJECTNAME =
"Hibernate:type=statistics,application=RHQ";
+
+ @SuppressWarnings("unchecked")
+ // used in hibernate.jsp
+ public static String getDisplayString(Type hibernateType) {
+ if (hibernateType instanceof EntityType) {
+ return hibernateType.getName() + " (enter integer of ID / primary key
field)";
+ } else if (hibernateType instanceof CustomType) {
+ if (Enum.class.isAssignableFrom(hibernateType.getReturnedClass())) {
+ Class<? extends Enum<?>> enumClass = (Class<? extends
Enum<?>>) hibernateType.getReturnedClass();
+ StringBuilder result = new StringBuilder();
+ result.append(enumClass.getName());
+ result.append(" (");
+ boolean first = true;
+ for (Enum<?> nextEnum : enumClass.getEnumConstants()) {
+ if (!first) {
+ result.append(" | ");
+ } else {
+ first = false;
+ }
+ result.append(nextEnum.name());
+ }
+ result.append(")");
+ return result.toString();
+ }
+ }
+ return hibernateType == null ? "" : hibernateType.getName();
+ }
+
+ @SuppressWarnings("unchecked")
+ // used in hibernate.jsp
+ public static Object cast(String value, Type hibernateType) {
+ if (hibernateType instanceof PrimitiveType) {
+ Class<?> type = ((PrimitiveType) hibernateType).getPrimitiveClass();
+ if (type.equals(Byte.TYPE)) {
+ return Byte.valueOf(value);
+ } else if (type.equals(Short.TYPE)) {
+ return Short.valueOf(value);
+ } else if (type.equals(Integer.TYPE)) {
+ return Integer.valueOf(value);
+ } else if (type.equals(Long.TYPE)) {
+ return Long.valueOf(value);
+ } else if (type.equals(Float.TYPE)) {
+ return Float.valueOf(value);
+ } else if (type.equals(Double.TYPE)) {
+ return Double.valueOf(value);
+ } else if (type.equals(Boolean.TYPE)) {
+ return Boolean.valueOf(value);
+ }
+ } else if (hibernateType instanceof EntityType) {
+ String entityName = ((EntityType) hibernateType).getAssociatedEntityName();
+ try {
+ Class<?> entityClass = Class.forName(entityName);
+ Object entity = entityClass.newInstance();
+
+ Field primaryKeyField = entityClass.getDeclaredField("id");
+ primaryKeyField.setAccessible(true);
+ primaryKeyField.setInt(entity, Integer.valueOf(value));
+ return entity;
+ } catch (Throwable t) {
+ throw new IllegalArgumentException("Type[" + entityName +
"] must have PK field named 'id'");
+ }
+ } else if (hibernateType instanceof CustomType) {
+ if (Enum.class.isAssignableFrom(hibernateType.getReturnedClass())) {
+ Class<? extends Enum<?>> enumClass =
hibernateType.getReturnedClass();
+ Enum<?>[] enumValues = enumClass.getEnumConstants();
+ try {
+ int enumOrdinal = Integer.valueOf(value);
+ try {
+ return enumValues[enumOrdinal];
+ } catch (ArrayIndexOutOfBoundsException aioobe) {
+ throw new IllegalArgumentException("There is no " +
enumClass.getSimpleName()
+ + " enum with ordinal '" + enumOrdinal +
"'");
+ }
+ } catch (NumberFormatException nfe) {
+ String ucaseValue = value.toUpperCase();
+ for (Enum<?> nextEnum : enumValues) {
+ if (nextEnum.name().toUpperCase().equals(ucaseValue)) {
+ return nextEnum;
+ }
+ }
+ throw new IllegalArgumentException("There is no " +
enumClass.getSimpleName() + " enum with name '"
+ + value + "'");
+ }
+ }
+ }
+ return value;
+ }
+
+ /**
+ * Used to create queries to use with the {@link
org.rhq.core.domain.util.PageControl} objects. The query will already have its sort
column
+ * and order appended as well as having its first result and max results set
according to the page control data.
+ *
+ * @param entityManager your entity manager
+ * @param queryName name of the query
+ * @param pageControl the controls on the paging and sorting
+ *
+ * @return a preconfigured query for ordered pagination
+ */
+ public static Query createQueryWithOrderBy(EntityManager entityManager, String
queryName, PageControl pageControl) {
+ Query query;
+
+ if (pageControl.getPrimarySortColumn() != null) {
+ query = createQueryWithOrderBy(entityManager, queryName,
pageControl.getOrderingFieldsAsArray());
+ } else {
+ StackTraceElement caller = new
Throwable().fillInStackTrace().getStackTrace()[1];
+ LOG.warn("Queries should really supply default sort columns. Caller did
not: " + caller);
+
+ // Use the standard named query if no sorting is specified
+ query = entityManager.createNamedQuery(queryName);
+ }
+
+ setDataPage(query, pageControl);
+
+ return query;
+ }
+
+ /**
+ * Create a query from a named query with a transformed order by clause with multiple
new ordery by clauses.
+ *
+ * @param entityManager the entity manager to build the query against
+ * @param queryName the name of the query to transform
+ * @param orderByFields an array of clauses to contribute to the order by
+ *
+ * @return the transformed query
+ */
+ public static Query createQueryWithOrderBy(EntityManager entityManager, String
queryName,
+ OrderingField... orderByFields) {
+ NamedQueryDefinition ndc = getNamedQueryDefinition(entityManager, queryName);
+ StringBuilder query = new StringBuilder(ndc.getQueryString());
+ buildOrderBy(query, orderByFields);
+ return entityManager.createQuery(query.toString());
+ }
+
+ private static StringBuilder buildOrderBy(StringBuilder query, OrderingField...
orderByFields) {
+ boolean first = true;
+ for (OrderingField orderingField : orderByFields) {
+ if (first) {
+ // TODO GH: We could see if there already is an order by clause and
contribute or override it
+ query.append(" ORDER BY ");
+ first = false;
+ } else {
+ query.append(", ");
+ }
+
+ query.append(orderingField.getField()).append("
").append(orderingField.getOrdering());
+ }
+
+ return query;
+ }
+
+ private static String getOrderByFragment(OrderingField... orderByFields) {
+ boolean first = true;
+ StringBuilder builder = new StringBuilder();
+ for (OrderingField orderingField : orderByFields) {
+ if (first) {
+ builder.append(" ORDER BY ");
+ first = false;
+ } else {
+ builder.append(", ");
+ }
+
+ builder.append(orderingField.getField()).append("
").append(orderingField.getOrdering());
+ }
+
+ return builder.toString();
+ }
+
+ /**
+ * Builds a count(*) version of the named query so we don't have duplicate all
our queries to use two query
+ * pagination model.
+ *
+ * @param em the entity manager to build the query for
+ * @param queryName the NamedQuery to transform
+ *
+ * @return a query that can be bound and executed to get the total count of results
+ */
+ public static Query createCountQuery(EntityManager em, String queryName) {
+ return createCountQuery(em, queryName, "*");
+ }
+
+ /**
+ * Builds a count(*) version of the named query so we don't have duplicate all
our queries to use two query
+ * pagination model.
+ *
+ * @param entityManager the entity manager to build the query for
+ * @param queryName the NamedQuery to transform
+ * @param countItem the object or attribute that needs to be counted, when
it's ambiguous
+ *
+ * @return a query that can be bound and executed to get the total count of results
+ */
+ public static Query createCountQuery(EntityManager entityManager, String queryName,
String countItem) {
+ NamedQueryDefinition namedQueryDefinition =
getNamedQueryDefinition(entityManager, queryName);
+ String query = namedQueryDefinition.getQueryString();
+
+ Matcher matcher = COUNT_QUERY_PATTERN.matcher(query);
+ if (!matcher.find()) {
+ throw new RuntimeException("Unable to transform query into count query
[" + queryName + " - " + query + "]");
+ }
+
+ String newQuery = matcher.group(1) + "COUNT(" + countItem +
")" + matcher.group(3);
+
+ matcher = COUNT_QUERY_REMOVE_FETCH.matcher(newQuery);
+ if (matcher.find()) {
+ StringBuffer buffer = new StringBuffer();
+ do {
+ matcher.appendReplacement(buffer, "");
+ } while (matcher.find());
+ matcher.appendTail(buffer);
+ newQuery = buffer.toString();
+ }
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Transformed query to count query [" + queryName +
"] resulting in [" + newQuery + "]");
+ }
+
+ return entityManager.createQuery(newQuery);
+ }
+
+ public static void setDataPage(Query query, PageControl pageControl) {
+ if (pageControl.getPageSize() > 0) {
+ query.setFirstResult(pageControl.getStartRow());
+ query.setMaxResults(pageControl.getPageSize());
+ }
+ }
+
+ /**
+ * Creates and executes a filter query for a collection relationship. This executes
without passing back the query
+ * object because the most common case is to simply paginate for a relationship. Use
the createFilter method to
+ * create more generic filters and get access to the hibernate query object for
setting parameters etc.
+ *
+ * @param entityManager
+ * @param collection
+ * @param pageControl
+ *
+ * @return the result list of the entities from the filtered relationship
+ */
+ @SuppressWarnings("unchecked")
+ public static PageList createPaginationFilter(EntityManager entityManager, Collection
collection,
+ PageControl pageControl) {
+ if (collection == null) {
+ return new PageList(pageControl);
+ }
+
+ String filter = "";
+ if (pageControl.getPrimarySortColumn() != null) {
+ PageOrdering order = (pageControl.getPrimarySortOrder() == null) ?
PageOrdering.ASC : pageControl
+ .getPrimarySortOrder();
+ filter = getOrderByFragment(new
OrderingField(pageControl.getPrimarySortColumn(), order));
+ }
+
+ org.hibernate.Query query =
getHibernateSession(entityManager).createFilter(collection, filter);
+ if (pageControl.getPageSize() > 0) {
+ query.setFirstResult(pageControl.getPageNumber() *
pageControl.getPageSize());
+ query.setMaxResults(pageControl.getPageSize());
+ }
+
+ // TODO GH: Always flushing is probably not what we really want here
+ // relationship filters don't seem to cause the proper flush, so manually
flush
+ getHibernateSession(entityManager).flush();
+
+ // TODO GH: This can only create unbounded PageLists since I don't know how
to do a count query to find the size
+ return new PageList<Object>(query.list(), pageControl);
+ }
+
+ /**
+ * Use this inside subclasses as a convenience method.
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> List<T> findByCriteria(EntityManager entityManager,
Class<T> type,
+ org.hibernate.criterion.Criterion... criterion) {
+ // Using Hibernate, more difficult with EntityManager and EJB-QL
+ org.hibernate.Criteria crit =
getHibernateSession(entityManager).createCriteria(type);
+ for (org.hibernate.criterion.Criterion c : criterion) {
+ crit.add(c);
+ }
+
+ return crit.list();
+ }
+
+ public static Session getHibernateSession(EntityManager entityManager) {
+ Session session;
+ if (entityManager.getDelegate() instanceof EntityManagerImpl) {
+ EntityManagerImpl entityManagerImpl = (EntityManagerImpl)
entityManager.getDelegate();
+ session = entityManagerImpl.getSession();
+ } else {
+ session = (Session) entityManager.getDelegate();
+ }
+
+ return session;
+ }
+
+ /**
+ * Enables the hibernate statistics mbean to provide access to information on the
ejb3 persistence tier.
+ *
+ * @param entityManager an inject entity manager whose session factory will be
tracked with these statistics
+ * @param server the MBeanServer where the statistics MBean should be
registered; if <code>null</code>, the
+ * first one in the list returned by
MBeanServerFactory.findMBeanServer(null) is used
+ */
+ public static void enableHibernateStatistics(EntityManager entityManager, MBeanServer
server) {
+ try {
+ SessionFactory sessionFactory =
PersistenceUtility.getHibernateSession(entityManager).getSessionFactory();
+
+ if (server == null) {
+ ArrayList<MBeanServer> list =
MBeanServerFactory.findMBeanServer(null);
+ server = list.get(0);
+ }
+
+ ObjectName objectName = new
ObjectName(HIBERNATE_STATISTICS_MBEAN_OBJECTNAME);
+ StatisticsService mBean = new StatisticsService();
+ mBean.setSessionFactory(sessionFactory);
+ server.registerMBean(mBean, objectName);
+ sessionFactory.getStatistics().setStatisticsEnabled(true);
+ } catch (InstanceAlreadyExistsException iaee) {
+ LOG.info("Duplicate mbean registration ignored: " +
HIBERNATE_STATISTICS_MBEAN_OBJECTNAME);
+ } catch (Exception e) {
+ LOG.warn("Couldn't register hibernate statistics mbean", e);
+ }
+ }
+
+ public static Statistics getStatisticsService(EntityManager entityManager,
MBeanServer server) {
+ Session hibernateSession =
PersistenceUtility.getHibernateSession(entityManager);
+ SessionFactory hibernateSessionFactory = hibernateSession.getSessionFactory();
+ Statistics hibernateStatistics = hibernateSessionFactory.getStatistics();
+ return hibernateStatistics;
+ }
+
+ private static NamedQueryDefinition getNamedQueryDefinition(EntityManager
entityManager, String queryName) {
+ SessionFactoryImplementor sessionFactory =
getHibernateSessionFactoryImplementor(entityManager);
+ NamedQueryDefinition namedQueryDefinition =
sessionFactory.getNamedQuery(queryName);
+ if (namedQueryDefinition == null) {
+ throw new RuntimeException("EJB3 query not found [" + queryName +
"]");
+ }
+
+ return namedQueryDefinition;
+ }
+
+ private static SessionFactoryImplementor
getHibernateSessionFactoryImplementor(EntityManager entityManager) {
+ Session session = getHibernateSession(entityManager);
+ SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor)
session.getSessionFactory();
+ return sessionFactory;
+ }
+
+ // wanted to combine postgres and oracle methods, but org.rhq.core.db.DatabaseType
objects are not visible to domain
+ public static String addPostgresNativePagingSortingToQuery(String query, PageControl
pageControl) {
+ return addLimitOffsetToQuery(query, pageControl);
+ }
+
+ // wanted to combine postgres and oracle methods, but org.rhq.core.db.DatabaseType
objects are not visible to domain
+ public static String addOracleNativePagingSortingToQuery(String query, PageControl
pageControl) {
+ StringBuilder queryWithPagingSorting = new StringBuilder(query.length() + 50);
+
+ int minRowNum = pageControl.getStartRow() + 1;
+ int maxRowNum = minRowNum + pageControl.getPageSize() - 1;
+
+ // pagination calculations based off of double-projection of the results
+ queryWithPagingSorting.append("SELECT outerResults.* FROM ( ");
+
+ queryWithPagingSorting.append("SELECT innerResults.*, ROWNUM rnum FROM (
");
+ queryWithPagingSorting.append(query);
+ // for oracle, order by occurs at the end of the original query, whether grouped
or not
+
queryWithPagingSorting.append(getOrderByFragment(pageControl.getOrderingFieldsAsArray()));
+ queryWithPagingSorting.append(" ) innerResults ");
+
+ // for oracle, paginate high off of the inner projection
+ queryWithPagingSorting.append(" WHERE ROWNUM <=
").append(maxRowNum);
+
+ // for oracle, paginate low off of the outer projection
+ queryWithPagingSorting.append(" ) outerResults ");
+ queryWithPagingSorting.append(" WHERE rnum >= ").append(minRowNum);
+
+ return queryWithPagingSorting.toString();
+ }
+
+ /**
+ * Note: always put the rownum column at the END of the columns, so that code
+ * which relies on index-based access to the result set data doesn't break
+ *
+ * Method 1:
+ *
+ * SELECT outerResults.* FROM (
+ * SELECT innerResults.*,
+ * ROW_NUMBER() OVER( {orderByClause} ) AS rownum
+ * FROM ( {queryWithoutOrderBy} ) AS innerResults
+ * ) AS outerResults
+ * WHERE rownum <= maxRowNum AND rownum >= minRowNum
+ *
+ * The above method fails in circumstances where the orderByClause is built up with
+ * aliases that aren't in the explicit select list returned from
queryWithoutOrderBy
+ *
+ *
+ * Method 2:
+ *
+ * Fix above shortcomings by pushing the orderByClause into the actual select list
+ *
+ * SELECT singleResults.* FROM (
+ * {queryWithoutOrderBySelectList}
+ * , ROW_NUMBER() OVER( {orderByClause} ) AS rownum
+ * {queryWithoutOrderByRestOfQuery}
+ * ) AS singleResults
+ * WHERE rownum <= maxRowNum AND rownum >= minRowNum
+ *
+ *
+ * Actually, both of the above methods have small flaws. The first can not sort by
columns that
+ * aren't in the explicit return list. The second can not sort by computed
columns and subqueries
+ * in the select list. The only way I see how this can work is by modifying the
queryWithoutOrderBy
+ * to explicitly return all parameters that will be sorted on (even if the use case
wouldn't normally
+ * require them to be in the select list), alias them, and order by the aliases by
modifying the web
+ * ui code to use those tokens when generating the sortable column headers (jmarques
- June/2009)
+ */
+ public static String addSQLServerNativePagingSortingToQuery(String query, PageControl
pageControl) {
+ return addSQLServerNativePagingSortingToQuery(query, pageControl, false);
+ }
+
+ public static String addSQLServerNativePagingSortingToQuery(String query, PageControl
pageControl,
+ boolean alternatePagingStyle) {
+ StringBuilder queryWithPagingSorting = new StringBuilder(query.length() + 50);
+
+ int minRowNum = pageControl.getStartRow() + 1;
+ int maxRowNum = minRowNum + pageControl.getPageSize() - 1;
+
+ String orderByClause =
getOrderByFragment(pageControl.getOrderingFieldsAsArray());
+
+ if (alternatePagingStyle) {
+ int index = findSelectListEndIndex(query);
+ String selectList = query.substring(0, index);
+ String restOfQuery = query.substring(index);
+ queryWithPagingSorting.append("SELECT singleResults.* FROM ( ");
+ queryWithPagingSorting.append(selectList);
+ queryWithPagingSorting.append(", ROW_NUMBER() OVER( " +
orderByClause + " ) AS rownum ");
+ queryWithPagingSorting.append(restOfQuery);
+ queryWithPagingSorting.append(") AS singleResults ");
+ } else {
+ queryWithPagingSorting.append("SELECT outerResults.* FROM ( ");
+ queryWithPagingSorting.append(" SELECT innerResults.*, ");
+ queryWithPagingSorting.append(" ROW_NUMBER() OVER( " +
orderByClause + " ) AS rownum ");
+ queryWithPagingSorting.append(" FROM ( " + query + " ) AS
innerResults ");
+ queryWithPagingSorting.append(" ) AS outerResults ");
+ }
+ queryWithPagingSorting.append("WHERE rownum <=
").append(maxRowNum);
+ queryWithPagingSorting.append(" AND rownum >= ").append(minRowNum);
+
+ return queryWithPagingSorting.toString();
+ }
+
+ // beginning of from clause (not counting retrievals via subqueries) should indicate
end of select list
+ private static int findSelectListEndIndex(String query) {
+ int nesting = 0;
+ query = query.toLowerCase();
+ StringBuilder wordBuffer = new StringBuilder();
+ for (int i = 0; i < query.length(); i++) {
+ char next = query.charAt(i);
+ if (next == '(') {
+ nesting++;
+ } else if (next == ')') {
+ nesting--;
+ } else {
+ if (nesting != 0) {
+ continue;
+ }
+ if (Character.isLetter(next)) {
+ wordBuffer.append(next);
+ if (wordBuffer.toString().equals("from")) {
+ return i - 4; // return index representing the character just
before "from"
+ }
+ } else {
+ wordBuffer.setLength(0); // clear buffer if we find any non-letter
+ }
+ }
+ }
+ throw new IllegalArgumentException("Could not find select list end
index");
+ }
+
+ // wanted to combine postgres and oracle methods, but org.rhq.core.db.DatabaseType
objects are not visible to domain
+ public static String addH2NativePagingSortingToQuery(String query, PageControl
pageControl) {
+ return addLimitOffsetToQuery(query, pageControl);
+ }
+
+ private static String addLimitOffsetToQuery(String query, PageControl pageControl) {
+ StringBuilder queryWithPagingSorting = new StringBuilder(query.length() + 50);
+ queryWithPagingSorting.append(query);
+
+ // for postgres, first order by
+
queryWithPagingSorting.append(getOrderByFragment(pageControl.getOrderingFieldsAsArray()));
+
+ // for postgres, then paginate
+ queryWithPagingSorting.append(" LIMIT
").append(pageControl.getPageSize());
+ queryWithPagingSorting.append(" OFFSET
").append(pageControl.getStartRow());
+
+ return queryWithPagingSorting.toString();
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
index e24805c..6963141 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
@@ -29,7 +29,7 @@ import java.util.List;
/**
* Used to pass information on pagination and sorting to data lookup methods.
- * {@link org.rhq.core.server.PersistenceUtility} provides several methods
+ * {@link org.rhq.core.domain.server.PersistenceUtility} provides several methods
* that can be called to apply PageControls to various types of queries.
*
* @author Greg Hinkle
diff --git a/modules/core/domain/src/main/java/org/rhq/core/server/EntitySerializer.java
b/modules/core/domain/src/main/java/org/rhq/core/server/EntitySerializer.java
deleted file mode 100644
index cdacd46..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/server/EntitySerializer.java
+++ /dev/null
@@ -1,296 +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.server;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Id;
-
-import org.rhq.core.domain.resource.Agent;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.server.ExternalizableStrategy.Subsystem;
-
-/**
- * A utility specifically tailored to entities which will iterate over its persistence
fields with a consistent
- * ordering for serialization and deserialization. If this class is passed a non-entity
object, it will ignore
- * field-level annotations and just serialize and deserialize all fields in that object.
- *
- * @author Joseph Marques
- */
-public class EntitySerializer {
- private static Set<Class<? extends Annotation>> PERSISTENCE_ANNOTATIONS =
new HashSet<Class<? extends Annotation>>();
- static {
- PERSISTENCE_ANNOTATIONS.add(Id.class);
- PERSISTENCE_ANNOTATIONS.add(Column.class);
- PERSISTENCE_ANNOTATIONS.add(ManyToOne.class);
- PERSISTENCE_ANNOTATIONS.add(OneToMany.class);
- PERSISTENCE_ANNOTATIONS.add(ManyToMany.class);
- }
-
- private static Set<Class<?>> BASIC_TYPES = new
HashSet<Class<?>>();
- static {
- BASIC_TYPES.add(Byte.TYPE);
- BASIC_TYPES.add(Short.TYPE);
- BASIC_TYPES.add(Integer.TYPE);
- BASIC_TYPES.add(Long.TYPE);
- BASIC_TYPES.add(Float.TYPE);
- BASIC_TYPES.add(Double.TYPE);
- BASIC_TYPES.add(Boolean.TYPE);
- }
-
- private static Comparator<Field> fieldComparator = new
Comparator<Field>() {
- public int compare(Field first, Field second) {
- return first.getName().compareTo(second.getName());
- }
- };
-
- private static Field[] getFields(Object object) {
- Class<?> objectClass = object.getClass();
- Entity entityAnnotation = objectClass.getAnnotation(Entity.class);
-
- List<Field> serializableFields;
- if (entityAnnotation == null) {
- serializableFields = getNonEntityFieldList(object);
- } else {
- serializableFields = getEntityFieldList(object);
- }
-
- Collections.sort(serializableFields, fieldComparator);
-
- Field[] results = serializableFields.toArray(new
Field[serializableFields.size()]);
- return results;
- }
-
- private static List<Field> getNonEntityFieldList(Object object) {
- Class<?> objectClass = object.getClass();
- Field[] fields = objectClass.getDeclaredFields();
- List<Field> serializableFields = new ArrayList<Field>();
-
- for (Field field : fields) {
- serializableFields.add(field);
- field.setAccessible(true);
- }
-
- return serializableFields;
- }
-
- private static List<Field> getEntityFieldList(Object entity) {
- Class<?> entityClass = entity.getClass();
- Entity entityAnnotation = entityClass.getAnnotation(Entity.class);
- if (entityAnnotation == null) {
- throw new IllegalArgumentException("EntitySerializer only introspects
objects annotated with @Entity ");
- }
-
- List<Field> serializableFields = new ArrayList<Field>();
-
- while (entityClass != null) {
-
- Field[] fields = entityClass.getDeclaredFields();
- for (Field field : fields) {
- Annotation[] fieldAnnotations = field.getAnnotations();
- for (Annotation fieldAnnotation : fieldAnnotations) {
- if
(PERSISTENCE_ANNOTATIONS.contains(fieldAnnotation.annotationType())) {
- serializableFields.add(field);
- field.setAccessible(true);
- break;
- }
- }
- }
- entityClass = entityClass.getSuperclass();
- }
-
- return serializableFields;
- }
-
- public static void writeExternalRemote(Object object, ObjectOutput out) throws
IOException {
- Field[] fields = getFields(object);
- for (Field field : fields) {
- //System.out.println("Serializing " + field.getName() +
"...");
- try {
- Class<?> type = field.getType();
- Object value = field.get(object);
-
- if (BASIC_TYPES.contains(type)) {
- if (type.equals(Byte.TYPE)) {
- out.writeByte((Byte) value);
- } else if (type.equals(Short.TYPE)) {
- out.writeShort((Short) value);
- } else if (type.equals(Integer.TYPE)) {
- out.writeInt((Integer) value);
- } else if (type.equals(Long.TYPE)) {
- out.writeLong((Long) value);
- } else if (type.equals(Float.TYPE)) {
- out.writeFloat((Float) value);
- } else if (type.equals(Double.TYPE)) {
- out.writeDouble((Double) value);
- } else if (type.equals(Boolean.TYPE)) {
- out.writeBoolean((Boolean) value);
- } else {
- throw new IllegalStateException(
- "BASIC_TYPES contains an entry that doesn't have
serialization support: " + type);
- }
- continue;
- }
-
- // either a string, an enum, numeric wrapper, collection, or some other
object
- out.writeObject(value);
- } catch (IllegalAccessException iae) {
- throw new IllegalStateException("Could not access field '"
+ field.getName() + "' for serialization");
- }
- }
- }
-
- public static void readExternalRemote(Object object, ObjectInput in) throws
IOException, ClassNotFoundException {
- Field[] fields = getFields(object);
- for (Field field : fields) {
- //System.out.println("Deserializing " + field.getName() +
"...");
- try {
- Class<?> type = field.getType();
-
- if (BASIC_TYPES.contains(type)) {
- if (type.equals(Byte.TYPE)) {
- field.setByte(object, in.readByte());
- } else if (type.equals(Short.TYPE)) {
- field.setShort(object, in.readShort());
- } else if (type.equals(Integer.TYPE)) {
- field.setInt(object, in.readInt());
- } else if (type.equals(Long.TYPE)) {
- field.setLong(object, in.readLong());
- } else if (type.equals(Float.TYPE)) {
- field.setFloat(object, in.readFloat());
- } else if (type.equals(Double.TYPE)) {
- field.setDouble(object, in.readDouble());
- } else if (type.equals(Boolean.TYPE)) {
- field.setBoolean(object, in.readBoolean());
- } else {
- throw new IllegalStateException(
- "BASIC_TYPES contains an entry that doesn't have
deserialization support: " + type);
- }
- continue;
- }
-
- // either a string, an enum, numeric wrapper, collection, or some other
object
- field.set(object, in.readObject());
- } catch (IllegalAccessException iae) {
- throw new IllegalStateException("Could not access field '"
+ field.getName() + "' for deserialization");
- }
- }
- }
-
- public static void main(String[] args) throws Exception {
- ExternalizableStrategy.setStrategy(Subsystem.REFLECTIVE_SERIALIZATION);
-
- // create objects
- Agent writeAgent = new Agent("reflectiveAgent",
"reflectiveAddress", 0, "reflectiveEndpoint",
"reflectiveToken");
-
- ResourceType writeResourceType = new ResourceType();
- writeResourceType.setName("reflectiveType");
- writeResourceType.setPlugin("reflectivePlugin");
- writeResourceType.setId(7);
-
- Resource writeParentResource = new Resource();
- writeParentResource.setId(11);
- writeParentResource.setName("reflectiveParentResource");
- writeParentResource.setResourceKey("reflectiveParentKey");
-
- Resource writeResource = new Resource();
- writeResource.setId(42);
- writeResource.setName("reflectiveResource");
- writeResource.setResourceKey("reflectiveKey");
-
- // setup relationships
- writeResource.setAgent(writeAgent);
- writeResource.setResourceType(writeResourceType);
- writeResource.setParentResource(writeParentResource);
-
- System.out.println("BEFORE");
- System.out.println(writeResource.toString());
- System.out.println("BEFORE");
-
- String tempDir = System.getProperty("java.io.tmpdir");
- File tempFile = new File(tempDir, "entitySerializerTest.txt");
-
- FileOutputStream fos = new FileOutputStream(tempFile);
- try {
- ObjectOutput output = new ObjectOutputStream(fos);
- try {
- writeExternalRemote(writeResource, output);
- } finally {
- output.close();
- }
- } finally {
- fos.close();
- }
-
- Resource readResource = new Resource();
- FileInputStream fis = new FileInputStream(tempFile);
- try {
- ObjectInput ois = new ObjectInputStream(fis);
- try {
- readExternalRemote(readResource, ois);
- } finally {
- ois.close();
- }
- } finally {
- fis.close();
- }
-
- // quick verification
- System.out.println("AFTER");
- System.out.println(readResource.toString());
- System.out.println("AFTER");
-
- // deeper verification
- boolean equalsResource = writeResource.equals(readResource);
- boolean equalsParentResource =
writeParentResource.equals(readResource.getParentResource());
- boolean equalsResourceType =
writeResourceType.equals(readResource.getResourceType());
- boolean equalsAgent = writeAgent.equals(readResource.getAgent());
-
- System.out.println("equalsResource: " + equalsResource);
- System.out.println("equalsParentResource: " + equalsParentResource);
- System.out.println("equalsResourceType: " + equalsResourceType);
- System.out.println("equalsAgent: " + equalsAgent);
- }
-
-}
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/server/ExternalizableStrategy.java
b/modules/core/domain/src/main/java/org/rhq/core/server/ExternalizableStrategy.java
deleted file mode 100644
index a43fcdc..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/server/ExternalizableStrategy.java
+++ /dev/null
@@ -1,64 +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.server;
-
-/**
- * This uses a ThreadLocal to bind an externalization strategy based on the invoking
subsystem. In other
- * words, when we know we're serializing for Server-Agent communication then set to
AGENT, when we know we're
- * serializing for RemoteClient-Server communication set to REMOTEAPI. By keeping this
info on the thread
- * we avoid having to tag all of the relevant objects that will be serialized.
- *
- * @author jay shaughnessy
- */
-public class ExternalizableStrategy {
-
- public enum Subsystem {
- AGENT((char) 1), // set bidirectionally for agent<--->server communication
- REFLECTIVE_SERIALIZATION((char) 3); // set unidirectionally for both
CLI-->server and WS-->server communication
-
- private char id;
-
- Subsystem(char id) {
- this.id = id;
- }
-
- public char id() {
- return id;
- }
- }
-
- private static ThreadLocal<Subsystem> strategy = new
ThreadLocal<Subsystem>() {
-
- protected ExternalizableStrategy.Subsystem initialValue() {
- return Subsystem.AGENT;
- }
- };
-
- public static Subsystem getStrategy() {
- return strategy.get();
- }
-
- public static void setStrategy(Subsystem newStrategy) {
- strategy.set(newStrategy);
- }
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/server/H2CustomDialect.java
b/modules/core/domain/src/main/java/org/rhq/core/server/H2CustomDialect.java
deleted file mode 100644
index cbbb8c5..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/server/H2CustomDialect.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.core.server;
-
-import org.hibernate.dialect.H2Dialect;
-
-/**
- * This class extends the basic H2Dialect that comes in the
- * Hibernate core distribution to force it to use sequences
- * for H2 database.
- *
- * @author Joseph Marques
- */
-public class H2CustomDialect extends H2Dialect {
-
- @Override
- public boolean supportsIdentityColumns() {
- /*
- * By default, GeneratorType.AUTO strategy will choose IDENTITY if a database
supports it.
- * However, the embedded database was originally written using sequences. Later,
SQL Server
- * support was added which required changing the generation strategy from
SEQUENCE to AUTO.
- * This broke support for the embedded database because the H2Dialect was trying
to use
- * identity data types for key columns, which the H2DatabaseType did not support.
This hack
- * basically tricks Hibernate into believing that H2 doesn't support identity
types, which
- * then forces it to fall back to using the SEQUENCE strategy.
- */
- return false;
- }
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/server/PersistenceUtility.java
b/modules/core/domain/src/main/java/org/rhq/core/server/PersistenceUtility.java
deleted file mode 100644
index 82c315e..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/server/PersistenceUtility.java
+++ /dev/null
@@ -1,563 +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.server;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.MBeanServer;
-import javax.management.MBeanServerFactory;
-import javax.management.ObjectName;
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.ejb.EntityManagerImpl;
-import org.hibernate.engine.NamedQueryDefinition;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.jmx.StatisticsService;
-import org.hibernate.stat.Statistics;
-import org.hibernate.type.CustomType;
-import org.hibernate.type.EntityType;
-import org.hibernate.type.PrimitiveType;
-import org.hibernate.type.Type;
-
-import org.rhq.core.domain.util.OrderingField;
-import org.rhq.core.domain.util.PageControl;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.core.domain.util.PageOrdering;
-
-/**
- * Various persistence utility methods - mostly Hibernate-specific.
- *
- * @author Heiko Rupp
- * @author Joseph Marques
- * @author Greg Hinkle
- */
-public class PersistenceUtility {
- private static final Log LOG = LogFactory.getLog(PersistenceUtility.class);
-
- private static final Pattern COUNT_QUERY_PATTERN =
Pattern.compile("^(\\s*SELECT\\s+)(.*?)(\\s+FROM.*)",
- Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- private static final Pattern COUNT_QUERY_REMOVE_FETCH =
Pattern.compile("FETCH", Pattern.CASE_INSENSITIVE
- | Pattern.MULTILINE | Pattern.DOTALL);
-
- public static final String HIBERNATE_STATISTICS_MBEAN_OBJECTNAME =
"Hibernate:type=statistics,application=RHQ";
-
- @SuppressWarnings("unchecked")
- // used in hibernate.jsp
- public static String getDisplayString(Type hibernateType) {
- if (hibernateType instanceof EntityType) {
- return hibernateType.getName() + " (enter integer of ID / primary key
field)";
- } else if (hibernateType instanceof CustomType) {
- if (Enum.class.isAssignableFrom(hibernateType.getReturnedClass())) {
- Class<? extends Enum<?>> enumClass = (Class<? extends
Enum<?>>) hibernateType.getReturnedClass();
- StringBuilder result = new StringBuilder();
- result.append(enumClass.getName());
- result.append(" (");
- boolean first = true;
- for (Enum<?> nextEnum : enumClass.getEnumConstants()) {
- if (!first) {
- result.append(" | ");
- } else {
- first = false;
- }
- result.append(nextEnum.name());
- }
- result.append(")");
- return result.toString();
- }
- }
- return hibernateType == null ? "" : hibernateType.getName();
- }
-
- @SuppressWarnings("unchecked")
- // used in hibernate.jsp
- public static Object cast(String value, Type hibernateType) {
- if (hibernateType instanceof PrimitiveType) {
- Class<?> type = ((PrimitiveType) hibernateType).getPrimitiveClass();
- if (type.equals(Byte.TYPE)) {
- return Byte.valueOf(value);
- } else if (type.equals(Short.TYPE)) {
- return Short.valueOf(value);
- } else if (type.equals(Integer.TYPE)) {
- return Integer.valueOf(value);
- } else if (type.equals(Long.TYPE)) {
- return Long.valueOf(value);
- } else if (type.equals(Float.TYPE)) {
- return Float.valueOf(value);
- } else if (type.equals(Double.TYPE)) {
- return Double.valueOf(value);
- } else if (type.equals(Boolean.TYPE)) {
- return Boolean.valueOf(value);
- }
- } else if (hibernateType instanceof EntityType) {
- String entityName = ((EntityType) hibernateType).getAssociatedEntityName();
- try {
- Class<?> entityClass = Class.forName(entityName);
- Object entity = entityClass.newInstance();
-
- Field primaryKeyField = entityClass.getDeclaredField("id");
- primaryKeyField.setAccessible(true);
- primaryKeyField.setInt(entity, Integer.valueOf(value));
- return entity;
- } catch (Throwable t) {
- throw new IllegalArgumentException("Type[" + entityName +
"] must have PK field named 'id'");
- }
- } else if (hibernateType instanceof CustomType) {
- if (Enum.class.isAssignableFrom(hibernateType.getReturnedClass())) {
- Class<? extends Enum<?>> enumClass =
hibernateType.getReturnedClass();
- Enum<?>[] enumValues = enumClass.getEnumConstants();
- try {
- int enumOrdinal = Integer.valueOf(value);
- try {
- return enumValues[enumOrdinal];
- } catch (ArrayIndexOutOfBoundsException aioobe) {
- throw new IllegalArgumentException("There is no " +
enumClass.getSimpleName()
- + " enum with ordinal '" + enumOrdinal +
"'");
- }
- } catch (NumberFormatException nfe) {
- String ucaseValue = value.toUpperCase();
- for (Enum<?> nextEnum : enumValues) {
- if (nextEnum.name().toUpperCase().equals(ucaseValue)) {
- return nextEnum;
- }
- }
- throw new IllegalArgumentException("There is no " +
enumClass.getSimpleName() + " enum with name '"
- + value + "'");
- }
- }
- }
- return value;
- }
-
- /**
- * Used to create queries to use with the {@link
org.rhq.core.domain.util.PageControl} objects. The query will already have its sort
column
- * and order appended as well as having its first result and max results set
according to the page control data.
- *
- * @param entityManager your entity manager
- * @param queryName name of the query
- * @param pageControl the controls on the paging and sorting
- *
- * @return a preconfigured query for ordered pagination
- */
- public static Query createQueryWithOrderBy(EntityManager entityManager, String
queryName, PageControl pageControl) {
- Query query;
-
- if (pageControl.getPrimarySortColumn() != null) {
- query = createQueryWithOrderBy(entityManager, queryName,
pageControl.getOrderingFieldsAsArray());
- } else {
- StackTraceElement caller = new
Throwable().fillInStackTrace().getStackTrace()[1];
- LOG.warn("Queries should really supply default sort columns. Caller did
not: " + caller);
-
- // Use the standard named query if no sorting is specified
- query = entityManager.createNamedQuery(queryName);
- }
-
- setDataPage(query, pageControl);
-
- return query;
- }
-
- /**
- * Create a query from a named query with a transformed order by clause with multiple
new ordery by clauses.
- *
- * @param entityManager the entity manager to build the query against
- * @param queryName the name of the query to transform
- * @param orderByFields an array of clauses to contribute to the order by
- *
- * @return the transformed query
- */
- public static Query createQueryWithOrderBy(EntityManager entityManager, String
queryName,
- OrderingField... orderByFields) {
- NamedQueryDefinition ndc = getNamedQueryDefinition(entityManager, queryName);
- StringBuilder query = new StringBuilder(ndc.getQueryString());
- buildOrderBy(query, orderByFields);
- return entityManager.createQuery(query.toString());
- }
-
- private static StringBuilder buildOrderBy(StringBuilder query, OrderingField...
orderByFields) {
- boolean first = true;
- for (OrderingField orderingField : orderByFields) {
- if (first) {
- // TODO GH: We could see if there already is an order by clause and
contribute or override it
- query.append(" ORDER BY ");
- first = false;
- } else {
- query.append(", ");
- }
-
- query.append(orderingField.getField()).append("
").append(orderingField.getOrdering());
- }
-
- return query;
- }
-
- private static String getOrderByFragment(OrderingField... orderByFields) {
- boolean first = true;
- StringBuilder builder = new StringBuilder();
- for (OrderingField orderingField : orderByFields) {
- if (first) {
- builder.append(" ORDER BY ");
- first = false;
- } else {
- builder.append(", ");
- }
-
- builder.append(orderingField.getField()).append("
").append(orderingField.getOrdering());
- }
-
- return builder.toString();
- }
-
- /**
- * Builds a count(*) version of the named query so we don't have duplicate all
our queries to use two query
- * pagination model.
- *
- * @param em the entity manager to build the query for
- * @param queryName the NamedQuery to transform
- *
- * @return a query that can be bound and executed to get the total count of results
- */
- public static Query createCountQuery(EntityManager em, String queryName) {
- return createCountQuery(em, queryName, "*");
- }
-
- /**
- * Builds a count(*) version of the named query so we don't have duplicate all
our queries to use two query
- * pagination model.
- *
- * @param entityManager the entity manager to build the query for
- * @param queryName the NamedQuery to transform
- * @param countItem the object or attribute that needs to be counted, when
it's ambiguous
- *
- * @return a query that can be bound and executed to get the total count of results
- */
- public static Query createCountQuery(EntityManager entityManager, String queryName,
String countItem) {
- NamedQueryDefinition namedQueryDefinition =
getNamedQueryDefinition(entityManager, queryName);
- String query = namedQueryDefinition.getQueryString();
-
- Matcher matcher = COUNT_QUERY_PATTERN.matcher(query);
- if (!matcher.find()) {
- throw new RuntimeException("Unable to transform query into count query
[" + queryName + " - " + query + "]");
- }
-
- String newQuery = matcher.group(1) + "COUNT(" + countItem +
")" + matcher.group(3);
-
- matcher = COUNT_QUERY_REMOVE_FETCH.matcher(newQuery);
- if (matcher.find()) {
- StringBuffer buffer = new StringBuffer();
- do {
- matcher.appendReplacement(buffer, "");
- } while (matcher.find());
- matcher.appendTail(buffer);
- newQuery = buffer.toString();
- }
- if (LOG.isTraceEnabled()) {
- LOG.trace("Transformed query to count query [" + queryName +
"] resulting in [" + newQuery + "]");
- }
-
- return entityManager.createQuery(newQuery);
- }
-
- public static void setDataPage(Query query, PageControl pageControl) {
- if (pageControl.getPageSize() > 0) {
- query.setFirstResult(pageControl.getStartRow());
- query.setMaxResults(pageControl.getPageSize());
- }
- }
-
- /**
- * Creates and executes a filter query for a collection relationship. This executes
without passing back the query
- * object because the most common case is to simply paginate for a relationship. Use
the createFilter method to
- * create more generic filters and get access to the hibernate query object for
setting parameters etc.
- *
- * @param entityManager
- * @param collection
- * @param pageControl
- *
- * @return the result list of the entities from the filtered relationship
- */
- @SuppressWarnings("unchecked")
- public static PageList createPaginationFilter(EntityManager entityManager, Collection
collection,
- PageControl pageControl) {
- if (collection == null) {
- return new PageList(pageControl);
- }
-
- String filter = "";
- if (pageControl.getPrimarySortColumn() != null) {
- PageOrdering order = (pageControl.getPrimarySortOrder() == null) ?
PageOrdering.ASC : pageControl
- .getPrimarySortOrder();
- filter = getOrderByFragment(new
OrderingField(pageControl.getPrimarySortColumn(), order));
- }
-
- org.hibernate.Query query =
getHibernateSession(entityManager).createFilter(collection, filter);
- if (pageControl.getPageSize() > 0) {
- query.setFirstResult(pageControl.getPageNumber() *
pageControl.getPageSize());
- query.setMaxResults(pageControl.getPageSize());
- }
-
- // TODO GH: Always flushing is probably not what we really want here
- // relationship filters don't seem to cause the proper flush, so manually
flush
- getHibernateSession(entityManager).flush();
-
- // TODO GH: This can only create unbounded PageLists since I don't know how
to do a count query to find the size
- return new PageList<Object>(query.list(), pageControl);
- }
-
- /**
- * Use this inside subclasses as a convenience method.
- */
- @SuppressWarnings("unchecked")
- public static <T> List<T> findByCriteria(EntityManager entityManager,
Class<T> type,
- org.hibernate.criterion.Criterion... criterion) {
- // Using Hibernate, more difficult with EntityManager and EJB-QL
- org.hibernate.Criteria crit =
getHibernateSession(entityManager).createCriteria(type);
- for (org.hibernate.criterion.Criterion c : criterion) {
- crit.add(c);
- }
-
- return crit.list();
- }
-
- public static Session getHibernateSession(EntityManager entityManager) {
- Session session;
- if (entityManager.getDelegate() instanceof EntityManagerImpl) {
- EntityManagerImpl entityManagerImpl = (EntityManagerImpl)
entityManager.getDelegate();
- session = entityManagerImpl.getSession();
- } else {
- session = (Session) entityManager.getDelegate();
- }
-
- return session;
- }
-
- /**
- * Enables the hibernate statistics mbean to provide access to information on the
ejb3 persistence tier.
- *
- * @param entityManager an inject entity manager whose session factory will be
tracked with these statistics
- * @param server the MBeanServer where the statistics MBean should be
registered; if <code>null</code>, the
- * first one in the list returned by
MBeanServerFactory.findMBeanServer(null) is used
- */
- public static void enableHibernateStatistics(EntityManager entityManager, MBeanServer
server) {
- try {
- SessionFactory sessionFactory =
PersistenceUtility.getHibernateSession(entityManager).getSessionFactory();
-
- if (server == null) {
- ArrayList<MBeanServer> list =
MBeanServerFactory.findMBeanServer(null);
- server = list.get(0);
- }
-
- ObjectName objectName = new
ObjectName(HIBERNATE_STATISTICS_MBEAN_OBJECTNAME);
- StatisticsService mBean = new StatisticsService();
- mBean.setSessionFactory(sessionFactory);
- server.registerMBean(mBean, objectName);
- sessionFactory.getStatistics().setStatisticsEnabled(true);
- } catch (InstanceAlreadyExistsException iaee) {
- LOG.info("Duplicate mbean registration ignored: " +
HIBERNATE_STATISTICS_MBEAN_OBJECTNAME);
- } catch (Exception e) {
- LOG.warn("Couldn't register hibernate statistics mbean", e);
- }
- }
-
- public static Statistics getStatisticsService(EntityManager entityManager,
MBeanServer server) {
- Session hibernateSession =
PersistenceUtility.getHibernateSession(entityManager);
- SessionFactory hibernateSessionFactory = hibernateSession.getSessionFactory();
- Statistics hibernateStatistics = hibernateSessionFactory.getStatistics();
- return hibernateStatistics;
- }
-
- private static NamedQueryDefinition getNamedQueryDefinition(EntityManager
entityManager, String queryName) {
- SessionFactoryImplementor sessionFactory =
getHibernateSessionFactoryImplementor(entityManager);
- NamedQueryDefinition namedQueryDefinition =
sessionFactory.getNamedQuery(queryName);
- if (namedQueryDefinition == null) {
- throw new RuntimeException("EJB3 query not found [" + queryName +
"]");
- }
-
- return namedQueryDefinition;
- }
-
- private static SessionFactoryImplementor
getHibernateSessionFactoryImplementor(EntityManager entityManager) {
- Session session = getHibernateSession(entityManager);
- SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor)
session.getSessionFactory();
- return sessionFactory;
- }
-
- // wanted to combine postgres and oracle methods, but org.rhq.core.db.DatabaseType
objects are not visible to domain
- public static String addPostgresNativePagingSortingToQuery(String query, PageControl
pageControl) {
- return addLimitOffsetToQuery(query, pageControl);
- }
-
- // wanted to combine postgres and oracle methods, but org.rhq.core.db.DatabaseType
objects are not visible to domain
- public static String addOracleNativePagingSortingToQuery(String query, PageControl
pageControl) {
- StringBuilder queryWithPagingSorting = new StringBuilder(query.length() + 50);
-
- int minRowNum = pageControl.getStartRow() + 1;
- int maxRowNum = minRowNum + pageControl.getPageSize() - 1;
-
- // pagination calculations based off of double-projection of the results
- queryWithPagingSorting.append("SELECT outerResults.* FROM ( ");
-
- queryWithPagingSorting.append("SELECT innerResults.*, ROWNUM rnum FROM (
");
- queryWithPagingSorting.append(query);
- // for oracle, order by occurs at the end of the original query, whether grouped
or not
-
queryWithPagingSorting.append(getOrderByFragment(pageControl.getOrderingFieldsAsArray()));
- queryWithPagingSorting.append(" ) innerResults ");
-
- // for oracle, paginate high off of the inner projection
- queryWithPagingSorting.append(" WHERE ROWNUM <=
").append(maxRowNum);
-
- // for oracle, paginate low off of the outer projection
- queryWithPagingSorting.append(" ) outerResults ");
- queryWithPagingSorting.append(" WHERE rnum >= ").append(minRowNum);
-
- return queryWithPagingSorting.toString();
- }
-
- /**
- * Note: always put the rownum column at the END of the columns, so that code
- * which relies on index-based access to the result set data doesn't break
- *
- * Method 1:
- *
- * SELECT outerResults.* FROM (
- * SELECT innerResults.*,
- * ROW_NUMBER() OVER( {orderByClause} ) AS rownum
- * FROM ( {queryWithoutOrderBy} ) AS innerResults
- * ) AS outerResults
- * WHERE rownum <= maxRowNum AND rownum >= minRowNum
- *
- * The above method fails in circumstances where the orderByClause is built up with
- * aliases that aren't in the explicit select list returned from
queryWithoutOrderBy
- *
- *
- * Method 2:
- *
- * Fix above shortcomings by pushing the orderByClause into the actual select list
- *
- * SELECT singleResults.* FROM (
- * {queryWithoutOrderBySelectList}
- * , ROW_NUMBER() OVER( {orderByClause} ) AS rownum
- * {queryWithoutOrderByRestOfQuery}
- * ) AS singleResults
- * WHERE rownum <= maxRowNum AND rownum >= minRowNum
- *
- *
- * Actually, both of the above methods have small flaws. The first can not sort by
columns that
- * aren't in the explicit return list. The second can not sort by computed
columns and subqueries
- * in the select list. The only way I see how this can work is by modifying the
queryWithoutOrderBy
- * to explicitly return all parameters that will be sorted on (even if the use case
wouldn't normally
- * require them to be in the select list), alias them, and order by the aliases by
modifying the web
- * ui code to use those tokens when generating the sortable column headers (jmarques
- June/2009)
- */
- public static String addSQLServerNativePagingSortingToQuery(String query, PageControl
pageControl) {
- return addSQLServerNativePagingSortingToQuery(query, pageControl, false);
- }
-
- public static String addSQLServerNativePagingSortingToQuery(String query, PageControl
pageControl,
- boolean alternatePagingStyle) {
- StringBuilder queryWithPagingSorting = new StringBuilder(query.length() + 50);
-
- int minRowNum = pageControl.getStartRow() + 1;
- int maxRowNum = minRowNum + pageControl.getPageSize() - 1;
-
- String orderByClause =
getOrderByFragment(pageControl.getOrderingFieldsAsArray());
-
- if (alternatePagingStyle) {
- int index = findSelectListEndIndex(query);
- String selectList = query.substring(0, index);
- String restOfQuery = query.substring(index);
- queryWithPagingSorting.append("SELECT singleResults.* FROM ( ");
- queryWithPagingSorting.append(selectList);
- queryWithPagingSorting.append(", ROW_NUMBER() OVER( " +
orderByClause + " ) AS rownum ");
- queryWithPagingSorting.append(restOfQuery);
- queryWithPagingSorting.append(") AS singleResults ");
- } else {
- queryWithPagingSorting.append("SELECT outerResults.* FROM ( ");
- queryWithPagingSorting.append(" SELECT innerResults.*, ");
- queryWithPagingSorting.append(" ROW_NUMBER() OVER( " +
orderByClause + " ) AS rownum ");
- queryWithPagingSorting.append(" FROM ( " + query + " ) AS
innerResults ");
- queryWithPagingSorting.append(" ) AS outerResults ");
- }
- queryWithPagingSorting.append("WHERE rownum <=
").append(maxRowNum);
- queryWithPagingSorting.append(" AND rownum >= ").append(minRowNum);
-
- return queryWithPagingSorting.toString();
- }
-
- // beginning of from clause (not counting retrievals via subqueries) should indicate
end of select list
- private static int findSelectListEndIndex(String query) {
- int nesting = 0;
- query = query.toLowerCase();
- StringBuilder wordBuffer = new StringBuilder();
- for (int i = 0; i < query.length(); i++) {
- char next = query.charAt(i);
- if (next == '(') {
- nesting++;
- } else if (next == ')') {
- nesting--;
- } else {
- if (nesting != 0) {
- continue;
- }
- if (Character.isLetter(next)) {
- wordBuffer.append(next);
- if (wordBuffer.toString().equals("from")) {
- return i - 4; // return index representing the character just
before "from"
- }
- } else {
- wordBuffer.setLength(0); // clear buffer if we find any non-letter
- }
- }
- }
- throw new IllegalArgumentException("Could not find select list end
index");
- }
-
- // wanted to combine postgres and oracle methods, but org.rhq.core.db.DatabaseType
objects are not visible to domain
- public static String addH2NativePagingSortingToQuery(String query, PageControl
pageControl) {
- return addLimitOffsetToQuery(query, pageControl);
- }
-
- private static String addLimitOffsetToQuery(String query, PageControl pageControl) {
- StringBuilder queryWithPagingSorting = new StringBuilder(query.length() + 50);
- queryWithPagingSorting.append(query);
-
- // for postgres, first order by
-
queryWithPagingSorting.append(getOrderByFragment(pageControl.getOrderingFieldsAsArray()));
-
- // for postgres, then paginate
- queryWithPagingSorting.append(" LIMIT
").append(pageControl.getPageSize());
- queryWithPagingSorting.append(" OFFSET
").append(pageControl.getStartRow());
-
- return queryWithPagingSorting.toString();
- }
-}
\ No newline at end of file
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/test/QueryAllTest.java
b/modules/core/domain/src/test/java/org/rhq/core/domain/test/QueryAllTest.java
index 57aba89..754d331 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/test/QueryAllTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/test/QueryAllTest.java
@@ -90,9 +90,9 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.GroupDefinition;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.exception.ThrowableUtil;
@SuppressWarnings("unchecked")
diff --git
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/ExternalizableStrategyCommandPreprocessor.java
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/ExternalizableStrategyCommandPreprocessor.java
index 8eef33b..a6c520f 100644
---
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/ExternalizableStrategyCommandPreprocessor.java
+++
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/ExternalizableStrategyCommandPreprocessor.java
@@ -18,7 +18,7 @@
*/
package org.rhq.enterprise.agent;
-import org.rhq.core.server.ExternalizableStrategy;
+import org.rhq.core.domain.server.ExternalizableStrategy;
import org.rhq.enterprise.communications.command.Command;
import org.rhq.enterprise.communications.command.client.ClientCommandSender;
import org.rhq.enterprise.communications.command.client.CommandPreprocessor;
diff --git
a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/core/RHQDomain.gwt.xml
b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/core/RHQDomain.gwt.xml
index 1be06f4..c8a85f0 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/core/RHQDomain.gwt.xml
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/core/RHQDomain.gwt.xml
@@ -35,6 +35,7 @@
<!-- Exclude any domain classes that can not be used client-side due to use of
unsupported class use -->
<exclude name="**/JPADriftFileBits.*"/> <!-- a server-side
entity that requires SQL Blob support -->
<exclude name="sync/**"/> <!-- a server-side package used by
the CLI to export system settings -->
+ <exclude name="server/**"/> <!-- a server-side package -->
</source>
<!--<generate-with
class="org.rhq.core.rebind.RecordBuilderGenerator">
diff --git
a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
index ae64ec4..1ee1741 100644
---
a/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
+++
b/modules/enterprise/gui/installer-war/src/main/java/org/rhq/enterprise/installer/ConfigurationBean.java
@@ -671,7 +671,7 @@ public class ConfigurationBean {
dialect = "org.hibernate.dialect.Oracle10gDialect";
quartzDriverDelegateClass =
"org.quartz.impl.jdbcjobstore.oracle.OracleDelegate";
} else if (db.toLowerCase().indexOf("h2") > -1) {
- dialect = "org.rhq.core.server.H2CustomDialect";
+ dialect = "org.rhq.core.domain.server.H2CustomDialect";
} else if (db.toLowerCase().indexOf("sqlserver") > -1) {
dialect = "org.hibernate.dialect.SQLServerDialect";
quartzDriverDelegateClass =
"org.quartz.impl.jdbcjobstore.MSSQLDelegate";
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
index 7ca48b2..2833c9e 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/ExternalizableStrategyCommandListener.java
@@ -18,7 +18,7 @@
*/
package org.rhq.enterprise.gui.startup;
-import org.rhq.core.server.ExternalizableStrategy;
+import org.rhq.core.domain.server.ExternalizableStrategy;
import org.rhq.enterprise.communications.command.Command;
import org.rhq.enterprise.communications.command.CommandResponse;
import org.rhq.enterprise.communications.command.client.CommandPreprocessor;
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/StartupServlet.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/StartupServlet.java
index 8b94c7b..651129c 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/StartupServlet.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/startup/StartupServlet.java
@@ -376,7 +376,7 @@ public class StartupServlet extends HttpServlet {
.getServiceContainer()
.addCommandListener(
new ExternalizableStrategyCommandListener(
- org.rhq.core.server.ExternalizableStrategy.Subsystem.AGENT));
+
org.rhq.core.domain.server.ExternalizableStrategy.Subsystem.AGENT));
} catch (Exception e) {
throw new ServletException("Cannot start the server-side communications
services.", e);
}
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/util/StatisticsUtility.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/util/StatisticsUtility.java
index 0a6bb59..be34373 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/util/StatisticsUtility.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/util/StatisticsUtility.java
@@ -23,7 +23,7 @@ import org.hibernate.stat.Statistics;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.enterprise.server.util.LookupUtil;
/**
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
index 67587db..e379377 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
@@ -1,7 +1,7 @@
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
-<%@ page import="org.rhq.core.server.PersistenceUtility" %>
+<%@ page import="org.rhq.core.domain.server.PersistenceUtility" %>
<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
<%@ page import="javax.naming.InitialContext" %>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/control.jsp
b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/control.jsp
index 0261703..1fbc38d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/control.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/control.jsp
@@ -3,7 +3,7 @@
<%@ page import="java.util.Map" %>
<%@ page import="org.rhq.core.domain.auth.Subject" %>
-<%@ page import="org.rhq.core.server.PersistenceUtility" %>
+<%@ page import="org.rhq.core.domain.server.PersistenceUtility" %>
<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils"%>
<%@ page import="org.rhq.enterprise.gui.util.WebUtility"%>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/hibernate.jsp
b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/hibernate.jsp
index c151a34..ce3f671 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/hibernate.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/hibernate.jsp
@@ -7,7 +7,7 @@
<%@ page import="org.hibernate.type.IntegerType" %>
<%@ page import="org.hibernate.type.LongType" %>
<%@ page import="org.hibernate.type.Type" %>
-<%@ page import="org.rhq.core.server.PersistenceUtility" %>
+<%@ page import="org.rhq.core.domain.server.PersistenceUtility" %>
<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
<%@ page import="javax.naming.InitialContext" %>
diff --git
a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/clientapi/RemoteClientProxy.java
b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/clientapi/RemoteClientProxy.java
index a3daeb7..e9751c2 100644
---
a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/clientapi/RemoteClientProxy.java
+++
b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/clientapi/RemoteClientProxy.java
@@ -29,7 +29,7 @@ import org.jboss.remoting.invocation.NameBasedInvocation;
import org.rhq.bindings.client.AbstractRhqFacadeProxy;
import org.rhq.bindings.client.RhqManagers;
import org.rhq.bindings.util.InterfaceSimplifier;
-import org.rhq.core.server.ExternalizableStrategy;
+import org.rhq.core.domain.server.ExternalizableStrategy;
/**
* This class acts as a local SLSB proxy to make remote invocations
diff --git
a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
index 73ef3e3..bb132fe 100644
---
a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
+++
b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
@@ -52,8 +52,8 @@ import org.rhq.core.domain.drift.JPADrift;
import org.rhq.core.domain.drift.JPADriftChangeSet;
import org.rhq.core.domain.drift.JPADriftFile;
import org.rhq.core.domain.drift.JPADriftSet;
+import org.rhq.core.domain.server.EntitySerializer;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.EntitySerializer;
import org.rhq.test.AssertUtils;
import org.rhq.test.TransactionCallback;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
index 76d9c3e..219af8d 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
@@ -28,7 +28,7 @@ import
org.rhq.core.clientapi.agent.measurement.MeasurementAgentService;
import org.rhq.core.clientapi.agent.operation.OperationAgentService;
import org.rhq.core.clientapi.agent.support.SupportAgentService;
import org.rhq.core.domain.resource.Agent;
-import org.rhq.core.server.ExternalizableStrategy;
+import org.rhq.core.domain.server.ExternalizableStrategy;
import org.rhq.enterprise.communications.Ping;
import org.rhq.enterprise.communications.command.Command;
import org.rhq.enterprise.communications.command.CommandResponse;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
index fa38154..fa03aaf 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertConditionManagerBean.java
@@ -38,9 +38,9 @@ import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.alert.composite.AbstractAlertConditionCategoryComposite;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.InventoryStatus;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
index db954c4..79fca41 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java
@@ -48,10 +48,10 @@ import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.NumericType;
import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.engine.AlertDefinitionEvent;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
index 38230af..672a2c9 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
@@ -67,10 +67,10 @@ import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceAncestryFormat;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.server.MeasurementConverter;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
index d8ce44e..94f1d35 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertTemplateManagerBean.java
@@ -37,10 +37,10 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
index 79bdec2..8974c30 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/GroupAlertDefinitionManagerBean.java
@@ -39,10 +39,10 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index 966a960..334b546 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -55,9 +55,9 @@ import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.criteria.RoleCriteria;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index 6413b89..00fefd2 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -43,9 +43,9 @@ import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.RoleCriteria;
import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/AffinityGroupManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/AffinityGroupManagerBean.java
index 8cf985b..2ebbdab 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/AffinityGroupManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/AffinityGroupManagerBean.java
@@ -38,9 +38,9 @@ import org.rhq.core.domain.cloud.PartitionEventType;
import org.rhq.core.domain.cloud.Server;
import org.rhq.core.domain.cloud.composite.AffinityGroupCountComposite;
import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.RequiredPermission;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/CloudManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/CloudManagerBean.java
index 4b98c67..01faa80 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/CloudManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/CloudManagerBean.java
@@ -39,9 +39,9 @@ import org.rhq.core.domain.cloud.PartitionEventType;
import org.rhq.core.domain.cloud.Server;
import org.rhq.core.domain.cloud.composite.ServerWithAgentCountComposite;
import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.RequiredPermission;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java
index 8eb345b..147dbc0 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/PartitionEventManagerBean.java
@@ -43,10 +43,10 @@ import org.rhq.core.domain.cloud.PartitionEventType;
import org.rhq.core.domain.cloud.PartitionEvent.ExecutionStatus;
import org.rhq.core.domain.cloud.composite.FailoverListComposite;
import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.core.AgentManagerLocal;
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 f88d2ba..d29eaac 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
@@ -97,11 +97,11 @@ import org.rhq.core.domain.resource.composite.ResourceComposite;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.core.util.exception.ThrowableUtil;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/AdvisoryManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/AdvisoryManagerBean.java
index 03530e9..c8f12e9 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/AdvisoryManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/AdvisoryManagerBean.java
@@ -38,9 +38,9 @@ import org.rhq.core.domain.content.AdvisoryCVE;
import org.rhq.core.domain.content.AdvisoryPackage;
import org.rhq.core.domain.content.CVE;
import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.RequiredPermission;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
index 5f65afb..3f42ef7 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
@@ -94,10 +94,10 @@ import org.rhq.core.domain.criteria.RepoCriteria;
import org.rhq.core.domain.resource.ProductVersion;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.core.util.stream.StreamUtil;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java
index b14ca51..2455c49 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java
@@ -50,11 +50,11 @@ import
org.rhq.core.domain.content.composite.LoadedPackageBitsComposite;
import org.rhq.core.domain.content.composite.PackageListItemComposite;
import org.rhq.core.domain.content.composite.PackageVersionComposite;
import org.rhq.core.domain.criteria.InstalledPackageHistoryCriteria;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
index 959b321..4a7c2f2 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
@@ -69,10 +69,10 @@ import org.rhq.core.domain.content.transfer.SubscribedRepo;
import org.rhq.core.domain.criteria.PackageVersionCriteria;
import org.rhq.core.domain.criteria.RepoCriteria;
import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java
index d851761..5a7d750 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java
@@ -53,9 +53,9 @@ import org.rhq.core.domain.common.composite.SystemSetting;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.composite.AgentLastAvailabilityPingComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.stream.StreamUtil;
import org.rhq.enterprise.server.RHQConstants;
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 f74b287..ce4e6a7 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
@@ -71,10 +71,10 @@ import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceError;
import org.rhq.core.domain.resource.ResourceErrorType;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
index ec1c956..75894ad 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/AvailabilityManagerBean.java
@@ -49,10 +49,10 @@ import org.rhq.core.domain.measurement.ResourceAvailability;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.composite.ResourceIdWithAvailabilityComposite;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.StopWatch;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.engine.AlertConditionCacheManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/CallTimeDataManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/CallTimeDataManagerBean.java
index dfaf5e8..82c1915 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/CallTimeDataManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/CallTimeDataManagerBean.java
@@ -55,10 +55,10 @@ import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.calltime.CallTimeData;
import org.rhq.core.domain.measurement.calltime.CallTimeDataComposite;
import org.rhq.core.domain.measurement.calltime.CallTimeDataValue;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.engine.AlertConditionCacheManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
index 7a70948..32567f0 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
@@ -74,10 +74,10 @@ import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.core.util.jdbc.JDBCUtil;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
index 0bf42d3..cdfb7cc 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
@@ -51,10 +51,10 @@ import org.rhq.core.domain.measurement.MeasurementDataPK;
import org.rhq.core.domain.measurement.MeasurementOOB;
import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.composite.MeasurementOOBComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementProblemManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementProblemManagerBean.java
index d398141..2804936 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementProblemManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementProblemManagerBean.java
@@ -32,10 +32,10 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.composite.ProblemResourceComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
index 69a22db..77956e1 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementScheduleManagerBean.java
@@ -78,11 +78,11 @@ import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index 4c007ae..d95bd9f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -77,10 +77,10 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
import org.rhq.enterprise.server.alert.engine.AlertConditionCacheManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java
index d11cc03..8d5ca9a 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteSafeInvocationHandler.java
@@ -35,7 +35,7 @@ import org.jboss.remoting.ServerInvoker;
import org.jboss.remoting.callback.InvokerCallbackHandler;
import org.jboss.remoting.invocation.NameBasedInvocation;
-import org.rhq.core.server.ExternalizableStrategy;
+import org.rhq.core.domain.server.ExternalizableStrategy;
import org.rhq.core.util.exception.WrappedRemotingException;
import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java
index 22cbddb..16c2195 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/remote/RemoteWsInvocationHandler.java
@@ -27,7 +27,7 @@ import org.jboss.remoting.ServerInvoker;
import org.jboss.remoting.callback.InvokerCallbackHandler;
import org.jboss.remoting.invocation.NameBasedInvocation;
-import org.rhq.core.server.ExternalizableStrategy;
+import org.rhq.core.domain.server.ExternalizableStrategy;
import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
public class RemoteWsInvocationHandler implements ServerInvocationHandler {
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceFactoryManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceFactoryManagerBean.java
index 6c016e7..214e46a 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceFactoryManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceFactoryManagerBean.java
@@ -58,10 +58,10 @@ import org.rhq.core.domain.resource.DeleteResourceStatus;
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.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
index 6339eda..468f619 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java
@@ -109,9 +109,9 @@ import org.rhq.core.domain.resource.flyweight.FlyweightCache;
import org.rhq.core.domain.resource.flyweight.ResourceFlyweight;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.AutoGroupComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.IntExtractor;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
index 2f00d16..eeeb4fc 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
@@ -51,9 +51,9 @@ import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.common.composite.SystemSetting;
import org.rhq.core.domain.resource.group.LdapGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.RequiredPermission;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
index eb493c3..d808969 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
@@ -76,10 +76,10 @@ import org.rhq.core.domain.resource.composite.ResourcePermission;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
index 8cc810f..3776c70 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/definition/GroupDefinitionManagerBean.java
@@ -41,9 +41,9 @@ import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria;
import org.rhq.core.domain.resource.group.GroupDefinition;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java
index 6adb7e2..823c9f2 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/AlertSubsystemManagerBean.java
@@ -37,10 +37,10 @@ import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.alert.composite.AlertDefinitionComposite;
import org.rhq.core.domain.alert.composite.AlertHistoryComposite;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.AlertManagerLocal;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java
index 6e6da2b..ff9ae0f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/ConfigurationSubsystemManagerBean.java
@@ -30,10 +30,10 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.composite.ConfigurationUpdateComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.util.QueryUtility;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java
index fbc7923..17a4ed4 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/subsystem/OperationHistorySubsystemManagerBean.java
@@ -30,10 +30,10 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.operation.composite.ResourceOperationHistoryComposite;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.util.QueryUtility;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
index c3c26f2..849dfba 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
@@ -65,7 +65,7 @@ import org.rhq.core.domain.common.SystemConfiguration;
import org.rhq.core.domain.common.composite.SystemSetting;
import org.rhq.core.domain.common.composite.SystemSettings;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
-import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.util.ObjectNameFactory;
import org.rhq.core.util.StopWatch;
import org.rhq.enterprise.server.RHQConstants;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/CoreTestBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/CoreTestBean.java
index c56e395..be872ae 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/CoreTestBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/CoreTestBean.java
@@ -36,7 +36,7 @@ import org.rhq.core.clientapi.server.core.AgentRegistrationResults;
import org.rhq.core.clientapi.server.core.CoreServerService;
import org.rhq.core.domain.plugin.Plugin;
import org.rhq.core.domain.resource.Agent;
-import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.core.CoreServerServiceImpl;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
index 6ac5be2..9fb1661 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/test/DiscoveryTestBean.java
@@ -50,7 +50,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.resource.group.ResourceGroup;
-import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.core.CoreServerServiceImpl;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index 9511e63..54fce8f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -48,11 +48,11 @@ import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.core.domain.tagging.Tag;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
-import org.rhq.core.server.PersistenceUtility;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.server.search.SearchExpressionException;
import org.rhq.enterprise.server.search.execution.SearchTranslationManager;
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 7c58b43..96394ce 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
@@ -30,7 +30,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.stat.Statistics;
-import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.domain.server.PersistenceUtility;
/**
* @author Joseph Marques
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java
index 742adf9..d429bc8 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/HibernateStatisticsStopWatch.java
@@ -25,7 +25,7 @@ import javax.persistence.EntityManager;
import org.hibernate.stat.Statistics;
-import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.domain.server.PersistenceUtility;
/**
* @author Joseph Marques
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index 43c1401..4647e1b 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -50,7 +50,7 @@ import org.jboss.mx.util.MBeanServerLocator;
import org.rhq.core.db.DatabaseTypeFactory;
import org.rhq.core.db.PostgresqlDatabaseType;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.domain.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SessionManager;
import org.rhq.enterprise.server.content.ContentSourceManagerBean;