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

Reply via email to