1/*
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.xml.internal.ws.wsdl.parser;
27
28import com.sun.xml.internal.ws.api.wsdl.parser.WSDLParserExtension;
29import com.sun.xml.internal.ws.api.wsdl.parser.WSDLParserExtensionContext;
30import com.sun.xml.internal.ws.api.model.wsdl.editable.*;
31import com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil;
32
33import javax.xml.stream.XMLStreamReader;
34import javax.xml.stream.Location;
35
36import org.xml.sax.Locator;
37import org.xml.sax.helpers.LocatorImpl;
38
39/**
40 * {@link WSDLParserExtension} that delegates to
41 * multiple {@link WSDLParserExtension}s.
42 *
43 * <p>
44 * This simplifies {@link RuntimeWSDLParser} since it now
45 * only needs to work with one {@link WSDLParserExtension}.
46 *
47 * <p>
48 * This class is guaranteed to return true from
49 * all the extension callback methods.
50 *
51 * @author Kohsuke Kawaguchi
52 */
53final class WSDLParserExtensionFacade extends WSDLParserExtension {
54    private final WSDLParserExtension[] extensions;
55
56    WSDLParserExtensionFacade(WSDLParserExtension... extensions) {
57        assert extensions!=null;
58        this.extensions = extensions;
59    }
60
61    public void start(WSDLParserExtensionContext context) {
62        for (WSDLParserExtension e : extensions) {
63            e.start(context);
64        }
65    }
66
67    public boolean serviceElements(EditableWSDLService service, XMLStreamReader reader) {
68        for (WSDLParserExtension e : extensions) {
69            if(e.serviceElements(service,reader))
70                return true;
71        }
72        XMLStreamReaderUtil.skipElement(reader);
73        return true;
74    }
75
76    public void serviceAttributes(EditableWSDLService service, XMLStreamReader reader) {
77        for (WSDLParserExtension e : extensions)
78            e.serviceAttributes(service,reader);
79    }
80
81    public boolean portElements(EditableWSDLPort port, XMLStreamReader reader) {
82        for (WSDLParserExtension e : extensions) {
83            if(e.portElements(port,reader))
84                return true;
85        }
86        //extension is not understood by any WSDlParserExtension
87        //Check if it must be understood.
88        if(isRequiredExtension(reader)) {
89            port.addNotUnderstoodExtension(reader.getName(),getLocator(reader));
90        }
91        XMLStreamReaderUtil.skipElement(reader);
92        return true;
93    }
94
95    public boolean portTypeOperationInput(EditableWSDLOperation op, XMLStreamReader reader) {
96        for (WSDLParserExtension e : extensions)
97            e.portTypeOperationInput(op,reader);
98
99        return false;
100    }
101
102    public boolean portTypeOperationOutput(EditableWSDLOperation op, XMLStreamReader reader) {
103        for (WSDLParserExtension e : extensions)
104            e.portTypeOperationOutput(op,reader);
105
106        return false;
107    }
108
109    public boolean portTypeOperationFault(EditableWSDLOperation op, XMLStreamReader reader) {
110        for (WSDLParserExtension e : extensions)
111            e.portTypeOperationFault(op,reader);
112
113        return false;
114    }
115
116    public void portAttributes(EditableWSDLPort port, XMLStreamReader reader) {
117        for (WSDLParserExtension e : extensions)
118            e.portAttributes(port,reader);
119    }
120
121    public boolean definitionsElements(XMLStreamReader reader){
122        for (WSDLParserExtension e : extensions) {
123            if (e.definitionsElements(reader)) {
124                return true;
125            }
126        }
127        XMLStreamReaderUtil.skipElement(reader);
128        return true;
129    }
130
131    public boolean bindingElements(EditableWSDLBoundPortType binding, XMLStreamReader reader){
132        for (WSDLParserExtension e : extensions) {
133            if (e.bindingElements(binding, reader)) {
134                return true;
135            }
136        }
137        //extension is not understood by any WSDlParserExtension
138        //Check if it must be understood.
139        if (isRequiredExtension(reader)) {
140            binding.addNotUnderstoodExtension(
141                    reader.getName(), getLocator(reader));
142        }
143        XMLStreamReaderUtil.skipElement(reader);
144        return true;
145    }
146
147    public void bindingAttributes(EditableWSDLBoundPortType binding, XMLStreamReader reader){
148        for (WSDLParserExtension e : extensions) {
149            e.bindingAttributes(binding, reader);
150        }
151    }
152
153    public boolean portTypeElements(EditableWSDLPortType portType, XMLStreamReader reader) {
154        for (WSDLParserExtension e : extensions) {
155            if (e.portTypeElements(portType, reader)) {
156                return true;
157            }
158        }
159        XMLStreamReaderUtil.skipElement(reader);
160        return true;
161    }
162
163    public void portTypeAttributes(EditableWSDLPortType portType, XMLStreamReader reader) {
164        for (WSDLParserExtension e : extensions) {
165            e.portTypeAttributes(portType, reader);
166        }
167    }
168
169    public boolean portTypeOperationElements(EditableWSDLOperation operation, XMLStreamReader reader) {
170        for (WSDLParserExtension e : extensions) {
171            if (e.portTypeOperationElements(operation, reader)) {
172                return true;
173            }
174        }
175        XMLStreamReaderUtil.skipElement(reader);
176        return true;
177    }
178
179    public void portTypeOperationAttributes(EditableWSDLOperation operation, XMLStreamReader reader) {
180        for (WSDLParserExtension e : extensions) {
181            e.portTypeOperationAttributes(operation, reader);
182        }
183    }
184
185    public boolean bindingOperationElements(EditableWSDLBoundOperation operation, XMLStreamReader reader) {
186        for (WSDLParserExtension e : extensions) {
187            if (e.bindingOperationElements(operation, reader)) {
188                return true;
189            }
190        }
191        XMLStreamReaderUtil.skipElement(reader);
192        return true;
193    }
194
195    public void bindingOperationAttributes(EditableWSDLBoundOperation operation, XMLStreamReader reader) {
196        for (WSDLParserExtension e : extensions) {
197            e.bindingOperationAttributes(operation, reader);
198        }
199    }
200
201    public boolean messageElements(EditableWSDLMessage msg, XMLStreamReader reader) {
202        for (WSDLParserExtension e : extensions) {
203            if (e.messageElements(msg, reader)) {
204                return true;
205            }
206        }
207        XMLStreamReaderUtil.skipElement(reader);
208        return true;
209    }
210
211    public void messageAttributes(EditableWSDLMessage msg, XMLStreamReader reader) {
212        for (WSDLParserExtension e : extensions) {
213            e.messageAttributes(msg, reader);
214        }
215    }
216
217    public boolean portTypeOperationInputElements(EditableWSDLInput input, XMLStreamReader reader) {
218        for (WSDLParserExtension e : extensions) {
219            if (e.portTypeOperationInputElements(input, reader)) {
220                return true;
221            }
222        }
223        XMLStreamReaderUtil.skipElement(reader);
224        return true;
225    }
226
227    public void portTypeOperationInputAttributes(EditableWSDLInput input, XMLStreamReader reader) {
228        for (WSDLParserExtension e : extensions) {
229            e.portTypeOperationInputAttributes(input, reader);
230        }
231    }
232
233    public boolean portTypeOperationOutputElements(EditableWSDLOutput output, XMLStreamReader reader) {
234        for (WSDLParserExtension e : extensions) {
235            if (e.portTypeOperationOutputElements(output, reader)) {
236                return true;
237            }
238        }
239        XMLStreamReaderUtil.skipElement(reader);
240        return true;
241    }
242
243    public void portTypeOperationOutputAttributes(EditableWSDLOutput output, XMLStreamReader reader) {
244        for (WSDLParserExtension e : extensions) {
245            e.portTypeOperationOutputAttributes(output, reader);
246        }
247    }
248
249    public boolean portTypeOperationFaultElements(EditableWSDLFault fault, XMLStreamReader reader) {
250        for (WSDLParserExtension e : extensions) {
251            if (e.portTypeOperationFaultElements(fault, reader)) {
252                return true;
253            }
254        }
255        XMLStreamReaderUtil.skipElement(reader);
256        return true;
257    }
258
259    public void portTypeOperationFaultAttributes(EditableWSDLFault fault, XMLStreamReader reader) {
260        for (WSDLParserExtension e : extensions) {
261            e.portTypeOperationFaultAttributes(fault, reader);
262        }
263    }
264
265    public boolean bindingOperationInputElements(EditableWSDLBoundOperation operation, XMLStreamReader reader) {
266        for (WSDLParserExtension e : extensions) {
267            if (e.bindingOperationInputElements(operation, reader)) {
268                return true;
269            }
270        }
271        XMLStreamReaderUtil.skipElement(reader);
272        return true;
273    }
274
275    public void bindingOperationInputAttributes(EditableWSDLBoundOperation operation, XMLStreamReader reader) {
276        for (WSDLParserExtension e : extensions) {
277            e.bindingOperationInputAttributes(operation, reader);
278        }
279    }
280
281    public boolean bindingOperationOutputElements(EditableWSDLBoundOperation operation, XMLStreamReader reader) {
282        for (WSDLParserExtension e : extensions) {
283            if (e.bindingOperationOutputElements(operation, reader)) {
284                return true;
285            }
286        }
287        XMLStreamReaderUtil.skipElement(reader);
288        return true;
289    }
290
291    public void bindingOperationOutputAttributes(EditableWSDLBoundOperation operation, XMLStreamReader reader) {
292        for (WSDLParserExtension e : extensions) {
293            e.bindingOperationOutputAttributes(operation, reader);
294        }
295    }
296
297    public boolean bindingOperationFaultElements(EditableWSDLBoundFault fault, XMLStreamReader reader) {
298        for (WSDLParserExtension e : extensions) {
299            if (e.bindingOperationFaultElements(fault, reader)) {
300                return true;
301            }
302        }
303        XMLStreamReaderUtil.skipElement(reader);
304        return true;
305    }
306
307    public void bindingOperationFaultAttributes(EditableWSDLBoundFault fault, XMLStreamReader reader) {
308        for (WSDLParserExtension e : extensions) {
309            e.bindingOperationFaultAttributes(fault, reader);
310        }
311    }
312
313    public void finished(WSDLParserExtensionContext context) {
314        for (WSDLParserExtension e : extensions) {
315            e.finished(context);
316        }
317    }
318
319    public void postFinished(WSDLParserExtensionContext context) {
320        for (WSDLParserExtension e : extensions) {
321            e.postFinished(context);
322        }
323    }
324    /**
325     *
326     * @param reader
327     * @return If the element has wsdl:required attribute set to true
328     */
329
330    private boolean isRequiredExtension(XMLStreamReader reader) {
331        String required = reader.getAttributeValue(WSDLConstants.NS_WSDL, "required");
332        if(required != null)
333            return Boolean.parseBoolean(required);
334        return false;
335    }
336
337    private Locator getLocator(XMLStreamReader reader) {
338        Location location = reader.getLocation();
339            LocatorImpl loc = new LocatorImpl();
340            loc.setSystemId(location.getSystemId());
341            loc.setLineNumber(location.getLineNumber());
342        return loc;
343    }
344
345}
346