failed experiment to use Bean(De)serializerModifier
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/adb1984a Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/adb1984a Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/adb1984a Branch: refs/heads/ODE-912 Commit: adb1984a06a82bd4860cc62ac1f3fe204ec28d8a Parents: a191003 Author: fangzhen <[email protected]> Authored: Sat Aug 9 23:11:23 2014 +0800 Committer: fangzhen <[email protected]> Committed: Mon Aug 11 11:10:42 2014 +0800 ---------------------------------------------------------------------- Rakefile | 10 ++--- .../ode/bpel/obj/serde/JsonOmDeserializer.java | 40 ++++++++++++++++++-- .../ode/bpel/obj/serde/JsonOmSerializer.java | 39 ++++++++++++++++++- 3 files changed, 80 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/adb1984a/Rakefile ---------------------------------------------------------------------- diff --git a/Rakefile b/Rakefile index 21a07bc..c53f7f0 100644 --- a/Rakefile +++ b/Rakefile @@ -130,7 +130,7 @@ define "ode" do end test.using :testng, :forkmode=>'perTest', :properties=>{ "org.apache.commons.logging.LogFactory" => "org.apache.commons.logging.impl.LogFactoryImpl", "log4j.configuration"=>"test-log4j.properties", "test.ports" => ENV['TEST_PORTS'], "org.apache.ode.scheduler.deleteJobsOnStart" => "true", "org.apache.ode.autoRetireProcess"=>"true" } , :java_args=>['-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6001', '-Xmx4g', '-XX:MaxPermSize=1g'] - test.with projects("tools"), libs, AXIS2_MODULES.mods, AXIOM, JAVAX.servlet, Buildr::Jetty::REQUIRES, HIBERNATE, DOM4J, H2::REQUIRES, SPRING_TEST, JACKSON + test.with projects("tools", "bpel-obj"), libs, AXIS2_MODULES.mods, AXIOM, JAVAX.servlet, Buildr::Jetty::REQUIRES, HIBERNATE, DOM4J, H2::REQUIRES, SPRING_TEST, JACKSON webapp_dir = "#{test.compile.target}/webapp" test.setup task(:prepare_webapp) do |task| cp_r _("src/main/webapp"), test.compile.target.to_s @@ -236,7 +236,7 @@ define "ode" do JACKSON, JAVAX.connector - test.with projects("scheduler-simple", "dao-jpa", "dao-hibernate", "bpel-epr"), + test.with projects("scheduler-simple", "dao-jpa", "dao-hibernate", "bpel-epr", "bpel-obj"), # BACKPORT, COMMONS.pool, COMMONS.lang, COMMONS.io, DERBY, JAVAX.connector, JAVAX.transaction, GERONIMO.transaction, GERONIMO.kernel, GERONIMO.connector, TRANQL, HSQLDB, JAVAX.ejb, JAVAX.transaction, OPENJPA, XERCES, XALAN, DOM4J, HIBERNATE, SPRING_TEST, JACKSON, DERBY, @@ -276,7 +276,7 @@ define "ode" do compile { open_jpa_enhance } resources hibernate_doclet(:package=>"org.apache.ode.store.hib", :excludedtags=>"@version,@author,@todo") - test.with COMMONS.collections, COMMONS.lang, JAVAX.connector, JAVAX.transaction, DOM4J, + test.with projects("bpel-obj"), COMMONS.collections, COMMONS.lang, JAVAX.connector, JAVAX.transaction, DOM4J, XERCES, XALAN, JAXEN, SAXON, OPENJPA, GERONIMO.transaction, SLF4J, SPRING_TEST, DERBY, GERONIMO.transaction, GERONIMO.kernel, GERONIMO.connector, JAVAX.connector, JAVAX.ejb package :jar @@ -291,7 +291,7 @@ define "ode" do SPRING_TEST, COMMONS.codec, SLF4J, LOG4J test.using :properties=>{ "org.apache.ode.autoRetireProcess"=>"true" } - test.with projects("bpel-nobj", "bpel-schemas", "bpel-scripts"), + test.with projects("bpel-nobj", "bpel-obj", "bpel-schemas", "bpel-scripts"), COMMONS.collections, COMMONS.lang, DERBY, JACOB, JAVAX.connector, JAVAX.stream, JAVAX.transaction, JAVAX.connector, JAXEN, HSQLDB, SAXON, XERCES, XMLBEANS, XALAN, GERONIMO.transaction, SPRING, HIBERNATE, DOM4J, JACKSON @@ -430,7 +430,7 @@ define "ode" do end test.using :properties=>{ "java.naming.factory.initial" => "org.apache.xbean.spring.jndi.SpringInitialContextFactory", "org.apache.ode.autoRetireProcess"=>"true"}, :java_args=>(ENV['TEST_JVM_ARGS']||='').split(' ') - test.with projects("dao-jpa", "dao-hibernate", "bpel-compiler", "bpel-api-jca", "jca-ra", "jca-server"), + test.with projects("dao-jpa", "dao-hibernate", "bpel-compiler", "bpel-api-jca", "jca-ra", "jca-server", "bpel-obj"), BACKPORT, COMMONS.lang, COMMONS.io, COMMONS.collections, DERBY, GERONIMO.connector, GERONIMO.kernel, GERONIMO.transaction, JACOB, JAVAX.connector, JAVAX.ejb, JAVAX.persistence, JAVAX.stream, JAVAX.transaction, JAXEN, JBI, OPENJPA, SAXON, SERVICEMIX, SPRING, TRANQL, http://git-wip-us.apache.org/repos/asf/ode/blob/adb1984a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java index 9081d1d..97d66d0 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmDeserializer.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; @@ -14,8 +15,6 @@ import javax.xml.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.bpel.obj.OProcess; -import org.apache.ode.bpel.obj.migrate.ObjectTraverser; -import org.apache.ode.bpel.obj.migrate.OmUpgradeVisitor; import org.apache.ode.bpel.obj.serde.jacksonhack.TypeBeanSerializerFactory; import org.apache.ode.utils.NSContext; import org.w3c.dom.Element; @@ -24,16 +23,22 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.io.SerializedString; import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.DeserializationConfig; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyName; import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; +import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; +import com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import com.fasterxml.jackson.module.jaxb.deser.DomElementJsonDeserializer; +import com.ibm.wsdl.AbstractWSDLElement; import com.ibm.wsdl.MessageImpl; public class JsonOmDeserializer implements OmDeserializer { protected static final Log __log = LogFactory @@ -77,7 +82,7 @@ public class JsonOmDeserializer implements OmDeserializer { simpleModule.addDeserializer((Class) d, (JsonDeserializer) deserializers.get(d)); } - simpleModule.setDeserializerModifier(new OModelDeserModifier()); + simpleModule.setDeserializerModifier(new WsdlElementDeserModifier()); simpleModule.addKeyDeserializer(Object.class, new KeyAsJsonDeserializer()); simpleModule.addKeyDeserializer(String.class, new KeyAsJsonDeserializer()); mapper.registerModule(simpleModule); @@ -236,4 +241,33 @@ public class JsonOmDeserializer implements OmDeserializer { } + public static class WsdlElementDeserModifier extends BeanDeserializerModifier{ + public static class MyBeanPropertyWriter extends BeanPropertyWriter{ + public MyBeanPropertyWriter(BeanPropertyWriter origi, String newName){ + super(origi, new SerializedString(newName)); + } + } + @Override + public List<BeanPropertyDefinition> updateProperties(DeserializationConfig config, + BeanDescription beanDesc, + List<BeanPropertyDefinition> propDefs){ + if (!AbstractWSDLElement.class.isAssignableFrom(beanDesc.getBeanClass())) { + return propDefs; + } + Iterator<BeanPropertyDefinition> itor = propDefs.iterator(); + BeanPropertyDefinition modified = null; + while(itor.hasNext()){ + BeanPropertyDefinition prop = itor.next(); + if (prop.getName().equalsIgnoreCase("extensibilityElements")){ + modified = new POJOPropertyBuilder((POJOPropertyBuilder)prop, new PropertyName("extElements")); + itor.remove(); + break; + } + } + if (modified != null){ + propDefs.add(modified); + } + return propDefs; + } + } } http://git-wip-us.apache.org/repos/asf/ode/blob/adb1984a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java ---------------------------------------------------------------------- diff --git a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java index cd01a16..db73328 100644 --- a/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java +++ b/bpel-nobj/src/main/java/org/apache/ode/bpel/obj/serde/JsonOmSerializer.java @@ -4,8 +4,8 @@ import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.lang.reflect.Type; -import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; @@ -23,15 +23,21 @@ import org.w3c.dom.Element; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.io.SerializedString; +import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; import com.fasterxml.jackson.module.jaxb.ser.DomElementJsonSerializer; +import com.ibm.wsdl.AbstractWSDLElement; import com.ibm.wsdl.MessageImpl; @@ -79,6 +85,7 @@ public class JsonOmSerializer implements OmSerializer { } simpleModule.addKeySerializer(Object.class, new KeyAsJsonSerializer()); + simpleModule.setSerializerModifier(new WsdlElementSerModifier()); mapper.registerModule(simpleModule); mapper.enable(SerializationFeature.INDENT_OUTPUT); @@ -204,4 +211,34 @@ public class JsonOmSerializer implements OmSerializer { } } + + public static class WsdlElementSerModifier extends BeanSerializerModifier{ + public static class MyBeanPropertyWriter extends BeanPropertyWriter{ + public MyBeanPropertyWriter(BeanPropertyWriter origi, String newName){ + super(origi, new SerializedString(newName)); + } + } + public List<BeanPropertyWriter> changeProperties(SerializationConfig config, + BeanDescription beanDesc, + List<BeanPropertyWriter> beanProperties){ + if (!AbstractWSDLElement.class.isAssignableFrom(beanDesc.getBeanClass())) { + return beanProperties; + } + Iterator<BeanPropertyWriter> itor = beanProperties.iterator(); + BeanPropertyWriter modified = null; + while(itor.hasNext()){ + BeanPropertyWriter prop = itor.next(); + if (prop.getName().equalsIgnoreCase("extensibilityElements")){ + modified = new MyBeanPropertyWriter(prop, "extElements"); + itor.remove(); + + break; + } + } + if (modified != null){ + beanProperties.add(modified); + } + return beanProperties; + } + } }
