ContentTypeImpl.java revision 524:dcaa586ab756
1/*
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.xml.internal.ws.encoding;
27
28import com.sun.istack.internal.Nullable;
29import com.sun.istack.internal.NotNull;
30
31/**
32 * @author Vivek Pandey
33 */
34public final class ContentTypeImpl implements com.sun.xml.internal.ws.api.pipe.ContentType {
35    private final @NotNull String contentType;
36    private final @NotNull String soapAction;
37    private String accept;
38    private final @Nullable String charset;
39    private String boundary;
40    private String boundaryParameter;
41    private String rootId;
42    private ContentType internalContentType;
43
44    public ContentTypeImpl(String contentType) {
45        this(contentType, null, null);
46    }
47
48    public ContentTypeImpl(String contentType, @Nullable String soapAction) {
49        this(contentType, soapAction, null);
50    }
51
52    public ContentTypeImpl(String contentType, @Nullable String soapAction, @Nullable String accept) {
53        this(contentType, soapAction, accept, null);
54    }
55
56    public ContentTypeImpl(String contentType, @Nullable String soapAction, @Nullable String accept, String charsetParam) {
57        this.contentType = contentType;
58        this.accept = accept;
59        this.soapAction = getQuotedSOAPAction(soapAction);
60        if (charsetParam == null) {
61            String tmpCharset = null;
62            try {
63                internalContentType = new ContentType(contentType);
64                tmpCharset = internalContentType.getParameter("charset");
65                rootId = internalContentType.getParameter("start");
66            } catch(Exception e) {
67                //Ignore the parsing exception.
68            }
69            charset = tmpCharset;
70        } else {
71            charset = charsetParam;
72        }
73    }
74
75    /**
76     * Returns the character set encoding.
77     *
78     * @return returns the character set encoding.
79     */
80    public @Nullable String getCharSet() {
81        return charset;
82    }
83
84    /** BP 1.1 R1109 requires SOAPAction too be a quoted value **/
85    private String getQuotedSOAPAction(String soapAction){
86        if(soapAction == null || soapAction.length() == 0){
87            return "\"\"";
88        }else if(soapAction.charAt(0) != '"' && soapAction.charAt(soapAction.length() -1) != '"'){
89            //surround soapAction by double quotes for BP R1109
90            return "\"" + soapAction + "\"";
91        }else{
92            return soapAction;
93        }
94    }
95
96    @Override
97    public String getContentType() {
98        return contentType;
99    }
100
101    @Override
102    public String getSOAPActionHeader() {
103        return soapAction;
104    }
105
106    @Override
107    public String getAcceptHeader() {
108        return accept;
109    }
110
111    public void setAcceptHeader(String accept) {
112        this.accept = accept;
113    }
114
115    public String getBoundary() {
116        if (boundary == null) {
117            if (internalContentType == null) internalContentType = new ContentType(contentType);
118            boundary = internalContentType.getParameter("boundary");
119        }
120        return boundary;
121    }
122
123    public void setBoundary(String boundary) {
124        this.boundary = boundary;
125    }
126
127    public String getBoundaryParameter() {
128        return boundaryParameter;
129    }
130
131    public void setBoundaryParameter(String boundaryParameter) {
132        this.boundaryParameter = boundaryParameter;
133    }
134
135    public String getRootId() {
136        if (rootId == null) {
137            if (internalContentType == null) internalContentType = new ContentType(contentType);
138            rootId = internalContentType.getParameter("start");
139        }
140        return rootId;
141    }
142
143    public void setRootId(String rootId) {
144        this.rootId = rootId;
145    }
146
147    public static class Builder {
148        public String contentType;
149        public String soapAction;
150        public String accept;
151        public String charset;
152        public ContentTypeImpl build() {
153            return new ContentTypeImpl(contentType, soapAction, accept, charset);
154        }
155    }
156}
157