1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.support.wsdl;
14
15 import java.io.InputStream;
16 import java.util.Iterator;
17 import java.util.Map;
18
19 import javax.wsdl.xml.WSDLLocator;
20
21 import org.apache.log4j.Logger;
22 import org.apache.xmlbeans.XmlObject;
23 import org.apache.xmlbeans.XmlOptions;
24 import org.w3c.dom.Document;
25 import org.xml.sax.InputSource;
26
27 import com.eviware.soapui.config.DefinitionCacheConfig;
28 import com.eviware.soapui.config.DefintionPartConfig;
29 import com.eviware.soapui.impl.wsdl.support.xsd.SchemaUtils;
30 import com.eviware.soapui.support.Tools;
31
32 /***
33 * Abstract WSDLLocator for loading definitions from either URL or cache..
34 *
35 * @author ole.matzura
36 */
37
38 public abstract class WsdlLoader implements WSDLLocator
39 {
40 private final String url;
41 private String last;
42 protected static final Logger log = Logger.getLogger( WsdlLoader.class );
43
44 public WsdlLoader( String url )
45 {
46 this.url = url;
47 }
48
49 public InputSource getBaseInputSource()
50 {
51 try
52 {
53 log.debug( "Returning baseInputSource [" + url + "]" );
54 return new InputSource( load( url ) );
55 }
56 catch (Exception e)
57 {
58 throw new RuntimeException( e.toString() );
59 }
60 }
61
62 public abstract InputStream load( String url ) throws Exception;
63
64 public XmlObject loadXmlObject( String url, XmlOptions options ) throws Exception
65 {
66 if( options == null )
67 {
68 return XmlObject.Factory.parse( load( url ), new XmlOptions().setLoadLineNumbers());
69 }
70 else
71 {
72 options.setLoadLineNumbers();
73 return XmlObject.Factory.parse( load( url ), options );
74 }
75 }
76
77 public String getBaseURI()
78 {
79 log.debug( "Returning baseURI [" + url + "]" );
80 return url;
81 }
82
83 public InputSource getImportInputSource(String parent, String imp)
84 {
85 if( isAbsoluteUrl( imp ))
86 last = imp;
87 else
88 last = Tools.joinRelativeUrl( parent, imp);
89
90 try
91 {
92 return new InputSource( load( last ) );
93 }
94 catch (Exception e)
95 {
96 throw new RuntimeException( e.toString() );
97 }
98 }
99
100 protected boolean isAbsoluteUrl(String tempImp)
101 {
102 tempImp = tempImp.toUpperCase();
103 return tempImp.startsWith( "HTTP:" ) || tempImp.startsWith( "HTTPS:" ) || tempImp.startsWith( "FILE:" );
104 }
105
106 public String getLatestImportURI()
107 {
108 String result = last == null ? url : last;
109 log.debug( "Returning latest import URI [" + result + "]" );
110 return result;
111 }
112
113 public abstract boolean abort();
114
115 public abstract boolean isAborted();
116
117 public static DefinitionCacheConfig cacheWsdl( WsdlLoader loader ) throws Exception
118 {
119 DefinitionCacheConfig definitionCache = DefinitionCacheConfig.Factory.newInstance();
120 definitionCache.setRootPart( loader.getBaseURI() );
121
122 Map<String, XmlObject> urls = SchemaUtils.getDefinitionParts( loader );
123
124 for( Iterator<String> i = urls.keySet().iterator(); i.hasNext(); )
125 {
126 DefintionPartConfig definitionPart = definitionCache.addNewPart();
127 String url = i.next();
128 definitionPart.setUrl( url );
129 XmlObject xmlObject = urls.get( url );
130 definitionPart.setContent( xmlObject);
131
132 Document domNode = (Document) xmlObject.getDomNode();
133 definitionPart.setType( domNode.getDocumentElement().getNamespaceURI());
134 }
135
136 return definitionCache;
137 }
138 }