| /* |
| * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code 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 General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package com.sun.xml.internal.ws.client.sei; |
| |
| import com.sun.xml.internal.ws.api.message.Attachment; |
| import com.sun.xml.internal.ws.api.message.Headers; |
| import com.sun.xml.internal.ws.api.message.Message; |
| import com.sun.xml.internal.ws.message.ByteArrayAttachment; |
| import com.sun.xml.internal.ws.message.DataHandlerAttachment; |
| import com.sun.xml.internal.ws.message.JAXBAttachment; |
| import com.sun.xml.internal.ws.model.ParameterImpl; |
| import com.sun.xml.internal.ws.spi.db.XMLBridge; |
| |
| import java.io.UnsupportedEncodingException; |
| import java.net.URLEncoder; |
| import java.util.UUID; |
| import javax.activation.DataHandler; |
| import javax.xml.transform.Source; |
| import javax.xml.ws.WebServiceException; |
| |
| /** |
| * Puts a non-payload message parameter to {@link Message}. |
| * |
| * <p> |
| * Instance of this class is used to handle header parameters and attachment parameters. |
| * They add things to {@link Message}. |
| * |
| * @see BodyBuilder |
| * @author Kohsuke Kawaguchi |
| * @author Jitendra Kotamraju |
| */ |
| abstract class MessageFiller { |
| |
| /** |
| * The index of the method invocation parameters that this object looks for. |
| */ |
| protected final int methodPos; |
| |
| protected MessageFiller( int methodPos) { |
| this.methodPos = methodPos; |
| } |
| |
| /** |
| * Moves an argument of a method invocation into a {@link Message}. |
| */ |
| abstract void fillIn(Object[] methodArgs, Message msg); |
| |
| /** |
| * Adds a parameter as an MIME attachment to {@link Message}. |
| */ |
| static abstract class AttachmentFiller extends MessageFiller { |
| protected final ParameterImpl param; |
| protected final ValueGetter getter; |
| protected final String mimeType; |
| private final String contentIdPart; |
| |
| protected AttachmentFiller(ParameterImpl param, ValueGetter getter) { |
| super(param.getIndex()); |
| this.param = param; |
| this.getter = getter; |
| mimeType = param.getBinding().getMimeType(); |
| try { |
| contentIdPart = URLEncoder.encode(param.getPartName(), "UTF-8")+'='; |
| } catch (UnsupportedEncodingException e) { |
| throw new WebServiceException(e); |
| } |
| } |
| |
| /** |
| * Creates an MessageFiller based on the parameter type |
| * |
| * @param param |
| * runtime Parameter that abstracts the annotated java parameter |
| * @param getter |
| * Gets a value from an object that represents a parameter passed |
| * as a method argument. |
| */ |
| public static MessageFiller createAttachmentFiller(ParameterImpl param, ValueGetter getter) { |
| Class type = (Class)param.getTypeInfo().type; |
| if (DataHandler.class.isAssignableFrom(type) || Source.class.isAssignableFrom(type)) { |
| return new DataHandlerFiller(param, getter); |
| } else if (byte[].class==type) { |
| return new ByteArrayFiller(param, getter); |
| } else if(isXMLMimeType(param.getBinding().getMimeType())) { |
| return new JAXBFiller(param, getter); |
| } else { |
| return new DataHandlerFiller(param, getter); |
| } |
| } |
| |
| String getContentId() { |
| return contentIdPart+UUID.randomUUID()+"@jaxws.sun.com"; |
| } |
| } |
| |
| private static class ByteArrayFiller extends AttachmentFiller { |
| protected ByteArrayFiller(ParameterImpl param, ValueGetter getter) { |
| super(param, getter); |
| } |
| void fillIn(Object[] methodArgs, Message msg) { |
| String contentId = getContentId(); |
| Object obj = getter.get(methodArgs[methodPos]); |
| Attachment att = new ByteArrayAttachment(contentId,(byte[])obj,mimeType); |
| msg.getAttachments().add(att); |
| } |
| } |
| |
| private static class DataHandlerFiller extends AttachmentFiller { |
| protected DataHandlerFiller(ParameterImpl param, ValueGetter getter) { |
| super(param, getter); |
| } |
| void fillIn(Object[] methodArgs, Message msg) { |
| String contentId = getContentId(); |
| Object obj = getter.get(methodArgs[methodPos]); |
| DataHandler dh = (obj instanceof DataHandler) ? (DataHandler)obj : new DataHandler(obj,mimeType); |
| Attachment att = new DataHandlerAttachment(contentId, dh); |
| msg.getAttachments().add(att); |
| } |
| } |
| |
| private static class JAXBFiller extends AttachmentFiller { |
| protected JAXBFiller(ParameterImpl param, ValueGetter getter) { |
| super(param, getter); |
| } |
| void fillIn(Object[] methodArgs, Message msg) { |
| String contentId = getContentId(); |
| Object obj = getter.get(methodArgs[methodPos]); |
| Attachment att = new JAXBAttachment(contentId, obj, param.getXMLBridge(), mimeType); |
| msg.getAttachments().add(att); |
| } |
| } |
| |
| /** |
| * Adds a parameter as an header. |
| */ |
| static final class Header extends MessageFiller { |
| private final XMLBridge bridge; |
| private final ValueGetter getter; |
| |
| protected Header(int methodPos, XMLBridge bridge, ValueGetter getter) { |
| super(methodPos); |
| this.bridge = bridge; |
| this.getter = getter; |
| } |
| |
| void fillIn(Object[] methodArgs, Message msg) { |
| Object value = getter.get(methodArgs[methodPos]); |
| msg.getHeaders().add(Headers.create(bridge,value)); |
| } |
| } |
| |
| private static boolean isXMLMimeType(String mimeType){ |
| return (mimeType.equals("text/xml") || mimeType.equals("application/xml")); |
| } |
| |
| } |