etc/m2/settings.xml
| 4
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/enterprise/agent/src/main/java/org/rhq/enterprise/agent/ExternalizableStrategyCommandPreprocessor.java
| 2
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/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/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/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/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/test/AbstractEJB3Test.java
| 2
65 files changed, 1026 insertions(+), 1025 deletions(-)
New commits:
commit a6ae8342006320402958a4fcf6dedc1a4ea217fc
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;