Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/apache/axis/handlers/soap/MustUnderstandChecker.java


1   /*
2    * Copyright 2001-2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.apache.axis.handlers.soap;
18  
19  import org.apache.axis.AxisFault;
20  import org.apache.axis.Constants;
21  import org.apache.axis.MessageContext;
22  import org.apache.axis.Message;
23  import org.apache.axis.description.OperationDesc;
24  import org.apache.axis.components.logger.LogFactory;
25  import org.apache.axis.handlers.BasicHandler;
26  import org.apache.axis.message.SOAPEnvelope;
27  import org.apache.axis.message.SOAPHeaderElement;
28  import org.apache.axis.soap.SOAPConstants;
29  import org.apache.axis.utils.Messages;
30  import org.apache.commons.logging.Log;
31  
32  import javax.xml.namespace.QName;
33  import java.util.ArrayList;
34  import java.util.Enumeration;
35  import java.util.Vector;
36  
37  /**
38   * MustUnderstandChecker is used to inject SOAP semantics just before
39   * the pivot handler.
40   */
41  public class MustUnderstandChecker extends BasicHandler {
42  
43      private static Log log =
44              LogFactory.getLog(MustUnderstandChecker.class.getName());
45  
46      private SOAPService service = null;
47  
48      public MustUnderstandChecker(SOAPService service) {
49          this.service = service;
50      }
51  
52      public void invoke(MessageContext msgContext) throws AxisFault {
53          // Do SOAP semantics here
54          if (log.isDebugEnabled()) {
55              log.debug(Messages.getMessage("semanticCheck00"));
56          }
57          
58          Message msg = msgContext.getCurrentMessage();
59          if (msg == null)
60              return;  // nothing to do if there's no message
61          
62          SOAPEnvelope env = msg.getSOAPEnvelope();
63          Vector headers = null;
64          if (service != null) {
65              ArrayList acts = service.getActors();
66              headers = env.getHeadersByActor(acts);
67          } else {
68              headers = env.getHeaders();
69          }
70              
71          // 1. Check mustUnderstands
72          Vector misunderstoodHeaders = null;
73          Enumeration enumeration = headers.elements();
74          while (enumeration.hasMoreElements()) {
75              SOAPHeaderElement header = (SOAPHeaderElement) enumeration.
76                      nextElement();
77              
78              // Ignore header, if it is a parameter to the operation 
79              if(msgContext != null && msgContext.getOperation() != null) {
80                  OperationDesc oper = msgContext.getOperation();
81                  if(oper.getParamByQName(header.getQName())!=null) {
82                      continue;
83                  }                    
84              }
85              if (header.getMustUnderstand() && !header.isProcessed()) {
86                  if (misunderstoodHeaders == null)
87                      misunderstoodHeaders = new Vector();
88                  misunderstoodHeaders.addElement(header);
89              }
90          }
91          SOAPConstants soapConstants = msgContext.getSOAPConstants();
92          // !!! we should indicate SOAP1.2 compliance via the
93          // MessageContext, not a boolean here....
94  
95          if (misunderstoodHeaders != null) {
96              AxisFault fault =
97                      new AxisFault(soapConstants.getMustunderstandFaultQName(),
98                              null, null,
99                              null, null,
100                             null);
101             StringBuffer whatWasMissUnderstood = new StringBuffer(256);
102 
103             // !!! If SOAP 1.2, insert misunderstood fault headers here
104             if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
105                 enumeration = misunderstoodHeaders.elements();
106                 while (enumeration.hasMoreElements()) {
107                     SOAPHeaderElement badHeader = (SOAPHeaderElement) enumeration.
108                             nextElement();
109                     QName badQName = new QName(badHeader.getNamespaceURI(),
110                             badHeader.getName());
111                     if (whatWasMissUnderstood.length() != 0)
112                         whatWasMissUnderstood.append(", ");
113                     whatWasMissUnderstood.append(badQName.toString());
114                     SOAPHeaderElement newHeader = new
115                             SOAPHeaderElement(Constants.URI_SOAP12_ENV,
116                                     Constants.ELEM_NOTUNDERSTOOD);
117                     newHeader.addAttribute(null,
118                             Constants.ATTR_QNAME,
119                             badQName);
120                     fault.addHeader(newHeader);
121                 }
122             }
123             fault.setFaultString(Messages.getMessage("noUnderstand00",
124                     whatWasMissUnderstood.toString()));
125             throw fault;
126         }
127     }
128 }