1 package com.fasterxml.jackson.databind.ext; 2 3 import java.io.IOException; 4 5 import org.w3c.dom.Node; 6 import org.w3c.dom.bootstrap.DOMImplementationRegistry; 7 import org.w3c.dom.ls.DOMImplementationLS; 8 import org.w3c.dom.ls.LSSerializer; 9 10 import com.fasterxml.jackson.core.*; 11 import com.fasterxml.jackson.databind.JavaType; 12 import com.fasterxml.jackson.databind.JsonMappingException; 13 import com.fasterxml.jackson.databind.JsonNode; 14 import com.fasterxml.jackson.databind.SerializerProvider; 15 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; 16 import com.fasterxml.jackson.databind.ser.std.StdSerializer; 17 18 @SuppressWarnings("serial") 19 public class DOMSerializer extends StdSerializer<Node> 20 { 21 protected final DOMImplementationLS _domImpl; 22 DOMSerializer()23 public DOMSerializer() { 24 super(Node.class); 25 DOMImplementationRegistry registry; 26 try { 27 registry = DOMImplementationRegistry.newInstance(); 28 } catch (Exception e) { 29 throw new IllegalStateException("Could not instantiate DOMImplementationRegistry: "+e.getMessage(), e); 30 } 31 _domImpl = (DOMImplementationLS)registry.getDOMImplementation("LS"); 32 } 33 34 @Override serialize(Node value, JsonGenerator jgen, SerializerProvider provider)35 public void serialize(Node value, JsonGenerator jgen, SerializerProvider provider) 36 throws IOException, JsonGenerationException 37 { 38 if (_domImpl == null) throw new IllegalStateException("Could not find DOM LS"); 39 LSSerializer writer = _domImpl.createLSSerializer(); 40 jgen.writeString(writer.writeToString(value)); 41 } 42 43 @Override getSchema(SerializerProvider provider, java.lang.reflect.Type typeHint)44 public JsonNode getSchema(SerializerProvider provider, java.lang.reflect.Type typeHint) { 45 // Well... it is serialized as String 46 return createSchemaNode("string", true); 47 } 48 49 @Override acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)50 public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException { 51 if (visitor != null) visitor.expectAnyFormat(typeHint); 52 } 53 } 54