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
