001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.codehaus.activesoap.handler.stax;
019
020 import org.codehaus.activesoap.Handler;
021 import org.codehaus.activesoap.MessageExchange;
022 import org.codehaus.activesoap.handler.stax.AnyAttribute;
023 import org.codehaus.activesoap.handler.stax.AnyContent;
024 import org.codehaus.activesoap.handler.stax.AnyElementMarshaler;
025
026 import javax.xml.namespace.QName;
027 import javax.xml.stream.XMLStreamConstants;
028 import javax.xml.stream.XMLStreamException;
029 import javax.xml.stream.XMLStreamReader;
030
031 /**
032 * A useful base class for any handlers implementd directly on top of StAX\
033 * @version $Revision: 1.2 $
034 */
035 public abstract class StaxHandler implements Handler {
036
037 protected void populateAnyContent(MessageExchange exchange, AnyElementMarshaler anyElementMarshaler, AnyContent property) throws XMLStreamException {
038 XMLStreamReader in = exchange.getIn();
039 boolean complete = false;
040 int elements = 0;
041 while (in.hasNext() && !complete) {
042 int code = in.next();
043 switch (code) {
044 case XMLStreamConstants.START_ELEMENT:
045 elements++;
046 property.getAny().add(anyElementMarshaler.parseElement(in));
047 break;
048
049 case XMLStreamConstants.END_ELEMENT:
050 if (--elements <= 0) {
051 complete = true;
052 }
053 break;
054
055 case XMLStreamConstants.END_DOCUMENT:
056 complete = true;
057 break;
058 }
059 }
060 }
061
062 protected void populateAnyAttributes(MessageExchange exchange, AnyAttribute value) throws XMLStreamException {
063 XMLStreamReader in = exchange.getIn();
064 int elements = 0;
065 boolean complete = false;
066
067 while (in.hasNext() && !complete) {
068 int code = in.next();
069 switch (code) {
070 case XMLStreamConstants.CHARACTERS:
071 value.putValue(in.getNamespaceContext(), in.getText().trim());
072 break;
073
074 case XMLStreamConstants.START_ELEMENT:
075 ++elements;
076 populateAttributes(in, value);
077 break;
078
079 case XMLStreamConstants.END_ELEMENT:
080 if (--elements <= 0) {
081 complete = true;
082 }
083 break;
084
085 case XMLStreamConstants.END_DOCUMENT:
086 complete = true;
087 break;
088
089 default:
090 }
091 }
092 }
093
094 protected void populateAttributes(XMLStreamReader in, AnyAttribute value) {
095 for (int i = 0, size = in.getAttributeCount(); i < size; i++) {
096 QName attributeName = in.getAttributeName(i);
097 String attributeValue = in.getAttributeValue(i);
098 value.putAttributeValue(in.getNamespaceContext(), attributeName, attributeValue);
099 }
100 }
101
102 }