1<!--***********************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements.  See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership.  The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License.  You may obtain a copy of the License at
10 *
11 *   http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied.  See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 ***********************************************************-->
21<xsl:stylesheet version="1.0"
22		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
23		xmlns:UML = 'org.omg.xmi.namespace.UML'
24		xml:space="default">
25  <xsl:output method="xml"/>
26
27  <xsl:template match="/">
28    <out>
29      <xsl:apply-templates select="*"/>
30    </out>
31  </xsl:template>
32
33  <xsl:template name="calcsizeinner">
34    <xsl:param name="size">0</xsl:param>
35    <xsl:variable name="arraycount">
36      <xsl:choose>
37	<xsl:when test="@array-count">
38	  <xsl:value-of select="@array-count"/>
39	</xsl:when>
40	<xsl:otherwise>1</xsl:otherwise>
41      </xsl:choose>
42    </xsl:variable>
43    <xsl:variable name="mysize">
44      <xsl:choose>
45	<xsl:when test="@size and not(@offset)">
46	  <xsl:value-of select="number($arraycount) * number(@size)"/>
47	</xsl:when>
48	<xsl:otherwise>0</xsl:otherwise>
49      </xsl:choose>
50    </xsl:variable>
51    <xsl:choose>
52      <xsl:when test="following-sibling::*">
53	<xsl:for-each select="following-sibling::*[1]">
54	  <xsl:call-template name="calcsizeinner">
55	    <xsl:with-param name="size"
56			    select="number($size) + number($mysize)"/>
57	  </xsl:call-template>
58	</xsl:for-each>
59      </xsl:when>
60      <xsl:otherwise>
61	<xsl:value-of select="number($size) + number($mysize)"/>
62      </xsl:otherwise>
63    </xsl:choose>
64  </xsl:template>
65
66  <xsl:template name="calcsize">
67    <xsl:for-each select="*[1]">
68      <xsl:call-template name="calcsizeinner"/>
69    </xsl:for-each>
70  </xsl:template>
71
72  <xsl:template name="calcoffsetinner">
73    <xsl:variable name="arraycount">
74      <xsl:choose>
75	<xsl:when test="@array-count">
76	  <xsl:value-of select="@array-count"/>
77	</xsl:when>
78	<xsl:otherwise>1</xsl:otherwise>
79      </xsl:choose>
80    </xsl:variable>
81    <xsl:variable name="mysize">
82      <xsl:choose>
83	<xsl:when test="@size and not(@offset)">
84	  <xsl:value-of select="number($arraycount) * number(@size)"/>
85	</xsl:when>
86	<xsl:otherwise>0</xsl:otherwise>
87      </xsl:choose>
88    </xsl:variable>
89    <xsl:choose>
90      <xsl:when test="preceding-sibling::*">
91	<xsl:variable name="precedingoffset">
92	  <xsl:for-each select="preceding-sibling::*[1]">
93	    <xsl:call-template name="calcoffsetinner"/>
94	  </xsl:for-each>
95	</xsl:variable>
96	<xsl:value-of select="number($precedingoffset) + number($mysize)"/>
97      </xsl:when>
98      <xsl:otherwise>
99	<xsl:value-of select="$mysize"/>
100      </xsl:otherwise>
101    </xsl:choose>
102  </xsl:template>
103
104  <xsl:template name="calcoffset">
105    <xsl:choose>
106      <xsl:when test="@offset">
107	<xsl:value-of select="@offset"/>
108      </xsl:when>
109      <xsl:otherwise>
110	<xsl:for-each select="preceding-sibling::*[1]">
111	  <xsl:call-template name="calcoffsetinner"/>
112	</xsl:for-each>
113      </xsl:otherwise>
114    </xsl:choose>
115  </xsl:template>
116
117  <xsl:template match="ww8resource">
118    <UML:Class>
119      <xsl:attribute name="xmi.id">
120	<xsl:value-of select="@name"/>
121      </xsl:attribute>
122      <xsl:attribute name="name">
123	<xsl:value-of select="@name"/>
124      </xsl:attribute>
125      <UML:ModelElement.stereotype>
126	<UML:Stereotype xmi.idref="ww8resource"/>
127      </UML:ModelElement.stereotype>
128      <xsl:for-each select="stereotype">
129	<UML:ModelElement.stereotype>
130	  <UML:Stereotype>
131	    <xsl:attribute name="xmi.idref">
132	      <xsl:value-of select="@name"/>
133	    </xsl:attribute>
134	  </UML:Stereotype>
135	</UML:ModelElement.stereotype>
136      </xsl:for-each>
137      <UML:ModelElement.taggedValue>
138	<UML:TaggedValue>
139	  <UML:TaggedValue.dataValue>
140	    <xsl:call-template name="calcsize"/>
141	  </UML:TaggedValue.dataValue>
142	  <UML:TaggedValue.type>
143	    <UML:TagDefinition xmi.idref="size"/>
144	  </UML:TaggedValue.type>
145	</UML:TaggedValue>
146      </UML:ModelElement.taggedValue>
147
148      <xsl:apply-templates select="*"/>
149
150    </UML:Class>
151    <UML:Generalization isSpecification="false">
152      <xsl:attribute name="xmi.id">
153	<xsl:value-of select="@name"/>
154	<xsl:text>-</xsl:text>
155	<xsl:value-of select="@resource"/>
156      </xsl:attribute>
157      <UML:Generalization.child>
158	<UML:Class>
159	  <xsl:attribute name="xmi.idref">
160	    <xsl:value-of select="@name"/>
161	  </xsl:attribute>
162	</UML:Class>
163      </UML:Generalization.child>
164      <UML:Generalization.parent>
165	<UML:Class xmi.idref="Properties">
166	  <xsl:attribute name="xmi.idref">
167	    <xsl:value-of select="@resource"/>
168	  </xsl:attribute>
169	</UML:Class>
170      </UML:Generalization.parent>
171    </UML:Generalization>
172  </xsl:template>
173
174  <xsl:template match="sprm">
175    <xsl:variable name="isww8resource">
176      <xsl:choose>
177        <xsl:when test="count(*) > 0">YES</xsl:when>
178        <xsl:otherwise>NO</xsl:otherwise>
179      </xsl:choose>
180    </xsl:variable>
181    <UML:Class>
182      <xsl:attribute name="xmi.id">
183        <xsl:value-of select="@name"/>
184      </xsl:attribute>
185      <xsl:attribute name="name">
186        <xsl:value-of select="@name"/>
187      </xsl:attribute>
188      <xsl:if test="$isww8resource='YES'">
189        <UML:ModelElement.stereotype>
190          <UML:Stereotype xmi.idref="ww8resource"/>
191        </UML:ModelElement.stereotype>
192      </xsl:if>
193      <UML:ModelElement.stereotype>
194        <UML:Stereotype xmi.idref="ww8sprm"/>
195      </UML:ModelElement.stereotype>
196      <xsl:call-template name="taggedvalue">
197        <xsl:with-param name="type">sprmcode</xsl:with-param>
198        <xsl:with-param name="value" select="@code"/>
199      </xsl:call-template>
200      <xsl:call-template name="taggedvalue">
201        <xsl:with-param name="type">sprmid</xsl:with-param>
202        <xsl:with-param name="value" select="@token"/>
203      </xsl:call-template>
204      <xsl:call-template name="taggedvalue">
205        <xsl:with-param name="type">kind</xsl:with-param>
206        <xsl:with-param name="value" select="@kind"/>
207      </xsl:call-template>
208      <xsl:apply-templates select="*"/>
209    </UML:Class>
210    <xsl:if test="$isww8resource='YES'">
211      <xsl:call-template name="generalization">
212        <xsl:with-param name="parent">Properties</xsl:with-param>
213        <xsl:with-param name="child" select="@name"/>
214      </xsl:call-template>
215    </xsl:if>
216  </xsl:template>
217
218  <xsl:template name="generalization">
219    <xsl:param name="parent"/>
220    <xsl:param name="child"/>
221    <UML:Generalization isSpecification="false">
222      <xsl:attribute name="xmi.id">
223	<xsl:value-of select="$child"/>
224	<xsl:text>-</xsl:text>
225	<xsl:value-of select="$parent"/>
226      </xsl:attribute>
227      <UML:Generalization.child>
228	<UML:Class>
229	  <xsl:attribute name="xmi.idref">
230	    <xsl:value-of select="$child"/>
231	  </xsl:attribute>
232	</UML:Class>
233      </UML:Generalization.child>
234      <UML:Generalization.parent>
235	<UML:Class xmi.idref="Properties">
236	  <xsl:attribute name="xmi.idref">
237	    <xsl:value-of select="$parent"/>
238	  </xsl:attribute>
239	</UML:Class>
240      </UML:Generalization.parent>
241    </UML:Generalization>
242  </xsl:template>
243
244  <xsl:template name="taggedvalue">
245    <xsl:param name="type"/>
246    <xsl:param name="value"/>
247    <UML:ModelElement.taggedValue>
248      <UML:TaggedValue>
249	<UML:TaggedValue.dataValue>
250	  <xsl:value-of select="$value"/>
251	</UML:TaggedValue.dataValue>
252	<UML:TaggedValue.type>
253	  <UML:TagDefinition>
254	    <xsl:attribute name="xmi.idref">
255	      <xsl:value-of select="$type"/>
256	    </xsl:attribute>
257	  </UML:TagDefinition>
258	</UML:TaggedValue.type>
259      </UML:TaggedValue>
260    </UML:ModelElement.taggedValue>
261  </xsl:template>
262
263  <xsl:template match="attribute">
264    <UML:Classifier.feature>
265      <UML:Attribute>
266	<xsl:attribute name="name">
267	  <xsl:value-of select="@name"/>
268	</xsl:attribute>
269	<xsl:call-template name="taggedvalue">
270	  <xsl:with-param name="type">comment</xsl:with-param>
271	  <xsl:with-param name="value"/>
272	</xsl:call-template>
273	<xsl:call-template name="taggedvalue">
274	  <xsl:with-param name="type">offset</xsl:with-param>
275	  <xsl:with-param name="value">
276	    <xsl:call-template name="calcoffset"/>
277	  </xsl:with-param>
278	</xsl:call-template>
279	<xsl:call-template name="taggedvalue">
280	  <xsl:with-param name="type">shift</xsl:with-param>
281	  <xsl:with-param name="value"></xsl:with-param>
282	</xsl:call-template>
283	<xsl:call-template name="taggedvalue">
284	  <xsl:with-param name="type">mask</xsl:with-param>
285	  <xsl:with-param name="value"></xsl:with-param>
286	</xsl:call-template>
287	<xsl:call-template name="taggedvalue">
288	  <xsl:with-param name="type">bits</xsl:with-param>
289	  <xsl:with-param name="value"></xsl:with-param>
290	</xsl:call-template>
291	<xsl:call-template name="taggedvalue">
292	  <xsl:with-param name="type">attrid</xsl:with-param>
293	  <xsl:with-param name="value">
294	    <xsl:choose>
295	      <xsl:when test="@token">
296		<xsl:value-of select="@token"/>
297	      </xsl:when>
298	      <xsl:otherwise>
299		<xsl:text>rtf:</xsl:text>
300		<xsl:value-of select="@name"/>
301	      </xsl:otherwise>
302	    </xsl:choose>
303	  </xsl:with-param>
304	</xsl:call-template>
305	<xsl:if test="@array-count">
306	  <xsl:call-template name="taggedvalue">
307	    <xsl:with-param name="type">arraycount</xsl:with-param>
308	    <xsl:with-param name="value">
309	      <xsl:value-of select="@array-count"/>
310	    </xsl:with-param>
311	  </xsl:call-template>
312	</xsl:if>
313	<UML:StructuralFeature.type>
314	  <UML:DataType>
315	    <xsl:attribute name="xmi.idref">
316	      <xsl:value-of select="@type"/>
317	    </xsl:attribute>
318	  </UML:DataType>
319	</UML:StructuralFeature.type>
320	<xsl:choose>
321	  <xsl:when test="@array-count">
322	    <UML:ModelElement.stereotype>
323	      <UML:Stereotype xmi.idref="array"/>
324	    </UML:ModelElement.stereotype>
325	  </xsl:when>
326	  <xsl:otherwise>
327	    <UML:ModelElement.stereotype>
328	      <UML:Stereotype xmi.idref="attribute"/>
329	    </UML:ModelElement.stereotype>
330	  </xsl:otherwise>
331	</xsl:choose>
332      </UML:Attribute>
333    </UML:Classifier.feature>
334  </xsl:template>
335
336  <xsl:template match="bitfield">
337    <xsl:variable name="offset">
338      <xsl:call-template name="calcoffset"/>
339    </xsl:variable>
340    <xsl:for-each select="bits">
341      <xsl:call-template name="bits">
342	<xsl:with-param name="offset" select="$offset"/>
343      </xsl:call-template>
344    </xsl:for-each>
345  </xsl:template>
346
347  <xsl:template name="mask">
348    <xsl:param name="count"/>
349    <xsl:param name="value"/>
350
351    <xsl:choose>
352      <xsl:when test="number($count) = 1">
353	<xsl:value-of select="$value"/>
354      </xsl:when>
355      <xsl:otherwise>
356	<xsl:call-template name="mask">
357	  <xsl:with-param name="count" select="number($count) - 1"/>
358	  <xsl:with-param name="value" select="number($value) * 2 + 1"/>
359	</xsl:call-template>
360      </xsl:otherwise>
361    </xsl:choose>
362  </xsl:template>
363
364  <xsl:template name="shift">
365    <xsl:param name="shift"/>
366    <xsl:param name="value"/>
367
368    <xsl:choose>
369      <xsl:when test="number($shift) = 0">
370	<xsl:value-of select="$value"/>
371      </xsl:when>
372      <xsl:otherwise>
373	<xsl:call-template name="shift">
374	  <xsl:with-param name="shift" select="number($shift) - 1"/>
375	  <xsl:with-param name="value" select="$value * 2"/>
376	</xsl:call-template>
377      </xsl:otherwise>
378    </xsl:choose>
379  </xsl:template>
380
381  <xsl:template name='dectohex'>
382    <xsl:param name="number"/>
383    <xsl:if test="$number > 16">
384      <xsl:call-template name="dectohex">
385	<xsl:with-param name="number" select="floor($number div 16)"/>
386      </xsl:call-template>
387    </xsl:if>
388    <xsl:value-of select="substring('0123456789abcdef', $number mod 16 + 1, 1)"/>
389  </xsl:template>
390
391  <xsl:template name="calcshift">
392    <xsl:choose>
393      <xsl:when test="@shift">
394	<xsl:value-of select="@shift"/>
395      </xsl:when>
396      <xsl:otherwise>
397	<xsl:value-of select="sum(following-sibling::*[not (@shift)]/@bits)"/>
398      </xsl:otherwise>
399    </xsl:choose>
400  </xsl:template>
401
402  <xsl:template name="bits">
403    <xsl:param name="offset"/>
404    <xsl:variable name="shift">
405      <xsl:call-template name="calcshift"/>
406    </xsl:variable>
407    <xsl:variable name="mask">
408      <xsl:call-template name="mask">
409	<xsl:with-param name="count" select="@bits"/>
410	<xsl:with-param name="value" select="1"/>
411      </xsl:call-template>
412    </xsl:variable>
413    <xsl:variable name="maskshifted">
414      <xsl:call-template name="shift">
415	<xsl:with-param name="shift" select="$shift"/>
416	<xsl:with-param name="value" select="$mask"/>
417      </xsl:call-template>
418    </xsl:variable>
419    <xsl:variable name="maskhex">
420      <xsl:text>0x</xsl:text>
421      <xsl:call-template name="dectohex">
422	<xsl:with-param name="number" select="$maskshifted"/>
423      </xsl:call-template>
424    </xsl:variable>
425    <UML:Classifier.feature>
426      <UML:Attribute>
427	<xsl:attribute name="name">
428	  <xsl:value-of select="@name"/>
429	</xsl:attribute>
430	<UML:ModelElement.taggedValue>
431	  <UML:TaggedValue>
432	    <UML:TaggedValue.dataValue/>
433	    <UML:TaggedValue.type>
434	      <UML:TagDefinition xmi.idref="comment"/>
435	    </UML:TaggedValue.type>
436	  </UML:TaggedValue>
437	</UML:ModelElement.taggedValue>
438	<UML:ModelElement.taggedValue>
439	  <UML:TaggedValue>
440	    <UML:TaggedValue.dataValue>
441	      <xsl:value-of select="$offset"/>
442	    </UML:TaggedValue.dataValue>
443	    <UML:TaggedValue.type>
444	      <UML:TagDefinition xmi.idref="offset"/>
445	    </UML:TaggedValue.type>
446	  </UML:TaggedValue>
447	</UML:ModelElement.taggedValue>
448	<UML:ModelElement.taggedValue>
449	  <UML:TaggedValue>
450	    <UML:TaggedValue.dataValue>
451	      <xsl:value-of select="$shift"/>
452	    </UML:TaggedValue.dataValue>
453	    <UML:TaggedValue.type>
454	      <UML:TagDefinition xmi.idref="shift"/>
455	    </UML:TaggedValue.type>
456	  </UML:TaggedValue>
457	</UML:ModelElement.taggedValue>
458	<UML:ModelElement.taggedValue>
459	  <UML:TaggedValue>
460	    <UML:TaggedValue.dataValue>
461	      <xsl:value-of select="$maskhex"/>
462	    </UML:TaggedValue.dataValue>
463	    <UML:TaggedValue.type>
464	      <UML:TagDefinition xmi.idref="mask"/>
465	    </UML:TaggedValue.type>
466	  </UML:TaggedValue>
467	</UML:ModelElement.taggedValue>
468	<UML:ModelElement.taggedValue>
469	  <UML:TaggedValue>
470	    <UML:TaggedValue.dataValue>
471	      <xsl:value-of select="@bits"/>
472	    </UML:TaggedValue.dataValue>
473	    <UML:TaggedValue.type>
474	      <UML:TagDefinition xmi.idref="bits"/>
475	    </UML:TaggedValue.type>
476	  </UML:TaggedValue>
477	</UML:ModelElement.taggedValue>
478	<UML:ModelElement.taggedValue>
479	  <UML:TaggedValue>
480	    <UML:TaggedValue.dataValue>
481	      <xsl:choose>
482		<xsl:when test="@token">
483		  <xsl:value-of select="@token"/>
484		</xsl:when>
485		<xsl:otherwise>
486		  <xsl:text>rtf:</xsl:text>
487		  <xsl:value-of select="@name"/>
488		</xsl:otherwise>
489	      </xsl:choose>
490	    </UML:TaggedValue.dataValue>
491	    <UML:TaggedValue.type>
492	      <UML:TagDefinition xmi.idref="attrid"/>
493	    </UML:TaggedValue.type>
494	  </UML:TaggedValue>
495	</UML:ModelElement.taggedValue>
496	<UML:StructuralFeature.type>
497	  <UML:DataType>
498	    <xsl:attribute name="xmi.idref">
499	      <xsl:value-of select="ancestor::bitfield/@type"/>
500	    </xsl:attribute>
501	  </UML:DataType>
502	</UML:StructuralFeature.type>
503	<UML:ModelElement.stereotype>
504	  <UML:Stereotype xmi.idref="attribute"/>
505	</UML:ModelElement.stereotype>
506      </UML:Attribute>
507    </UML:Classifier.feature>
508  </xsl:template>
509
510  <xsl:template match="operation">
511    <UML:Classifier.feature>
512      <UML:Operation>
513	<xsl:attribute name="name">
514	  <xsl:value-of select="@name"/>
515	</xsl:attribute>
516	<xsl:call-template name="taggedvalue">
517	  <xsl:with-param name="type">opid</xsl:with-param>
518	  <xsl:with-param name="value">
519	    <xsl:choose>
520	      <xsl:when test="@token">
521		<xsl:value-of select="@token"/>
522	      </xsl:when>
523	      <xsl:otherwise>
524		<xsl:text>rtf:</xsl:text>
525		<xsl:value-of select="@name"/>
526	      </xsl:otherwise>
527	    </xsl:choose>
528	  </xsl:with-param>
529	</xsl:call-template>
530	<xsl:if test="@array-count">
531	  <xsl:call-template name="taggedvalue">
532	    <xsl:with-param name="type">arraycount</xsl:with-param>
533	    <xsl:with-param name="value">
534	      <xsl:value-of select="@array-count"/>
535	    </xsl:with-param>
536	  </xsl:call-template>
537	</xsl:if>
538	<UML:BehavioralFeature.parameter>
539	  <UML:Parameter kind="return" name="return">
540	    <UML:Parameter.type>
541	      <UML:Class>
542		<xsl:attribute name="xmi.idref">
543		  <xsl:value-of select="@type"/>
544		</xsl:attribute>
545	      </UML:Class>
546	    </UML:Parameter.type>
547	  </UML:Parameter>
548	</UML:BehavioralFeature.parameter>
549	<xsl:choose>
550	  <xsl:when test="@array-count or stereotype[text()='array']">
551	    <UML:ModelElement.stereotype>
552	      <UML:Stereotype xmi.idref="array"/>
553	    </UML:ModelElement.stereotype>
554	  </xsl:when>
555	  <xsl:otherwise>
556	    <UML:ModelElement.stereotype>
557	      <UML:Stereotype xmi.idref="attribute"/>
558	    </UML:ModelElement.stereotype>
559	  </xsl:otherwise>
560	</xsl:choose>
561      </UML:Operation>
562    </UML:Classifier.feature>
563  </xsl:template>
564</xsl:stylesheet>
565