summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.x/modules/databinding-jaxb-axiom/src/main/java/org/apache/tuscany/sca/databinding/jaxb/axiom/JAXBDataSource.java
diff options
context:
space:
mode:
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.java89
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;
+ }
+
}