diff options
Diffstat (limited to 'branches/sca-java-1.x/modules/databinding-jaxb-axiom/src/main/java/org/apache/tuscany/sca/databinding/jaxb/axiom/JAXBDataSource.java')
-rw-r--r-- | branches/sca-java-1.x/modules/databinding-jaxb-axiom/src/main/java/org/apache/tuscany/sca/databinding/jaxb/axiom/JAXBDataSource.java | 89 |
1 files changed, 79 insertions, 10 deletions
diff --git a/branches/sca-java-1.x/modules/databinding-jaxb-axiom/src/main/java/org/apache/tuscany/sca/databinding/jaxb/axiom/JAXBDataSource.java b/branches/sca-java-1.x/modules/databinding-jaxb-axiom/src/main/java/org/apache/tuscany/sca/databinding/jaxb/axiom/JAXBDataSource.java index b6fa362ed9..68098fd2c2 100644 --- a/branches/sca-java-1.x/modules/databinding-jaxb-axiom/src/main/java/org/apache/tuscany/sca/databinding/jaxb/axiom/JAXBDataSource.java +++ b/branches/sca-java-1.x/modules/databinding-jaxb-axiom/src/main/java/org/apache/tuscany/sca/databinding/jaxb/axiom/JAXBDataSource.java @@ -6,22 +6,24 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations - * under the License. + * under the License. */ package org.apache.tuscany.sca.databinding.jaxb.axiom; import java.io.OutputStream; import java.io.StringReader; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.io.Writer; +import java.lang.reflect.Method; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; @@ -33,8 +35,10 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; -import org.apache.axiom.om.OMDataSource; +import org.apache.axiom.om.OMDataSourceExt; import org.apache.axiom.om.OMOutputFormat; +import org.apache.axiom.om.ds.OMDataSourceExtBase; +import org.apache.axiom.om.impl.MTOMXMLStreamWriter; import org.apache.axiom.om.util.StAXUtils; import org.apache.tuscany.sca.databinding.jaxb.JAXBContextHelper; @@ -42,7 +46,7 @@ import org.apache.tuscany.sca.databinding.jaxb.JAXBContextHelper; * * @version $Rev$ $Date$ */ -public class JAXBDataSource implements OMDataSource { +public class JAXBDataSource extends OMDataSourceExtBase { private JAXBContext context; private Object element; private Marshaller marshaller; @@ -55,11 +59,11 @@ public class JAXBDataSource implements OMDataSource { private Marshaller getMarshaller() throws JAXBException { if (marshaller == null) { // For thread safety, not sure we can cache the marshaller - marshaller = JAXBContextHelper.getMarshaller(context); + marshaller = JAXBContextHelper.getMarshaller(context); } return marshaller; } - + private void releaseMarshaller(Marshaller marshaller) { JAXBContextHelper.releaseJAXBMarshaller(context, marshaller); } @@ -73,6 +77,27 @@ public class JAXBDataSource implements OMDataSource { return StAXUtils.createXMLStreamReader(reader); } + /** + * If the writer is backed by an OutputStream, then return the OutputStream + * @param writer + * @return OutputStream or null + */ + private static OutputStream getOutputStream(XMLStreamWriter writer) throws XMLStreamException { + if (writer.getClass() == MTOMXMLStreamWriter.class) { + return ((MTOMXMLStreamWriter)writer).getOutputStream(); + } + + try { + Method method = writer.getClass().getMethod("getOutputStream"); + return (OutputStream)method.invoke(writer); + + } catch (NoSuchMethodException e) { + return null; + } catch (Exception e) { + return null; + } + } + public void serialize(final XMLStreamWriter xmlWriter) throws XMLStreamException { try { // marshaller.setProperty(Marshaller.JAXB_ENCODING, format.getCharSetEncoding()); @@ -80,10 +105,15 @@ public class JAXBDataSource implements OMDataSource { public Object run() throws Exception { try { Marshaller marshaller = getMarshaller(); - marshaller.marshal(element, xmlWriter); + OutputStream os = getOutputStream(xmlWriter); + if (os != null) { + marshaller.marshal(element, os); + } else { + marshaller.marshal(element, xmlWriter); + } } finally { releaseMarshaller(marshaller); - } + } return null; } }); @@ -128,9 +158,48 @@ public class JAXBDataSource implements OMDataSource { throw new XMLStreamException(e.getException()); } } - + public Object getObject() { return element; } + public void close() { + } + + public OMDataSourceExt copy() { + return new JAXBDataSource(element, context); + } + + public byte[] getXMLBytes(final String encoding) throws UnsupportedEncodingException { + try { + return AccessController.doPrivileged(new PrivilegedExceptionAction<byte[]>() { + public byte[] run() throws JAXBException, XMLStreamException, UnsupportedEncodingException { + try { + StringWriter sw = new StringWriter(); + Marshaller marshaller = getMarshaller(); + marshaller.marshal(element, sw); + return sw.toString().getBytes(encoding); + } finally { + releaseMarshaller(marshaller); + } + } + }); + } catch (PrivilegedActionException e) { + Throwable t = e.getCause(); + if (t instanceof UnsupportedEncodingException) { + throw (UnsupportedEncodingException)t; + } else { + throw new RuntimeException(t); + } + } + } + + public boolean isDestructiveRead() { + return false; + } + + public boolean isDestructiveWrite() { + return false; + } + } |