You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2011/07/11 10:57:25 UTC
svn commit: r1145074 [1/2] - in /geronimo/bundles/trunk/axis2: ./
src/main/java/org/apache/axis2/jaxws/message/
src/main/java/org/apache/axis2/jaxws/message/databinding/impl/
src/main/java/org/apache/axis2/jaxws/message/impl/
Author: xuhaihong
Date: Mon Jul 11 08:57:25 2011
New Revision: 1145074
URL: http://svn.apache.org/viewvc?rev=1145074&view=rev
Log:
Try the fix of AXIS2-5023 (Ambigious use of isElementData in the Block interface) from Geronimo side
Added:
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/impl/
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/impl/BlockImpl.java (with props)
geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/impl/XMLSpineImpl.java (with props)
Modified:
geronimo/bundles/trunk/axis2/pom.xml
Modified: geronimo/bundles/trunk/axis2/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/pom.xml?rev=1145074&r1=1145073&r2=1145074&view=diff
==============================================================================
--- geronimo/bundles/trunk/axis2/pom.xml (original)
+++ geronimo/bundles/trunk/axis2/pom.xml Mon Jul 11 08:57:25 2011
@@ -313,7 +313,19 @@
org/apache/axis2/transport/http/HTTPSender.class=target/classes/org/apache/axis2/transport/http/HTTPSender.class,
org/apache/axis2/client/OperationClient.class=target/classes/org/apache/axis2/client/OperationClient.class,
org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.class=target/classes/org/apache/axis2/jaxws/description/impl/PostRI216MethodRetrieverImpl.class,
- org/apache/axis2/jaxws/client/dispatch/BaseDispatch.class=target/classes/org/apache/axis2/jaxws/client/dispatch/BaseDispatch.class
+ org/apache/axis2/jaxws/client/dispatch/BaseDispatch.class=target/classes/org/apache/axis2/jaxws/client/dispatch/BaseDispatch.class,
+
+ org/apache/axis2/jaxws/message/Block.class=target/classes/org/apache/axis2/jaxws/message/Block.class,
+ org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.class,
+ org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.class,
+ org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl$1.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl$1.class,
+ org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.class,
+ org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.class,
+ org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.class,
+ org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.class,
+ org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl$1.class=target/classes/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl$1.class,
+ org/apache/axis2/jaxws/message/impl/BlockImpl.class=target/classes/org/apache/axis2/jaxws/message/impl/BlockImpl.class,
+ org/apache/axis2/jaxws/message/impl/XMLSpineImpl.class=target/classes/org/apache/axis2/jaxws/message/impl/XMLSpineImpl.class
</Include-Resource>
<SPI-Provider>true</SPI-Provider>
</instructions>
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java?rev=1145074&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java Mon Jul 11 08:57:25 2011
@@ -0,0 +1,164 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
+
+package org.apache.axis2.jaxws.message;
+
+import org.apache.axiom.om.OMDataSourceExt;
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.jaxws.message.factory.BlockFactory;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebServiceException;
+
+/**
+ * Block A Block represents an xml element and associated sub-tree. The name of the element must be
+ * defined by a root element in a schema. All prefixes within the subtree must correspond to
+ * namespace declarations defined within the tree. Many specifications refer to this as a "embedded
+ * document" or "xml block". I chose the term, block, for simplicity.
+ * <p/>
+ * The block can be exposed as: * BusinessObject * StAX object
+ * <p/>
+ * Note that the whole Message can also be thought of as a Block. Thus a Message can be createFrom
+ * a Block and written as a Block.
+ * <p/>
+ * In addition, each of the accessors has a consume parameter. If consume is true, the Block is no
+ * longer valid after the message is called. (i.e. the implementation does not need to cache the
+ * information)
+ */
+public interface Block extends OMDataSourceExt {
+
+ /**
+ * Get a reference to the Business Object represented by this Block
+ *
+ * @param consume true if this is the last request on the block.
+ * @return Object (JAXB, String etc.)
+ * @throws XMLStreamException
+ * @throws WebServiceException
+ */
+ public Object getBusinessObject(boolean consume) throws XMLStreamException, WebServiceException;
+
+ /**
+ * GetBusinesContext Some business objects have an associated context object (i.e. JAXBContext)
+ *
+ * @return Context Object or null
+ */
+ public Object getBusinessContext();
+
+ /**
+ * Get the XMLStreamReader represented by this Block
+ *
+ * @param consume true if this is the last request on the block.
+ * @return XMLStreamReader
+ * @throws XMLStreamException
+ */
+ public XMLStreamReader getXMLStreamReader(boolean consume)
+ throws XMLStreamException, WebServiceException;
+
+ /**
+ * Get the OMElement represented by this Block. This call always consumes the block because you are
+ * taking control of the underlying OM
+ *
+ * @return
+ * @throws XMLStreamException
+ * @throws WebServiceException
+ */
+ public OMElement getOMElement() throws XMLStreamException, WebServiceException;
+
+ /**
+ * Write out the Block
+ *
+ * @param writer XMLStreamWriter
+ * @param consume true if this is the last request on the block.
+ * @throws XMLStreamException
+ * @trhows WebServiceException
+ */
+ public void outputTo(XMLStreamWriter writer, boolean consume)
+ throws XMLStreamException, WebServiceException;
+
+ /**
+ * isConsumed Return true if the block is consumed. Once consumed, the information in the block
+ * is no longer available.
+ *
+ * @return true if the block is consumed (a method was called with consume=true)
+ */
+ public boolean isConsumed();
+
+ /**
+ * Get a traceString...the trace string dumps the contents of the Block without forcing an
+ * underlying ill-performant transformation of the message.
+ *
+ * @return String containing trace information
+ * @boolean indent String containing indent characters
+ */
+ public String traceString(String indent);
+
+ /**
+ * @return If QName is available without doing an expensive parse of the business object, then
+ * return true Otherwise return false Note: This method should be used in situations where
+ * it would be nice to know the qname (like logging or a special check) but we don't want
+ * to cause an ill-performant parse.
+ */
+ public boolean isQNameAvailable();
+
+ /**
+ * Get the QName (namespace, localpart) of the Block. Do not depend on prefix being set correctly.
+ * Asking for the QName can cause a performant hit.
+ *
+ * @return QName of the block
+ * @throw WebServiceException
+ * @see isQNameAvailable
+ */
+ public QName getQName() throws WebServiceException;
+
+ /**
+ * Get BlockFactory
+ *
+ * @return BlockFactory that created the Block
+ */
+ public BlockFactory getBlockFactory();
+
+ /**
+ * Get the Message associated with this block
+ *
+ * @return Message
+ */
+ public Message getParent();
+
+ /**
+ * Set the Message associated with this block (This method is intended to be called by the
+ * Message Implementation only)
+ *
+ * @param parent
+ */
+ public void setParent(Message parent);
+
+ /**
+ * @return true if data is always an element; false if possibly mixed content or multiple
+ * elements
+ */
+ public boolean isElementData();
+
+ /**
+ * @return true if data is always one or multiple elements
+ */
+ public boolean isXMLData();
+}
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/Block.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java?rev=1145074&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java Mon Jul 11 08:57:25 2011
@@ -0,0 +1,289 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
+
+package org.apache.axis2.jaxws.message.databinding.impl;
+
+import org.apache.axiom.attachments.impl.BufferUtils;
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMDataSource;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axiom.om.OMSourcedElement;
+import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axiom.soap.SOAP11Constants;
+import org.apache.axis2.datasource.SourceDataSource;
+import org.apache.axis2.java.security.AccessController;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.axis2.jaxws.message.databinding.DataSourceBlock;
+import org.apache.axis2.jaxws.message.factory.BlockFactory;
+import org.apache.axis2.jaxws.message.impl.BlockImpl;
+import org.apache.axis2.jaxws.message.util.Reader2Writer;
+import org.apache.axis2.jaxws.utility.ConvertUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.activation.DataSource;
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebServiceException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+/**
+ * SourceBlock
+ * <p/>
+ * Block containing a business object that is a javax.activation.DataSource
+ * <p/>
+ */
+public class DataSourceBlockImpl extends BlockImpl implements DataSourceBlock {
+
+ private static final Log log = LogFactory.getLog(DataSourceBlockImpl.class);
+
+ /**
+ * Constructor called from factory
+ *
+ * @param busObject
+ * @param qName
+ * @param factory
+ */
+ DataSourceBlockImpl(DataSource busObject, QName qName, BlockFactory factory)
+ throws WebServiceException {
+ super(busObject, null, qName, factory);
+ // Check validity of DataSource
+ if (!(busObject instanceof DataSource)) {
+ throw ExceptionFactory.makeWebServiceException(
+ Messages.getMessage("SourceNotSupported", busObject.getClass().getName()));
+ }
+ }
+
+
+ /**
+ * Constructor called from factory
+ *
+ * @param reader
+ * @param qName
+ * @param factory
+ */
+ public DataSourceBlockImpl(OMElement omElement, QName qName, BlockFactory factory) {
+ super(omElement, null, qName, factory);
+ }
+
+ protected Object _getBOFromReader(XMLStreamReader reader, Object busContext) throws XMLStreamException, WebServiceException {
+ Reader2Writer r2w = new Reader2Writer(reader);
+ try {
+ return new ByteArrayDataSource(r2w.getAsString(), "application/octet-stream");
+ } catch (IOException e) {
+ throw new XMLStreamException(e);
+ }
+
+ }
+
+ public OMElement getOMElement() throws XMLStreamException, WebServiceException {
+ OMFactory factory = OMAbstractFactory.getOMFactory();
+ OMNamespace ns = factory.createOMNamespace("", "");
+ return factory.createOMElement(this, "dummy", ns);
+ }
+
+ @Override
+ protected Object _getBOFromOM(OMElement omElement, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ Object busObject;
+
+ // Shortcut to get business object from existing data source
+ if (omElement instanceof OMSourcedElement) {
+ OMDataSource ds = ((OMSourcedElement) omElement).getDataSource();
+ if (ds instanceof SourceDataSource) {
+ return ((SourceDataSource) ds).getObject();
+ }
+ }
+
+ // If the message is a fault, there are some special gymnastics that we have to do
+ // to get this working for all of the handler scenarios.
+ boolean hasFault = false;
+ if ((parent != null && parent.isFault()) ||
+ omElement.getQName().getLocalPart().equals(SOAP11Constants.SOAPFAULT_LOCAL_NAME)) {
+ hasFault = true;
+ }
+
+ // Transform reader into business object
+ if (!hasFault) {
+ busObject = ((OMSourcedElement)omElement).getDataSource();
+ }
+ else {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ omElement.serialize(baos);
+ busObject = new ByteArrayDataSource(baos.toByteArray(), "UTF-8");
+ }
+ return busObject;
+ }
+
+ @Override
+ protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ try {
+ if (busObj instanceof DataSource) {
+ XMLInputFactory f = StAXUtils.getXMLInputFactory();
+
+ XMLStreamReader reader = f.createXMLStreamReader(((DataSource)busObj).getInputStream());
+ StAXUtils.releaseXMLInputFactory(f);
+ return reader;
+ }
+ throw ExceptionFactory.makeWebServiceException(
+ Messages.getMessage("SourceNotSupported", busObject.getClass().getName()));
+ } catch (Exception e) {
+ String className = (busObj == null) ? "none" : busObj.getClass().getName();
+ throw ExceptionFactory
+ .makeWebServiceException(Messages.getMessage("SourceReadErr", className), e);
+ }
+ }
+
+ public void serialize(OutputStream output, OMOutputFormat format) throws XMLStreamException {
+ try {
+ BufferUtils.inputStream2OutputStream(((DataSource)busObject).getInputStream(), output);
+ } catch (IOException e) {
+ throw new XMLStreamException(e);
+ }
+ }
+
+ @Override
+ protected void _outputFromBO(Object busObject, Object busContext, XMLStreamWriter writer)
+ throws XMLStreamException, WebServiceException {
+ // There is no fast way to output the Source to a writer, so get the reader
+ // and pass use the default reader->writer.
+ if (log.isDebugEnabled()) {
+ log.debug("Start _outputFromBO");
+ }
+ XMLStreamReader reader = _getReaderFromBO(busObject, busContext);
+ if (log.isDebugEnabled()) {
+ log.debug("Obtained reader=" + reader);
+ }
+ _outputFromReader(reader, writer);
+ if (log.isDebugEnabled()) {
+ log.debug("End _outputReaderFromBO");
+ }
+ // REVIEW Should we call close() on the Source ?
+ }
+
+
+ @Override
+ protected Object _getBOFromBO(Object busObject, Object busContext, boolean consume) {
+ if (consume) {
+ return busObject;
+ } else {
+ // TODO Missing Impl
+ throw ExceptionFactory.makeWebServiceException(
+ Messages.getMessage("SourceMissingSupport", busObject.getClass().getName()));
+ }
+ }
+
+ public boolean isElementData() {
+ return false; // The source could be a text or element etc.
+ }
+
+ public boolean isXMLData() {
+ return false;
+ }
+
+ /**
+ * Return the class for this name
+ * @return Class
+ */
+ private static Class forName(final String className) throws ClassNotFoundException {
+ // NOTE: This method must remain private because it uses AccessController
+ Class cl = null;
+ try {
+ cl = (Class)AccessController.doPrivileged(
+ new PrivilegedExceptionAction() {
+ public Object run() throws ClassNotFoundException {
+ return Class.forName(className);
+ }
+ }
+ );
+ } catch (PrivilegedActionException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Exception thrown from AccessController: " + e);
+ }
+ throw (ClassNotFoundException)e.getException();
+ }
+
+ return cl;
+ }
+
+
+ public void close() {
+ return; // Nothing to close
+ }
+
+ public InputStream getXMLInputStream(String encoding) throws UnsupportedEncodingException {
+ try {
+ byte[] bytes = (byte[])
+ ConvertUtils.convert(getBusinessObject(false), byte[].class);
+ return new ByteArrayInputStream(bytes);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public Object getObject() {
+ try {
+ return getBusinessObject(false);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public boolean isDestructiveRead() {
+ return true;
+ }
+
+ public boolean isDestructiveWrite() {
+ return true;
+ }
+
+
+ public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+ if (log.isDebugEnabled()) {
+ log.debug("Start getXMLBytes");
+ }
+ byte[] bytes = null;
+ try {
+ bytes = (byte[])
+ ConvertUtils.convert(getBusinessObject(false), byte[].class);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("End getXMLBytes");
+ }
+ return bytes;
+ }
+}
\ No newline at end of file
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/DataSourceBlockImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java?rev=1145074&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java Mon Jul 11 08:57:25 2011
@@ -0,0 +1,270 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
+
+package org.apache.axis2.jaxws.message.databinding.impl;
+
+import org.apache.axiom.om.OMDataSource;
+import org.apache.axiom.om.OMDataSourceExt;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMSourcedElement;
+import org.apache.axiom.om.OMXMLStreamReader;
+import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axis2.datasource.jaxb.JAXBDSContext;
+import org.apache.axis2.datasource.jaxb.JAXBDataSource;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.message.Message;
+import org.apache.axis2.jaxws.message.databinding.JAXBBlock;
+import org.apache.axis2.jaxws.message.databinding.JAXBBlockContext;
+import org.apache.axis2.jaxws.message.factory.BlockFactory;
+import org.apache.axis2.jaxws.message.impl.BlockImpl;
+import org.apache.axis2.jaxws.message.util.XMLStreamWriterWithOS;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebServiceException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * JAXBBlockImpl <p/> A Block containing a JAXB business object (either a JAXBElement or an object
+ * with @XmlRootElement).
+ */
+public class JAXBBlockImpl extends BlockImpl implements JAXBBlock {
+
+ private static final Log log = LogFactory.getLog(JAXBBlockImpl.class);
+
+ private static final boolean DEBUG_ENABLED = log.isDebugEnabled();
+
+ /**
+ * Called by JAXBBlockFactory
+ *
+ * @param busObject..The business object must be a JAXBElement or an object with an
+ * @XMLRootElement. This is assertion is validated in the JAXBFactory.
+ * @param busContext
+ * @param qName QName must be non-null
+ * @param factory
+ */
+ JAXBBlockImpl(Object busObject, JAXBBlockContext busContext, QName qName,
+ BlockFactory factory)
+ throws JAXBException {
+ super(busObject, busContext, qName, factory);
+ }
+
+ /**
+ * Called by JAXBBlockFactory
+ *
+ * @param omelement
+ * @param busContext
+ * @param qName must be non-null
+ * @param factory
+ */
+ JAXBBlockImpl(OMElement omElement, JAXBBlockContext busContext, QName qName,
+ BlockFactory factory) {
+ super(omElement, busContext, qName, factory);
+ }
+
+ protected Object _getBOFromReader(XMLStreamReader reader, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ // Get the JAXBBlockContext. All of the necessry information is recorded on it
+ JAXBBlockContext ctx = (JAXBBlockContext) busContext;
+
+ try {
+ busObject = ctx.unmarshal(reader);
+ } catch (JAXBException je) {
+ if (DEBUG_ENABLED) {
+ try {
+ log.debug("JAXBContext for unmarshal failure:" +
+ ctx.getJAXBContext(ctx.getClassLoader()));
+ } catch (Exception e) {
+ }
+ }
+ throw ExceptionFactory.makeWebServiceException(je);
+ }
+ return busObject;
+ }
+
+ @Override
+ protected Object _getBOFromOM(OMElement omElement, Object busContext)
+ throws XMLStreamException, WebServiceException {
+
+ // Shortcut to get business object from existing data source
+ if (omElement instanceof OMSourcedElement) {
+ OMDataSource ds = ((OMSourcedElement) omElement).getDataSource();
+ if (ds instanceof JAXBDataSource) {
+ // Update the business context to use the one provided
+ // by the datasource
+ try {
+ JAXBDSContext dsContext = ((JAXBDataSource) ds).getContext();
+ busContext = new JAXBBlockContext(dsContext.getJAXBContext());
+ } catch (JAXBException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ return ((JAXBDataSource) ds).getObject();
+ } else if (ds instanceof JAXBBlockImpl) {
+ // Update the business context to use the one provided by the
+ // by the datasource
+ JAXBBlockContext blockContext = (JAXBBlockContext) ((JAXBBlockImpl) ds).getBusinessContext();
+ busContext = blockContext;
+
+ return ((JAXBBlockImpl) ds).getObject();
+ }
+ }
+ return super._getBOFromOM(omElement, busContext);
+ }
+
+ /**
+ * @param busObj
+ * @param busContext
+ * @return
+ * @throws XMLStreamException
+ * @throws WebServiceException
+ */
+ private byte[] _getBytesFromBO(Object busObj, Object busContext, String encoding)
+ throws XMLStreamException, WebServiceException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ // Exposes getOutputStream, which allows faster writes.
+ XMLStreamWriterWithOS writer = new XMLStreamWriterWithOS(baos, encoding);
+
+ // Write the business object to the writer
+ _outputFromBO(busObj, busContext, writer);
+
+ // Flush the writer
+ writer.flush();
+ writer.close();
+ return baos.toByteArray();
+ }
+
+
+ @Override
+ protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ ByteArrayInputStream baos =
+ new ByteArrayInputStream(_getBytesFromBO(busObj, busContext, "utf-8"));
+ return StAXUtils.createXMLStreamReader(baos, "utf-8");
+ }
+
+ protected XMLStreamReader _getReaderFromOM(OMElement omElement) {
+ XMLStreamReader reader;
+ if (omElement.getBuilder() != null && !omElement.getBuilder().isCompleted()) {
+ reader = omElement.getXMLStreamReaderWithoutCaching();
+ } else {
+ reader = omElement.getXMLStreamReader();
+ }
+ if (reader instanceof OMXMLStreamReader) {
+ ((OMXMLStreamReader)reader).setInlineMTOM(false); // Optimize attachment usage
+ }
+ return reader;
+ }
+
+ protected void _outputFromBO(Object busObject, Object busContext, XMLStreamWriter writer)
+ throws XMLStreamException, WebServiceException {
+ JAXBBlockContext ctx = (JAXBBlockContext) busContext;
+
+ try {
+ ctx.marshal(busObject, writer);
+ } catch (JAXBException je) {
+ if (DEBUG_ENABLED) {
+ try {
+ log.debug("JAXBContext for marshal failure:" +
+ ctx.getJAXBContext(ctx.getClassLoader()));
+ } catch (Exception e) {
+ }
+ }
+ throw ExceptionFactory.makeWebServiceException(je);
+ }
+ }
+
+ public boolean isElementData() {
+ return true;
+ }
+
+ public boolean isXMLData() {
+ return true;
+ }
+
+ public void close() {
+ return; // Nothing to close
+ }
+
+ public InputStream getXMLInputStream(String encoding) throws UnsupportedEncodingException {
+ try {
+ byte[] bytes= _getBytesFromBO(
+ getBusinessObject(false),
+ busContext,
+ encoding);
+ return new ByteArrayInputStream(bytes);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public Object getObject() {
+ try {
+ return getBusinessObject(false);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public boolean isDestructiveRead() {
+ return false;
+ }
+
+ public boolean isDestructiveWrite() {
+ return false;
+ }
+
+ public OMDataSourceExt copy() throws OMException {
+
+ if (DEBUG_ENABLED) {
+ log.debug("Making a copy of the JAXB object");
+ }
+ return new JAXBDataSource(this.getObject(),
+ (JAXBDSContext) this.getBusinessContext());
+ }
+
+ public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+ try {
+ return _getBytesFromBO(getBusinessObject(false),
+ busContext,
+ encoding);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public void setParent(Message message) {
+ if (busContext != null) {
+ ((JAXBBlockContext) busContext).setMessage(message);
+ }
+ super.setParent(message);
+ }
+
+
+
+}
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java?rev=1145074&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java Mon Jul 11 08:57:25 2011
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
+
+package org.apache.axis2.jaxws.message.databinding.impl;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.message.databinding.OMBlock;
+import org.apache.axis2.jaxws.message.factory.BlockFactory;
+import org.apache.axis2.jaxws.message.impl.BlockImpl;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebServiceException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+
+/** OMBlockImpl Block with a business object that is an OMElement */
+public class OMBlockImpl extends BlockImpl implements OMBlock {
+
+
+ /**
+ * Called by OMBlockFactory
+ *
+ * @param busObject
+ * @param factory
+ */
+ OMBlockImpl(OMElement busObject, BlockFactory factory) {
+ super(busObject,
+ null,
+ busObject.getQName(),
+ factory);
+ }
+
+ @Override
+ protected Object _getBOFromReader(XMLStreamReader reader, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ // Take a shortcut and return the OMElement
+ return this.getOMElement();
+ }
+
+ @Override
+ protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ OMElement om = (OMElement)busObj;
+ return om.getXMLStreamReader();
+ }
+
+ @Override
+ protected Object _getBOFromOM(OMElement om, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ return om;
+ }
+
+ @Override
+ protected OMElement _getOMFromBO(Object busObject, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ return (OMElement) busObject;
+ }
+
+ @Override
+ protected void _outputFromBO(Object busObject, Object busContext, XMLStreamWriter writer)
+ throws XMLStreamException, WebServiceException {
+ OMElement om = (OMElement)busObject;
+ om.serialize(writer);
+ }
+
+ public boolean isElementData() {
+ return true;
+ }
+
+ public boolean isXMLData() {
+ return true;
+ }
+
+ public void close() {
+ return; // Nothing to close
+ }
+
+ public InputStream getXMLInputStream(String encoding) throws UnsupportedEncodingException {
+ byte[] bytes = getXMLBytes(encoding);
+ return new ByteArrayInputStream(bytes);
+ }
+
+ public Object getObject() {
+ try {
+ return getBusinessObject(false);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public boolean isDestructiveRead() {
+ return false;
+ }
+
+ public boolean isDestructiveWrite() {
+ return false;
+ }
+
+ public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ OMOutputFormat format = new OMOutputFormat();
+ format.setCharSetEncoding(encoding);
+ try {
+ serialize(baos, format);
+ baos.flush();
+ return baos.toByteArray();
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ } catch (IOException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+}
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/OMBlockImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java?rev=1145074&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java Mon Jul 11 08:57:25 2011
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
+
+/**
+ *
+ */
+package org.apache.axis2.jaxws.message.databinding.impl;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.message.Message;
+import org.apache.axis2.jaxws.message.databinding.SOAPEnvelopeBlock;
+import org.apache.axis2.jaxws.message.factory.BlockFactory;
+import org.apache.axis2.jaxws.message.factory.MessageFactory;
+import org.apache.axis2.jaxws.message.impl.BlockImpl;
+import org.apache.axis2.jaxws.message.util.SOAPElementReader;
+import org.apache.axis2.jaxws.registry.FactoryRegistry;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebServiceException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+
+/**
+ *
+ *
+ */
+public class SOAPEnvelopeBlockImpl extends BlockImpl implements SOAPEnvelopeBlock {
+
+ /**
+ * Called by SOAPEnvelopeBlockFactory
+ *
+ * @param busObject
+ * @param busContext
+ * @param qName
+ * @param factory
+ */
+ public SOAPEnvelopeBlockImpl(Object busObject, Object busContext,
+ QName qName, BlockFactory factory) {
+ super(busObject,
+ busContext,
+ (qName == null) ? getQName((SOAPEnvelope)busObject) : qName,
+ factory);
+ }
+
+ /**
+ * Called by SOAPEnvelopeBlockFactory
+ *
+ * @param omElement
+ * @param busContext
+ * @param qName
+ * @param factory
+ */
+ public SOAPEnvelopeBlockImpl(OMElement omElement, Object busContext,
+ QName qName, BlockFactory factory) {
+ super(omElement, busContext, qName, factory);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.message.impl.BlockImpl#_getBOFromReader(javax.xml.stream.XMLStreamReader, java.lang.Object)
+ */
+ @Override
+ protected Object _getBOFromReader(XMLStreamReader reader, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ MessageFactory mf = (MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
+ Message message = mf.createFrom(reader, null);
+ SOAPEnvelope env = message.getAsSOAPEnvelope();
+ this.setQName(getQName(env));
+ return env;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.message.impl.BlockImpl#_getReaderFromBO(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ return new SOAPElementReader((SOAPElement)busObj);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.axis2.jaxws.message.impl.BlockImpl#_outputFromBO(java.lang.Object, java.lang.Object, javax.xml.stream.XMLStreamWriter)
+ */
+ @Override
+ protected void _outputFromBO(Object busObject, Object busContext,
+ XMLStreamWriter writer)
+ throws XMLStreamException, WebServiceException {
+ XMLStreamReader reader = _getReaderFromBO(busObject, busContext);
+ _outputFromReader(reader, writer);
+ }
+
+ /**
+ * Get the QName of the envelope
+ *
+ * @param env
+ * @return QName
+ */
+ private static QName getQName(SOAPEnvelope env) {
+ return new QName(env.getNamespaceURI(), env.getLocalName(), env.getPrefix());
+ }
+
+ public boolean isElementData() {
+ return true;
+ }
+
+ public boolean isXMLData() {
+ return true;
+ }
+
+ public void close() {
+ return; // Nothing to close
+ }
+
+ public InputStream getXMLInputStream(String encoding) throws UnsupportedEncodingException {
+ byte[] bytes = getXMLBytes(encoding);
+ return new ByteArrayInputStream(bytes);
+ }
+
+ public Object getObject() {
+ try {
+ return getBusinessObject(false);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public boolean isDestructiveRead() {
+ return false;
+ }
+
+ public boolean isDestructiveWrite() {
+ return false;
+ }
+
+ public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ OMOutputFormat format = new OMOutputFormat();
+ format.setCharSetEncoding(encoding);
+ try {
+ serialize(baos, format);
+ baos.flush();
+ return baos.toByteArray();
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ } catch (IOException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+}
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SOAPEnvelopeBlockImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java?rev=1145074&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java Mon Jul 11 08:57:25 2011
@@ -0,0 +1,378 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
+
+package org.apache.axis2.jaxws.message.databinding.impl;
+
+import org.apache.axiom.om.OMDataSource;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMSourcedElement;
+import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axiom.soap.SOAP11Constants;
+import org.apache.axis2.datasource.SourceDataSource;
+import org.apache.axis2.java.security.AccessController;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.axis2.jaxws.message.databinding.SourceBlock;
+import org.apache.axis2.jaxws.message.factory.BlockFactory;
+import org.apache.axis2.jaxws.message.impl.BlockImpl;
+import org.apache.axis2.jaxws.message.util.Reader2Writer;
+import org.apache.axis2.jaxws.utility.ConvertUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.bind.util.JAXBSource;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.WebServiceException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+/**
+ * SourceBlock
+ * <p/>
+ * Block containing a business object that is a javax.xml.transform.Source.
+ * <p/>
+ * The javax.xml.transform.Source is an interface. The actual concrete class may be one of the
+ * following: - StreamSource - DOMSource - JAXBSource - SAXSource - StAXSource
+ * <p/>
+ * During processing of the block, the block is free to change the representation from one source
+ * to another. (i.e. if you initially seed this with a SAXSource, but a later access may give you
+ * a StAXSource).
+ * <p/>
+ * A Source is consumed when read. The block will make a copy of the source if a non-consumable
+ * request is made.
+ */
+public class SourceBlockImpl extends BlockImpl implements SourceBlock {
+
+ private static final Log log = LogFactory.getLog(SourceBlockImpl.class);
+ private static Class staxSource = null;
+
+ static {
+ try {
+ // Dynamically discover if StAXSource is available
+ staxSource = forName("javax.xml.transform.stax.StAXSource");
+ } catch (Exception e) {
+ if (log.isDebugEnabled()) {
+ log.debug("StAXSource is not present in the JDK. " +
+ "This is acceptable. Processing continues");
+ }
+ }
+ try {
+ // Woodstox does not work with StAXSource
+ if(XMLInputFactory.newInstance().getClass().getName().indexOf("wstx")!=-1){
+ staxSource = null;
+ }
+ } catch (Exception e){
+ }
+ }
+
+ /**
+ * Constructor called from factory
+ *
+ * @param busObject
+ * @param qName
+ * @param factory
+ */
+ SourceBlockImpl(Source busObject, QName qName, BlockFactory factory)
+ throws WebServiceException {
+ super(busObject, null, qName, factory);
+
+ // Check validity of Source
+ if (busObject instanceof DOMSource ||
+ busObject instanceof SAXSource ||
+ busObject instanceof StreamSource ||
+ (busObject.getClass().equals(staxSource)) ||
+ busObject instanceof JAXBSource) {
+ // Okay, these are supported Source objects
+ if (log.isDebugEnabled()) {
+ log.debug("data object is a " + busObject.getClass().getName());
+ }
+ } else {
+ throw ExceptionFactory.makeWebServiceException(
+ Messages.getMessage("SourceNotSupported", busObject.getClass().getName()));
+ }
+ }
+
+
+ /**
+ * Constructor called from factory
+ *
+ * @param reader
+ * @param qName
+ * @param factory
+ */
+ public SourceBlockImpl(OMElement omElement, QName qName, BlockFactory factory) {
+ super(omElement, null, qName, factory);
+ }
+
+ @Override
+ protected Object _getBOFromReader(XMLStreamReader reader, Object busContext)
+ throws XMLStreamException {
+
+ // Best solution is to use a StAXSource
+ // However StAXSource is not widely accepted.
+ // For now, a StreamSource is always returned
+ /*
+ if (staxSource != null) {
+ try {
+ // TODO Constructor should be statically cached for performance
+ Constructor c =
+ staxSource.getDeclaredConstructor(new Class[] { XMLStreamReader.class });
+ return c.newInstance(new Object[] { reader });
+ } catch (Exception e) {
+ }
+ }
+ */
+
+ // TODO StreamSource is not performant...work is needed here to make this faster
+ Reader2Writer r2w = new Reader2Writer(reader);
+ String text = r2w.getAsString();
+ StringReader sr = new StringReader(text);
+ return new StreamSource(sr);
+
+ }
+
+ @Override
+ protected Object _getBOFromOM(OMElement omElement, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ Object busObject;
+
+ // Shortcut to get business object from existing data source
+ if (omElement instanceof OMSourcedElement) {
+ OMDataSource ds = ((OMSourcedElement) omElement).getDataSource();
+ if (ds instanceof SourceDataSource) {
+ return ((SourceDataSource) ds).getObject();
+ }
+ }
+
+ // If the message is a fault, there are some special gymnastics that we have to do
+ // to get this working for all of the handler scenarios.
+ boolean hasFault = false;
+ if ((parent != null && parent.isFault()) ||
+ omElement.getQName().getLocalPart().equals(SOAP11Constants.SOAPFAULT_LOCAL_NAME)) {
+ hasFault = true;
+ }
+
+ // Transform reader into business object
+ if (!hasFault) {
+ busObject = super._getBOFromOM(omElement, busContext);
+ }
+ else {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ omElement.serialize(baos);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ busObject = new StreamSource(bais);
+ }
+ return busObject;
+ }
+
+ @Override
+ protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
+ throws XMLStreamException, WebServiceException {
+ try {
+ // TODO not sure if this is always the most performant way to do this.
+ /* The following code failed in some (CTS) environments.
+ if (busObj instanceof DOMSource) {
+ // Let's use our own DOMReader for now...
+ Element element = null;
+
+ // Business Object msut be a Document or Element
+ Node node = ((DOMSource)busObj).getNode();
+ if(node instanceof Document){
+ element = ((Document)node).getDocumentElement();
+ }else{
+ element = (Element) ((DOMSource)busObj).getNode();
+ }
+
+ // We had some problems with testers producing DOMSources w/o Namespaces.
+ // It's easy to catch this here.
+ if (element.getLocalName() == null) {
+ throw new XMLStreamException(ExceptionFactory.
+ makeWebServiceException(Messages.getMessage("JAXBSourceNamespaceErr")));
+ }
+
+ return new DOMReader(element);
+ }
+ */
+
+ if (busObj instanceof StreamSource) {
+ XMLInputFactory f = StAXUtils.getXMLInputFactory();
+
+ XMLStreamReader reader = f.createXMLStreamReader((Source)busObj);
+ StAXUtils.releaseXMLInputFactory(f);
+ return reader;
+ }
+ //TODO: For GM we need to only use this approach when absolutely necessary.
+ // For example, we don't want to do this if this is a (1.6) StaxSource or if the
+ // installed parser provides a better solution.
+ //TODO: Uncomment this code if woodstock parser handles
+ // JAXBSource and SAXSource correctly.
+ //return inputFactory.createXMLStreamReader((Source) busObj);
+ return _slow_getReaderFromSource((Source)busObj);
+ } catch (Exception e) {
+ String className = (busObj == null) ? "none" : busObj.getClass().getName();
+ throw ExceptionFactory
+ .makeWebServiceException(Messages.getMessage("SourceReadErr", className), e);
+ }
+ }
+
+ /** Creates an XMLStreamReader from a Source using a slow but proven algorithm. */
+ private XMLStreamReader _slow_getReaderFromSource(Source src) throws XMLStreamException {
+ if (log.isDebugEnabled()) {
+ log.debug("Start _slow_getReaderFromSource");
+ }
+ byte[] bytes = (byte[]) ConvertUtils.convert(src, byte[].class);
+ if (log.isDebugEnabled()) {
+ log.debug("Successfully converted to ByteArray");
+ }
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+ XMLStreamReader reader = StAXUtils.createXMLStreamReader(bais);
+ if (log.isDebugEnabled()) {
+ log.debug("End _slow_getReaderFromSource =" + reader);
+ }
+ return reader;
+ }
+
+ @Override
+ protected void _outputFromBO(Object busObject, Object busContext, XMLStreamWriter writer)
+ throws XMLStreamException, WebServiceException {
+ // There is no fast way to output the Source to a writer, so get the reader
+ // and pass use the default reader->writer.
+ if (log.isDebugEnabled()) {
+ log.debug("Start _outputFromBO");
+ }
+ XMLStreamReader reader = _getReaderFromBO(busObject, busContext);
+ if (log.isDebugEnabled()) {
+ log.debug("Obtained reader=" + reader);
+ }
+ _outputFromReader(reader, writer);
+ if (log.isDebugEnabled()) {
+ log.debug("End _outputReaderFromBO");
+ }
+ // REVIEW Should we call close() on the Source ?
+ }
+
+
+ @Override
+ protected Object _getBOFromBO(Object busObject, Object busContext, boolean consume) {
+ if (consume) {
+ return busObject;
+ } else {
+ // TODO Missing Impl
+ throw ExceptionFactory.makeWebServiceException(
+ Messages.getMessage("SourceMissingSupport", busObject.getClass().getName()));
+ }
+ }
+
+
+ public boolean isElementData() {
+ return false; // The source could be a text or element etc.
+ }
+
+ public boolean isXMLData() {
+ return true;
+ }
+
+ /**
+ * Return the class for this name
+ * @return Class
+ */
+ private static Class forName(final String className) throws ClassNotFoundException {
+ // NOTE: This method must remain private because it uses AccessController
+ Class cl = null;
+ try {
+ cl = (Class)AccessController.doPrivileged(
+ new PrivilegedExceptionAction() {
+ public Object run() throws ClassNotFoundException {
+ return Class.forName(className);
+ }
+ }
+ );
+ } catch (PrivilegedActionException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Exception thrown from AccessController: " + e);
+ }
+ throw (ClassNotFoundException)e.getException();
+ }
+
+ return cl;
+ }
+
+
+ public void close() {
+ return; // Nothing to close
+ }
+
+ public InputStream getXMLInputStream(String encoding) throws UnsupportedEncodingException {
+ try {
+ byte[] bytes = (byte[])
+ ConvertUtils.convert(getBusinessObject(false), byte[].class);
+ return new ByteArrayInputStream(bytes);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public Object getObject() {
+ try {
+ return getBusinessObject(false);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public boolean isDestructiveRead() {
+ return true;
+ }
+
+ public boolean isDestructiveWrite() {
+ return true;
+ }
+
+
+ public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+ if (log.isDebugEnabled()) {
+ log.debug("Start getXMLBytes");
+ }
+ byte[] bytes = null;
+ try {
+ bytes = (byte[])
+ ConvertUtils.convert(getBusinessObject(false), byte[].class);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("End getXMLBytes");
+ }
+ return bytes;
+ }
+}
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/SourceBlockImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java
URL: http://svn.apache.org/viewvc/geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java?rev=1145074&view=auto
==============================================================================
--- geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java (added)
+++ geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java Mon Jul 11 08:57:25 2011
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
+
+package org.apache.axis2.jaxws.message.databinding.impl;
+
+import org.apache.axiom.om.OMDataSource;
+import org.apache.axiom.om.OMDataSourceExt;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMSourcedElement;
+import org.apache.axiom.om.util.StAXUtils;
+import org.apache.axis2.datasource.XMLStringDataSource;
+import org.apache.axis2.jaxws.ExceptionFactory;
+import org.apache.axis2.jaxws.message.databinding.XMLStringBlock;
+import org.apache.axis2.jaxws.message.factory.BlockFactory;
+import org.apache.axis2.jaxws.message.impl.BlockImpl;
+import org.apache.axis2.jaxws.message.util.Reader2Writer;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebServiceException;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * XMLStringBlock
+ * <p/>
+ * Block containing a business object that is a String of xml text
+ */
+public class XMLStringBlockImpl extends BlockImpl implements XMLStringBlock {
+
+ /**
+ * Constructor called from factory
+ *
+ * @param busObject
+ * @param qName
+ * @param factory
+ */
+ XMLStringBlockImpl(String busObject, QName qName, BlockFactory factory) {
+ super(busObject, null, qName, factory);
+ }
+
+
+ /**
+ * Constructor called from factory
+ *
+ * @param reader
+ * @param qName
+ * @param factory
+ */
+ public XMLStringBlockImpl(OMElement omElement, QName qName, BlockFactory factory) {
+ super(omElement, null, qName, factory);
+ }
+
+ protected Object _getBOFromReader(XMLStreamReader reader, Object busContext)
+ throws XMLStreamException {
+ // Create a Reader2Writer converter and get the output as a String
+ Reader2Writer r2w;
+ if ((busContext == null) && (omElement != null) && (omElement.isComplete())) {
+ r2w = new Reader2Writer(reader, false);
+ } else {
+ r2w = new Reader2Writer(reader);
+ }
+ return r2w.getAsString();
+ }
+
+ @Override
+ protected Object _getBOFromOM(OMElement omElement, Object busContext)
+ throws XMLStreamException, WebServiceException {
+
+ // Shortcut to get business object from existing data source
+ if (omElement instanceof OMSourcedElement) {
+ OMDataSource ds = ((OMSourcedElement) omElement).getDataSource();
+ if (ds instanceof XMLStringDataSource) {
+ return ((XMLStringDataSource) ds).getObject();
+ }
+ }
+ return super._getBOFromOM(omElement, busContext);
+ }
+
+ protected XMLStreamReader _getReaderFromBO(Object busObj, Object busContext)
+ throws XMLStreamException {
+ // Create an XMLStreamReader from the inputFactory using the String as the sources
+ String str = (String)busObj;
+ StringReader sr = new StringReader(str);
+ return StAXUtils.createXMLStreamReader(sr);
+ }
+
+ protected void _outputFromBO(Object busObject, Object busContext, XMLStreamWriter writer)
+ throws XMLStreamException {
+ // There is no fast way to output the String to a writer, so get the reader
+ // and pass use the default reader->writer.
+ XMLStreamReader reader = _getReaderFromBO(busObject, busContext);
+ _outputFromReader(reader, writer);
+ }
+
+
+ public boolean isElementData() {
+ return false; // The text could be element or text or something else
+ }
+
+ public boolean isXMLData() {
+ return true;
+ }
+
+ public void close() {
+ return; // Nothing to close
+ }
+
+ public InputStream getXMLInputStream(String encoding) throws UnsupportedEncodingException {
+ try {
+ byte[] bytes = ((String) getBusinessObject(false)).getBytes(encoding);
+ return new ByteArrayInputStream(bytes);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public Object getObject() {
+ try {
+ return getBusinessObject(false);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+
+ public boolean isDestructiveRead() {
+ return false;
+ }
+
+ public boolean isDestructiveWrite() {
+ return false;
+ }
+
+ public OMDataSourceExt copy() throws OMException {
+ return new XMLStringDataSource((String) getObject());
+ }
+
+
+ public byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
+ try {
+ return ((String) getBusinessObject(false)).getBytes(encoding);
+ } catch (XMLStreamException e) {
+ throw ExceptionFactory.makeWebServiceException(e);
+ }
+ }
+}
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/bundles/trunk/axis2/src/main/java/org/apache/axis2/jaxws/message/databinding/impl/XMLStringBlockImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain