/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.axis2.jaxws.marshaller.impl.alt; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; /** * Characteristics of the "Element" value. * The Element value is ready for marshalling or is the * result of unmarshalling. * The Element value represents the element rendering. Thus it is either * a JAXBElement or has the @XmlRootElement annotation. (i.e. it is never a java.lang.String) * The Element value is not a JAX-WS object. (i.e. it is not a holder or exception) * Characteristics of the "Type" value * It is the type value associated with the element value. (Thus it is either * the element value or it is value of the JAXBElement * The type value is usually the object needed * for the method signature (i.e. String) * <p/> * Here is an example for illustration: * <element name='e1'> * <complexType>...</complexType> * </element> * <p/> * <element name='e2' type='t2' /> <complexType name= 't2'>.. * <p/> * <element name='e3' type='e3' /> <!-- note element and type have same name --> * <complexType name= 'e3'>.. * <p/> * JAXB will generate the following objects: E1, T2, E3 E1 will have an @XMLRootElement annotation. * It is "element" and "type" enabled. e2 does not have a generated object. So it will be * represented as a JAXBElement that contains an object T2. The JAXBElement is "element" enabled. * T2 represents a complexType. It is only "type" enabled. E3 represents the e3 complexType (it * does not represent the e3 element). Thus E3 is "type enabled". * <p/> * When JAXB unmarshals an object, it will return an "element" enabled object (either a generatated * object with @XMLRootElement or a JAXBElement). Conversely, you must always marshal "element" * enabled objects. * * @see PDElement * <p/> * At the signature level, the values passed as arguments in an SEI operation represent type * enabled objects. Each of the object must be converted to an element enabled object to * marshal (or conversely converted to a type enabled object when unmarshalling) */ public class Element { private QName qName; private Object elementValue; private Object typeValue; private Class typeClass; /** * Create Element from an * * @param elementValue must be JAXBElement or @XmlRootElement rendered * @param qName associated QName */ public Element(Object elementValue, QName qName) { if (elementValue != null) { this.qName = qName; this.elementValue = elementValue; } else { this.qName = qName; this.typeValue = null; this.typeClass = Object.class; } } /** * @param typeValue must not be a JAXBElement. Must not have @XmlRootElement rendering. * typeValue must not be a Holder or other JAXWS api value. * @param qName associated QName * @param cls */ public Element(Object typeValue, QName qName, Class cls) { this.qName = qName; this.typeValue = typeValue; this.typeClass = cls; } public Object getElementValue() { if (elementValue == null) { // Create ElementValue from type information elementValue = new JAXBElement(qName, typeClass, typeValue); } return elementValue; } public Object getTypeValue() { if (elementValue != null) { if (elementValue.getClass() == JAXBElement.class) { return ((JAXBElement)elementValue).getValue(); } else { return elementValue; } } else { return typeValue; } } public QName getQName() { return qName; } }