View Javadoc

1   /*
2    * Copyright 2006 the original author or authors.
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  
17  package org.springframework.ws.wsdl.wsdl11;
18  
19  import javax.wsdl.Definition;
20  import javax.wsdl.WSDLException;
21  import javax.wsdl.factory.WSDLFactory;
22  import javax.wsdl.xml.WSDLWriter;
23  import javax.xml.transform.Source;
24  import javax.xml.transform.dom.DOMSource;
25  
26  import org.w3c.dom.Document;
27  
28  import org.springframework.util.Assert;
29  import org.springframework.util.StringUtils;
30  import org.springframework.ws.wsdl.WsdlDefinitionException;
31  
32  /**
33   * Implementation of the <code>Wsdl11Definition</code> based on WSDL4J. A {@link javax.wsdl.Definition} can be given as
34   * as constructor argument, or set using a property.
35   *
36   * @author Arjen Poutsma
37   * @see #Wsdl4jDefinition(javax.wsdl.Definition)
38   * @see #setDefinition(javax.wsdl.Definition)
39   * @since 1.0.0
40   */
41  public class Wsdl4jDefinition implements Wsdl11Definition {
42  
43      private Definition definition;
44  
45      /** Cached DOM version of the definition */
46      private Document document;
47  
48      /** WSDL4J is not thread safe, hence the need for a monitor. */
49      private final Object monitor = new Object();
50  
51      /**
52       * Constructs a new, empty <code>Wsdl4jDefinition</code>.
53       *
54       * @see #setDefinition(javax.wsdl.Definition)
55       */
56      public Wsdl4jDefinition() {
57      }
58  
59      /**
60       * Constructs a new <code>Wsdl4jDefinition</code> based on the given <code>Definition</code>.
61       *
62       * @param definition the WSDL4J definition
63       */
64      public Wsdl4jDefinition(Definition definition) {
65          setDefinition(definition);
66      }
67  
68      /** Returns the WSDL4J <code>Definition</code>. */
69      public Definition getDefinition() {
70          synchronized (monitor) {
71              return definition;
72          }
73      }
74  
75      /** Set the WSDL4J <code>Definition</code>. */
76      public void setDefinition(Definition definition) {
77          synchronized (monitor) {
78              this.definition = definition;
79              this.document = null;
80          }
81      }
82  
83      public Source getSource() {
84          synchronized (monitor) {
85              Assert.notNull(definition, "definition must not be null");
86              if (document == null) {
87                  try {
88                      WSDLFactory wsdlFactory = WSDLFactory.newInstance();
89                      WSDLWriter wsdlWriter = wsdlFactory.newWSDLWriter();
90                      document = wsdlWriter.getDocument(definition);
91                  }
92                  catch (WSDLException ex) {
93                      throw new WsdlDefinitionException(ex.getMessage(), ex);
94                  }
95              }
96          }
97          return new DOMSource(document);
98      }
99  
100     public String toString() {
101         StringBuffer buffer = new StringBuffer("Wsdl4jDefinition");
102         if (definition != null && StringUtils.hasLength(definition.getTargetNamespace())) {
103             buffer.append('{');
104             buffer.append(definition.getTargetNamespace());
105             buffer.append('}');
106         }
107         return buffer.toString();
108     }
109 }