Liran Zelkha has uploaded a new change for review. Change subject: core: Add JPA UserTypes ......................................................................
core: Add JPA UserTypes The VDS patch requires some UserTypes. To simplify things, those UserTypes are added as a separate patch Change-Id: I30f76493ec72e3c2540e43bef2c095a7ed1c38aa Bug-Url: https://bugzilla.redhat.com/1159621 Signed-off-by: lzel...@redhat.com <lzel...@redhat.com> --- A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/EnumUserType.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/HBAUserType.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/RpmVersionUserType.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/VmRngDeviceSourceUserType.java 4 files changed, 395 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/15/40515/1 diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/EnumUserType.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/EnumUserType.java new file mode 100644 index 0000000..6cf259a --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/EnumUserType.java @@ -0,0 +1,123 @@ +package org.ovirt.engine.core.dao.jpa; + +import java.io.Serializable; +import java.lang.reflect.Method; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Properties; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.usertype.ParameterizedType; +import org.hibernate.usertype.UserType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EnumUserType implements UserType, ParameterizedType { + private static final Logger log = LoggerFactory.getLogger(EnumUserType.class); + + @SuppressWarnings("rawtypes") + private Class enumClass; + private Method forValueMethod; + private Method getValueMethod; + + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object deepCopy(Object val) throws HibernateException { + return val; + } + + @Override + public Serializable disassemble(Object val) throws HibernateException { + return (Serializable) val; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x == null && y == null) { + return true; + } + if (x == null) { + return false; + } + return x.equals(y); + } + + @Override + public int hashCode(Object value) throws HibernateException { + return value.hashCode(); + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor si, Object owner) + throws HibernateException, SQLException { + + Object value = rs.getObject(names[0]); + if (value == null) + return null; + int fieldValue = Integer.parseInt(value.toString()); + try { + return forValueMethod.invoke(null, fieldValue); + } catch (Exception e) { + log.error("Can't get ENUM value from " + fieldValue + " of type " + enumClass, e); + } + return null; + } + + @Override + public void nullSafeSet(PreparedStatement stmt, Object value, int index, SessionImplementor si) + throws HibernateException, SQLException { + if (value == null) { + stmt.setNull(index, Types.INTEGER); + } else { + try { + stmt.setObject(index, getValueMethod.invoke(value)); + } catch (Exception e) { + log.error("Can't set ENUM value from " + value + " of type " + enumClass, e); + } + } + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } + + @SuppressWarnings("rawtypes") + @Override + public Class returnedClass() { + return enumClass; + } + + @Override + public int[] sqlTypes() { + return new int[] { Types.INTEGER }; + } + + @SuppressWarnings({ "unchecked" }) + @Override + public void setParameterValues(Properties parameters) { + try { + enumClass = Class.forName(parameters.getProperty("type")); + if (enumClass.isEnum()) { + forValueMethod = enumClass.getDeclaredMethod("forValue", int.class); + getValueMethod = enumClass.getDeclaredMethod("getValue"); + } else { + log.error("Specified class is not an enum " + parameters.getProperty("type")); + } + } catch (Exception e) { + log.error("Can't find methods forValue, getValue for type " + parameters.getProperty("type"), e); + } + } +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/HBAUserType.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/HBAUserType.java new file mode 100644 index 0000000..b311baa --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/HBAUserType.java @@ -0,0 +1,93 @@ +package org.ovirt.engine.core.dao.jpa; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Map; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.usertype.UserType; +import org.ovirt.engine.core.utils.serialization.json.JsonObjectDeserializer; +import org.ovirt.engine.core.utils.serialization.json.JsonObjectSerializer; + +public class HBAUserType implements UserType { + + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object deepCopy(Object val) throws HibernateException { + return val; + } + + @SuppressWarnings("rawtypes") + @Override + public Serializable disassemble(Object val) throws HibernateException { + return (HashMap) val; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x == null && y == null) { + return true; + } + if (x == null) { + return false; + } + // TODO: Add full compare + return x.equals(y); + } + + @Override + public int hashCode(Object value) throws HibernateException { + return value.hashCode(); + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor si, Object owner) + throws HibernateException, SQLException { + + Object value = rs.getObject(names[0]); + if (value == null) + return null; + + return new JsonObjectDeserializer().deserialize(value, HashMap.class); + } + + @Override + public void nullSafeSet(PreparedStatement stmt, Object value, int index, SessionImplementor si) + throws HibernateException, SQLException { + if (value == null) { + stmt.setNull(index, Types.VARCHAR); + } else { + stmt.setString(index, new JsonObjectSerializer().serialize(value)); + } + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } + + @SuppressWarnings("rawtypes") + @Override + public Class returnedClass() { + return Map.class; + } + + @Override + public int[] sqlTypes() { + return new int[] { Types.VARCHAR }; + } +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/RpmVersionUserType.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/RpmVersionUserType.java new file mode 100644 index 0000000..0799960 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/RpmVersionUserType.java @@ -0,0 +1,86 @@ +package org.ovirt.engine.core.dao.jpa; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.usertype.UserType; +import org.ovirt.engine.core.compat.RpmVersion; + +public class RpmVersionUserType implements UserType { + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object deepCopy(Object val) throws HibernateException { + return val; + } + + @Override + public Serializable disassemble(Object val) throws HibernateException { + return (RpmVersion) val; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x == null && y == null) { + return true; + } + if (x == null) { + return false; + } + return x.equals(y); + } + + @Override + public int hashCode(Object value) throws HibernateException { + return value.hashCode(); + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor si, Object owner) + throws HibernateException, SQLException { + + Object value = rs.getObject(names[0]); + if (value == null) + return null; + return new RpmVersion(value.toString()); + } + + @Override + public void nullSafeSet(PreparedStatement stmt, Object value, int index, SessionImplementor si) + throws HibernateException, SQLException { + if (value == null) { + stmt.setNull(index, Types.INTEGER); + } else { + stmt.setString(index, value.toString()); + } + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } + + @SuppressWarnings("rawtypes") + @Override + public Class returnedClass() { + return RpmVersion.class; + } + + @Override + public int[] sqlTypes() { + return new int[] { Types.VARCHAR }; + } +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/VmRngDeviceSourceUserType.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/VmRngDeviceSourceUserType.java new file mode 100644 index 0000000..78091ef --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/jpa/VmRngDeviceSourceUserType.java @@ -0,0 +1,93 @@ +package org.ovirt.engine.core.dao.jpa; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.usertype.UserType; +import org.ovirt.engine.core.common.businessentities.VmRngDevice; + +public class VmRngDeviceSourceUserType implements UserType { + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @SuppressWarnings("unchecked") + @Override + public Object deepCopy(Object val) throws HibernateException { + return (Set<VmRngDevice.Source>) val; + } + + @SuppressWarnings("unchecked") + @Override + public Serializable disassemble(Object val) throws HibernateException { + return (HashSet<VmRngDevice.Source>) val; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x == null && y == null) { + return true; + } + if (x == null) { + return false; + } + // TODO: Add full compare + return x.equals(y); + } + + @Override + public int hashCode(Object value) throws HibernateException { + return value.hashCode(); + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor si, Object owner) + throws HibernateException, SQLException { + + Object value = rs.getObject(names[0]); + if (value == null) + return null; + + return VmRngDevice.csvToSourcesSet(value.toString()); + } + + @SuppressWarnings("unchecked") + @Override + public void nullSafeSet(PreparedStatement stmt, Object value, int index, SessionImplementor si) + throws HibernateException, SQLException { + if (value == null) { + stmt.setNull(index, Types.VARCHAR); + } else { + stmt.setString(index, VmRngDevice.sourcesToCsv((Set<VmRngDevice.Source>) value)); + } + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } + + @SuppressWarnings("rawtypes") + @Override + public Class returnedClass() { + return Set.class; + } + + @Override + public int[] sqlTypes() { + return new int[] { Types.VARCHAR }; + } +} -- To view, visit https://gerrit.ovirt.org/40515 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I30f76493ec72e3c2540e43bef2c095a7ed1c38aa Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liran Zelkha <lzel...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches