001: /*
002: * BEGIN_HEADER - DO NOT EDIT
003: *
004: * The contents of this file are subject to the terms
005: * of the Common Development and Distribution License
006: * (the "License"). You may not use this file except
007: * in compliance with the License.
008: *
009: * You can obtain a copy of the license at
010: * https://open-esb.dev.java.net/public/CDDLv1.0.html.
011: * See the License for the specific language governing
012: * permissions and limitations under the License.
013: *
014: * When distributing Covered Code, include this CDDL
015: * HEADER in each file and include the License file at
016: * https://open-esb.dev.java.net/public/CDDLv1.0.html.
017: * If applicable add the following below this CDDL HEADER,
018: * with the fields enclosed by brackets "[]" replaced with
019: * your own identifying information: Portions Copyright
020: * [year] [name of copyright owner]
021: */
022:
023: /*
024: * @(#)BindingMessageReferenceImpl.java
025: * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
026: *
027: * END_HEADER - DO NOT EDIT
028: */
029: package com.sun.jbi.wsdl2.impl;
030:
031: import com.sun.jbi.wsdl2.Direction;
032:
033: import java.util.Map;
034:
035: import javax.xml.namespace.QName;
036:
037: import org.apache.xmlbeans.XmlCursor;
038:
039: import org.w3.ns.wsdl.BindingOperationMessageType;
040:
041: /**
042: * Implementation of WSDL 2.0 Binding message reference component.
043: *
044: * @author Sun Microsystems, Inc.
045: */
046: final class BindingMessageReferenceImpl extends BindingMessageReference {
047: /** Container for this component */
048: private DescriptionImpl mContainer;
049:
050: /**
051: * Get the container for this component.
052: *
053: * @return The component for this component
054: */
055: protected DescriptionImpl getContainer() {
056: return this .mContainer;
057: }
058:
059: /**
060: * Construct a binding message reference component implementation object from
061: * the given XML bean.
062: *
063: * @param bean The binding operation messsage XML bean to use to construct
064: * this component.
065: * @param defs The wsdl definitions component that contains this binding
066: * operation message type.
067: */
068: private BindingMessageReferenceImpl(
069: BindingOperationMessageType bean, DescriptionImpl defs) {
070: super (bean);
071:
072: this .mContainer = defs;
073: }
074:
075: /** Map of WSDL-defined attribute QNames. Keyed by QName.toString value */
076: private static java.util.Map sWsdlAttributeQNames = null;
077:
078: /**
079: * Worker class method for {@link #getWsdlAttributeNameMap()}.
080: *
081: * @return Map of WSDL-defined attribute QNames for this component,
082: * indexed by QName.toString()
083: */
084: static synchronized java.util.Map getAttributeNameMap() {
085: if (sWsdlAttributeQNames == null) {
086: sWsdlAttributeQNames = XmlBeansUtil
087: .getAttributesMap(BindingOperationMessageType.type);
088: }
089:
090: return sWsdlAttributeQNames;
091: }
092:
093: /**
094: * Get map of WSDL-defined attribute QNames for this component, indexed by
095: * canonical QName string (see {@link javax.xml.namespace.QName#toString()}.
096: *
097: * @return Map of WSDL-defined attribute QNames for this component,
098: * indexed by QName.toString()
099: */
100: public java.util.Map getWsdlAttributeNameMap() {
101: return getAttributeNameMap();
102: }
103:
104: /**
105: * Get message exchange pattern role identifier.
106: *
107: * @return Message exchange pattern role identifier
108: */
109: public String getMessageLabel() {
110: return getBean().getMessageLabel();
111: }
112:
113: /**
114: * Set message exchange pattern role identifier.
115: *
116: * @param theMessageLabel Message exchange pattern role identifier
117: */
118: public void setMessageLabel(String theMessageLabel) {
119: if (theMessageLabel != null) {
120: getBean().setMessageLabel(theMessageLabel);
121: } else {
122: getBean().unsetMessageLabel();
123: }
124: }
125:
126: /**
127: * Get direction of this message in the exchange.
128: * <p>
129: * This implementation assumes that the underlying XML is valid; in particular,
130: * that the bean has a parent, and that parent is either an input or an output
131: * element. It remains to be seen if this remains true during programatic
132: * WSDL construction.
133: *
134: * @return Direction of this message in the exchange
135: */
136: public Direction getDirection() {
137: XmlCursor cursor = getBean().newCursor();
138: QName name = cursor.getName();
139:
140: cursor.dispose();
141:
142: return INPUT.equals(name.getLocalPart()) ? Direction.IN
143: : Direction.OUT;
144: }
145:
146: /** WSDL element local name for input messages */
147: private static final String INPUT = "input";
148:
149: /** WSDL element local name for output messages */
150: private static final String OUTPUT = "output";
151:
152: /**
153: * Set direction of this message in the exchange. The direction property
154: * of a message reference (fault or normal) is inferred from the name
155: * of the XML element containing it. This means that we have to drill into
156: * the actual XML to rename the <input/output> element appropriately.
157: * This is accomplished in XmlBeans using the so-called XmlCursor.
158: *
159: * @param theDirection Direction of this message in the exchange
160: */
161: public void setDirection(Direction theDirection) {
162: XmlCursor cursor = getBean().newCursor();
163: QName name = cursor.getName();
164: QName newName = new QName(name.getNamespaceURI(),
165: theDirection == Direction.IN ? INPUT : OUTPUT);
166:
167: cursor.setName(newName);
168: cursor.dispose();
169: }
170:
171: /**
172: * A factory class for creating / finding components for given XML beans.
173: * <p>
174: * This factory guarantees that there will only be one component for each
175: * XML bean instance.
176: */
177: static class Factory {
178: /**
179: * Find the WSDL binding message reference component associated with the given XML
180: * bean, creating a new component if necessary.
181: * <p>
182: * This is thread-safe.<p>
183: *
184: * @param bean The XML bean to find the component for.
185: * @param defs The container for the component.
186: * @return The WSDL binding message reference component for the given
187: * <code>bean</code> (null if the <code>bean</code> is null).
188: */
189: static BindingMessageReferenceImpl getInstance(
190: BindingOperationMessageType bean, DescriptionImpl defs) {
191: BindingMessageReferenceImpl result;
192:
193: if (bean != null) {
194: Map map = defs.getBindingMessageReferenceMap();
195:
196: synchronized (map) {
197: result = (BindingMessageReferenceImpl) map
198: .get(bean);
199:
200: if (result == null) {
201: result = new BindingMessageReferenceImpl(bean,
202: defs);
203: map.put(bean, result);
204: }
205: }
206: } else {
207: result = null;
208: }
209:
210: return result;
211: }
212: } // end inner class Factory
213: }
214:
215: // End-of-file: BindingMessageReferenceImpl.java
|