[jboss-svn-commits] JBossWS SVN: r877 - in branches/tdiesler/trunk/src: main/java/org/jboss/ws/addressing/soap main/java/org/jboss/ws/binding main/java/org/jboss/ws/binding/soap main/java/org/jboss/ws/handler main/java/org/jboss/ws/jaxrpc main/java/org/jboss/ws/jaxrpc/encoding main/java/org/jboss/ws/jaxrpc/handler main/java/org/jboss/ws/jaxws main/java/org/jboss/ws/jaxws/core main/java/org/jboss/ws/jbossxb main/java/org/jboss/ws/server main/java/org/jboss/ws/soap main/java/org/jboss/ws/soap/attachment main/java/org/jboss/ws/utils main/java/org/jboss/ws/wsse main/java/org/jboss/ws/xop test/java/org/jboss/test/ws/samples/mtom test/java/org/jboss/test/ws/wsse test/java/org/jboss/test/ws/xop test/java/org/jboss/test/ws/xop/doclit test/resources/samples-override/mtom/WEB-INF test/resources/samples-override/mtom/WEB-INF/wsdl test/resources/xop test/resources/xop/doclit/WEB-INF test/resources/xop/doclit/WEB-INF/wsdl

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Sep 1 05:12:21 EDT 2006


Author: thomas.diesler at jboss.com
Date: 2006-09-01 05:11:50 -0400 (Fri, 01 Sep 2006)
New Revision: 877

Added:
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SAAJElementWriter.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPValueAdapter.java
Removed:
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerSupport.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentUnmarshallerImpl.java
Modified:
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/addressing/soap/SOAPAddressingPropertiesImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeDeserializer.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeSerializer.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/soap/SOAPMessageMarshaller.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/handler/HandlerChainBaseImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/CallProxy.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/StubExt.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleDeserializer.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleSerializer.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/handler/HandlerChainBaseImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBDeserializer.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBSerializer.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/core/SOAPBindingImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/jbossxb/SchemaBindingBuilder.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ContextServlet.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ServiceEndpoint.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/MessageFactoryImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SAAJPayloadBuilderDOM.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementMessage.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementRpc.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPConnectionImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPContentElement.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPDocument.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPElementImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPEnvelopeImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFactoryImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFaultImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPHeaderImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPMessageImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPPartImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/ByteArrayContentHandler.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedSwAEncoder.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedXOPEncoder.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/IOUtils.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/MimeUtils.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/ThreadLocalAssociation.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/wsse/SecurityStore.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPContext.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPMarshallerImpl.java
   branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPUnmarshallerImpl.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPRpcTestCase.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTest.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTestImpl.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/wsse/PasswordUtil.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPElementRPCTestCase.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPTypeDefTestCase.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/InlineHandler.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsg.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsgResponse.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/TestServiceImpl.java
   branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/XOPElementDoclitTestCase.java
   branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/jaxrpc-mapping.xml
   branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/wsdl/TestService.wsdl
   branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/jaxrpc-mapping.xml
   branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/wsdl/TestService.wsdl
   branches/tdiesler/trunk/src/test/resources/xop/schema.xsd
Log:
merge from trunk -r876

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/addressing/soap/SOAPAddressingPropertiesImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/addressing/soap/SOAPAddressingPropertiesImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/addressing/soap/SOAPAddressingPropertiesImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -53,6 +53,7 @@
 import org.jboss.ws.soap.NameImpl;
 import org.jboss.ws.soap.SOAPElementImpl;
 import org.jboss.ws.soap.SOAPFactoryImpl;
+import org.jboss.ws.utils.ThreadLocalAssociation;
 import org.jboss.xb.binding.NamespaceRegistry;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
@@ -74,8 +75,10 @@
 
    public void readHeaders(SOAPMessage message) throws AddressingException
    {
+      Boolean domExpansion = ThreadLocalAssociation.localDomExpansion().get();
       try
       {
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.TRUE);
          SOAPHeader soapHeader = message.getSOAPHeader();
 
          SOAPAddressingBuilder builder = new SOAPAddressingBuilderImpl();
@@ -183,6 +186,9 @@
       {
          throw new AddressingException("Cannot read headers", ex);
       }
+      finally{
+         ThreadLocalAssociation.localDomExpansion().set(domExpansion);
+      }
    }
 
    public void writeHeaders(SOAPMessage message) throws AddressingException

Deleted: branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -1,105 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ws.binding;
-
-// $Id: $
-
-import javax.activation.DataHandler;
-import javax.xml.bind.attachment.AttachmentMarshaller;
-import javax.xml.namespace.QName;
-import javax.xml.soap.AttachmentPart;
-
-import org.jboss.logging.Logger;
-import org.jboss.util.NotImplementedException;
-import org.jboss.ws.Constants;
-import org.jboss.ws.jaxrpc.handler.SOAPMessageContextJAXRPC;
-import org.jboss.ws.soap.MessageContextAssociation;
-import org.jboss.ws.soap.SOAPMessageImpl;
-import org.jboss.ws.soap.attachment.MimeConstants;
-import org.jboss.xb.binding.NamespaceRegistry;
-
-/**
- * The AttachmentMarshaller allows callbacks from the binding layer towards the
- * soap processing components in order to optimize binary processing.
- *
- * @see AttachmentUnmarshallerImpl
- * @see org.jboss.ws.jbossxb.JBossXBSerializer
- * @see org.jboss.ws.jaxrpc.encoding.SimpleSerializer
- *
- * @author Heiko Braun <heiko.braun at jboss.com>
- * @since May 9, 2006
- */
-public class AttachmentMarshallerImpl extends AttachmentMarshaller
-{
-   private static final Logger log = Logger.getLogger(AttachmentMarshallerImpl.class);
-
-   public AttachmentMarshallerImpl()
-   {
-   }
-
-   public boolean isXOPPackage()
-   {
-      return AttachmentMarshallerSupport.isXOPPackage();
-   }
-
-   public String addMtomAttachment(DataHandler dataHandler, String elementNamespace, String elementName)
-   {
-
-      QName xmlName = new QName(elementNamespace, elementName);
-      log.debug("serialize: [xmlName=" + xmlName + "]");
-
-      SOAPMessageContextJAXRPC msgContext = (SOAPMessageContextJAXRPC)MessageContextAssociation.peekMessageContext();
-      SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
-      SerializationContext serContext = msgContext.getSerializationContext();
-      NamespaceRegistry nsRegistry = serContext.getNamespaceRegistry();
-
-      // Add the xop:Include element
-      StringBuilder xopInclude = new StringBuilder("<" + Constants.PREFIX_XOP + ":Include ");
-      xopInclude.append("xmlns:" + Constants.PREFIX_XOP + "='" + Constants.NS_XOP + "' ");
-      String cid = soapMessage.getCidGenerator().generateFromName(xmlName.getLocalPart());
-
-      // RFC2392 requires the 'cid:' prefix to be added to the XML element
-      xopInclude.append("href='cid:" + cid + "'/>");
-
-      AttachmentPart xopPart = soapMessage.createAttachmentPart(dataHandler);
-      xopPart.addMimeHeader(MimeConstants.CONTENT_ID, '<' + cid + '>'); // RFC2392 requirement
-      soapMessage.addAttachmentPart(xopPart);
-
-      return xopInclude.toString();
-
-   }
-
-   public String addMtomAttachment(byte[] data, String elementNamespace, String elementName)
-   {
-      throw new NotImplementedException();
-   }
-
-   public String addSwaRefAttachment(DataHandler dataHandler)
-   {
-      throw new NotImplementedException();
-   }
-
-   public String addMtomAttachment(byte[] arg0, int arg1, int arg2, String arg3, String arg4, String arg5)
-   {
-      throw new NotImplementedException();
-   }
-}

Deleted: branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerSupport.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerSupport.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentMarshallerSupport.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -1,43 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.ws.binding;
-
-import org.jboss.ws.common.SOAPMessageContextBase;
-import org.jboss.ws.soap.MessageContextAssociation;
-import org.jboss.ws.soap.SOAPMessageImpl;
-
-/**
- * @author Heiko Braun <heiko.braun at jboss.com>
- * @since May 10, 2006
- */
-public class AttachmentMarshallerSupport {
-
-   public static boolean isXOPPackage() {
-      boolean isXOP = false;
-      SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
-      if(msgContext!=null) {
-         SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
-         isXOP = (soapMessage != null && soapMessage.isXOPMessage());
-      }
-      return isXOP;
-   }
-}

Deleted: branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentUnmarshallerImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentUnmarshallerImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/AttachmentUnmarshallerImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -1,95 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ws.binding;
-
-// $Id: $
-
-import javax.activation.DataHandler;
-import javax.xml.bind.attachment.AttachmentUnmarshaller;
-import javax.xml.soap.AttachmentPart;
-import javax.xml.soap.SOAPException;
-
-import org.jboss.logging.Logger;
-import org.jboss.util.NotImplementedException;
-import org.jboss.ws.WSException;
-import org.jboss.ws.common.SOAPMessageContextBase;
-import org.jboss.ws.soap.MessageContextAssociation;
-import org.jboss.ws.soap.SOAPMessageImpl;
-
-/**
- * The AttachmentUnmarshaller allows callbacks from the binding layer towards the
- * soap processing components in order to optimize binary processing.
- *
- * @see AttachmentMarshallerImpl
- * @see org.jboss.ws.jbossxb.JBossXBDeserializer
- * @see org.jboss.ws.jaxrpc.encoding.SimpleDeserializer
- *
- * @author Heiko Braun <heiko.braun at jboss.com>
- * @since May 9, 2006
- */
-public class AttachmentUnmarshallerImpl extends AttachmentUnmarshaller
-{
-
-   private static final Logger log = Logger.getLogger(AttachmentUnmarshallerImpl.class);
-
-   public AttachmentUnmarshallerImpl()
-   {
-   }
-
-   public boolean isXOPPackage()
-   {
-      return AttachmentMarshallerSupport.isXOPPackage();
-   }
-
-   public DataHandler getAttachmentAsDataHandler(String cid)
-   {
-
-      try
-      {
-         SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
-         SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
-
-         // RFC2392 requires the 'cid:' part to be stripped from the cid
-         if (cid.startsWith("cid:"))
-            cid = cid.substring(4);
-         
-         cid = '<' + cid + '>'; // RFC2392 requirement
-
-         AttachmentPart part = soapMessage.getAttachmentByContentId(cid);
-         if (part == null)
-            throw new WSException("Cannot find attachment part for: " + cid);
-
-         DataHandler dataHandler = part.getDataHandler();
-         return dataHandler;
-      }
-      catch (SOAPException ex)
-      {
-         throw new WSException(ex);
-      }
-
-   }
-
-   public byte[] getAttachmentAsByteArray(String cid)
-   {
-      throw new NotImplementedException();
-   }
-}

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeDeserializer.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeDeserializer.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeDeserializer.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,11 +23,6 @@
 
 // $Id$
 
