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

Quick Search    Search Deep

Source code: org/apache/axis/message/SOAPHandler.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  package org.apache.axis.message;
17  
18  /** A <code>SOAPHandler</code>
19   * 
20   * @author Glen Daniels (gdaniels@allaire.com)
21   */
22  
23  import org.apache.axis.AxisFault;
24  import org.apache.axis.Constants;
25  import org.apache.axis.encoding.DeserializationContext;
26  import org.apache.axis.encoding.TypeMappingRegistry;
27  import org.apache.axis.soap.SOAPConstants;
28  import org.apache.axis.utils.Messages;
29  import org.apache.axis.utils.StringUtils;
30  import org.xml.sax.Attributes;
31  import org.xml.sax.SAXException;
32  import org.xml.sax.helpers.DefaultHandler;
33  
34  import javax.xml.soap.SOAPException;
35  import java.io.CharArrayWriter;
36  
37  public class SOAPHandler extends DefaultHandler
38  {
39      public MessageElement myElement = null;
40      private MessageElement[] myElements;
41      private int myIndex = 0;
42  
43      private CharArrayWriter val;
44      
45      public SOAPHandler() {
46      }
47  
48     /**
49      * This constructor allows deferred setting of any elements
50      * @param elements array of message elements to be populated
51      * @param index position in array where the message element is to be created
52      */
53      public SOAPHandler(MessageElement[] elements, int index) {
54          myElements = elements;
55          myIndex = index;
56      }
57      
58      public void startElement(String namespace, String localName,
59                               String prefix, Attributes attributes,
60                               DeserializationContext context)
61          throws SAXException
62      {
63          SOAPConstants soapConstants = context.getSOAPConstants();
64  
65          if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
66              String encodingStyle = attributes.getValue(Constants.URI_SOAP12_ENV,
67                                  Constants.ATTR_ENCODING_STYLE);
68  
69              if (encodingStyle != null && !encodingStyle.equals("")
70                  && !encodingStyle.equals(Constants.URI_SOAP12_NOENC)
71                  && !Constants.isSOAP_ENC(encodingStyle)) {
72                  TypeMappingRegistry tmr = context.getTypeMappingRegistry();
73                  // TODO: both soap encoding style is registered ?
74                  if (tmr.getTypeMapping(encodingStyle) == tmr.getDefaultTypeMapping()) {
75                      AxisFault fault = new AxisFault(Constants.FAULT_SOAP12_DATAENCODINGUNKNOWN,
76                          null, Messages.getMessage("invalidEncodingStyle"), null, null, null);
77  
78                      throw new SAXException(fault);
79                  }
80              }
81          }
82  
83  
84          // By default, make a new element
85          if (!context.isDoneParsing() && !context.isProcessingRef()) {
86              if (myElement == null) {
87                  try {
88                      myElement = makeNewElement(namespace, localName, prefix,
89                                                 attributes, context);
90                  } catch (AxisFault axisFault) {
91                      throw new SAXException(axisFault);
92                  }
93              }
94              context.pushNewElement(myElement);
95          }
96      }
97  
98      public MessageElement makeNewElement(String namespace, String localName,
99                               String prefix, Attributes attributes,
100                              DeserializationContext context)
101         throws AxisFault
102     {
103         return new MessageElement(namespace, localName,
104                                                prefix, attributes, context);
105     }
106 
107     public void endElement(String namespace, String localName,
108                            DeserializationContext context)
109         throws SAXException
110     {
111         if (myElement != null) {
112             addTextNode();  
113 
114             if (myElements != null) {
115                 myElements[myIndex] = myElement;
116             }
117             myElement.setEndIndex(context.getCurrentRecordPos());
118         }
119     }
120     
121     public SOAPHandler onStartChild(String namespace, 
122                                     String localName,
123                                     String prefix,
124                                     Attributes attributes,
125                                     DeserializationContext context)
126         throws SAXException
127     {
128         addTextNode();
129         SOAPHandler handler = new SOAPHandler();
130         return handler;
131     }
132 
133     private void addTextNode() throws SAXException {
134         if (myElement != null) {
135             if (val != null && val.size() > 0) {
136                 String s = StringUtils.strip(val.toString());
137                 val.reset();
138                 
139                 // we need to check the length of STRIPPED string 
140                 // to avoid appending ignorable white spaces as 
141                 // message elmenet's child. 
142                 // (SOAPHeader and others does not accept text children...
143                 // but in SAAJ 1.2's DOM view, this could be incorrect.
144                 // we need to keep the ignorable white spaces later)
145                 if(s.length()>0){
146                     try {
147                         // add unstripped string as text child.
148                         myElement.addTextNode(s);
149                     } catch (SOAPException e) {
150                         throw new SAXException(e);
151                     }
152                 }
153             }
154         }
155     }
156     
157     public void onEndChild(String namespace, String localName,
158                            DeserializationContext context)
159         throws SAXException
160     {
161     }
162 
163     public void characters(char[] chars, int start, int end) 
164         throws SAXException 
165     {
166         if (val == null) {
167             val = new CharArrayWriter();
168         }
169         val.write(chars, start, end);
170     }
171 }