Michael Pasternak has uploaded a new change for review.

Change subject: sdk: implement generic JAXBElement generation
......................................................................

sdk: implement generic JAXBElement generation

Change-Id: I3dcd4c148c1de9d4fe8bc1c718c3808ad7e688c6
Signed-off-by: Michael Pasternak <[email protected]>
---
M 
ovirt-engine-sdk-java/src/main/java/org/ovirt/engine/sdk/utils/SerializationHelper.java
1 file changed, 64 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine-sdk-java 
refs/changes/15/12715/1

diff --git 
a/ovirt-engine-sdk-java/src/main/java/org/ovirt/engine/sdk/utils/SerializationHelper.java
 
b/ovirt-engine-sdk-java/src/main/java/org/ovirt/engine/sdk/utils/SerializationHelper.java
index 0f3e2b6..9db3c26 100644
--- 
a/ovirt-engine-sdk-java/src/main/java/org/ovirt/engine/sdk/utils/SerializationHelper.java
+++ 
b/ovirt-engine-sdk-java/src/main/java/org/ovirt/engine/sdk/utils/SerializationHelper.java
@@ -19,6 +19,8 @@
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 import java.io.StringReader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -30,6 +32,8 @@
 import javax.xml.namespace.QName;
 import javax.xml.transform.stream.StreamSource;
 
+import org.ovirt.engine.sdk.entities.DataCenter;
+import org.ovirt.engine.sdk.entities.ObjectFactory;
 import org.ovirt.engine.sdk.exceptions.MarshallingException;
 
 /**
@@ -40,6 +44,8 @@
     private final static Map<Class<?>, JAXBContextHolder> contexts = new 
HashMap<Class<?>, JAXBContextHolder>();
     private static String PACKAGE_CONTEXT = "org.ovirt.engine.sdk.entities";
     private static JAXBContext JAXB_CONTEXT = null;
+    private static ObjectFactory factory = new ObjectFactory();
+    private static Map<String, Method> factoryMethods = new HashMap<String, 
Method>();
 
     private SerializationHelper() {
     }
@@ -70,7 +76,12 @@
      */
     public static <S> String marshall(Class<S> clz, S obj) {
         try {
-            return marshall(new JAXBElement<S>(new QName("", 
clz.getSimpleName().toLowerCase()), clz, null, obj));
+            JAXBElement<S> element = getElement(clz, obj);
+            if (element != null)
+                return marshall(element);
+            throw new MarshallingException(
+                    "Coresponding JAXBElement for \"" + clz.getSimpleName() +
+                            "\" is not found.");
         } catch (JAXBException e) {
             // TODO: log error
             throw new MarshallingException(e);
@@ -78,6 +89,58 @@
     }
 
     /**
+     * Produces JAXBElement
+     * 
+     * @param clz
+     *            class to initiate the JAXBElement for
+     * @param obj
+     *            object to initiate the JAXBElement from
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    private static <S> JAXBElement<S> getElement(Class<S> clz, S obj) {
+        Method m = getCreateMethod(clz);
+        if (m != null) {
+            try {
+                return (JAXBElement<S>) m.invoke(factory, obj);
+            } catch (IllegalArgumentException e) {
+                // TODO: should never happen, but log error anyway
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                // TODO: should never happen, but log error anyway
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                // TODO: should never happen, but log error anyway
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Fetches factory method to create the corresponding JAXBElement
+     * 
+     * @param clz
+     *            class to create the JAXBElement from
+     * 
+     * @return factory method or null
+     */
+    public static synchronized <S> Method getCreateMethod(Class<S> clz) {
+        String createMethod = "create" + clz.getSimpleName();
+
+        if (factoryMethods.isEmpty()) {
+            for (Method m : factory.getClass().getMethods()) {
+                factoryMethods.put(m.getName(), m);
+            }
+        }
+
+        if (factoryMethods.containsKey(createMethod)) {
+            return factoryMethods.get(createMethod);
+        }
+        return null;
+    }
+
+    /**
      * Marshalls object to XML
      * 
      * @param os


--
To view, visit http://gerrit.ovirt.org/12715
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3dcd4c148c1de9d4fe8bc1c718c3808ad7e688c6
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine-sdk-java
Gerrit-Branch: master
Gerrit-Owner: Michael Pasternak <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to