View Javadoc
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  
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              } 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       */
79      public @Nullable String getCharSet() {
80          return charset;
81      }
82  
83      /** BP 1.1 R1109 requires SOAPAction too be a quoted value **/
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
96      public String getContentType() {
97          return contentType;
98      }
99  
100     @Override
101     public String getSOAPActionHeader() {
102         return soapAction;
103     }
104 
105     @Override
106     public String getAcceptHeader() {
107         return accept;
108     }
109 
110     public void setAcceptHeader(String accept) {
111         this.accept = accept;
112     }
113 
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 
122     public void setBoundary(String boundary) {
123         this.boundary = boundary;
124     }
125 
126     public String getBoundaryParameter() {
127         return boundaryParameter;
128     }
129 
130     public void setBoundaryParameter(String boundaryParameter) {
131         this.boundaryParameter = boundaryParameter;
132     }
133 
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 
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;
151         public ContentTypeImpl build() {
152             return new ContentTypeImpl(contentType, soapAction, accept, charset);
153         }
154     }
155 }