-import java.io.IOException;
-
-import javax.activation.DataHandler;
-
-
 /**
  * A Deserializer that can handle complex types by delegating to JAXB.
  *
@@ -36,19 +31,5 @@
  */
 public abstract class ComplexTypeDeserializer extends DeserializerSupport
 {
-   protected AttachmentUnmarshallerImpl attachmentUnmarshaller = new AttachmentUnmarshallerImpl();
 
-   protected Object deserializeXOP(String val, Object value) throws BindingException
-   {
-      try
-      {
-         DataHandler dataHandler = attachmentUnmarshaller.getAttachmentAsDataHandler(val);
-         value = dataHandler.getContent();
-      }
-      catch (IOException e)
-      {
-         throw new BindingException("Failed to unmarshal XOP content: " + e.getMessage());
-      }
-      return value;
-   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeSerializer.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeSerializer.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/ComplexTypeSerializer.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,14 +23,6 @@
 
 // $Id$
 
-import java.io.StringWriter;
-
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-
-import org.jboss.ws.utils.MimeUtils;
-import org.jboss.xb.binding.NamespaceRegistry;
-
 /**
  * A Serializer that can handle complex types by delegating to JAXB.
  *
@@ -39,45 +31,5 @@
  */
 public abstract class ComplexTypeSerializer extends SerializerSupport
 {
-   
-   protected AttachmentMarshallerImpl attachmentMarshaller = new AttachmentMarshallerImpl();
 
-   protected String serializeXOP(QName xmlName, Object value, SerializationContext serContext, AttachmentMarshallerImpl attachmentMarshaller)
-   {
-      String xmlFragment;
-      DataHandler dataHandler = null;
-      if (value instanceof DataHandler)
-      {
-         dataHandler = (DataHandler)value;
-      }
-      else
-      {
-         dataHandler = new DataHandler(value, MimeUtils.resolveMimeType(value));
-      }
-
-      String xopInclude = attachmentMarshaller.addMtomAttachment(dataHandler, xmlName.getNamespaceURI(), xmlName.getLocalPart());
-
-      StringWriter strwr = new StringWriter();
-
-      if (xmlName.getNamespaceURI().length() > 0)
-      {
-         NamespaceRegistry nsRegistry = serContext.getNamespaceRegistry();
-         xmlName = nsRegistry.registerQName(xmlName);
-         String prefix = xmlName.getPrefix();
-         String elName = prefix + ":" + xmlName.getLocalPart();
-         String xmlns = " xmlns:" + prefix + "='" + xmlName.getNamespaceURI() + "'";
-         strwr.write("<" + elName + xmlns + ">");
-         strwr.write(xopInclude);
-         strwr.write("</" + elName + ">");
-      }
-      else
-      {
-         strwr.write("<" + xmlName.getLocalPart() + ">");
-         strwr.write(xopInclude);
-         strwr.write("</" + xmlName.getLocalPart() + ">");
-      }
-
-      xmlFragment = strwr.toString();
-      return xmlFragment;
-   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/soap/SOAPMessageMarshaller.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/soap/SOAPMessageMarshaller.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/binding/soap/SOAPMessageMarshaller.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,19 +21,18 @@
 */
 package org.jboss.ws.binding.soap;
 
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.xml.soap.SOAPEnvelope;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPMessage;
-
 import org.jboss.logging.Logger;
 import org.jboss.remoting.InvocationRequest;
 import org.jboss.remoting.invocation.OnewayInvocation;
 import org.jboss.remoting.marshal.Marshaller;
-import org.jboss.util.xml.DOMWriter;
+import org.jboss.ws.soap.SAAJElementWriter;
+import org.jboss.ws.soap.SOAPElementImpl;
 
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+import java.io.IOException;
+import java.io.OutputStream;
 /**
  * @author Thomas.Diesler at jboss.org
  * @since 25-Nov-2004
@@ -71,7 +70,7 @@
          if (log.isTraceEnabled())
          {
             SOAPEnvelope soapEnv = soapMessage.getSOAPPart().getEnvelope();
-            String envStr = DOMWriter.printNode(soapEnv, true);
+            String envStr = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapEnv, true);
             log.trace("Outgoing SOAPMessage\n" + envStr);
          }
 

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/handler/HandlerChainBaseImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/handler/HandlerChainBaseImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/handler/HandlerChainBaseImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -24,16 +24,15 @@
 // $Id$
 
 import org.jboss.logging.Logger;
-import org.jboss.util.xml.DOMWriter;
 import org.jboss.ws.Constants;
 import org.jboss.ws.jaxrpc.handler.HandlerWrapper;
 import org.jboss.ws.common.SOAPMessageContextBase;
 import org.jboss.ws.metadata.EndpointMetaData;
 import org.jboss.ws.metadata.OperationMetaData;
 import org.jboss.ws.metadata.ParameterMetaData;
+import org.jboss.ws.soap.SAAJElementWriter;
 import org.jboss.ws.soap.SOAPEnvelopeImpl;
 import org.jboss.ws.soap.SOAPMessageImpl;
-import org.jboss.ws.xop.XOPContext;
 
 import javax.xml.namespace.QName;
 import javax.xml.rpc.JAXRPCException;
@@ -242,9 +241,7 @@
 
                currHandler = ((HandlerEntry)handlers.get(handlerIndex)).getHandler();
                log.debug("Handle request: " + currHandler);
-               XOPContext.setInlineBase64();
                doNext = currHandler.handleRequest(msgContext);
-               XOPContext.unsetInlineBase64();
 
                if (log.isTraceEnabled())
                {
@@ -310,9 +307,7 @@
 
                currHandler = ((HandlerEntry)handlers.get(handlerIndex)).getHandler();
                log.debug("Handle response: " + currHandler);
-               XOPContext.setInlineBase64();
                doNext = currHandler.handleResponse(msgContext);
-               XOPContext.unsetInlineBase64();
 
                if (log.isTraceEnabled())
                {
@@ -390,7 +385,7 @@
       try
       {
          SOAPEnvelopeImpl soapEnv = (SOAPEnvelopeImpl)soapPart.getEnvelope();
-         String envString = DOMWriter.printNode(soapEnv, true);
+         String envString = SAAJElementWriter.printSOAPElement(soapEnv, true);
          if (envString.equals(lastMessageTrace) == false)
          {
             log.debug(envString);

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/CallProxy.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/CallProxy.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/CallProxy.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -180,7 +180,7 @@
 
    private String assertPropertyName(String name)
    {
-      if (name.startsWith("javax.xml.rpc") && standardProperties.contains(name) == false)
+      if (name != null && name.startsWith("javax.xml.rpc") && standardProperties.contains(name) == false)
          throw new JAXRPCException("Unsupported property: " + name);
       
       if (legacyPropertyMap.keySet().contains(name))

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/StubExt.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/StubExt.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/StubExt.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -56,6 +56,8 @@
    static final String PROPERTY_AUTH_TYPE_BASIC = "org.jboss.ws.authType.basic";
    /** Authentication type, WSEE */
    static final String PROPERTY_AUTH_TYPE_WSSE = "org.jboss.ws.authType.wsse";
+   
+   static final String PROPERTY_MTOM_ENABLED= "org.jboss.ws.mtom.enabled";
 
    // if you add a property here, make sure its registered in CallProxy 
    

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleDeserializer.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleDeserializer.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleDeserializer.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,18 +23,14 @@
 
 // $Id$
 
-import java.io.IOException;
-
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-
 import org.jboss.logging.Logger;
-import org.jboss.ws.binding.AttachmentUnmarshallerImpl;
 import org.jboss.ws.binding.BindingException;
 import org.jboss.ws.binding.DeserializerSupport;
 import org.jboss.ws.binding.SerializationContext;
 import org.jboss.xb.binding.SimpleTypeBindings;
 
+import javax.xml.namespace.QName;
+
 /**
  * A deserializer that can handle XMLSchema simple types.
  *
@@ -51,28 +47,8 @@
       log.debug("deserialize: [xmlName=" + xmlName + ",xmlType=" + xmlType + "]");
 
       Object value = null;
-      String typeName = xmlType.getLocalPart();
-
-      boolean isXOPPackage = false;
-      if ("base64Binary".equals(typeName))
-      {
-         AttachmentUnmarshallerImpl attachmentUnmarshaller = new AttachmentUnmarshallerImpl();
-         isXOPPackage = attachmentUnmarshaller.isXOPPackage();
-         if (isXOPPackage)
-         {
-            try
-            {
-               DataHandler dataHandler = attachmentUnmarshaller.getAttachmentAsDataHandler(xmlFragment);
-               value = dataHandler.getContent();
-            }
-            catch (IOException e)
-            {
-               throw new BindingException("Failed to unmarshal XOP content: " + e.getMessage());
-            }
-         }
-      }
-      
       String valueStr = unwrapValueStr(xmlFragment);
+
       if (valueStr != null)
       {
          value = SimpleTypeBindings.unmarshal(xmlType.getLocalPart(), valueStr, serContext.getNamespaceRegistry());

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleSerializer.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleSerializer.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/encoding/SimpleSerializer.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -27,7 +27,6 @@
 
 import org.jboss.logging.Logger;
 import org.jboss.util.NotImplementedException;
-import org.jboss.ws.binding.AttachmentMarshallerImpl;
 import org.jboss.ws.binding.BindingException;
 import org.jboss.ws.binding.SerializationContext;
 import org.jboss.ws.binding.SerializerSupport;

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/handler/HandlerChainBaseImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/handler/HandlerChainBaseImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxrpc/handler/HandlerChainBaseImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,15 +23,15 @@
 
 // $Id$
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
+import org.jboss.logging.Logger;
+import org.jboss.ws.Constants;
+import org.jboss.ws.metadata.EndpointMetaData;
+import org.jboss.ws.metadata.OperationMetaData;
+import org.jboss.ws.metadata.ParameterMetaData;
+import org.jboss.ws.soap.SAAJElementWriter;
+import org.jboss.ws.soap.SOAPElementImpl;
+import org.jboss.ws.soap.SOAPEnvelopeImpl;
+import org.jboss.ws.soap.SOAPMessageImpl;
 
 import javax.xml.namespace.QName;
 import javax.xml.rpc.JAXRPCException;
@@ -40,21 +40,9 @@
 import javax.xml.rpc.handler.HandlerInfo;
 import javax.xml.rpc.handler.MessageContext;
 import javax.xml.rpc.soap.SOAPFaultException;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPEnvelope;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPHeaderElement;
-import javax.xml.soap.SOAPPart;
+import javax.xml.soap.*;
+import java.util.*;
 
-import org.jboss.logging.Logger;
-import org.jboss.util.xml.DOMWriter;
-import org.jboss.ws.Constants;
-import org.jboss.ws.metadata.EndpointMetaData;
-import org.jboss.ws.metadata.OperationMetaData;
-import org.jboss.ws.metadata.ParameterMetaData;
-import org.jboss.ws.soap.SOAPEnvelopeImpl;
-import org.jboss.ws.soap.SOAPMessageImpl;
-
 /**
  * Represents a list of handlers. All elements in the
  * HandlerChain are of the type javax.xml.rpc.handler.Handler.
@@ -366,7 +354,7 @@
       if (handlers.size() > 0)
       {
          log.debug("Enter: handleFault");
-         
+
          try
          {
             int handlerIndex = handlers.size() - 1;
@@ -398,7 +386,7 @@
       try
       {
          SOAPEnvelopeImpl soapEnv = (SOAPEnvelopeImpl)soapPart.getEnvelope();
-         String envString = DOMWriter.printNode(soapEnv, true);
+         String envString = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapEnv, true);
          if (envString.equals(lastMessageTrace) == false)
          {
             log.debug(envString);
@@ -467,7 +455,7 @@
       try
       {
          SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
-         
+
          // A SOAPHeaderElement is possibly bound to the endpoint operation
          // in order to check that we need a the opMetaData
          OperationMetaData opMetaData = msgContext.getOperationMetaData();
@@ -477,8 +465,8 @@
             // before the dispatch target operation can be known 
             EndpointMetaData epMetaData = msgContext.getEndpointMetaData();
             opMetaData = soapMessage.getOperationMetaData(epMetaData);
-         }         
-         
+         }
+
          SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
          if (soapEnvelope != null && soapEnvelope.getHeader() != null)
          {
@@ -488,10 +476,10 @@
                SOAPHeaderElement soapHeaderElement = (SOAPHeaderElement)it.next();
                Name name = soapHeaderElement.getElementName();
                QName xmlName = new QName(name.getURI(), name.getLocalName());
-               
+
                ParameterMetaData paramMetaData = (opMetaData != null ? opMetaData.getParameter(xmlName) : null);
                boolean isBoundHeader = (paramMetaData != null && paramMetaData.isInHeader());
-               
+
                if (soapHeaderElement.getMustUnderstand() && isBoundHeader == false)
                {
                   String actor = soapHeaderElement.getActor();

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBDeserializer.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBDeserializer.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBDeserializer.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -60,37 +60,27 @@
       Object value = null;
       String typeName = xmlType.getLocalPart();
 
-      // Currently we intercept xsd:base64Binary types to allow callback for
-      // XOP processing. This should actually be moved to jbossxb once it supports
-      // the AttachMarshaller and Unmarshaller interfaces.
+      try
+      {
+         TypeMappingImpl typeMapping = serContext.getTypeMapping();
+         Class javaType = typeMapping.getJavaType(xmlType);
+         JAXBContext jaxbContext = JAXBContext.newInstance(javaType);
+         Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
 
-      if (attachmentUnmarshaller.isXOPPackage() && "base64Binary".equals(typeName))
+         ByteArrayInputStream ins = new ByteArrayInputStream(val.getBytes("UTF-8"));
+         JAXBElement jbe = unmarshaller.unmarshal(new StreamSource(ins), javaType);
+         value = jbe.getValue();
+      }
+      catch (RuntimeException e)
       {
-         value = deserializeXOP(val, value);
+         throw e;
       }
-      else
+      catch (Exception e)
       {
-         try
-         {
-            TypeMappingImpl typeMapping = serContext.getTypeMapping();
-            Class javaType = typeMapping.getJavaType(xmlType);
-            JAXBContext jaxbContext = JAXBContext.newInstance(javaType);
-            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
-
-            ByteArrayInputStream ins = new ByteArrayInputStream(val.getBytes("UTF-8"));
-            JAXBElement jbe = unmarshaller.unmarshal(new StreamSource(ins), javaType);
-            value = jbe.getValue();
-         }
-         catch (RuntimeException e)
-         {
-            throw e;
-         }
-         catch (Exception e)
-         {
-            throw new BindingException(e);
-         }
+         throw new BindingException(e);
       }
 
+
       log.debug("deserialized: " + (value != null ? value.getClass().getName() : null));
       return value;
 

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBSerializer.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBSerializer.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/JAXBSerializer.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,21 +23,19 @@
 
 // $Id$
 
-import java.io.StringWriter;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.Marshaller;
-import javax.xml.namespace.QName;
-
 import org.jboss.logging.Logger;
-import org.jboss.ws.Constants;
 import org.jboss.ws.binding.BindingException;
 import org.jboss.ws.binding.ComplexTypeSerializer;
 import org.jboss.ws.binding.SerializationContext;
 import org.jboss.ws.jaxrpc.TypeMappingImpl;
 import org.w3c.dom.NamedNodeMap;
 
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.Marshaller;
+import javax.xml.namespace.QName;
+import java.io.StringWriter;
+
 /**
  * A Serializer that can handle complex types by delegating to JAXB.
  *
@@ -62,29 +60,19 @@
       {
          String xmlFragment = null;
 
-         // Currently we intercept xsd:base64Binary types to allow callback for
-         // XOP processing. This should actually be moved to jbossxb once it supports
-         // the AttachMarshaller and Unmarshaller interfaces.
-         if (attachmentMarshaller.isXOPPackage() && xmlType.equals(Constants.TYPE_XMIME_DEFAULT))
-         {
-            xmlFragment = serializeXOP(xmlName, value, serContext, attachmentMarshaller);
-         }
-         else
-         {
-            TypeMappingImpl typeMapping = serContext.getTypeMapping();
-            Class javaType = typeMapping.getJavaType(xmlType);
-            JAXBContext jaxbContext = JAXBContext.newInstance(javaType);
-            Marshaller marshaller = jaxbContext.createMarshaller();
-            
-            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
-            
-            StringWriter strwr = new StringWriter();
-            marshaller.marshal(new JAXBElement(xmlName, javaType, value), strwr);
-            xmlFragment = strwr.toString();
+         TypeMappingImpl typeMapping = serContext.getTypeMapping();
+         Class javaType = typeMapping.getJavaType(xmlType);
+         JAXBContext jaxbContext = JAXBContext.newInstance(javaType);
+         Marshaller marshaller = jaxbContext.createMarshaller();
 
-            log.debug("serialized: " + xmlFragment);
-         }
+         marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
 
+         StringWriter strwr = new StringWriter();
+         marshaller.marshal(new JAXBElement(xmlName, javaType, value), strwr);
+         xmlFragment = strwr.toString();
+
+         log.debug("serialized: " + xmlFragment);
+
          return xmlFragment;
       }
       catch (RuntimeException rte)

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/core/SOAPBindingImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/core/SOAPBindingImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/core/SOAPBindingImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -79,9 +79,14 @@
 import org.jboss.ws.soap.attachment.CIDGenerator;
 import org.jboss.ws.utils.JavaUtils;
 import org.jboss.ws.utils.MimeUtils;
+import org.jboss.ws.utils.ThreadLocalAssociation;
 import org.jboss.xb.binding.NamespaceRegistry;
 import org.w3c.dom.Element;
 
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
+import javax.xml.rpc.JAXRPCException;
+
 /**
  * The SOAPBinding interface is an abstraction for the SOAP binding. 
  * 
@@ -136,6 +141,7 @@
 
       try
       {
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.FALSE);
          SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
          if (msgContext == null)
             throw new WSException("MessageContext not available");
@@ -238,6 +244,9 @@
          handleException(e);
          return null;
       }
+      finally{
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.TRUE);
+      }
    }
 
    /** On the server side, extract the IN parameters from the payload and populate an Invocation object */
@@ -371,6 +380,7 @@
 
       try
       {
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.FALSE);
          SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
          if (msgContext == null)
             throw new WSException("MessageContext not available");
@@ -494,6 +504,9 @@
          handleException(e);
          return null;
       }
+      finally {
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.TRUE);
+      }
    }
 
    /** On the client side, extract the OUT parameters from the payload and return them to the client. */
@@ -504,6 +517,7 @@
 
       try
       {
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.FALSE);
          // R2714 For one-way operations, an INSTANCE MUST NOT return a HTTP response that contains a SOAP envelope.
          // Specifically, the HTTP response entity-body must be empty.
          if (opMetaData.isOneWayOperation() == true)
@@ -641,6 +655,10 @@
       {
          handleException(e);
       }
+      finally{
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.TRUE);
+      }
+
    }
 
    private void verifySOAPVersion(OperationMetaData opMetaData, SOAPEnvelope soapEnvelope)
@@ -806,6 +824,10 @@
 
          if (soapArrayName.equals(elName))
          {
+            Boolean domExpansion = ThreadLocalAssociation.localDomExpansion().get();
+            ThreadLocalAssociation.localDomExpansion().set(Boolean.TRUE);
+            try
+            {
             QName compXMLName = paramMetaData.getXmlName();
             Element compElement = DOMUtils.getFirstChildElement(aux);
             if (compElement.getNodeName().equals(compXMLName.getLocalPart()))
@@ -813,7 +835,12 @@
                soapContentElement = aux;
                soapContentElement.setParamMetaData(paramMetaData);
                break;
+               }
             }
+            finally
+            {
+               ThreadLocalAssociation.localDomExpansion().set(domExpansion);
+            }
          }
       }
 

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/jbossxb/SchemaBindingBuilder.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/jbossxb/SchemaBindingBuilder.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/jbossxb/SchemaBindingBuilder.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -42,6 +42,7 @@
 import org.jboss.ws.utils.JBossWSEntityResolver;
 import org.jboss.ws.Constants;
 import org.jboss.ws.WSException;
+import org.jboss.ws.xop.XOPValueAdapter;
 import org.jboss.xb.binding.metadata.ClassMetaData;
 import org.jboss.xb.binding.metadata.PackageMetaData;
 import org.jboss.xb.binding.metadata.PropertyMetaData;
@@ -296,6 +297,20 @@
          if (log.isTraceEnabled())
             log.trace("Bound element " + xmlName + " to property " + prop.getName());
       }
+      // XOP elements that derive from xmlmime namespace
+      // need to be declared 'simple' in order for XB to
+      // treat them as simple base64Binaries.
+      QName elementType = element.getType().getQName();
+      if(elementType!=null)
+      {
+         String elementTypeNS = elementType.getNamespaceURI() != null ? elementType.getNamespaceURI() : "";
+         String elementTypeName = elementType.getLocalPart() != null ? elementType.getLocalPart() : "";
+         if(elementTypeNS.equals(Constants.NS_XML_MIME) && elementTypeName.equals("base64Binary"))
+         {
+            element.getType().setSimple(true);
+            element.getType().setValueAdapter(new XOPValueAdapter());
+         }
+      }
    }
 
    private void processWildcard(TypeBinding typeBinding, VariableMapping varMapping)

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ContextServlet.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ContextServlet.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ContextServlet.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -78,9 +78,10 @@
 
    private void setupHTMLResponseHeader(PrintWriter writer)
    {
+      Package wsPackage = Package.getPackage("org.jboss.ws");
       writer.println("<head>");
       writer.println("<meta http-equiv='Content-Type content='text/html; charset=iso-8859-1'>");
-      writer.println("<title>JBossWS</title>");
+      writer.println("<title>JBossWS / "+wsPackage.getImplementationVersion()+"</title>");
       writer.println("<link rel='stylesheet' href='./styles.css'>");
       writer.println("</head>");
    }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ServiceEndpoint.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ServiceEndpoint.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/server/ServiceEndpoint.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -45,9 +45,7 @@
 import org.jboss.ws.metadata.EndpointMetaData;
 import org.jboss.ws.metadata.ServerEndpointMetaData;
 import org.jboss.ws.metadata.UnifiedMetaData;
-import org.jboss.ws.soap.MessageContextAssociation;
-import org.jboss.ws.soap.MessageFactoryImpl;
-import org.jboss.ws.soap.SOAPMessageImpl;
+import org.jboss.ws.soap.*;
 import org.w3c.dom.Document;
 
 /**
@@ -175,7 +173,7 @@
          if (msgLog.isDebugEnabled())
          {
             SOAPEnvelope soapEnv = reqMessage.getSOAPPart().getEnvelope();
-            String envStr = DOMWriter.printNode(soapEnv, true);
+            String envStr = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapEnv, true);
             msgLog.debug("Incomming SOAPMessage\n" + envStr);
          }
 
@@ -252,7 +250,7 @@
          {
             resMessage.saveChanges();
             SOAPEnvelope soapEnv = resMessage.getSOAPPart().getEnvelope();
-            String envStr = DOMWriter.printNode(soapEnv, true);
+            String envStr = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapEnv, true);
             msgLog.debug("Outgoing SOAPMessage\n" + envStr);
          }
       }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/MessageFactoryImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/MessageFactoryImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/MessageFactoryImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -47,6 +47,7 @@
 import org.jboss.ws.soap.attachment.MimeConstants;
 import org.jboss.ws.soap.attachment.MultipartRelatedDecoder;
 import org.jboss.ws.utils.IOUtils;
+import org.jboss.ws.utils.ThreadLocalAssociation;
 
 /**
  * MessageFactory implementation
@@ -155,7 +156,14 @@
     */
    public SOAPMessage createMessage(MimeHeaders mimeHeaders, InputStream ins) throws IOException, SOAPException
    {
-      return createMessageInternal(mimeHeaders, ins, false);
+      try
+      {
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.FALSE);
+         return createMessageInternal(mimeHeaders, ins, false);
+      }
+      finally{
+         ThreadLocalAssociation.localDomExpansion().set(Boolean.TRUE);
+      }
    }
 
    public SOAPMessage createMessageInternal(MimeHeaders mimeHeaders, InputStream ins, boolean ignoreParseError) throws IOException, SOAPException

Copied: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SAAJElementWriter.java (from rev 876, trunk/src/main/java/org/jboss/ws/soap/SAAJElementWriter.java)

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SAAJPayloadBuilderDOM.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SAAJPayloadBuilderDOM.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SAAJPayloadBuilderDOM.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -22,27 +22,18 @@
 package org.jboss.ws.soap;
 
 //$Id$
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-
-import javax.xml.namespace.QName;
-import javax.xml.soap.Detail;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPHeader;
-
+import org.w3c.dom.*;
 import org.jboss.util.xml.DOMUtils;
 import org.jboss.util.xml.DOMWriter;
