VirtualBox

source: vbox/trunk/src/VBox/Main/webservice/websrv-wsdl2gsoapH.xsl@ 53925

Last change on this file since 53925 was 53925, checked in by vboxsync, 10 years ago

websrv-wsdl2gsoapH.xsl: Use xsl:key and key() to optimize four expensive lookups, don't use emitNewline, call xsltprocNewlineOutputHack once in a while. Execution time went from 14-15 seconds to less than half a second.

  • Property svn:eol-style set to native
File size: 11.6 KB
Line 
1<?xml version="1.0"?>
2
3<!--
4 websrv-gsoapH.xsl:
5 XSLT stylesheet that generates a gSOAP pseudo-header
6 file from VirtualBox.xidl. Such a pseudo-header files
7 can be fed into gSOAP's soapcpp2 to create web service
8 client headers and server stubs.
9 See webservice/Makefile.kmk for an overview of all the things
10 generated for the webservice.
11
12 Copyright (C) 2006-2013 Oracle Corporation
13
14 This file is part of VirtualBox Open Source Edition (OSE), as
15 available from http://www.virtualbox.org. This file is free software;
16 you can redistribute it and/or modify it under the terms of the GNU
17 General Public License (GPL) as published by the Free Software
18 Foundation, in version 2 as it comes in the "COPYING" file of the
19 VirtualBox OSE distribution. VirtualBox OSE is distributed in the
20 hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
21-->
22
23<xsl:stylesheet
24 version="1.0"
25 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
26 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
27 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
28 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
29 xmlns:vbox="http://www.virtualbox.org/"
30 xmlns:exsl="http://exslt.org/common"
31 extension-element-prefixes="exsl"
32 >
33
34 <xsl:param name="G_argDebug" />
35
36 <xsl:output method="text"/>
37
38 <xsl:strip-space elements="*"/>
39
40<!-- - - - - - - - - - - - - - - - - - - - - - -
41 global XSLT variables
42 - - - - - - - - - - - - - - - - - - - - - - -->
43
44<xsl:variable name="G_xsltFilename" select="'websrv-wsdl2gsoapH.xsl'" />
45
46<xsl:include href="../idl/typemap-shared.inc.xsl" />
47
48<!-- collect all interfaces with "wsmap='suppress'" in a global variable for
49 quick lookup -->
50<xsl:variable name="G_setSuppressedInterfaces"
51 select="//interface[@wsmap='suppress']" />
52
53
54<!-- - - - - - - - - - - - - - - - - - - - - - -
55 Keys for more efficiently looking up of stuff
56 - - - - - - - - - - - - - - - - - - - - - - -->
57
58<xsl:key name="G_keyMessagesByName" match="//wsdl:message[@name]" use="@name"/>
59<xsl:key name="G_keySimpleTypesByName" match="//xsd:simpleType[@name]" use="@name"/>
60<xsl:key name="G_keyComplexTypesByName" match="//xsd:complexType[@name]" use="@name"/>
61
62
63<!-- - - - - - - - - - - - - - - - - - - - - - -
64 root match
65 - - - - - - - - - - - - - - - - - - - - - - -->
66
67<xsl:template match="/wsdl:definitions">
68 <xsl:text><![CDATA[
69/* DO NOT EDIT! This is a generated file.
70 * Generated from: vboxweb.wsdl (generated WSDL file)
71 * Generator: src/VBox/Main/webservice/websrv-gsoapH.xsl
72 *
73 * Note: This is not a real C/C++ header file. Instead, gSOAP uses files like this
74 * one -- with a pseudo-C-header syntax -- to describe a web service API.
75 */
76
77// STL vector containers
78#import "stlvector.h"
79
80]]></xsl:text>
81
82 <xsl:value-of select="concat('//gsoap vbox schema namespace: ', $G_targetNamespace)" />
83 <xsl:value-of select="concat('//gsoap vbox schema form: unqualified', '')" />
84
85 <xsl:text>
86/****************************************************************************
87 *
88 * declarations
89 *
90 ****************************************************************************/
91
92// forward declarations
93class _vbox__InvalidObjectFault;
94class _vbox__RuntimeFault;
95
96struct SOAP_ENV__Detail
97{
98 _vbox__InvalidObjectFault *vbox__InvalidObjectFault;
99 _vbox__RuntimeFault *vbox__RuntimeFault;
100 int __type;
101 void *fault;
102 _XML __any;
103};
104</xsl:text>
105
106 <xsl:apply-templates />
107</xsl:template>
108
109<xsl:template name="convertSequence">
110 <xsl:param name="xmltype" />
111 <xsl:param name="ctype" />
112
113 <xsl:value-of select="concat('class ', $ctype, $G_sNewLine)" />
114 <xsl:text>{
115 public:
116</xsl:text>
117 <xsl:for-each select="xsd:element">
118 <xsl:variable name="typefield" select="@type" />
119 <xsl:variable name="xmltypefield" select="substring($typefield, 5)" /><!-- remove "xsd:" prefix-->
120 <xsl:variable name="withoutvboxtypefield" select="substring($typefield, 6)" /><!-- remove "vbox:" prefix-->
121 <xsl:variable name="ctypefield" select="exsl:node-set($G_aSharedTypes)/type[@xmlname=$xmltypefield]/@cname" />
122 <xsl:text> </xsl:text>
123 <xsl:choose>
124 <xsl:when test="$ctypefield">
125 <!-- array or simple type: depends on whether maxOccurs="unbounded" is in WSDL -->
126 <xsl:choose>
127 <xsl:when test="@maxOccurs='unbounded'">
128 <xsl:value-of select="concat('std::vector&lt;', $ctypefield, '&gt;')" />
129 </xsl:when>
130 <xsl:otherwise>
131 <xsl:value-of select="$ctypefield" />
132 </xsl:otherwise>
133 </xsl:choose>
134 </xsl:when>
135 <!-- is there an enum of this type? (look up in simple types) -->
136 <xsl:when test="count(key('G_keySimpleTypesByName', $withoutvboxtypefield)) > 0">
137 <xsl:variable name="enumname">
138 <xsl:value-of select="concat('enum vbox__', $withoutvboxtypefield)" />
139 </xsl:variable>
140 <xsl:choose>
141 <xsl:when test="@maxOccurs='unbounded'">
142 <xsl:value-of select="concat('std::vector&lt;', $enumname, '&gt;')" />
143 </xsl:when>
144 <xsl:otherwise>
145 <xsl:value-of select="$enumname" />
146 </xsl:otherwise>
147 </xsl:choose>
148 </xsl:when>
149 <!-- is this one of the vbox types? (look up in complex types) -->
150 <xsl:when test="count(key('G_keyComplexTypesByName', $withoutvboxtypefield)) > 0">
151 <!-- array or simple type: depends on whether maxOccurs="unbounded" is in WSDL -->
152 <xsl:choose>
153 <xsl:when test="@maxOccurs='unbounded'">
154 <xsl:value-of select="concat('std::vector&lt;vbox__', $withoutvboxtypefield, '*&gt;')" />
155 </xsl:when>
156 <xsl:otherwise>
157 <xsl:value-of select="concat('vbox__', $withoutvboxtypefield, '*')" />
158 </xsl:otherwise>
159 </xsl:choose>
160 </xsl:when>
161 <xsl:otherwise>
162 <xsl:value-of select="concat('std::string', '')" />
163 </xsl:otherwise>
164 </xsl:choose>
165 <xsl:variable name="underscoredname">
166 <xsl:call-template name="escapeUnderscores">
167 <xsl:with-param name="string" select="@name" />
168 </xsl:call-template>
169 </xsl:variable>
170 <xsl:value-of select="concat(' ', $underscoredname, ' 1;', $G_sNewLine)" />
171 </xsl:for-each>
172 <xsl:text> struct soap *soap;
173};
174</xsl:text>
175<xsl:call-template name="xsltprocNewlineOutputHack"/>
176
177</xsl:template>
178
179<xsl:template match="wsdl:types/xsd:schema">
180
181 <!-- enums are represented as simple types -->
182 <xsl:for-each select="xsd:simpleType">
183 <xsl:variable name="ctype" select="concat('vbox__', @name)" />
184 <xsl:for-each select="xsd:restriction">
185 <xsl:value-of select="concat('enum ', $ctype)" />
186 <xsl:text>
187{
188</xsl:text>
189 <xsl:for-each select="xsd:enumeration">
190 <xsl:variable name="underscoredname">
191 <xsl:call-template name="escapeUnderscores">
192 <xsl:with-param name="string" select="@value" />
193 </xsl:call-template>
194 </xsl:variable>
195 <xsl:value-of select="concat(' ', $ctype, '__', $underscoredname)" />
196 <xsl:if test = "not(position()=last())" >
197 <xsl:text >,</xsl:text>
198 </xsl:if>
199 <xsl:text>
200</xsl:text>
201 </xsl:for-each>
202 <xsl:text>};
203
204</xsl:text>
205 </xsl:for-each>
206 </xsl:for-each>
207
208 <!-- structs and arrays are represented as complex types -->
209 <xsl:for-each select="xsd:complexType">
210 <xsl:variable name="xmltype" select="@name" />
211 <xsl:variable name="ctype" select="concat('vbox__', $xmltype)" />
212 <xsl:for-each select="xsd:sequence">
213 <xsl:call-template name="convertSequence">
214 <xsl:with-param name="xmltype" select="$xmltype" />
215 <xsl:with-param name="ctype" select="$ctype" />
216 </xsl:call-template>
217 </xsl:for-each>
218 </xsl:for-each>
219
220 <!-- individual message elements are represented with xsd:element -> xsd:complexType -> xsdSequence -->
221 <xsl:for-each select="xsd:element">
222 <xsl:variable name="xmltype" select="@name" />
223 <xsl:variable name="underscoredname">
224 <xsl:call-template name="escapeUnderscores">
225 <xsl:with-param name="string" select="$xmltype" />
226 </xsl:call-template>
227 </xsl:variable>
228 <xsl:variable name="ctype" select="concat('_vbox__', $underscoredname)" />
229 <xsl:for-each select="xsd:complexType">
230 <xsl:for-each select="xsd:sequence">
231 <xsl:call-template name="convertSequence">
232 <xsl:with-param name="xmltype" select="$xmltype" />
233 <xsl:with-param name="ctype" select="$ctype" />
234 </xsl:call-template>
235 </xsl:for-each>
236 </xsl:for-each>
237 </xsl:for-each>
238</xsl:template>
239
240<xsl:template match="wsdl:portType">
241
242 <xsl:value-of select="concat('//gsoap vbox service name: vbox', $G_bindingSuffix, $G_sNewLine)" />
243 <xsl:value-of select="concat('//gsoap vbox service type: vbox', $G_portTypeSuffix, $G_sNewLine)" />
244 <xsl:value-of select="concat('//gsoap vbox service namespace: ', $G_targetNamespace, $G_targetNamespaceSeparator, $G_sNewLine)" />
245 <xsl:value-of select="concat('//gsoap vbox service transport: ', 'http://schemas.xmlsoap.org/soap/http', $G_sNewLine)" />
246
247 <xsl:for-each select="wsdl:operation">
248 <xsl:variable name="methodname" select="@name" />
249 <xsl:variable name="cmethodname">
250 <xsl:call-template name="escapeUnderscores">
251 <xsl:with-param name="string" select="$methodname" />
252 </xsl:call-template>
253 </xsl:variable>
254 <xsl:variable name="requestmsg" select="concat($methodname, $G_methodRequest)" />
255 <xsl:variable name="responsemsg" select="concat($methodname, $G_methodResponse)" />
256
257 <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-style: ', $cmethodname, ' ', $G_basefmt)" />
258 <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-encoding: ', $cmethodname, ' ', $G_parmfmt)" />
259 <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-action: ', $cmethodname, ' &quot;&quot;')" />
260 <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-fault: ', $cmethodname, ' vbox__InvalidObjectFault')" />
261 <xsl:value-of select="concat($G_sNewLine, '//gsoap vbox service method-fault: ', $cmethodname, ' vbox__RuntimeFault')" />
262 <xsl:value-of select="concat($G_sNewLine, 'int __vbox__', $cmethodname, '(', $G_sNewLine)" />
263
264 <!-- request element -->
265 <xsl:variable name="reqtype" select="key('G_keyMessagesByName', $requestmsg)/wsdl:part/@element" />
266 <xsl:if test="not($reqtype)">
267 <xsl:call-template name="fatalError">
268 <xsl:with-param name="msg" select="concat('wsdl:portType match: Cannot find message with &quot;name&quot;=&quot;', $requestmsg, '&quot;.')" />
269 </xsl:call-template>
270 </xsl:if>
271 <xsl:variable name="creqtype">
272 <xsl:call-template name="escapeUnderscores">
273 <xsl:with-param name="string" select="substring($reqtype, 6)" />
274 </xsl:call-template>
275 </xsl:variable>
276 <xsl:value-of select="concat(' _vbox__', $creqtype, '* vbox__', $creqtype, ',', $G_sNewLine)"/>
277 <!-- response element -->
278 <xsl:variable name="resptype" select="key('G_keyMessagesByName', $responsemsg)/wsdl:part/@element" />
279 <xsl:if test="not($resptype)">
280 <xsl:call-template name="fatalError">
281 <xsl:with-param name="msg" select="concat('wsdl:portType match: Cannot find message with &quot;name&quot;=&quot;', $responsemsg, '&quot;.')" />
282 </xsl:call-template>
283 </xsl:if>
284 <xsl:variable name="cresptype">
285 <xsl:call-template name="escapeUnderscores">
286 <xsl:with-param name="string" select="substring($resptype, 6)" />
287 </xsl:call-template>
288 </xsl:variable>
289 <xsl:value-of select="concat(' _vbox__', $cresptype, '* vbox__', $cresptype, $G_sNewLine)"/>
290
291 <xsl:text>);</xsl:text>
292 <xsl:call-template name="xsltprocNewlineOutputHack"/>
293
294 </xsl:for-each>
295</xsl:template>
296
297</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette