1 /*
2  * Copyright (c) 1997, 2012, 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 
26 package com.sun.xml.internal.ws.encoding;
27 
28 import com.sun.istack.internal.Nullable;
29 import com.sun.istack.internal.NotNull;
30 
31 /**
32  * @author Vivek Pandey
33  */
34 public 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 
ContentTypeImpl(String contentType)44     public ContentTypeImpl(String contentType) {
45         this(contentType, null, null);
46     }
47 
ContentTypeImpl(String contentType, @Nullable String soapAction)48     public ContentTypeImpl(String contentType, @Nullable String soapAction) {
49         this(contentType, soapAction, null);
50     }
51 
ContentTypeImpl(String contentType, @Nullable String soapAction, @Nullable String accept)52     public ContentTypeImpl(String contentType, @Nullable String soapAction, @Nullable String accept) {
53         this(contentType, soapAction, accept, null);
54     }
55 
ContentTypeImpl(String contentType, @Nullable String soapAction, @Nullable String accept, String charsetParam)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             } catch(Exception e) {
66                 //Ignore the parsing exception.
67             }
68             charset = tmpCharset;
69         } else {
70             charset = charsetParam;
71         }
72     }
73 
74     /**
75      * Returns the character set encoding.
76      *
77      * @return returns the character set encoding.
78      */
getCharSet()79     public @Nullable String getCharSet() {
80         return charset;
81     }
82 
83     /** BP 1.1 R1109 requires SOAPAction too be a quoted value **/
getQuotedSOAPAction(String soapAction)84     private String getQuotedSOAPAction(String soapAction){
85         if(soapAction == null || soapAction.length() == 0){
86             return "\"\"";
87         }else if(soapAction.charAt(0) != '"' && soapAction.charAt(soapAction.length() -1) != '"'){
88             //surround soapAction by double quotes for BP R1109
89             return "\"" + soapAction + "\"";
90         }else{
91             return soapAction;
92         }
93     }
94 
95     @Override
getContentType()96     public String getContentType() {
97         return contentType;
98     }
99 
100     @Override
getSOAPActionHeader()101     public String getSOAPActionHeader() {
102         return soapAction;
103     }
104 
105     @Override
getAcceptHeader()106     public String getAcceptHeader() {
107         return accept;
108     }
109 
setAcceptHeader(String accept)110     public void setAcceptHeader(String accept) {
111         this.accept = accept;
112     }
113 
getBoundary()114     public String getBoundary() {
115         if (boundary == null) {
116             if (internalContentType == null) internalContentType = new ContentType(contentType);
117             boundary = internalContentType.getParameter("boundary");
118         }
119         return boundary;
120     }
121 
setBoundary(String boundary)122     public void setBoundary(String boundary) {
123         this.boundary = boundary;
124     }
125 
getBoundaryParameter()126     public String getBoundaryParameter() {
127         return boundaryParameter;
128     }
129 
setBoundaryParameter(String boundaryParameter)130     public void setBoundaryParameter(String boundaryParameter) {
131         this.boundaryParameter = boundaryParameter;
132     }
133 
getRootId()134     public String getRootId() {
135         if (rootId == null) {
136             if (internalContentType == null) internalContentType = new ContentType(contentType);
137             rootId = internalContentType.getParameter("start");
138         }
139         return rootId;
140     }
141 
setRootId(String rootId)142     public void setRootId(String rootId) {
143         this.rootId = rootId;
144     }
145 
146     public static class Builder {
147         public String contentType;
148         public String soapAction;
149         public String accept;
150         public String charset;
build()151         public ContentTypeImpl build() {
152             return new ContentTypeImpl(contentType, soapAction, accept, charset);
153         }
154     }
155 }
156