+import org.jboss.xb.binding.NamespaceRegistry;
+import org.jboss.ws.jaxrpc.Style;
 import org.jboss.ws.WSException;
-import org.jboss.ws.jaxrpc.Style;
-import org.jboss.xb.binding.NamespaceRegistry;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
 
+import javax.xml.soap.*;
+import javax.xml.namespace.QName;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.Iterator;
 /**
  * A SOAPEnvelope builder for JAXRPC based on DOM 
  * 
@@ -101,12 +92,14 @@
          while (it.hasNext())
          {
             Element srcElement = (Element)it.next();
+            //registerNamespacesLocally(srcElement);
             String xmlFragment = DOMWriter.printNode(srcElement, false);
 
             Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(), srcElement.getNamespaceURI());
             SOAPContentElement destElement = new SOAPHeaderElementImpl(name);
             soapHeader.addChildElement(destElement);
 
+            //DOMUtils.copyAttributes(destElement, srcElement);
             DOMUtils.copyAttributes(destElement, srcElement);
             destElement.setXMLFragment(xmlFragment);
          }
@@ -188,6 +181,7 @@
                while (itBodyElement.hasNext())
                {
                   Element srcElement = (Element)itBodyElement.next();
+                  registerNamespacesLocally(srcElement);
 
                   Name name = new NameImpl(srcElement.getLocalName(), srcElement.getPrefix(), srcElement.getNamespaceURI());
                   SOAPContentElement destElement = new SOAPContentElement(name);
@@ -200,6 +194,7 @@
             else if (style == Style.DOCUMENT)
             {
                Element srcElement = (Element)domBodyElement;
+               registerNamespacesLocally(srcElement);
                SOAPBodyElementDoc destElement = new SOAPBodyElementDoc(beName);
                destElement = (SOAPBodyElementDoc)soapBody.addChildElement(destElement);
 
@@ -247,6 +242,21 @@
       }
    }
 
+   /**
+    * Register globally available namespaces on element level.
+    * This is necessary to ensure that each xml fragment is valid.    
+    */
+   private void registerNamespacesLocally(Element srcElement) {
+      if(srcElement.getPrefix()== null)
+      {
+         srcElement.setAttribute("xmlns", srcElement.getNamespaceURI());
+      }
+      else
+      {
+         srcElement.setAttribute("xmlns:"+srcElement.getPrefix(), srcElement.getNamespaceURI());
+      }
+   }
+
    private void registerNamespaces(NamespaceRegistry namespaceRegistry, SOAPElement soapEl)
    {
       Iterator itNSPrefixes = soapEl.getNamespacePrefixes();

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementMessage.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementMessage.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementMessage.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,8 +21,11 @@
 */
 package org.jboss.ws.soap;
 
+import org.jboss.util.xml.DOMWriter;
 import javax.xml.soap.Name;
 import javax.xml.soap.SOAPBodyElement;
+import javax.xml.rpc.JAXRPCException;
+import java.io.Writer;
 
 /**
  * An abstract implemenation of the SOAPBodyElement
@@ -43,4 +46,18 @@
    {
       super(element);
    }
+   public String write(Writer writer, boolean pretty) {
+      try
+      {
+         DOMWriter domWriter = new DOMWriter(writer);
+         domWriter.setPrettyprint(pretty);
+         domWriter.print(this);
+      }
+      catch (Exception e)
+      {
+         throw new JAXRPCException(e);
+      }
+
+      return null;
+   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementRpc.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementRpc.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyElementRpc.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,8 +21,15 @@
 */
 package org.jboss.ws.soap;
 
+import org.jboss.util.xml.DOMWriter;
+import org.jboss.ws.WSException;
+import org.w3c.dom.Element;
 import javax.xml.soap.Name;
 import javax.xml.soap.SOAPBodyElement;
+import javax.xml.rpc.JAXRPCException;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Iterator;
 
 /**
  * An abstract implemenation of the SOAPBodyElement
@@ -43,4 +50,58 @@
    {
       super(element);
    }
+   public String write(Writer writer, boolean pretty) {
+      try
+      {
+
+         writer.write('<');
+         String prefix = getPrefix()!=null ? getPrefix():"";
+         String fqn = prefix.length()>0 ? prefix+":"+getLocalName() : getLocalName();
+         writer.write(fqn);
+
+         // namespaces
+         Iterator it = getNamespacePrefixes();
+         while(it.hasNext())
+         {
+            String nsPrefix = (String)it.next();
+            writer.write(" xmlns:"+nsPrefix+"='"+getNamespaceURI(nsPrefix)+"'");
+         }
+
+          // attributes
+         Iterator attNames = getAllAttributes();
+         while(attNames.hasNext())
+         {
+            NameImpl name = (NameImpl)attNames.next();
+            String attPrefix = name.getPrefix()!=null ? name.getPrefix():"";
+            String attFqn = attPrefix.length()>0 ? attPrefix+":"+name.getLocalName() : name.getLocalName();
+            writer.write(" "+attFqn);
+            writer.write("='"+getAttributeValue(name)+"'");
+         }
+
+         writer.write('>');
+
+         // children
+         Iterator children = getChildElements();
+         while(children.hasNext())
+         {
+            Object child = children.next();
+            if( (child instanceof SOAPContentElement) == false)
+            {
+               DOMWriter domWriter = new DOMWriter(writer);
+               domWriter.setPrettyprint(pretty);
+               domWriter.print((Element)child);
+            }
+         }
+
+         if(pretty)
+            writer.write("\n");
+
+         return("</"+fqn+">");
+
+      }
+      catch (IOException e)
+      {
+         throw new JAXRPCException(e);
+      }
+   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPBodyImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -29,6 +29,8 @@
 import java.io.Reader;
 import java.util.Iterator;
 import java.util.Locale;
+import java.io.Writer;
+import java.io.IOException;
 
 import javax.xml.bind.util.JAXBSource;
 import javax.xml.soap.Name;
@@ -54,6 +56,7 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
+import javax.xml.rpc.JAXRPCException;
 
 /**
  * An object that represents the contents of the SOAP body element in a SOAP message.
@@ -296,4 +299,43 @@
          }
       }
    }
+
+   public String write(Writer writer, boolean pretty) {
+      try
+      {
+         writer.write("<");
+         writer.write(getParentElement().getPrefix()+":Body");
+
+         // namespaces
+         Iterator nsPrefixes = getNamespacePrefixes();
+         while(nsPrefixes.hasNext())
+         {
+            String prefix = (String)nsPrefixes.next();
+            writer.write(" xmlns:"+prefix+"='"+getNamespaceURI(prefix)+"'");
+         }
+
+         // attributes
+         Iterator attNames = getAllAttributes();
+         while(attNames.hasNext())
+         {
+            NameImpl name = (NameImpl)attNames.next();
+            String attPrefix = name.getPrefix()!=null ? name.getPrefix():"";
+            String attFqn = attPrefix.length()>0 ? attPrefix+":"+name.getLocalName() : name.getLocalName();
+            writer.write(" "+attFqn);
+            writer.write("='"+getAttributeValue(name)+"'");
+         }
+
+         writer.write(">");
+
+         if(pretty)
+            writer.write("\n");
+
+         return ("</"+getParentElement().getPrefix()+":Body>");
+      }
+      catch (IOException e)
+      {
+         throw new JAXRPCException(e);
+      }
+   }
+
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPConnectionImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPConnectionImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPConnectionImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -181,7 +181,7 @@
          if(msgLog.isDebugEnabled())
          {
             SOAPEnvelope soapReqEnv = reqMessage.getSOAPPart().getEnvelope();
-            String envStr = DOMWriter.printNode(soapReqEnv, true);
+            String envStr = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapReqEnv, true);
             msgLog.debug("Remoting meta data: " + metadata);
             msgLog.debug("Outgoing SOAPMessage\n" + envStr);
          }
@@ -200,7 +200,7 @@
          if (resMessage != null && msgLog.isDebugEnabled())
          {
             SOAPEnvelope soapResEnv = resMessage.getSOAPPart().getEnvelope();
-            String envStr = DOMWriter.printNode(soapResEnv, true);
+            String envStr = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapResEnv, true);
             msgLog.debug("Incomming Response SOAPMessage\n" + envStr);
          }
 

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPContentElement.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPContentElement.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPContentElement.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,17 +21,6 @@
  */
 package org.jboss.ws.soap;
 
-import java.io.IOException;
-import java.lang.reflect.Array;
-import java.lang.reflect.Method;
-import java.util.Iterator;
-
-import javax.activation.DataHandler;
-import javax.xml.namespace.QName;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPException;
-
 import org.jboss.logging.Logger;
 import org.jboss.util.xml.DOMUtils;
 import org.jboss.util.xml.DOMWriter;
@@ -48,15 +37,21 @@
 import org.jboss.ws.jaxrpc.encoding.SerializerFactoryBase;
 import org.jboss.ws.metadata.ParameterMetaData;
 import org.jboss.ws.utils.JavaUtils;
-import org.jboss.ws.utils.MimeUtils;
-import org.w3c.dom.Attr;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.TypeInfo;
+import org.jboss.ws.utils.ThreadLocalAssociation;
+import org.jboss.ws.xop.XOPContext;
+import org.w3c.dom.*;
 
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
+import javax.xml.soap.Name;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
+import java.io.IOException;
+import java.io.Writer;
+import java.lang.reflect.Array;
+import java.lang.reflect.Method;
+import java.util.Iterator;
+
 /**
  * A SOAPElement that gives access to its content as XML fragment or Java object.
  *
@@ -147,8 +142,10 @@
          TypeMappingImpl typeMapping = serContext.getTypeMapping();
 
          QName xmlName = getQName();
+         Boolean domExpansionState = ThreadLocalAssociation.localDomExpansion().get();
          try
          {
+            ThreadLocalAssociation.localDomExpansion().set(Boolean.FALSE);
             SerializerSupport ser;
             if (objectValue != null)
             {
@@ -163,8 +160,7 @@
                   addNamespaceDeclaration(Constants.PREFIX_XSI, Constants.NS_SCHEMA_XSI);
             }
 
-            NamedNodeMap attributes = getAttributes();
-            xmlFragment = ser.serialize(xmlName, xmlType, objectValue, serContext, attributes);
+            xmlFragment = ser.serialize(xmlName, xmlType, getObjectValue(), serContext, null);
 
             // Add the arrayType namespace declaration
             QName compXmlType = paramMetaData.getSOAPArrayCompType();
@@ -181,6 +177,9 @@
          {
             throw new WSException(e);
          }
+         finally {
+            ThreadLocalAssociation.localDomExpansion().set(domExpansionState);
+         }
       }
 
       // Generate the xmlFragment from the DOM tree
@@ -237,7 +236,7 @@
             DeserializerFactoryBase deserializerFactory = getDeserializerFactory(typeMapping, javaType, xmlType);
             DeserializerSupport des = (DeserializerSupport)deserializerFactory.getDeserializer();
 
-            String strContent = insertNamespaceDeclarations(getXMLFragment());
+            String strContent = getXMLFragment();
 
             Object obj = des.deserialize(getQName(), xmlType, strContent, serContext);
             if (obj != null)
@@ -277,19 +276,17 @@
 
                if (isAssignable == false)
                {
-                  // MSFT hack: Force conversion according to the target java parameter
                   Object convertedObj = null;
+
                   if(obj instanceof DataHandler)
                   {
-                    MimeUtils utils = new MimeUtils();
-                    MimeUtils.ByteArrayConverter converter = utils.getConverterFor(javaType);
                      try
                      {
-                        convertedObj = converter.convert( ((DataHandler)obj).getInputStream() );
+                        convertedObj = ((DataHandler)obj).getContent();
                      }
                      catch (IOException e)
                      {
-                        log.warn("Failed to convert from DataHandler", e);
+                        throw new WSException("Failed to convert unassignable endpoint parameter", e);
                      }
                   }
 
@@ -811,7 +808,11 @@
     */
    private void expandToDOM()
    {
-      if (isDOMValid == false && expandingToDOM == false)
+      // If JBossWS itself uses the SAAJ API, we can safely disable
+      // DOM expansion, assuming it does everything right.
+      // SOAPContentElements should only be expanded when jaxxrpc handlers do require it.
+      boolean domExpansionEnabled = ThreadLocalAssociation.localDomExpansion().get().booleanValue();
+      if (isDOMValid == false && expandingToDOM == false && domExpansionEnabled)
       {
          log.trace("BEGIN: expandToDOM");
          expandingToDOM = true;
@@ -851,6 +852,8 @@
                   {
                      SOAPElementImpl soapElement = soapFactory.createElement((Element)child, true);
                      super.addChildElement(soapElement);
+                     if(isXOPParameter())                     
+                        XOPContext.inlineXOPData(soapElement);
                   }
                   else if (childType == Node.TEXT_NODE)
                   {
@@ -887,7 +890,8 @@
             log.trace("END: expandToDOM");
          }
 
-         // FIXME JBWS-482, This is a workaround
+         // Either the dom-valid state, or the xml-valid state can be true
+         // Therefore we invalidate the xml content.
          invalidateXMLContent();
       }
    }
@@ -964,4 +968,70 @@
          invalidateXMLContent();
       }
    }
+   public String write(Writer writer, boolean pretty) {
+      try
+      {
+         handleMTOMTransitions();
+
+         if(isDOMValid)
+         {
+            DOMWriter dw = new DOMWriter(writer);
+            dw.setPrettyprint(pretty);
+            dw.print(this);
+         }
+         else
+         {
+            writer.write( getXMLFragment() );
+            if(pretty)
+               writer.write("\n");
+         }
+
+      }
+      catch (Exception e)
+      {
+         throw new WSException(e);
+      }
+
+      return null;
+   }
+   /**
+    * When a SOAPContentElement transitions between dom-valid and xml-valid
+    * the XOP elements need to transition from XOP optimized to base64 and reverse.<p>
+    *
+    * If MTOM is disabled through a message context property we always enforce the
+    * base64 representation by expanding to DOM, the same happens when a JAXRPC handler
+    * accesses the SOAPContentElement.<p>
+    *
+    * If the element is in dom-valid state (because a handlers accessed it), upon marshalling
+    * it's needs to be decided wether or not the <code>xop:Include</code> should be restored.
+    * This as well depends upon the message context property.
+    */
+   private void handleMTOMTransitions() {
+
+      boolean mtomEnabled = isXOPParameter() && XOPContext.isMTOMEnabled();
+
+      if( paramMetaData != null && mtomEnabled == false )
+      {
+         // If MTOM is disabled, we force dom expansion.
+         // This will inline any XOP include element
+         // and remove the attachment part when transitioning.
+         // See SOAPFactoryImpl for details.
+
+         log.debug("Transitioning to dom-valid state, MTOM disabled");
+         expandToDOM();
+      }
+      else if(isDOMValid && mtomEnabled )
+      {
+         // When the DOM representation is valid,
+         // but MTOM is enabled we need to convert the inlined
+         // element back to an xop:Include element and create the attachment part
+
+         log.debug("Transitioning to xml-valid state, MTOM enabled");
+         XOPContext.restoreXOPData(this);
+      }
+   }
+
+   private boolean isXOPParameter() {
+      return (paramMetaData != null && paramMetaData.isXOP());
+   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPDocument.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPDocument.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPDocument.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -159,7 +159,7 @@
    // Node methods
    public String getNodeName()
    {
-      throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Node operations not allowed on SOAPDocument");
+      return doc.getNodeName();
    }
 
    public String getNodeValue() throws DOMException

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPElementImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPElementImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPElementImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -26,6 +26,7 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.io.Writer;
 
 import javax.xml.namespace.QName;
 import javax.xml.soap.Name;
@@ -36,6 +37,7 @@
 
 import org.jboss.logging.Logger;
 import org.jboss.util.xml.DOMUtils;
+import org.jboss.util.xml.DOMWriter;
 import org.jboss.ws.Constants;
 import org.w3c.dom.Attr;
 import org.w3c.dom.DOMException;
@@ -655,4 +657,21 @@
       // FIXME setIdAttributeNS
       throw new org.jboss.util.NotImplementedException("setIdAttributeNS");
    }
