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: * @(#)EndpointImpl.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 java.io.StringWriter;
032:
033: import java.util.Map;
034:
035: import javax.xml.namespace.QName;
036:
037: import org.apache.xmlbeans.XmlOptions;
038:
039: import org.w3.ns.wsdl.EndpointType;
040:
041: import org.w3c.dom.DocumentFragment;
042:
043: /**
044: * Implementation of WSDL 2.0 Endpoint component.
045: *
046: * @author Sun Microsystems, Inc.
047: */
048: final class EndpointImpl extends Endpoint {
049: /** Container for this component. */
050: private DescriptionImpl mContainer;
051:
052: /**
053: * Get the container for this component.
054: *
055: * @return The component for this component
056: */
057: protected DescriptionImpl getContainer() {
058: return this .mContainer;
059: }
060:
061: /**
062: * Construct an Endpoint component implementation, based on the given Xml Bean.
063: *
064: * @param bean The Xml bean to construct this endpoint from.
065: * @param defs The container for this endpoint component.
066: */
067: private EndpointImpl(EndpointType bean, DescriptionImpl defs) {
068: super (bean);
069:
070: this .mContainer = defs;
071: }
072:
073: /** Map of WSDL-defined attribute QNames. Keyed by QName.toString value */
074: private static java.util.Map sWsdlAttributeQNames = null;
075:
076: /**
077: * Worker class method for {@link #getWsdlAttributeNameMap()}.
078: *
079: * @return Map of WSDL-defined attribute QNames for this component,
080: * indexed by QName.toString()
081: */
082: static synchronized java.util.Map getAttributeNameMap() {
083: if (sWsdlAttributeQNames == null) {
084: sWsdlAttributeQNames = XmlBeansUtil
085: .getAttributesMap(EndpointType.type);
086: }
087:
088: return sWsdlAttributeQNames;
089: }
090:
091: /**
092: * Get map of WSDL-defined attribute QNames for this component, indexed by
093: * canonical QName string (see {@link javax.xml.namespace.QName#toString()}.
094: * <p>
095: * Implementation note: since this method is declared in the public API
096: * <code>interface</code>, it has to be a member, not static. We delegate
097: * to a class method to do the actual work.
098: *
099: * @return Map of WSDL-defined attribute QNames for this component,
100: * indexed by QName.toString()
101: */
102: public java.util.Map getWsdlAttributeNameMap() {
103: return getAttributeNameMap();
104: }
105:
106: /**
107: * Get name of this endpoint component.
108: *
109: * @return Name of this endpoint component
110: */
111: public String getName() {
112: return getBean().getName();
113: }
114:
115: /**
116: * Set name of this endpoint component.
117: *
118: * @param theName Name of this endpoint component
119: */
120: public void setName(String theName) {
121: getBean().setName(theName);
122: }
123:
124: /**
125: * Get binding for this endpoint.
126: *
127: * @return Binding for this endpoint
128: */
129: public com.sun.jbi.wsdl2.Binding getBinding() {
130: return this .mContainer.findBinding(getBean().getBinding());
131: }
132:
133: /**
134: * Set binding for this endpoint.
135: *
136: * @param theBinding Binding for this endpoint
137: */
138: public void setBinding(com.sun.jbi.wsdl2.Binding theBinding) {
139: QName name;
140:
141: if (theBinding != null) {
142: name = new QName(theBinding.getTargetNamespace(),
143: theBinding.getName());
144: } else {
145: name = null;
146: }
147:
148: getBean().setBinding(name);
149: }
150:
151: /**
152: * Return this WSDL endpoint as an XML string.
153: *
154: * @return This endpoint, serialized as an XML string.
155: */
156: public String toXmlString() {
157: String result;
158: StringWriter sw = new StringWriter();
159: XmlOptions options = new XmlOptions();
160:
161: options.setSavePrettyPrint();
162: options
163: .setSavePrettyPrintIndent(Constants.XML_PRETTY_PRINT_INDENT);
164: options.setSaveOuter();
165:
166: try {
167: getBean().save(sw, options);
168: sw.close();
169: } catch (java.io.IOException ex) {
170: sw.write("\n<!-- IO error: ");
171: sw.write(ex.getMessage());
172: sw.write("\n Document fragment truncated. -->\n");
173: // $TODO: log error
174: }
175:
176: return sw.getBuffer().toString();
177: }
178:
179: /**
180: * Return this endpoint as a DOM document fragment.
181: *
182: * @return This endpoint, as a DOM document fragment.
183: */
184: public DocumentFragment toXmlDocumentFragment() {
185: XmlOptions options = new XmlOptions();
186:
187: options.setSaveOuter();
188: return (DocumentFragment) getBean().newDomNode(options);
189: }
190:
191: /**
192: * A factory class for creating / finding components for given XML beans.
193: * <p>
194: * This factory guarantees that there will only be one component for each
195: * XML bean instance.
196: */
197: static class Factory {
198: /**
199: * Find the WSDL endpoint component associated with the given XML
200: * bean, creating a new component if necessary.
201: * <p>
202: * This is thread-safe.<p>
203: *
204: * @param bean The XML bean to find the component for.
205: * @param defs The container for the component.
206: * @return The WSDL endpoint component for the given <code>bean</code>
207: * (null if the <code>bean</code> is null).
208: */
209: static EndpointImpl getInstance(EndpointType bean,
210: DescriptionImpl defs) {
211: EndpointImpl result;
212:
213: if (bean != null) {
214: Map map = defs.getEndpointMap();
215:
216: synchronized (map) {
217: result = (EndpointImpl) map.get(bean);
218:
219: if (result == null) {
220: result = new EndpointImpl(bean, defs);
221: map.put(bean, result);
222: }
223: }
224: } else {
225: result = null;
226: }
227:
228: return result;
229: }
230: }
231: }
232:
233: // End-of-file: EndpointImpl.java
|