+   /**
+    * The default implementation uses a DOMWriter.
+    * SOAPContentElements overwrite this to optimize DOM callbacks.
+    *
+    * @param writer
+    * @param pretty
+    *
+    * @return end element tag
+    */
+   public String write(Writer writer, boolean pretty)
+   {
+      /*DOMWriter domWriter = new DOMWriter(writer);
+      domWriter.setPrettyprint(pretty);
+      domWriter.print(this);
+      */
+      return null;
+   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPEnvelopeImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPEnvelopeImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPEnvelopeImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -24,9 +24,12 @@
 // $Id$
 
 import java.util.Iterator;
+import java.io.Writer;
+import java.io.IOException;
 
 import javax.xml.namespace.QName;
 import javax.xml.rpc.soap.SOAPFaultException;
+import javax.xml.rpc.JAXRPCException;
 import javax.xml.soap.Name;
 import javax.xml.soap.Node;
 import javax.xml.soap.SOAPBody;
@@ -38,6 +41,7 @@
 import javax.xml.soap.SOAPPart;
 
 import org.jboss.ws.Constants;
+import org.jboss.ws.WSException;
 import org.jboss.xb.binding.NamespaceRegistry;
 import org.w3c.dom.Document;
 
@@ -53,6 +57,7 @@
 {
    // Reference the enclosing SOAPPart, so that getOwnerDocument() works correctly
    private SOAPPartImpl soapPart;
+   private boolean domExpansionEnabled = false;
 
    // A registry of namespaces in this envelope
    private NamespaceRegistry namespaceRegistry = new NamespaceRegistry();
@@ -190,4 +195,32 @@
    {
       return soapPart;
    }
+   public String write(Writer writer, boolean pretty) {
+      try
+      {
+         writer.write("<");
+         String envPrefix = getPrefix();
+         writer.write(envPrefix +":Envelope xmlns:"+getPrefix()+"='"+getNamespaceURI()+"'");
+
+         // namespaces
+         Iterator it = getNamespacePrefixes();
+         while(it.hasNext())
+         {
+            String prefix = (String)it.next();
+            if(!prefix.equals(envPrefix))
+               writer.write(" xmlns:"+prefix+"='"+getNamespaceURI(prefix)+"'");
+         }
+
+         writer.write('>');
+
+         if(pretty)
+            writer.write("\n");
+
+         return("</"+getPrefix()+":Envelope>");
+      }
+      catch (IOException e)
+      {
+         throw new JAXRPCException(e);
+      }
+   }   
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFactoryImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFactoryImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFactoryImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -69,8 +69,8 @@
          throw new IllegalArgumentException("Source node cannot be null");
       
       String localName = domNode.getLocalName();
-      String prefix = domNode.getPrefix();
-      String nsURI = domNode.getNamespaceURI();
+      String prefix = domNode.getPrefix() != null ? domNode.getPrefix() : "";
+      String nsURI = domNode.getNamespaceURI() != null ? domNode.getNamespaceURI() : "";
       
       SOAPElementImpl soapElement = new SOAPElementImpl(localName, prefix, nsURI);
 

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFaultImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFaultImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPFaultImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,6 +23,7 @@
 
 import java.util.Iterator;
 import java.util.Locale;
+import java.io.Writer;
 
 import javax.xml.namespace.QName;
 import javax.xml.soap.Detail;
@@ -30,12 +31,14 @@
 import javax.xml.soap.SOAPElement;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFault;
+import javax.xml.rpc.JAXRPCException;
 
 import org.jboss.logging.Logger;
 import org.jboss.ws.Constants;
 import org.jboss.ws.WSException;
 import org.jboss.xb.QNameBuilder;
 import org.jboss.util.xml.DOMUtils;
+import org.jboss.util.xml.DOMWriter;
 import org.w3c.dom.Element;
 
 /**
@@ -230,4 +233,18 @@
       setFaultString(faultString);
       this.faultStringLocale = locale;
    }
+   public String write(Writer writer, boolean pretty) {
+      try
+      {
+         DOMWriter dw = new DOMWriter(writer);
+         dw.setPrettyprint(pretty);
+         dw.print(this);
+      }
+      catch (Exception e)
+      {
+        throw new JAXRPCException(e);
+      }
+
+      return null;
+   }
 }
\ No newline at end of file

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPHeaderImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPHeaderImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPHeaderImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,16 +23,20 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.io.Writer;
+import java.io.IOException;
 
 import javax.xml.soap.Name;
 import javax.xml.soap.SOAPElement;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPHeader;
 import javax.xml.soap.SOAPHeaderElement;
+import javax.xml.rpc.JAXRPCException;
 
 import org.w3c.dom.DOMException;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Node;
+import org.jboss.ws.WSException;
 
 
 /**
@@ -195,4 +199,52 @@
 
       return super.replaceChild(newChild, oldChild);
    }
+   public String write(Writer writer, boolean pretty) {
+      try
+      {
+
+         writer.write('<');
+         writer.write(getParentElement().getPrefix()+":Header");
+
+         // namespaces
+         Iterator it = getNamespacePrefixes();
+         while(it.hasNext())
+         {
+            String prefix = (String)it.next();
+            writer.write(" xmlns:"+prefix+"='"+getNamespaceURI(prefix)+"'");
+         }
+
+         // attributes
+         Iterator attNames = getAllAttributes();
+         while(attNames.hasNext())
+         {
+            NameImpl name = (NameImpl)attNames.next();
+            String attPrefix = name.getPrefix()!=null ? name.getPrefix():"";
+            String attFqn = attPrefix.length()>0 ? attPrefix+":"+name.getLocalName() : name.getLocalName();
+            writer.write(" "+attFqn);
+            writer.write("='"+getAttributeValue(name)+"'");
+         }
+
+         boolean hasChildren = getChildNodes().getLength() > 0;
+         String endTag = null;
+         if(hasChildren)
+         {
+            writer.write('>');
+            endTag = "</"+getParentElement().getPrefix()+":Header>";
+         }
+         else
+         {
+            writer.write("/>");
+         }
+
+         if(pretty)
+            writer.write("\n");
+
+         return endTag;
+      }
+      catch (IOException e)
+      {
+         throw new JAXRPCException(e);
+      }
+   }
 }
\ No newline at end of file

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPMessageImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPMessageImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPMessageImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -42,6 +42,7 @@
 
 import org.jboss.util.xml.DOMWriter;
 import org.jboss.ws.WSException;
+import org.jboss.ws.xop.XOPContext;
 import org.jboss.ws.metadata.EndpointMetaData;
 import org.jboss.ws.metadata.OperationMetaData;
 import org.jboss.ws.soap.attachment.AttachmentPartImpl;
@@ -122,6 +123,20 @@
       return null;
    }
 
+   public AttachmentPart removeAttachmentByContentId(String cid)
+   {
+      for (AttachmentPart part : attachments)
+      {
+         String contentId = part.getContentId();
+         if (contentId.equals(cid))
+         {
+           attachments.remove(part);
+           return part;
+         }
+      }
+
+      return null;
+   }
    public AttachmentPart getAttachmentByPartName(String partName)
    {
       for (AttachmentPart part : attachments)
@@ -200,7 +215,7 @@
          try
          {
             String contentType;
-            if (isXOPMessage())
+            if (isXOPMessage() && XOPContext.isMTOMEnabled())
             {
                multipartRelatedEncoder = new MultipartRelatedXOPEncoder(this);
                multipartRelatedEncoder.encodeMultipartRelatedMessage();
@@ -260,8 +275,8 @@
          {
             boolean writeXML = isWriteXMLDeclaration();
             String charsetEncoding = getCharSetEncoding();
-            DOMWriter domWriter = new DOMWriter(outs, charsetEncoding);
-            domWriter.setWriteXMLDeclaration(writeXML).print(soapEnv);
+            SAAJElementWriter writer = new SAAJElementWriter(outs, charsetEncoding);
+            writer.setWriteXMLDeclaration(writeXML).print((SOAPEnvelopeImpl)soapEnv);
          }
       }
    }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPPartImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPPartImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/SOAPPartImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -331,7 +331,7 @@
 
    public String getNodeName()
    {
-      return null;
+      return doc.getNodeName();
    }
 
    public short getNodeType()

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/ByteArrayContentHandler.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/ByteArrayContentHandler.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/ByteArrayContentHandler.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,17 +21,16 @@
 */
 package org.jboss.ws.soap.attachment;
 
-import org.jboss.ws.WSException;
+import org.jboss.ws.utils.MimeUtils;
 
+import javax.activation.ActivationDataFlavor;
 import javax.activation.DataContentHandler;
 import javax.activation.DataSource;
-import javax.activation.ActivationDataFlavor;
-import javax.xml.transform.stream.StreamSource;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.ByteArrayInputStream;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.UnsupportedFlavorException;
 
 /**
  * @author Heiko Braun <heiko.braun at jboss.com>
@@ -58,6 +57,16 @@
    }
 
    public void writeTo(Object object, String string, OutputStream outputStream) throws IOException {
-      throw new WSException("The current implementation is read-only");
+      if(object instanceof byte[])
+      {
+         // this actually depends on the SwapableMemoryDataSource
+         // todo: why is not always a ByteArrayInputStream ? 
+         outputStream.write((byte[])object);
+      }
+      else
+      {
+         MimeUtils.ByteArrayConverter converter = MimeUtils.getConverterForJavaType(object.getClass());
+         converter.writeTo(object, outputStream);
+      }
    }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedSwAEncoder.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedSwAEncoder.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedSwAEncoder.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,7 +21,9 @@
  */
 package org.jboss.ws.soap.attachment;
 
-import java.io.OutputStream;
+import org.jboss.ws.soap.SAAJElementWriter;
+import org.jboss.ws.soap.SOAPElementImpl;
+import org.jboss.ws.soap.SOAPMessageImpl;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeBodyPart;
@@ -30,7 +32,7 @@
 import javax.xml.soap.SOAPEnvelope;
 import javax.xml.soap.SOAPException;
 
-import org.jboss.util.xml.DOMWriter;
+import java.io.OutputStream;
 import org.jboss.ws.soap.SOAPMessageImpl;
 
 /**
@@ -69,7 +71,7 @@
        * stream.
        */
       SOAPEnvelope soapEnv = soapMessage.getSOAPPart().getEnvelope();
-      String envStr = DOMWriter.printNode(soapEnv, true);
+      String envStr = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapEnv, true);
       rootPart.setText(envStr, "UTF-8");
 
       rootPart.setContentID(MimeConstants.ROOTPART_CID);

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedXOPEncoder.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedXOPEncoder.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/soap/attachment/MultipartRelatedXOPEncoder.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,7 +21,9 @@
  */
 package org.jboss.ws.soap.attachment;
 
-import java.io.OutputStream;
+import org.jboss.ws.soap.SAAJElementWriter;
+import org.jboss.ws.soap.SOAPElementImpl;
+import org.jboss.ws.soap.SOAPMessageImpl;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeBodyPart;
@@ -30,7 +32,7 @@
 import javax.xml.soap.SOAPEnvelope;
 import javax.xml.soap.SOAPException;
 
-import org.jboss.util.xml.DOMWriter;
+import java.io.OutputStream;
 import org.jboss.ws.soap.SOAPMessageImpl;
 
 /**
@@ -71,7 +73,7 @@
        * stream.
        */
       SOAPEnvelope soapEnv = soapMessage.getSOAPPart().getEnvelope();
-      String envStr = DOMWriter.printNode(soapEnv, true);
+      String envStr = SAAJElementWriter.printSOAPElement((SOAPElementImpl)soapEnv, true);
       rootPart.setText(envStr, "UTF-8");
 
       rootPart.setContentID(MimeConstants.ROOTPART_CID);

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/IOUtils.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/IOUtils.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/IOUtils.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,17 +21,11 @@
  */
 package org.jboss.ws.utils;
 
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
+import java.io.*;
 
 import org.jboss.logging.Logger;
+import org.jboss.ws.WSException;
+import javax.activation.DataHandler;
 
 /**
  * IO utilites
@@ -64,6 +58,19 @@
          r = ins.read(bytes);
       }
    }
+   public static byte[] convertToBytes(DataHandler dh)
+   {
+      try
+      {
+         ByteArrayOutputStream buffOS= new ByteArrayOutputStream();
+         dh.writeTo(buffOS);
+         return buffOS.toByteArray();
+      }
+      catch (IOException e)
+      {
+         throw new WSException("Unable to convert DataHandler to byte[]: " + e.getMessage());
+      }
+   }
 
    /**
     * Transform a Reader to an InputStream

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/MimeUtils.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/MimeUtils.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/MimeUtils.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -27,7 +27,9 @@
 
 import com.sun.image.codec.jpeg.JPEGCodec;
 import com.sun.image.codec.jpeg.JPEGImageDecoder;
+import com.sun.image.codec.jpeg.JPEGImageEncoder;
 import org.jboss.ws.Constants;
+import org.jboss.ws.WSException;
 
 import javax.mail.internet.ContentType;
 import javax.mail.internet.MimeMultipart;
@@ -35,7 +37,7 @@
 import javax.xml.namespace.QName;
 import javax.xml.transform.stream.StreamSource;
 import java.awt.image.BufferedImage;
-import java.io.InputStream;
+import java.io.*;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -169,25 +171,48 @@
       return mimeType;
    }
 
-   public ByteArrayConverter getConverterFor(Class targetClazz)
+   public static ByteArrayConverter getConverterForJavaType(Class targetClazz)
    {
       ByteArrayConverter converter = null;
-      if(JavaUtils.isAssignableFrom(targetClazz, java.awt.Image.class))
+      if(JavaUtils.isAssignableFrom(java.awt.Image.class, targetClazz))
          converter = new ImageConverter();
-      else if (JavaUtils.isAssignableFrom(targetClazz, javax.xml.transform.Source.class))
+      else if (JavaUtils.isAssignableFrom(javax.xml.transform.Source.class, targetClazz))
          converter = new SourceConverter();
-      else if (JavaUtils.isAssignableFrom(targetClazz, java.lang.String.class))
+      else if (JavaUtils.isAssignableFrom(java.lang.String.class, targetClazz))
          converter = new StringConverter();
+      else if (JavaUtils.isAssignableFrom(java.io.InputStream.class, targetClazz))
+         converter = new StreamConverter();
 
       if(null == converter)
-         throw new IllegalArgumentException("Unable to resolve conversion strategy for: " + targetClazz);
+         throw new WSException("No ByteArrayConverter for class: " + targetClazz.getName());
 
       return converter;
    }
 
-   public class ImageConverter implements ByteArrayConverter
+   public static ByteArrayConverter getConverterForContentType(String contentType)
    {
-      public Object convert(InputStream in) {
+      ByteArrayConverter converter = null;
+
+      if(contentType != null)
+      {
+         if("image/jpeg".equals(contentType) || "image/jpg".equals(contentType))
+            converter = new ImageConverter();
+         else if("text/xml".equals(contentType) || "application/xml".equals(contentType))
+            converter = new SourceConverter();
+         else if("text/plain".equals(contentType))
+            converter = new StringConverter();
+         else if("application/octet-stream".equals(contentType))
+            converter = new StreamConverter();
+      }
+
+      if(null == converter)
+         throw new WSException("No ByteArrayConverter for content type: " + contentType);
+
+      return converter;
+   }
+   public static class ImageConverter implements ByteArrayConverter
+   {
+      public Object readFrom(InputStream in) {
          Object converted = null;
          try
          {
@@ -203,51 +228,124 @@
          return converted;
       }
 
+      public void writeTo(Object obj, OutputStream out) {
+         if(obj instanceof BufferedImage)
+         {
+            JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(out);
+            try
+            {
+               enc.encode((BufferedImage)obj);
+            }
+            catch (IOException e)
+            {
+               throw new WSException("Failed to convert " + obj.getClass());
+            }
+         }
+         else
+         {
+            throw new WSException("Unable to convert " + obj.getClass());
+         }
+
+      }
+
    }
 
-   public class SourceConverter implements ByteArrayConverter
+   public static class SourceConverter implements ByteArrayConverter
    {
-      public Object convert(InputStream in) {
+      public Object readFrom(InputStream in) {
+         return new StreamSource(in);
+      }
 
-         Object converted = null;
-         try
+      public void writeTo(Object obj, OutputStream out) {
+         if(obj instanceof StreamSource)
          {
-            converted = new StreamSource(in);
+            StreamSource s = (StreamSource)obj;
+            try
+            {
+               IOUtils.copyStream(out, s.getInputStream());
+            }
+            catch (IOException e)
+            {
+               throw new WSException("Failed to convert " + obj.getClass());
+            }
          }
-         catch (Exception e)
+         else
          {
-            // ignore
+            throw new WSException("Unable to convert " + obj.getClass());
          }
-
-         return converted;
       }
    }
 
-   public class StringConverter implements ByteArrayConverter
+   public static class StringConverter implements ByteArrayConverter
    {
-      public Object convert(InputStream in) {
+      public Object readFrom(InputStream in) {
          Object converted = null;
          try
          {
-            StringBuffer sb = new StringBuffer();
-            while(in.available()>0)
-            {
-               sb.append(in.read());
+            BufferedReader br = new BufferedReader(new InputStreamReader(in));
+            StringBuilder sb = new StringBuilder();
+            String line = null;
+
+            while ((line = br.readLine()) != null) {
+               sb.append(line + "\n");
             }
+
+            br.close();
+
             converted = sb.toString();
          }
-         catch (Exception e)
+         catch (IOException e)
          {
-            // ignore
+            throw new WSException("Failed to convert java.lang.String");
          }
 
          return converted;
       }
+
+      public void writeTo(Object obj, OutputStream out) {
+         if(obj instanceof String)
+         {
+            String s = (String)obj;
+            try
+            {
+               out.write(s.getBytes("UTF-8"));
+            }
+            catch (IOException e)
+            {
+               throw new WSException("Failed to convert " + obj.getClass());
+            }
+         }
+         else
+         {
+            throw new WSException("Unable to convert " + obj.getClass());
+         }
+      }
    }
 
+   public static class StreamConverter implements ByteArrayConverter
+   {
+      public Object readFrom(InputStream in) {
+         return in;
+      }
+
+      public void writeTo(Object obj, OutputStream out) {
+         if(obj instanceof InputStream)
+         {
+            try
+            {
+               IOUtils.copyStream(out, (InputStream)obj);
+            }
+            catch (IOException e)
+            {
+               throw new WSException("Failed to convert " + obj.getClass());
+            }
+         }
+      }
+   }
    public interface ByteArrayConverter
    {
-      Object convert(InputStream in);
+      Object readFrom(InputStream in);
+      void writeTo(Object obj, OutputStream out);
    }
 
 

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/ThreadLocalAssociation.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/ThreadLocalAssociation.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/utils/ThreadLocalAssociation.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -37,52 +37,54 @@
  */
 public class ThreadLocalAssociation {
 
-    /**
-     * Handles invocations on MDB endpoints.
-     */
-    private static ThreadLocal invokerMDBAssoc = new ThreadLocal();
+   /**
+    * Handles invocations on MDB endpoints.
+    */
+   private static ThreadLocal invokerMDBAssoc = new ThreadLocal();
 
-    /**
-     * SOAP message context
-     * @see org.jboss.ws.soap.MessageContextAssociation
-     */
-    private static ThreadLocal<Stack<SOAPMessageContextBase>> msgContextAssoc = new InheritableThreadLocal<Stack<SOAPMessageContextBase>>();
+   /**
+    * SOAP message context
+    * @see org.jboss.ws.soap.MessageContextAssociation
+    */
+   private static ThreadLocal<Stack<SOAPMessageContextBase>> msgContextAssoc = new InheritableThreadLocal<Stack<SOAPMessageContextBase>>();
 
-    /**
-     * @see org.jboss.ws.wsse.STRTransform
-     */
-    private static InheritableThreadLocal<SecurityStore> strTransformAssoc = new InheritableThreadLocal<SecurityStore>();
+   /**
+    * @see org.jboss.ws.wsse.STRTransform
+    */
+   private static InheritableThreadLocal<SecurityStore> strTransformAssoc = new InheritableThreadLocal<SecurityStore>();
 
    /**
     * Stores XOP callee information
     * @see org.jboss.ws.xop.XOPContext#doInlineBase64
     */
-   private static ThreadLocal<Boolean> XOPInlineAssoc = new ThreadLocal<Boolean>()
+   private static ThreadLocal<Boolean> DOMExpansionAssoc = new ThreadLocal<Boolean>()
    {
       protected Boolean initialValue() {
-         return Boolean.FALSE;
+         return Boolean.TRUE;
       }
    };
-    public static ThreadLocal localInvokerMDBAssoc() {
-        return invokerMDBAssoc;
-    }
+   
+   public static ThreadLocal localInvokerMDBAssoc() {
+      return invokerMDBAssoc;
+   }
 
-    public static ThreadLocal<Stack<SOAPMessageContextBase>> localMsgContextAssoc() {
-        return msgContextAssoc;
-    }
+   public static ThreadLocal<Stack<SOAPMessageContextBase>> localMsgContextAssoc() {
+      return msgContextAssoc;
+   }
 
-    public static ThreadLocal<SecurityStore> localStrTransformAssoc() {
-        return strTransformAssoc;
-    }
+   public static ThreadLocal<SecurityStore> localStrTransformAssoc() {
+      return strTransformAssoc;
+   }
 
-   public static ThreadLocal<Boolean> localXOPCalleeAssoc()
+   public static ThreadLocal<Boolean> localDomExpansion()
    {
-      return XOPInlineAssoc;
+      return DOMExpansionAssoc;
    }
-    public static void clear() {
-        invokerMDBAssoc.set(null);
-        msgContextAssoc.set(null);
-        strTransformAssoc.set(null);
-      XOPInlineAssoc.set(null);
-    }
+
+   public static void clear() {
+      invokerMDBAssoc.set(null);
+      msgContextAssoc.set(null);
+      strTransformAssoc.set(null);
+      DOMExpansionAssoc.set(Boolean.FALSE);
+   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/wsse/SecurityStore.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/wsse/SecurityStore.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/wsse/SecurityStore.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -129,28 +129,51 @@
       if (storeType == null)
          storeType = "jks";
 
-      storePassword = getPassword(storePassword);
+      KeyStore keyStore = null; 
       try
       {
          log.debug("loadStore: " + storeURL);
          InputStream stream = storeURL.openStream();
-         KeyStore keyStore = KeyStore.getInstance(storeType);
-         keyStore.load(stream, storePassword.toCharArray());
-
-         return keyStore;
+         if (stream == null)
+            throw new WSSecurityException("Cannot load store from: " + storeURL);
+         
+         keyStore = KeyStore.getInstance(storeType);
+         if (keyStore == null)
+            throw new WSSecurityException("Cannot get keystore for type: " + storeType);
+         
+         String decryptedPassword = decryptPassword(storePassword);
+         if (decryptedPassword == null)
+            throw new WSSecurityException("Cannot decrypt store password");
+         
+         keyStore.load(stream, decryptedPassword.toCharArray());
       }
-      catch (Exception e)
+      catch (RuntimeException rte)
       {
-         throw new WSSecurityException("Problems loading " + type + ": " + e.getMessage(), e);
+         throw rte;
       }
+      catch (WSSecurityException ex)
+      {
+         throw ex;
+      }
+      catch (Exception ex)
+      {
+         throw new WSSecurityException("Problems loading " + type + ": " + ex.getMessage(), ex);
+      }
+      
+      return keyStore;
    }
 
    /**
     * This method examines the password for the presence of a encryption algorithm, if found
     * decrypts and returns the password, else returns the password as is.
     */
-   private String getPassword(String password) throws WSSecurityException
+   private String decryptPassword(String password) throws WSSecurityException
    {
+      log.trace("decrypt password: " + password);
+      
+      if (password == null)
+         throw new WSSecurityException("Invalid null password for security store");
+      
       if (password.charAt(0) == '{')
       {
          StringTokenizer tokenizer = new StringTokenizer(password, "{}");
@@ -169,7 +192,10 @@
             throw new WSSecurityException("Unknown keyStorePasswordCmdType: " + keyStorePasswordCmdType);
          }
       }
-
+      if (password == null)
+         throw new WSSecurityException("Cannot decrypt password, result is null");
+      
+      log.trace("decrypted password: " + password);
       return password;
    }
 
@@ -361,7 +387,7 @@
       PrivateKey key;
       try
       {
-         key = (PrivateKey)keyStore.getKey(alias, getPassword(keyStorePassword).toCharArray());
+         key = (PrivateKey)keyStore.getKey(alias, decryptPassword(keyStorePassword).toCharArray());
       }
       catch (Exception e)
       {

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPContext.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPContext.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPContext.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,23 +21,44 @@
 */
 package org.jboss.ws.xop;
 
+import org.jboss.logging.Logger;
 import org.jboss.util.xml.DOMUtils;
+import org.jboss.ws.Constants;
+import org.jboss.ws.WSException;
 import org.jboss.ws.common.SOAPMessageContextBase;
+import org.jboss.ws.jaxrpc.StubExt;
 import org.jboss.ws.soap.MessageContextAssociation;
+import org.jboss.ws.soap.NameImpl;
 import org.jboss.ws.soap.SOAPMessageImpl;
+import org.jboss.ws.utils.MimeUtils;
 import org.jboss.ws.utils.ThreadLocalAssociation;
+import org.jboss.ws.utils.JavaUtils;
 import org.jboss.xb.binding.SimpleTypeBindings;
-import org.jboss.xb.binding.sunday.xop.XOPUnmarshaller;
+import org.jboss.xb.binding.sunday.xop.XOPMarshaller;
+import org.jboss.xb.binding.sunday.xop.XOPObject;
 
 import javax.activation.DataHandler;
 import javax.activation.DataSource;
+import javax.xml.namespace.QName;
+import javax.xml.soap.AttachmentPart;
 import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
+import javax.xml.rpc.handler.soap.SOAPMessageContext;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.util.Iterator;
 
 /**
  * XOP context associated with a message context.
+ * Acts as a facade to the current soap message and supports the various
+ * XOP transitions.<p>
+ * A good starting point to understand how MTOM in JBossWS works is to take a
+ * look at the SOAPContentElement implementation.
  *
  * @see ThreadLocalAssociation
+ * @see org.jboss.ws.soap.SOAPContentElement#handleMTOMTransitions()
+ * @see XOPUnmarshallerImpl
+ * @see XOPMarshallerImpl
  *
  * @author Heiko Braun <heiko.braun at jboss.com>
  * @since May 10, 2006
@@ -45,8 +66,13 @@
  */
 public class XOPContext {
 
-   public static final String CID_PREFIX = "cid:";
+   private static final Logger log = Logger.getLogger(XOPContext.class);
 
+   private static final String NS_XOP_JBOSSWS = "http://org.jboss.ws/xop";
+
+   /**
+    * Check if the current soap message flagged as a XOP package?
+    */
    public static boolean isXOPPackage() {
       boolean isXOP = false;
       SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
@@ -58,93 +84,229 @@
    }
 
    /**
-    * Force inline representation.
+    * Check if MTOM is disabled through a message context property.
+    * (<code>org.jboss.ws.mtom.enabled</code>)<br>
+    * Defaults to TRUE if the property is not set.
     */
-   public static void setInlineBase64()
+   public static boolean isMTOMEnabled()
    {
-      ThreadLocalAssociation.localXOPCalleeAssoc().set(Boolean.TRUE);
+      SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
+      boolean mtomEnabled = msgContext.getProperty(StubExt.PROPERTY_MTOM_ENABLED) == null ?
+          true :
+          ((String)msgContext.getProperty(StubExt.PROPERTY_MTOM_ENABLED)).equalsIgnoreCase("true");
+      return mtomEnabled;
    }
 
    /**
-    * Unset inline representation flag.
+    * Replace all <code>xop:Include</code> elements with it's base64 representation.
+    * This happens when the associated SOAPContentElement transitions to state dom-valid.<br>
+    * All attachement parts will be removed.
     */
-   public static void unsetInlineBase64()
+   public static void inlineXOPData(SOAPElement xopElement)
    {
-      ThreadLocalAssociation.localXOPCalleeAssoc().set(Boolean.FALSE);
-   }
+      String ns = xopElement.getNamespaceURI()!=null ? xopElement.getNamespaceURI(): "";
+      String localName = xopElement.getLocalName();
 
-   /**
-    * Should the current message be inlined?
-    * An inlined message contains the base64 representation instead
-    * if the <code>xop:Include</code> element.
-    */
-   public static boolean doInlineBase64()
-   {
-      Boolean b = ThreadLocalAssociation.localXOPCalleeAssoc().get() != null ?
-          ThreadLocalAssociation.localXOPCalleeAssoc().get():Boolean.FALSE;
-      return b.booleanValue();
+      // rpc/lit
+      if(ns.equals(Constants.NS_XOP) && localName.equals("Include"))
+      {
+         replaceXOPInclude(xopElement.getParentElement(), xopElement);
+      }
+      else
+      {
+         // doc/lit
+         Iterator it = DOMUtils.getChildElements(xopElement);
+         while(it.hasNext())
+         {
+            SOAPElement childElement = (SOAPElement)it.next();
+            String childNS = childElement.getNamespaceURI()!=null ? childElement.getNamespaceURI(): "";
+            String childName = childElement.getLocalName();
+            if(childNS.equals(Constants.NS_XOP) && childName.equals("Include"))
+            {
+               replaceXOPInclude(xopElement, childElement);
+            }
+            else
+            {
+               inlineXOPData(childElement);
+            }
+         }
+      }
    }
 
    /**
-    * Replace all <code>xop:Include</code> elements with it's base64 representation
+    * Restore previously inlined XOP elements.
+    * All base64 representations will be replaced by <code>xop:Include</code>
+    * elements and the attachment parts will be recreated. <br>
+    * This happens when a SOAPContentElement is written to an output stream.
     */
-   public static void inlineXOPData(SOAPElement xopElement)
+   public static void restoreXOPData(SOAPElement xopElement)
    {
-      Iterator it = DOMUtils.getChildElements(xopElement);
-      while(it.hasNext())
+      String contentType = xopElement.getAttributeNS(NS_XOP_JBOSSWS, "content-type");
+      if(contentType != null && contentType.length()>0)
       {
-         SOAPElement childElement = (SOAPElement)it.next();
-         String ns = childElement.getNamespaceURI()!=null ? childElement.getNamespaceURI(): "";
-         String localName = childElement.getLocalName();
-         if(ns.equals("http://www.w3.org/2004/08/xop/include") && localName.equals("Include"))
+         replaceBase64Representation(xopElement, contentType);
+         xopElement.removeAttribute(new NameImpl(new QName(NS_XOP_JBOSSWS, "content-type")));
+      }
+      else
+      {
+         Iterator it = DOMUtils.getChildElements(xopElement);
+         while(it.hasNext())
          {
-            replaceXOPInclude(xopElement, childElement);
+            SOAPElement childElement = (SOAPElement)it.next();
+            restoreXOPData(childElement);
          }
-         else
-         {
-            inlineXOPData(childElement);
-         }
       }
    }
 
-   private static void replaceXOPInclude(SOAPElement parent, SOAPElement child)
+   private static void replaceBase64Representation(SOAPElement xopElement, String contentType) {
+
+      SOAPElement parentElement = xopElement.getParentElement();
+      log.debug("Replace base64 representation on element [xmlName=" + parentElement.getLocalName()+"]");
+
+      String base64 = xopElement.getValue();
+      byte[] data = SimpleTypeBindings.unmarshalBase64(base64);
+
+      MimeUtils.ByteArrayConverter converter = MimeUtils.getConverterForContentType(contentType);
+      Object converted = converter.readFrom(new ByteArrayInputStream(data));
+
+      XOPObject xopObject = new XOPObject(converted);
+      xopObject.setContentType(contentType);
+
+      XOPMarshaller xopMarshaller = new XOPMarshallerImpl();
+      String cid = xopMarshaller.addMtomAttachment(xopObject, xopElement.getNamespaceURI(), xopElement.getLocalName());      
+
+      // remove base64 node with the xop:Include element
+      org.w3c.dom.Node child = (org.w3c.dom.Node)xopElement.getFirstChild();
+      xopElement.removeChild(child);
+
+      try
+      {
+         SOAPElement xopInclude = xopElement.addChildElement("Include", "xop", Constants.NS_XOP);
+         xopInclude.setAttribute("href", cid);
+         log.debug("Restored xop:Include element on {" + xopElement.getNamespaceURI()+"}"+xopElement.getLocalName());
+      }
+      catch (SOAPException e)
+      {
+         throw new WSException("Failed to create XOP include element", e);
+      }
+
+   }
+
+   private static void replaceXOPInclude(SOAPElement parent, SOAPElement xopIncludeElement)
    {
-      String cid = child.getAttribute("href");
-      if(cid!=null)
+
+      log.debug("Replace xop:Include on element [xmlName=" + parent.getLocalName() +"]");
+
+      String cid = xopIncludeElement.getAttribute("href");
+      byte[] data;
+      String contentType;
+
+      try
       {
-         XOPUnmarshaller unm = new XOPUnmarshallerImpl();
-         byte[] data = unm.getAttachmentAsByteArray(cid);
-         String base64 = SimpleTypeBindings.marshalBase64(data);
-         parent.removeChild(child);
-         parent.setValue(base64);
+         AttachmentPart part = XOPContext.getAttachmentByCID(cid);
+         DataHandler dh = part.getDataHandler();
+         contentType = dh.getContentType();
+
+         // TODO: can't we create base64 directly from stream?
+         ByteArrayOutputStream bout = new ByteArrayOutputStream();
+         dh.writeTo(bout);
+         data = bout.toByteArray();
+
       }
+      catch (Exception e)
+      {
+         throw new WSException("Failed to inline XOP data", e);
+      }
+
+      // create base64 contents
+      String base64 = SimpleTypeBindings.marshalBase64(data);
+      parent.removeChild(xopIncludeElement);
+      parent.setValue(base64);
+      parent.setAttributeNS(NS_XOP_JBOSSWS, "content-type", contentType);
+
+      log.debug("Created base64 representation for content-type " + contentType);
+
+      // cleanup the attachment part
+      SOAPMessageContextBase msgContext = (SOAPMessageContextBase)MessageContextAssociation.peekMessageContext();
+      SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
+
+      if(cid.startsWith("cid:")) cid = cid.substring(4);
+      cid = '<'+cid+'>';
+
+      AttachmentPart removedPart = soapMessage.removeAttachmentByContentId(cid);
+      if(null == removedPart)
+         throw new WSException("Unable to remove attachment part " + cid);
+
+      log.debug("Removed attachment part " + cid);
+
    }
 
-   public static DataHandler getDataHandler(Object o)
+   /**
+    * Access an XOP attachment part by content id (CID).
+    */
+   public static AttachmentPart getAttachmentByCID(String cid) throws SOAPException
    {
+      SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
+      SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
+
+      // RFC2392 requires the 'cid:' part to be stripped from the cid
+      if(cid.startsWith("cid:")) cid = cid.substring(4);
+      cid = '<'+cid+'>';
+
+      AttachmentPart part = soapMessage.getAttachmentByContentId(cid);
+      if (part == null)
+         throw new WSException("Cannot find attachment part for: " + cid);
+
+      return part;
+   }
+
+   /**
+    * Create a <code>DataHandler</code> for an object.
+    * The handlers content type is based on the java type.
+    */
+   public static DataHandler createDataHandler(XOPObject xopObject)
+   {
       DataHandler dataHandler;
-      // todo: contentType
-      if(o instanceof java.awt.Image)
+      Object o = xopObject.getContent();
+
+      if(o instanceof DataHandler)
       {
-         dataHandler = new DataHandler(o, "image/jpeg");
+         dataHandler = (DataHandler)o;
       }
-      else if(o instanceof javax.xml.transform.Source)
+      else if(xopObject.getContentType() != null)
       {
-         dataHandler = new DataHandler(o, "application/xml");
+         dataHandler = new DataHandler(o, xopObject.getContentType());
       }
-      else if(o instanceof String)
+      else if(! getContentTypeForClazz(o.getClass()).equals("application/octet-stream"))
       {
-         dataHandler = new DataHandler(o, "text/plain");
+         dataHandler = new DataHandler(o, getContentTypeForClazz(o.getClass()));
       }
-      else if(o instanceof DataHandler)
-      {
-         dataHandler = (DataHandler)o;//new DataHandler(o, "application/octet-stream");
-      }
       else
       {
          DataSource ds = new SimpleDataSource(o, "application/octet-stream");
          dataHandler = new DataHandler(ds);
       }
+
       return dataHandler;
    }
+
+   public static String getContentTypeForClazz(Class clazz)
+   {
+      if(JavaUtils.isAssignableFrom(java.awt.Image.class, clazz))
+      {
+         return "image/jpeg";
+      }
+      else if (JavaUtils.isAssignableFrom(javax.xml.transform.Source.class, clazz))
+      {
+         return "application/xml";
+      }
+      else if (JavaUtils.isAssignableFrom(java.lang.String.class, clazz))
+      {
+         return "text/plain";
+      }
+      else
+      {
+         return "application/octet-stream";
+      }
+   }
 }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPMarshallerImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPMarshallerImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPMarshallerImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -24,9 +24,10 @@
 import org.jboss.logging.Logger;
 import org.jboss.util.NotImplementedException;
 import org.jboss.ws.soap.MessageContextAssociation;
+
 import org.jboss.ws.soap.SOAPMessageImpl;
+import org.jboss.ws.soap.attachment.MimeConstants;
 import org.jboss.ws.soap.attachment.ContentHandlerRegistry;
-import org.jboss.ws.soap.attachment.MimeConstants;
 import org.jboss.ws.common.SOAPMessageContextBase;
 import org.jboss.xb.binding.sunday.xop.XOPMarshaller;
 import org.jboss.xb.binding.sunday.xop.XOPObject;
@@ -54,7 +55,7 @@
       // Load JAF content handlers
       ContentHandlerRegistry.register();
    }
-   
+
    public boolean isXOPPackage()
    {
       return XOPContext.isXOPPackage();
@@ -63,21 +64,21 @@
    public String addMtomAttachment(XOPObject obj, String elementNamespace, String elementName)
    {
 
+      SOAPMessageContextBase msgContext = (SOAPMessageContextBase)MessageContextAssociation.peekMessageContext();
+      SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
+
       QName xmlName = new QName(elementNamespace, elementName);
       log.debug("serialize: [xmlName=" + xmlName + "]");
 
-      SOAPMessageContextBase msgContext = (SOAPMessageContextBase)MessageContextAssociation.peekMessageContext();
-      SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
-
       String cid = soapMessage.getCidGenerator().generateFromName(xmlName.getLocalPart());
 
-      DataHandler dataHandler = XOPContext.getDataHandler(obj.getContent());
-      obj.setContentType(dataHandler.getContentType());
-      
+      DataHandler dataHandler = XOPContext.createDataHandler(obj);
       AttachmentPart xopPart = soapMessage.createAttachmentPart(dataHandler);
       xopPart.addMimeHeader(MimeConstants.CONTENT_ID, '<'+cid+'>'); // RFC2392 requirement
       soapMessage.addAttachmentPart(xopPart);
 
+      log.debug("Created attachment part " +cid+", with content-type " +xopPart.getContentType());
+
       return "cid:" + cid;
 
    }

Modified: branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPUnmarshallerImpl.java
===================================================================
--- branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPUnmarshallerImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPUnmarshallerImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,9 +23,6 @@
 
 import org.jboss.logging.Logger;
 import org.jboss.ws.WSException;
-import org.jboss.ws.common.SOAPMessageContextBase;
-import org.jboss.ws.soap.MessageContextAssociation;
-import org.jboss.ws.soap.SOAPMessageImpl;
 import org.jboss.ws.soap.attachment.ContentHandlerRegistry;
 import org.jboss.xb.binding.sunday.xop.XOPObject;
 import org.jboss.xb.binding.sunday.xop.XOPUnmarshaller;
@@ -35,7 +32,6 @@
 import javax.xml.soap.SOAPException;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 
 /**
  * The XOPUnmarshallerImpl allows callbacks from the binding layer towards the
@@ -66,19 +62,10 @@
    {
       try
       {
-         AttachmentPart part = getAttachementByCID(cid);
-
-         // Let JAF do the conversion
-         Object content = part.getDataHandler().getContent();
-
-         if(content instanceof InputStream)
-         {
-            // JAF doesn't know the content-type
-            // In this case we pass along the DataHandler
-            content = part.getDataHandler();
-         }
-
-         XOPObject xopObject = new XOPObject(content);
+         // Always return the DataHandler, it's the preferred SEI parameter type.
+         // If necessary the conversion can take just place in SOAPContentElement
+         AttachmentPart part = XOPContext.getAttachmentByCID(cid);
+         XOPObject xopObject = new XOPObject(part.getDataHandler());
          xopObject.setContentType(part.getDataHandler().getContentType());
 
          return xopObject;
@@ -87,18 +74,13 @@
       {
          throw new WSException(ex);
       }
-      catch(IOException e)
-      {
-         throw new WSException("Unable to retrieve content for cid:" + cid, e);
-      }
-
    }
 
    public byte[] getAttachmentAsByteArray(String cid)
    {
       try
       {
-         AttachmentPart part = getAttachementByCID(cid);
+         AttachmentPart part = XOPContext.getAttachmentByCID(cid);
          DataHandler dh = part.getDataHandler();
          ByteArrayOutputStream bout = new ByteArrayOutputStream();
          dh.writeTo(bout);
@@ -115,20 +97,4 @@
       }
 
    }
-
-   private AttachmentPart getAttachementByCID(String cid) throws SOAPException
-   {
-      SOAPMessageContextBase msgContext = MessageContextAssociation.peekMessageContext();
-      SOAPMessageImpl soapMessage = (SOAPMessageImpl)msgContext.getMessage();
-
-      // RFC2392 requires the 'cid:' part to be stripped from the cid
-      if(cid.startsWith("cid:")) cid = cid.substring(4);
-      cid = '<'+cid+'>';
-
-      AttachmentPart part = soapMessage.getAttachmentByContentId(cid);
-      if (part == null)
-         throw new WSException("Cannot find attachment part for: " + cid);
-
-      return part;
-   }
 }

Copied: branches/tdiesler/trunk/src/main/java/org/jboss/ws/xop/XOPValueAdapter.java (from rev 876, trunk/src/main/java/org/jboss/ws/xop/XOPValueAdapter.java)

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPRpcTestCase.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPRpcTestCase.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPRpcTestCase.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -34,7 +34,6 @@
 import javax.xml.rpc.Stub;
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
-import java.awt.*;
 import java.io.File;
 import java.io.FileInputStream;
 import java.net.URL;
@@ -67,7 +66,7 @@
             InitialContext iniCtx = getInitialContext();
             Service service = (Service)iniCtx.lookup("java:comp/env/service/XOPTestService");
             port = (XOPTest)service.getPort(XOPTest.class);
-         }         
+         }
          else
          {
             ServiceFactoryImpl factory = new ServiceFactoryImpl();
@@ -84,140 +83,86 @@
       //((Stub)port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "http://" + getServerHost() + ":8081/jbossws-samples-mtom");
    }
 
-   /** Send a multipart message with a image/gif attachment part
+   /**
+    * Send unknown file as 'application/octet-stream'.
+    * Uses a DataHandler both for the endpint parameter and the return type.
     */
-   /*public void testSendMimeImageGIF() throws Exception
+   public void testSimpleBinary() throws Exception
    {
-      URL url = new File("resources/samples/mtom/attach.gif").toURL();
-
-      // On Linux the X11 server must be installed properly to create images successfully.
-      // If the image cannot be created in the test VM, we assume it cannot be done on the
-      // server either, so we just skip the test
-      Image image = null;
-      try
-      {
-         image = Toolkit.getDefaultToolkit().createImage(url);
-      }
-      catch (Throwable th)
-      {
-         //log.warn("Cannot create Image: " + th);
-      }
-
-      if (image != null)
-      {
-         Object value = port.sendMimeImageGIF("Some text message", new DataHandler(url));
-         assertNotNull(value);
-         assertTrue("Wrong return value type", value instanceof Image);
-      }
-   } */
-
-   /** Send unknown file that actually is converted into a DataHandler
-    */
-   public void testSendOctets() throws Exception
-   {
-      Object value = port.sendOctets("Some text message", new DataHandler(
+      DataHandler value = port.sendOctets("Some text message", new DataHandler(
           new FileDataSource("resources/samples/mtom/disguised_jpeg.xcf")
       ));
       assertNotNull(value);
-      assertTrue("Wrong return value type", value instanceof DataHandler);
+      assertTrue("Wrong content type", value.getContentType().equals("application/octet-stream"));
    }
 
    /**
-    * A disguised element is send when the actual SEI java parameter
-    * doesn't map with the content-type set on the mimepart.
-    * .NET loves do this...
-    *
-    * In this case we try to 'force' convert that object according to
-    * the expected java parameter.
-    *
-    * @throws Exception
-    * @see org.jboss.ws.soap.SOAPContentElement#getObjectValue()
+    * Send a multipart message with a 'image/jpeg' attachment part.
+    * Uses a DataHandler as endpoint parameter and return type.
     */
-   public void testSendDisguised() throws Exception
+   public void testAbstractParameterTypes() throws Exception
    {
-      Object value = port.sendMimeImageGIF("Some text message", new DataHandler(
-          new FileDataSource("resources/samples/mtom/disguised_jpeg.xcf")
-      ));
+      URL url = new File("resources/samples/mtom/attach.jpeg").toURL();
+      DataHandler value = port.sendMimeImageJPEG("Some text message", new DataHandler(url));
       assertNotNull(value);
-      assertTrue("Wrong return value type", value instanceof Image);
+      assertTrue("Wrong return content-type returned", value.getContentType().equals("image/jpeg"));
    }
 
-   /** Send a multipart message with a image/jpeg attachment part
+   /**
+    * Send a multipart message with a 'text/plain' attachment part.
+    * Uses java.lang.String as endpoint parameter and return type.
     */
-  public void testSendMimeImageJPEG() throws Exception
+   public void testConcreteParameterTypes() throws Exception
    {
-      URL url = new File("resources/samples/mtom/attach.jpeg").toURL();
-
-      // On Linux the X11 server must be installed properly to create images successfully.
-      // If the image cannot be created in the test VM, we assume it cannot be done on the
-      // server either, so we just skip the test
-      Image image = null;
-      try
-      {
-         image = Toolkit.getDefaultToolkit().createImage(url);
-      }
-      catch (Throwable th)
-      {
-         //log.warn("Cannot create Image: " + th);
-      }
-
-      if (image != null)
-      {
-         Object value = port.sendMimeImageJPEG("Some text message", image);
-         assertNotNull(value);
-         assertTrue("Wrong return value type", value instanceof Image);
-      }
-   }
-
-   /** Send a multipart message with a text/plain attachment part
-    */
-   public void testSendMimeTextPlain() throws Exception
-   {
-      String value = port.sendMimeTextPlain("Some text message", "This is a plain text attachment.");
+      String xoppart = "This is a plain text attachment.";
+      String value = port.sendMimeTextPlain("Some text message", xoppart);
       assertNotNull(value);
+      assertEquals("Value mismatch", value, xoppart);
    }
 
-   /** Send a multipart message with a multipart attachment part
+   /**
+    * Send a multipart message with a 'text/xml' attachment part.
+    * Uses a DataHandler as endpoint parameter, but javax.xml.transform.Source as return value.
     */
-   public void testSendMimeMultipart() throws Exception
+   public void testParameterConversion() throws Exception
    {
-      /*URL url = new File("resources/samples/mtom/attach.txt").toURL();
-      MimeMultipart multipart = new MimeMultipart("mixed");
-      MimeBodyPart bodyPart = new MimeBodyPart();
-      bodyPart.setDataHandler(new DataHandler(url));
-      String bpct = bodyPart.getContentType();
-      bodyPart.setHeader("Content-Type", bpct);
-      multipart.addBodyPart(bodyPart);
+      FileInputStream stream = new FileInputStream("resources/samples/mtom/attach.xml");
+      StreamSource source = new StreamSource(stream);
 
-      Object value = port.sendMimeMultipart("Some text message", multipart);
+      Source value = port.sendMimeTextXML("Some text message", new DataHandler(source, "text/xml"));
       assertNotNull(value);
-      assertTrue("Wrong return value type", value instanceof MimeMultipart);
-      */
-
-      System.out.println("FIXME 'testSendMimeMultipart()'");
+      assertTrue("Wrong return value type", value instanceof Source);
    }
 
-   /** Send a multipart message with a text/xml attachment part
+   /**
+    * Send a multipart message with a application/xml attachment part.
+    * Uses a javax.xml.transform.Source as endpoint parameter, but javax.activation.DataHandler as return value.
     */
-  public void testSendMimeTextXML() throws Exception
+   public void testParameterConversionReverse() throws Exception
    {
       FileInputStream stream = new FileInputStream("resources/samples/mtom/attach.xml");
       StreamSource source = new StreamSource(stream);
 
-      Object value = port.sendMimeTextXML("Some text message", new DataHandler(source, "text/xml"));
+      DataHandler value = port.sendMimeApplicationXML("Some text message", source);
       assertNotNull(value);
-      assertTrue("Wrong return value type", value instanceof Source);
+      assertTrue("Wrong return value content-type", value.getContentType().equals("application/xml"));
    }
 
-   /** Send a multipart message with a application/xml attachment part
+   /**
+    * Send a inlined message and expect a multipart response.
     */
-   public void testSendMimeApplicationXML() throws Exception
+   public void testMTOMDisabledClientSide() throws Exception
    {
-      FileInputStream stream = new FileInputStream("resources/samples/mtom/attach.xml");
-      StreamSource source = new StreamSource(stream);
+      /*URL url = new File("resources/samples/mtom/attach.jpeg").toURL();
 
-      Object value = port.sendMimeApplicationXML("Some text message", source);
+      // disable MTOM
+      ((Stub)port)._setProperty("org.jboss.ws.mtom.enabled", "false");
+
+      DataHandler value = port.sendMimeImageJPEG("MTOM disabled request", new DataHandler(url));
       assertNotNull(value);
-      assertTrue("Wrong return value type", value instanceof Source);
+      assertTrue("Wrong return content-type returned", value.getContentType().equals("image/jpeg"));
+      */
+
+      System.out.println("FIXME: testMTOMDisabledClientSide");
    }
 }

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTest.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTest.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTest.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -44,29 +44,21 @@
  */
 public interface XOPTest extends Remote
 {
-   /** Service endpoint method for image/gif
-    */
-   Object sendMimeImageGIF(String message, Object xoppart) throws RemoteException;
-
    /** Service endpoint method for image/jpeg
     */
-   Object sendMimeImageJPEG(String message, Image xoppart) throws RemoteException;
+   DataHandler sendMimeImageJPEG(String message, DataHandler xoppart) throws RemoteException;
 
    /** Service endpoint method for text/plain
     */
    String sendMimeTextPlain(String message, String xoppart) throws RemoteException;
 
-   /** Service endpoint method for multipart/*
-    */
-   MimeMultipart sendMimeMultipart(String message, MimeMultipart xoppart) throws RemoteException;
-
    /** Service endpoint method for text/xml
     */
-   Object sendMimeTextXML(String message, Object xoppart) throws RemoteException;
+   Source sendMimeTextXML(String message, DataHandler xoppart) throws RemoteException;
 
    /** Service endpoint method for application/xml
     */
-   Object sendMimeApplicationXML(String message, Source xoppart) throws RemoteException;
+   DataHandler sendMimeApplicationXML(String message, Source xoppart) throws RemoteException;
 
    DataHandler sendOctets(String message, DataHandler xoppart) throws RemoteException;
 }

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTestImpl.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTestImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/samples/mtom/XOPTestImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -21,6 +21,8 @@
   */
 package org.jboss.test.ws.samples.mtom;
 
+import org.jboss.ws.WSException;
+
 import javax.mail.BodyPart;
 import javax.mail.internet.MimeMultipart;
 import javax.xml.rpc.ServiceException;
@@ -34,229 +36,77 @@
 import java.awt.*;
 import java.rmi.RemoteException;
 import java.util.Iterator;
+import java.io.IOException;
 
 /**
  * Service Endpoint for XOP
  *
- * image/gif         java.awt.Image
  * image/jpeg        java.awt.Image
  * text/plain        java.lang.String
- * multipart/*       javax.mail.internet.MimeMultipart
  * text/xml          javax.xml.transform.Source
  * application/xml   javax.xml.transform.Source
  *
  * @author Thomas.Diesler at jboss.org
+ * @author Heiko.Braun at jboss.org
+ *
  * @since 18-Jan-2006
  */
 public class XOPTestImpl implements XOPTest, ServiceLifecycle
 {
    private ServletEndpointContext context;
 
-   /** Service endpoint method for image/gif
+   /**
+    * Service endpoint method that processes inlined and optimized values.
     */
-   public Object sendMimeImageGIF(String message, Object xoppart) throws RemoteException
+   public DataHandler sendMimeImageJPEG(String message, DataHandler xoppart) throws RemoteException
    {
-      StringBuffer buffer = new StringBuffer();
+      String expContentType = message.equals("MTOM disabled request") ? "application/octet-stream" : "image/jpeg";
 
-      validateStringMessage(buffer, message);
-
-      String expContentType = "image/gif";
-      validateAttachmentPart(buffer, expContentType, xoppart);
-
+      if(! xoppart.getContentType().equals(expContentType))
+         throw new IllegalArgumentException("Wrong content-type: expected "+expContentType+", but was " + xoppart.getContentType());
       return xoppart;
    }
 
-   /** Service endpoint method for image/jpeg
+   /**
+    * Service endpoint method for text/plain
     */
-   public Object sendMimeImageJPEG(String message, Image xoppart) throws RemoteException
-   {
-      StringBuffer buffer = new StringBuffer();
-      String expContentType = "image/jpeg";
-      validateAttachmentPart(buffer, expContentType, xoppart);
-      return xoppart;
-   }
-
-   /** Service endpoint method for text/plain
-    */
    public String sendMimeTextPlain(String message, String xoppart) throws RemoteException
    {
-      StringBuffer buffer = new StringBuffer();
-
-      validateStringMessage(buffer, message);
-
-      String expContentType = "text/plain";
-      validateAttachmentPart(buffer, expContentType, xoppart);
-
-      String resultStr = getResultStr(buffer, expContentType);
-      return resultStr;
-   }
-
-   /** Service endpoint method for multipart/*
-    */
-   public MimeMultipart sendMimeMultipart(String message, MimeMultipart xoppart) throws RemoteException
-   {
-      StringBuffer buffer = new StringBuffer();
-
-      validateStringMessage(buffer, message);
-
-      String expContentType = "multipart/*";
-      validateAttachmentPart(buffer, expContentType, xoppart);
-
       return xoppart;
    }
 
-   /** Service endpoint method for text/xml
+   /**
+    * Service endpoint method for text/xml
     */
-   public Object sendMimeTextXML(String message, Object xoppart) throws RemoteException
+   public Source sendMimeTextXML(String message, DataHandler xoppart) throws RemoteException
    {
-      StringBuffer buffer = new StringBuffer();
-
-      validateStringMessage(buffer, message);
-
-      String expContentType = "text/xml";
-      validateAttachmentPart(buffer, expContentType, xoppart);
-
-      return xoppart;
-   }
-
-   /** Service endpoint method for application/xml
-    */
-   public Object sendMimeApplicationXML(String message, Source xoppart) throws RemoteException
-   {
-      StringBuffer buffer = new StringBuffer();
-
-      validateStringMessage(buffer, message);
-
-      String expContentType = "application/xml";
-      validateAttachmentPart(buffer, expContentType, xoppart);
-
-      return xoppart;
-   }
-
-   public DataHandler sendOctets(String message, DataHandler xoppart) throws RemoteException {
-      StringBuffer buffer = new StringBuffer();
-      validateStringMessage(buffer, message);
-
-      String expContentType = "application/octet-stream";
-      validateAttachmentPart(buffer, expContentType, xoppart);
-
-      return xoppart;
-   }
-
-   private void validateStringMessage(StringBuffer buffer, String message)
-   {
-      if ("Some text message".equals(message) == false)
-         buffer.append("[message=" + message + "]");
-   }
-
-   private void validateAttachmentPart(StringBuffer buffer, String expContentType, Object xoppart)
-   {
-      if(null==xoppart)
-         throw new IllegalArgumentException("XOP Parameter was null");
-      SOAPMessageContext msgContext = (SOAPMessageContext)context.getMessageContext();
-      SOAPMessage soapMessage = msgContext.getMessage();
-
-      Iterator attachments = soapMessage.getAttachments();
-      if (attachments.hasNext())
+      if(! xoppart.getContentType().equals("text/xml"))
+         throw new IllegalArgumentException("Wrong content-type: expected 'text/xml', but was " + xoppart.getContentType());
+      try
       {
-         AttachmentPart ap = (AttachmentPart)attachments.next();
-         String contentType = ap.getContentType();
-
-         if (expContentType.equals("multipart/*"))
-         {
-            if (contentType.startsWith("multipart/") == false)
-               buffer.append("[contentType=" + contentType + "]");
-         }
-         else if (expContentType.equals("text/xml"))
-         {
-            if (contentType.equals("text/xml") == false && contentType.equals("application/xml") == false)
-               buffer.append("[contentType=" + contentType + "]");
-         }
-         else
-         {
-            if (contentType.equals(expContentType) == false)
-               buffer.append("[contentType=" + contentType + "]");
-         }
-         validateSinglePart(buffer, expContentType, ap);
+         Source payload = (Source)xoppart.getContent();
+         return payload;
       }
-      else
+      catch (IOException e)
       {
-         buffer.append("[no attachments]");
+         throw new WSException(e.getMessage());
       }
-
-      validateSinglePart(buffer, expContentType, xoppart);
    }
 
-   private void validateSinglePart(StringBuffer buffer, String contentType, Object content)
+   /**
+    * Service endpoint method for application/xml
+    */
+   public DataHandler sendMimeApplicationXML(String message, Source xoppart) throws RemoteException
    {
-      try
-      {
-         if (content instanceof AttachmentPart)
-            content = ((AttachmentPart)content).getContent();
-
-         if (contentType.equals("image/gif") || contentType.equals("image/jpeg"))
-         {
-            if ((content instanceof Image) == false)
-               buffer.append("[content=" + content + "]");
-         }
-         else if (contentType.equals("text/plain"))
-         {
-            if ((content instanceof String) == false)
-               buffer.append("[content=" + content + "]");
-         }
-         else if (contentType.startsWith("multipart/"))
-         {
-            if ((content instanceof MimeMultipart) == false)
-            {
-               buffer.append("[content=" + content + "]");
-            }
-            else
-            {
-               MimeMultipart mmp = (MimeMultipart)content;
-
-               int mmpCount = mmp.getCount();
-               if (mmpCount < 1)
-                  buffer.append("[count=" + mmpCount + "]");
-
-               for (int i = 0; i < mmpCount; i++)
-               {
-                  BodyPart bp = mmp.getBodyPart(i);
-                  String bpct = bp.getContentType();
-                  Object bpc = bp.getContent();
-                  validateSinglePart(buffer, bpct, bpc);
-               }
-            }
-         }
-         else if (contentType.equals("text/xml") || contentType.equals("application/xml"))
-         {
-            if ((content instanceof Source) == false)
-               buffer.append("[content=" + content + "]");
-         }
-         else if (contentType.equals("application/octet-stream") )
-         {
-            if ((content instanceof DataHandler) == false)
-               buffer.append("[content=" + content + "]");
-         }
-         else
-         {
-            throw new IllegalArgumentException("Unsupported mime type: " + contentType);
-         }
-      }
-      catch (Exception e)
-      {
-         buffer.append("[" + e + "]");
-      }
+      return new DataHandler(xoppart, "application/xml");
    }
 
-   private String getResultStr(StringBuffer buffer, String expContentType)
-   {
-      String retStr = (buffer.length() == 0 ? "[pass]" : buffer.toString());
-      System.out.println(expContentType + ": " + retStr);
-      return retStr;
+   public DataHandler sendOctets(String message, DataHandler xoppart) throws RemoteException {
+      if(! xoppart.getContentType().equals("application/octet-stream"))
+         throw new IllegalArgumentException("Wrong content-type: expected 'application/octet-stream', but was " + xoppart.getContentType());
+      return xoppart;
    }
 
-   // ServiceLifecycle *******************************************************************************************
-
    public void init(Object context) throws ServiceException
    {
       this.context = (ServletEndpointContext)context;

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/wsse/PasswordUtil.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/wsse/PasswordUtil.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/wsse/PasswordUtil.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -1,34 +1,36 @@
 /*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * License along with this software; if not, write to the Free
-  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-  */
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
 package org.jboss.test.ws.wsse;
 
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
 import java.io.RandomAccessFile;
-import java.io.ByteArrayOutputStream;
 
-import javax.crypto.spec.PBEParameterSpec;
-import javax.crypto.spec.PBEKeySpec;
 import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
 import javax.crypto.SecretKeyFactory;
-import javax.crypto.SecretKey;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
 
 /**
  * This is a simple decode utility for using along with the jboss-ws-security keystore and truststore use cases
@@ -40,13 +42,11 @@
 {
    public static void main(String args[])
    {
-     if( args.length != 1 )
+      if (args.length != 1)
       {
-         System.err.println(
-            "Read a password in plain text form from a password file"
-           +"Usage: PasswordUtil password-file"
-           +"  password-file : the path to the file to write the password to"
-         );
+         System.err.println("Read a password in plain text form from a password file");
+         System.err.println("Usage: PasswordUtil password-file");
+         return;
       }
       try
       {
@@ -60,13 +60,16 @@
 
    private static char[] decode(String passwordFilePath) throws Exception
    {
+      if (new File(passwordFilePath).exists() == false)
+         throw new IOException("Password file does not exist: " + passwordFilePath);
+
       RandomAccessFile passwordFile = new RandomAccessFile(passwordFilePath, "rws");
       byte[] salt = new byte[8];
       passwordFile.readFully(salt);
       int count = passwordFile.readInt();
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
       int b;
-      while( (b = passwordFile.read()) >= 0 )
+      while ((b = passwordFile.read()) >= 0)
          baos.write(b);
       passwordFile.close();
       byte[] secret = baos.toByteArray();

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPElementRPCTestCase.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPElementRPCTestCase.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPElementRPCTestCase.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -23,11 +23,15 @@
 
 import org.jboss.test.ws.JBossWSTest;
 import org.jboss.ws.Constants;
+import org.jboss.ws.common.SOAPMessageContextBase;
 import org.jboss.ws.jaxrpc.Style;
 import org.jboss.ws.jaxrpc.handler.SOAPMessageContextJAXRPC;
 import org.jboss.ws.metadata.OperationMetaData;
 import org.jboss.ws.metadata.ParameterMetaData;
-import org.jboss.ws.soap.*;
+import org.jboss.ws.soap.MessageContextAssociation;
+import org.jboss.ws.soap.NameImpl;
+import org.jboss.ws.soap.SOAPBodyElementRpc;
+import org.jboss.ws.soap.SOAPContentElement;
 
 import javax.xml.namespace.QName;
 import javax.xml.soap.MessageFactory;
@@ -72,7 +76,7 @@
       bodyElement.addChildElement(xopElement);
 
       // Setup the message context
-      SOAPMessageContextJAXRPC msgContext = new SOAPMessageContextJAXRPC();
+      SOAPMessageContextBase msgContext = new SOAPMessageContextJAXRPC();
       MessageContextAssociation.pushMessageContext(msgContext);
       msgContext.setOperationMetaData(opMetaData);
       msgContext.setMessage(soapMessage);

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPTypeDefTestCase.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPTypeDefTestCase.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/XOPTypeDefTestCase.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -18,6 +18,9 @@
  */
 public class XOPTypeDefTestCase extends TestCase {
 
+   //String prefix = "C:/dev/prj/jbossws/branches/jbossws-1.0/src/test/";
+   String prefix = "";
+   
    public XOPTypeDefTestCase(String string) {
       super(string);
    }
@@ -28,8 +31,7 @@
 
   public void testCircularReferences() throws Exception{
       SchemaUtils utils = SchemaUtils.getInstance();
-      //String prefix = "C:/dev/prj/jbossws/branches/jbossws-1.0_SchemaBindingMarshaller/src/test/";
-      File f = new File("resources/xop/circular.xsd");
+      File f = new File(prefix+"resources/xop/circular.xsd");
       assertTrue("Unable to load schema file " + f.getAbsolutePath(), f.exists());
 
       XSModel xsModel = utils.parseSchema(f.toURL());
@@ -54,8 +56,7 @@
    public void testXOPElementScan() throws Exception
    {
       SchemaUtils utils = SchemaUtils.getInstance();
-      //String prefix = "C:/dev/prj/jbossws/branches/jbossws-1.0_SchemaBindingMarshaller/src/test/";
-      File f = new File("resources/xop/schema.xsd");
+      File f = new File(prefix+"resources/xop/schema.xsd");
       assertTrue("Unable to load schema file " + f.getAbsolutePath(), f.exists());
 
       XSModel xsModel = utils.parseSchema(f.toURL());
@@ -87,4 +88,31 @@
       }
 
    }
+
+   public void testMSFTElementScan() throws Exception
+   {
+      /*
+      SchemaUtils utils = SchemaUtils.getInstance();
+      File f = new File(prefix +"resources/xop/schema.xsd");
+      assertTrue("Unable to load schema file " + f.getAbsolutePath(), f.exists());
+
+      XSModel xsModel = utils.parseSchema(f.toURL());
+      assertNotNull(xsModel);
+      WSSchemaUtils wsUtil = WSSchemaUtils.getInstance(new NamespaceRegistry(), "http://jboss.org/test/ws/xop/doclit");
+      JBossXSModel schemaModel= wsUtil.getJBossXSModel(xsModel);
+
+      XSTypeDefinition xsType = schemaModel.getTypeDefinition(">MSFTBinary", "http://jboss.org/test/ws/xop/doclit");
+
+      assertNotNull("Root type def not found", xsType);
+      XOPScanner scanner = new XOPScanner();
+
+      if (xsType instanceof XSComplexTypeDefinition)
+      {
+         XSComplexTypeDefinition xsComplexType = (XSComplexTypeDefinition)xsType;
+         XSTypeDefinition resultType = scanner.findXOPTypeDef(xsComplexType);
+         assertNotNull("Unable to find xop typedef in schema", resultType);
+      }
+      */
+      System.out.println("FIXME: testMSFTElementScan");
+   }
 }

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/InlineHandler.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/InlineHandler.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/InlineHandler.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -1,17 +1,16 @@
 package org.jboss.test.ws.xop.doclit;
 
 import org.jboss.logging.Logger;
-import org.jboss.util.xml.DOMWriter;
 import org.jboss.ws.soap.NameImpl;
 
 import javax.xml.namespace.QName;
 import javax.xml.rpc.handler.GenericHandler;
 import javax.xml.rpc.handler.MessageContext;
 import javax.xml.rpc.handler.soap.SOAPMessageContext;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.soap.Name;
-import javax.xml.soap.SOAPElement;
 import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPMessage;
+import java.io.ByteArrayOutputStream;
 
 /**
  * @author Heiko Braun <heiko.braun at jboss.com>
@@ -26,7 +25,7 @@
    }
 
    public boolean handleRequest(MessageContext messageContext) {
-      //dumpMessage(messageContext);
+      dumpMessage(messageContext);
       return true;
    }
 
@@ -41,12 +40,9 @@
          SOAPMessage soapMessage = ((SOAPMessageContext)messageContext).getMessage();
          SOAPBody soapBody = soapMessage.getSOAPBody();
 
-         String msg = DOMWriter.printNode(soapBody, true);
-         log.info(msg);
-
          SOAPElement response = (SOAPElement) soapBody.getChildElements().next();
-         SOAPElement xopElement = (SOAPElement)response.getChildElements(new NameImpl("imagejpeg")).next();
-         messageContext.setProperty("xop.expected", xopElement.getFirstChild().getNodeValue());
+         SOAPElement xopElement = (SOAPElement)response.getChildElements(new NameImpl("xopContent")).next();
+         messageContext.setProperty("xop.inline.value", xopElement.getFirstChild().getNodeValue());
       }
       catch (Exception e)
       {

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsg.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsg.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsg.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -7,30 +7,29 @@
 
 package org.jboss.test.ws.xop.doclit;
 
-import java.awt.*;
+import javax.activation.DataHandler;
 
-
-public class  PingMsg
+public class PingMsg
 {
    protected String message;
-   protected Image imagejpeg;
+   protected DataHandler xopContent;
 
    public PingMsg(){}
 
-   public PingMsg(String message, Image img){
+   public PingMsg(String message, DataHandler dataHandler){
       this.message=message;
-      this.imagejpeg = img;
+      this.xopContent = dataHandler;
    }
 
    public java.lang.String getMessage() { return message ;}
 
    public void setMessage(java.lang.String message){ this.message=message; }
 
-   public Image getImagejpeg() {
-      return imagejpeg;
+   public DataHandler getXopContent() {
+      return xopContent;
    }
 
-   public void setImagejpeg(Image imagejpeg) {
-      this.imagejpeg = imagejpeg;
+   public void setXopContent(DataHandler xopContent) {
+      this.xopContent = xopContent;
    }
 }

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsgResponse.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsgResponse.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/PingMsgResponse.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -7,25 +7,25 @@
 
 package org.jboss.test.ws.xop.doclit;
 
-import java.awt.*;
+import javax.activation.DataHandler;
 
 
 public class  PingMsgResponse
 {
-   protected Image imagejpeg;
+   protected DataHandler xopContent;
 
    public PingMsgResponse(){
    }
 
-   public PingMsgResponse(Image image) {
-      this.imagejpeg = image;
+   public PingMsgResponse(DataHandler dataHandler) {
+      this.xopContent = dataHandler;
    }
 
-   public Image getImagejpeg() {
-      return imagejpeg;
+   public DataHandler getXopContent() {
+      return xopContent;
    }
 
-   public void setImagejpeg(Image imagejpeg) {
-      this.imagejpeg = imagejpeg;
+   public void setXopContent(DataHandler xopContent) {
+      this.xopContent = xopContent;
    }
 }

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/TestServiceImpl.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/TestServiceImpl.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/TestServiceImpl.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -1,7 +1,5 @@
 package org.jboss.test.ws.xop.doclit;
 
-import org.jboss.ws.WSException;
-
 import java.rmi.RemoteException;
 
 /**
@@ -10,6 +8,6 @@
  */
 public class TestServiceImpl implements TestService_PortType {
     public PingMsgResponse ping(PingMsg pingMsg) throws RemoteException {
-        return new PingMsgResponse(pingMsg.getImagejpeg());
+        return new PingMsgResponse(pingMsg.getXopContent());
     }
 }

Modified: branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/XOPElementDoclitTestCase.java
===================================================================
--- branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/XOPElementDoclitTestCase.java	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/xop/doclit/XOPElementDoclitTestCase.java	2006-09-01 09:11:50 UTC (rev 877)
@@ -27,15 +27,13 @@
 import org.jboss.test.ws.JBossWSTest;
 import org.jboss.test.ws.JBossWSTestSetup;
 import org.jboss.xb.binding.SimpleTypeBindings;
+import org.jboss.ws.jaxrpc.StubExt;
 
 import javax.activation.DataHandler;
 import javax.naming.InitialContext;
 import javax.xml.rpc.Service;
 import javax.xml.rpc.Stub;
-import java.awt.*;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.net.URL;
+import java.io.*;
 
 /**
  *
@@ -60,50 +58,58 @@
          Service service = (Service)iniCtx.lookup("java:comp/env/service/TestService");
          port = (TestService_PortType)service.getPort(TestService_PortType.class);
       }
+
+      //((Stub)port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8081/jbossws-xop-doclit");
    }
 
-   public void testPingMsg() throws Exception {
 
-      URL url = new File("resources/samples/mtom/attach.jpeg").toURL();
+   public void testPingMsgInlined() throws Exception {
 
-      // On Linux the X11 server must be installed properly to create images successfully.
-      // If the image cannot be created in the test VM, we assume it cannot be done on the
-      // server either, so we just skip the test
-      Image image = null;
-      try
-      {
-         image = Toolkit.getDefaultToolkit().createImage(url);
-      }
-      catch (Throwable th)
-      {
-         //log.warn("Cannot create Image: " + th);
-      }
+      DataHandler dh = new DataHandler("Another plain text attachment", "text/plain");
+      PingMsgResponse value = port.ping(new PingMsg("Some text message", dh));
+      assertNotNull("Return value was null", value);
+      assertNotNull("Returned xopContent was null", value.getXopContent());
+      assertTrue("Wrong java type returned", (value.getXopContent()) instanceof DataHandler);
 
-      if (image != null)
-      {
-         PingMsgResponse value = port.ping(new PingMsg("Some text message", image));
-         assertNotNull("Return value was null",value);
-         assertNotNull("Return image was null", value.getImagejpeg());
+      // check inline values
+      ByteArrayOutputStream bout = new ByteArrayOutputStream();
+      dh.writeTo(bout);
 
-         // check inline values
+      byte[] imageBytes = bout.toByteArray();
+      String expected = SimpleTypeBindings.marshalBase64(imageBytes);
 
-         System.out.println("FIXME: JBWS-660");
+      String was = (String)((Stub) port)._getProperty("xop.inline.value");
+      assertNotNull("base64 value not found", was);
+      //assertEquals(expected, was);
+   }
 
-         /*
-         DataHandler dh = new DataHandler(url);
-         ByteArrayOutputStream bout = new ByteArrayOutputStream();
-         dh.writeTo(bout);
+   public void testMTOMDisabled() throws Exception {
 
-         byte[] imageBytes = bout.toByteArray();
-         String expected = SimpleTypeBindings.marshalBase64(imageBytes);
+      byte[] bytes = getBytesFromFile(new File("resources/samples/mtom/attach.jpeg"));
+      DataHandler dh = new DataHandler(new ByteArrayInputStream(bytes), "application/octet-stream");
 
-         String was = (String)((Stub) port)._getProperty("xop.expected");
-         assertNotNull("bas64 value not found", was);
-         assertEquals(expected, was);
-         */
+      // force disable MTOM
+      ((Stub)port)._setProperty(StubExt.PROPERTY_MTOM_ENABLED, "false");
+
+      PingMsgResponse value = port.ping(new PingMsg("Some text message", dh));
+      assertNotNull("Return value was null",value);
+      assertNotNull("Return image was null", value.getXopContent());
+   } 
+
+   public static byte[] getBytesFromFile(File file) throws IOException {
+      InputStream is = new FileInputStream(file);
+
+      long length = file.length();
+      byte[] bytes = new byte[(int)length];
+
+      int offset = 0;
+      int numRead = 0;
+      while (offset < bytes.length
+          && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
+         offset += numRead;
       }
 
-      //System.out.println("FIXME: JBXB-62");
-
+      is.close();
+      return bytes;
    }
 }

Modified: branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/jaxrpc-mapping.xml
===================================================================
--- branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/jaxrpc-mapping.xml	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/jaxrpc-mapping.xml	2006-09-01 09:11:50 UTC (rev 877)
@@ -19,37 +19,6 @@
     <wsdl-binding xmlns:bindingNS="http://org.jboss.ws/samples/mtom">bindingNS:XOPTestBinding</wsdl-binding>
 
     <service-endpoint-method-mapping>
-      <java-method-name>sendMimeImageGIF</java-method-name>
-      <wsdl-operation>sendMimeImageGIF</wsdl-operation>
-      <method-param-parts-mapping>
-        <param-position>0</param-position>
-        <param-type>java.lang.String</param-type>
-        <wsdl-message-mapping>
-          <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeImageGIF</wsdl-message>
-          <wsdl-message-part-name>message</wsdl-message-part-name>
-          <parameter-mode>IN</parameter-mode>
-        </wsdl-message-mapping>
-      </method-param-parts-mapping>
-
-      <!-- BEGIN manual modification -->
-      <method-param-parts-mapping>
-        <param-position>1</param-position>
-        <param-type>java.awt.Image</param-type>
-        <wsdl-message-mapping>
-          <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeImageGIF</wsdl-message>
-          <wsdl-message-part-name>xoppart</wsdl-message-part-name>
-          <parameter-mode>IN</parameter-mode>
-        </wsdl-message-mapping>
-      </method-param-parts-mapping>
-      <!-- END manual modification -->
-
-      <wsdl-return-value-mapping>
-        <method-return-value>java.awt.Image</method-return-value>
-        <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeImageGIFResponse</wsdl-message>
-        <wsdl-message-part-name>result</wsdl-message-part-name>
-      </wsdl-return-value-mapping>
-    </service-endpoint-method-mapping>
-    <service-endpoint-method-mapping>
       <java-method-name>sendMimeImageJPEG</java-method-name>
       <wsdl-operation>sendMimeImageJPEG</wsdl-operation>
       <method-param-parts-mapping>
@@ -65,7 +34,7 @@
       <!-- BEGIN manual modification -->
       <method-param-parts-mapping>
         <param-position>1</param-position>
-        <param-type>java.awt.Image</param-type>
+        <param-type>javax.activation.DataHandler</param-type>
         <wsdl-message-mapping>
           <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeImageJPEG</wsdl-message>
           <wsdl-message-part-name>xoppart</wsdl-message-part-name>
@@ -75,11 +44,12 @@
       <!-- END manual modification -->
 
       <wsdl-return-value-mapping>
-        <method-return-value>java.awt.Image</method-return-value>
+        <method-return-value>javax.activation.DataHandler</method-return-value>
         <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeImageJPEGResponse</wsdl-message>
         <wsdl-message-part-name>result</wsdl-message-part-name>
       </wsdl-return-value-mapping>
     </service-endpoint-method-mapping>
+
     <service-endpoint-method-mapping>
       <java-method-name>sendMimeTextPlain</java-method-name>
       <wsdl-operation>sendMimeTextPlain</wsdl-operation>
@@ -111,37 +81,7 @@
         <wsdl-message-part-name>result</wsdl-message-part-name>
       </wsdl-return-value-mapping>
     </service-endpoint-method-mapping>
-    <service-endpoint-method-mapping>
-      <java-method-name>sendMimeMultipart</java-method-name>
-      <wsdl-operation>sendMimeMultipart</wsdl-operation>
-      <method-param-parts-mapping>
-        <param-position>0</param-position>
-        <param-type>java.lang.String</param-type>
-        <wsdl-message-mapping>
-          <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeMultipart</wsdl-message>
-          <wsdl-message-part-name>message</wsdl-message-part-name>
-          <parameter-mode>IN</parameter-mode>
-        </wsdl-message-mapping>
-      </method-param-parts-mapping>
 
-      <!-- BEGIN manual modification -->
-      <method-param-parts-mapping>
-        <param-position>1</param-position>
-        <param-type>javax.mail.internet.MimeMultipart</param-type>
-        <wsdl-message-mapping>
-          <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeMultipart</wsdl-message>
-          <wsdl-message-part-name>xoppart</wsdl-message-part-name>
-          <parameter-mode>IN</parameter-mode>
-        </wsdl-message-mapping>
-      </method-param-parts-mapping>
-      <!-- END manual modification -->
-
-      <wsdl-return-value-mapping>
-        <method-return-value>javax.mail.internet.MimeMultipart</method-return-value>
-        <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeMultipartResponse</wsdl-message>
-        <wsdl-message-part-name>result</wsdl-message-part-name>
-      </wsdl-return-value-mapping>
-    </service-endpoint-method-mapping>
     <service-endpoint-method-mapping>
       <java-method-name>sendMimeTextXML</java-method-name>
       <wsdl-operation>sendMimeTextXML</wsdl-operation>
@@ -158,7 +98,7 @@
       <!-- BEGIN manual modification -->
       <method-param-parts-mapping>
         <param-position>1</param-position>
-        <param-type>javax.xml.transform.Source</param-type>
+        <param-type>javax.activation.DataHandler</param-type>
         <wsdl-message-mapping>
           <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeTextXML</wsdl-message>
           <wsdl-message-part-name>xoppart</wsdl-message-part-name>
@@ -173,6 +113,7 @@
         <wsdl-message-part-name>result</wsdl-message-part-name>
       </wsdl-return-value-mapping>
     </service-endpoint-method-mapping>
+
     <service-endpoint-method-mapping>
       <java-method-name>sendMimeApplicationXML</java-method-name>
       <wsdl-operation>sendMimeApplicationXML</wsdl-operation>
@@ -199,7 +140,7 @@
       <!-- END manual modification -->
 
       <wsdl-return-value-mapping>
-        <method-return-value>javax.xml.transform.Source</method-return-value>
+        <method-return-value>javax.activation.DataHandler</method-return-value>
         <wsdl-message xmlns:wsdlMsgNS="http://org.jboss.ws/samples/mtom">wsdlMsgNS:XOPTest_sendMimeApplicationXMLResponse</wsdl-message>
         <wsdl-message-part-name>result</wsdl-message-part-name>
       </wsdl-return-value-mapping>

Modified: branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/wsdl/TestService.wsdl
===================================================================
--- branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/wsdl/TestService.wsdl	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/resources/samples-override/mtom/WEB-INF/wsdl/TestService.wsdl	2006-09-01 09:11:50 UTC (rev 877)
@@ -13,10 +13,8 @@
 
          <import schemaLocation="http://www.w3.org/2005/05/xmlmime" namespace="http://www.w3.org/2005/05/xmlmime"/>
 
-         <element name="imagegif" xmime:contentType="image/gif" type="xmime:base64Binary"/>
          <element name="imagejpeg" xmime:contentType="image/jpeg" type="xmime:base64Binary"/>
          <element name="textplain" xmime:contentType="text/plain" type="xmime:base64Binary"/>
-         <element name="multipart" xmime:contentType="multipart/*" type="xmime:base64Binary"/>
          <element name="textxml" xmime:contentType="text/xml" type="xmime:base64Binary"/>
          <element name="applxml" xmime:contentType="application/xml" type="xmime:base64Binary"/>
          <element name="octets" xmime:contentType="application/octet-stream" type="xmime:base64Binary"/>
@@ -31,14 +29,6 @@
       </schema>
    </types>
 
-   <message name="XOPTest_sendMimeImageGIF">
-      <part name="message" type="xsd:string"/>
-      <part name="xoppart" element="tns:imagegif"/>
-   </message>
-   <message name="XOPTest_sendMimeImageGIFResponse">
-      <part name="result" element="tns:imagegif"/>
-   </message>
-
    <message name="XOPTest_sendMimeImageJPEG">
       <part name="message" type="xsd:string"/>
       <part name="xoppart" element="tns:imagejpeg"/>
@@ -53,13 +43,6 @@
    <message name="XOPTest_sendMimeTextPlainResponse">
       <part name="result" element="tns:textplain"/>
    </message>
-   <message name="XOPTest_sendMimeMultipart">
-      <part name="message" type="xsd:string"/>
-      <part name="xoppart" element="tns:multipart"/>
-   </message>
-   <message name="XOPTest_sendMimeMultipartResponse">
-      <part name="result" element="tns:multipart"/>
-   </message>
    <message name="XOPTest_sendMimeTextXML">
       <part name="message" type="xsd:string"/>
       <part name="xoppart" element="tns:textxml"/>
@@ -84,10 +67,6 @@
    </message>
 
    <portType name="XOPTest">
-      <operation name="sendMimeImageGIF">
-         <input message="tns:XOPTest_sendMimeImageGIF"/>
-         <output message="tns:XOPTest_sendMimeImageGIFResponse"/>
-      </operation>
       <operation name="sendMimeImageJPEG">
          <input message="tns:XOPTest_sendMimeImageJPEG"/>
          <output message="tns:XOPTest_sendMimeImageJPEGResponse"/>
@@ -96,10 +75,6 @@
          <input message="tns:XOPTest_sendMimeTextPlain"/>
          <output message="tns:XOPTest_sendMimeTextPlainResponse"/>
       </operation>
-      <operation name="sendMimeMultipart">
-         <input message="tns:XOPTest_sendMimeMultipart"/>
-         <output message="tns:XOPTest_sendMimeMultipartResponse"/>
-      </operation>
       <operation name="sendMimeTextXML">
          <input message="tns:XOPTest_sendMimeTextXML"/>
          <output message="tns:XOPTest_sendMimeTextXMLResponse"/>
@@ -117,15 +92,6 @@
 
    <binding name="XOPTestBinding" type="tns:XOPTest">
       <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
-      <operation name="sendMimeImageGIF">
-         <soap:operation soapAction=""/>
-         <input>
-            <soap:body use="literal" namespace="http://org.jboss.ws/samples/mtom"/>
-         </input>
-         <output>
-            <soap:body use="literal" namespace="http://org.jboss.ws/samples/mtom"/>
-         </output>
-      </operation>
       <operation name="sendMimeImageJPEG">
          <soap:operation soapAction=""/>
          <input>
@@ -143,16 +109,7 @@
          <output>
             <soap:body use="literal" namespace="http://org.jboss.ws/samples/mtom"/>
          </output>
-      </operation>
-      <operation name="sendMimeMultipart">
-         <soap:operation soapAction=""/>
-         <input>
-            <soap:body use="literal" namespace="http://org.jboss.ws/samples/mtom"/>
-         </input>
-         <output>
-            <soap:body use="literal" namespace="http://org.jboss.ws/samples/mtom"/>
-         </output>
-      </operation>
+      </operation>     
       <operation name="sendMimeTextXML">
          <soap:operation soapAction=""/>
          <input>

Modified: branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/jaxrpc-mapping.xml
===================================================================
--- branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/jaxrpc-mapping.xml	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/jaxrpc-mapping.xml	2006-09-01 09:11:50 UTC (rev 877)
@@ -3,12 +3,7 @@
       <package-type>org.jboss.test.ws.xop.doclit</package-type>
       <namespaceURI>http://jboss.org/test/ws/xop/doclit</namespaceURI>
    </package-mapping>
-
-   <!--java-xml-type-mapping>
-      <java-type>org.jboss.test.ws.xop.doclit.PingMsg</java-type>
-      <root-type-qname xmlns:typeNS='http://jboss.org/test/ws/xop/doclit'>typeNS:PingMsg</root-type-qname>
-      <qname-scope>element</qname-scope>
-   </java-xml-type-mapping-->
+   
    <java-xml-type-mapping>
       <java-type>org.jboss.test.ws.xop.doclit.PingMsg</java-type>
       <anonymous-type-qname xmlns:typeNS='http://jboss.org/test/ws/xop/doclit'>typeNS:&gt;PingMsg</anonymous-type-qname>
@@ -18,23 +13,18 @@
          <xml-element-name>message</xml-element-name>
       </variable-mapping>
       <variable-mapping>
-         <java-variable-name>imagejpeg</java-variable-name>
-         <xml-element-name>imagejpeg</xml-element-name>
+         <java-variable-name>xopContent</java-variable-name>
+         <xml-element-name>xopContent</xml-element-name>
       </variable-mapping>
    </java-xml-type-mapping>
 
-   <!--java-xml-type-mapping>
-      <java-type>org.jboss.test.ws.xop.doclit.PingMsgResponse</java-type>
-      <root-type-qname xmlns:typeNS='http://jboss.org/test/ws/xop/doclit'>typeNS:PingMsgResponse</root-type-qname>
-      <qname-scope>element</qname-scope>
-   </java-xml-type-mapping-->
    <java-xml-type-mapping>
       <java-type>org.jboss.test.ws.xop.doclit.PingMsgResponse</java-type>
       <anonymous-type-qname xmlns:typeNS='http://jboss.org/test/ws/xop/doclit'>typeNS:&gt;PingMsgResponse</anonymous-type-qname>
       <qname-scope>complexType</qname-scope>
       <variable-mapping>
-         <java-variable-name>imagejpeg</java-variable-name>
-         <xml-element-name>imagejpeg</xml-element-name>
+         <java-variable-name>xopContent</java-variable-name>
+         <xml-element-name>xopContent</xml-element-name>
       </variable-mapping>
    </java-xml-type-mapping>
 

Modified: branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/wsdl/TestService.wsdl
===================================================================
--- branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/wsdl/TestService.wsdl	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/resources/xop/doclit/WEB-INF/wsdl/TestService.wsdl	2006-09-01 09:11:50 UTC (rev 877)
@@ -20,14 +20,14 @@
             <s:complexType>
                <s:sequence>
                   <s:element name="message" minOccurs="0" maxOccurs="1" type="s:string" />
-                  <s:element name="imagejpeg" xmime:expectedContentTypes="image/jpeg" type="xmime:base64Binary"/>
+                  <s:element name="xopContent" xmime:expectedContentTypes="text/plain" type="xmime:base64Binary"/>
                </s:sequence>
             </s:complexType>
          </s:element>
          <s:element name="PingMsgResponse">
             <s:complexType>
                <s:sequence>
-                  <s:element name="imagejpeg" xmime:expectedContentTypes="image/jpeg" type="xmime:base64Binary"/>
+                  <s:element name="xopContent" xmime:expectedContentTypes="text/plain" type="xmime:base64Binary"/>
                </s:sequence>
             </s:complexType>
          </s:element>

Modified: branches/tdiesler/trunk/src/test/resources/xop/schema.xsd
===================================================================
--- branches/tdiesler/trunk/src/test/resources/xop/schema.xsd	2006-08-31 19:27:50 UTC (rev 876)
+++ branches/tdiesler/trunk/src/test/resources/xop/schema.xsd	2006-09-01 09:11:50 UTC (rev 877)
@@ -30,4 +30,12 @@
       </s:simpleContent>
    </s:complexType>
 
+   <s:element name="MSFTBinary">
+      <s:complexType>
+         <s:sequence>
+            <s:element minOccurs="0" name="array" nillable="true" type="s:base64Binary"/>
+         </s:sequence>
+      </s:complexType>
+   </s:element>
+
 </s:schema>
\ No newline at end of file




More information about the jboss-svn-commits mailing list