1/*
2 * Copyright (c) 2005, 2017, 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 javax.xml.ws.spi;
27
28import java.util.Iterator;
29import javax.xml.namespace.QName;
30import javax.xml.ws.Dispatch;
31import javax.xml.ws.Service;
32import javax.xml.ws.handler.HandlerResolver;
33import javax.xml.ws.WebServiceFeature;
34import javax.xml.bind.JAXBContext;
35import javax.xml.ws.EndpointReference;
36import javax.xml.ws.WebServiceException;
37
38
39/**
40 * Service delegates are used internally by {@code Service} objects
41 * to allow pluggability of JAX-WS implementations.
42 * <p>
43 * Every {@code Service} object has its own delegate, created using
44 * the {@link javax.xml.ws.spi.Provider#createServiceDelegate} method. A {@code Service}
45 * object delegates all of its instance methods to its delegate.
46 *
47 * @see javax.xml.ws.Service
48 * @see javax.xml.ws.spi.Provider
49 *
50 * @since 1.6, JAX-WS 2.0
51 */
52public abstract class ServiceDelegate {
53
54    /**
55     * Default constructor.
56     */
57    protected ServiceDelegate() {
58    }
59
60    /**
61     * The {@code getPort} method returns a proxy. A service client
62     * uses this proxy to invoke operations on the target
63     * service endpoint. The {@code serviceEndpointInterface}
64     * specifies the service endpoint interface that is supported by
65     * the created dynamic proxy instance.
66     *
67     * @param <T> Service endpoint interface
68     * @param portName  Qualified name of the service endpoint in
69     *                  the WSDL service description
70     * @param serviceEndpointInterface Service endpoint interface
71     *                  supported by the dynamic proxy
72     * @return Object Proxy instance that
73     *                supports the specified service endpoint
74     *                interface
75     * @throws WebServiceException This exception is thrown in the
76     *                  following cases:
77     *                  <UL>
78     *                  <LI>If there is an error in creation of
79     *                      the proxy
80     *                  <LI>If there is any missing WSDL metadata
81     *                      as required by this method
82     *                  <LI>If an illegal
83     *                      {@code serviceEndpointInterface}
84     *                      or {@code portName} is specified
85     *                  </UL>
86     * @see java.lang.reflect.Proxy
87     * @see java.lang.reflect.InvocationHandler
88     **/
89    public abstract <T> T getPort(QName portName,
90            Class<T> serviceEndpointInterface);
91
92    /**
93     * The {@code getPort} method returns a proxy. A service client
94     * uses this proxy to invoke operations on the target
95     * service endpoint. The {@code serviceEndpointInterface}
96     * specifies the service endpoint interface that is supported by
97     * the created dynamic proxy instance.
98     *
99     * @param <T> Service endpoint interface
100     * @param portName  Qualified name of the service endpoint in
101     *                  the WSDL service description
102     * @param serviceEndpointInterface Service endpoint interface
103     *                  supported by the dynamic proxy or instance
104     * @param features  A list of WebServiceFeatures to configure on the
105     *                proxy.  Supported features not in the {@code features
106     *                } parameter will have their default values.
107     * @return Object Proxy instance that
108     *                supports the specified service endpoint
109     *                interface
110     * @throws WebServiceException This exception is thrown in the
111     *                  following cases:
112     *                  <UL>
113     *                  <LI>If there is an error in creation of
114     *                      the proxy
115     *                  <LI>If there is any missing WSDL metadata
116     *                      as required by this method
117     *                  <LI>If an illegal
118     *                      {@code serviceEndpointInterface}
119     *                      or {@code portName} is specified
120     *                  <LI>If a feature is enabled that is not compatible
121     *                      with this port or is unsupported.
122     *                  </UL>
123     * @see java.lang.reflect.Proxy
124     * @see java.lang.reflect.InvocationHandler
125     * @see WebServiceFeature
126     *
127     * @since 1.6, JAX-WS 2.1
128     **/
129    public abstract <T> T getPort(QName portName,
130            Class<T> serviceEndpointInterface, WebServiceFeature... features);
131
132    /**
133     * The {@code getPort} method returns a proxy.
134     * The parameter {@code endpointReference} specifies the
135     * endpoint that will be invoked by the returned proxy.  If there
136     * are any reference parameters in the
137     * {@code endpointReference}, then those reference
138     * parameters MUST appear as SOAP headers, indicating them to be
139     * reference parameters, on all messages sent to the endpoint.
140     * The {@code endpointReference's} address MUST be used
141     * for invocations on the endpoint.
142     * The parameter {@code serviceEndpointInterface} specifies
143     * the service endpoint interface that is supported by the
144     * returned proxy.
145     * In the implementation of this method, the JAX-WS
146     * runtime system takes the responsibility of selecting a protocol
147     * binding (and a port) and configuring the proxy accordingly from
148     * the WSDL associated with this {@code Service} instance or
149     * from the metadata from the {@code endpointReference}.
150     * If this {@code Service} instance has a WSDL and
151     * the {@code endpointReference} metadata
152     * also has a WSDL, then the WSDL from this instance MUST be used.
153     * If this {@code Service} instance does not have a WSDL and
154     * the {@code endpointReference} does have a WSDL, then the
155     * WSDL from the {@code endpointReference} MAY be used.
156     * The returned proxy should not be reconfigured by the client.
157     * If this {@code Service} instance has a known proxy
158     * port that matches the information contained in
159     * the WSDL,
160     * then that proxy is returned, otherwise a WebServiceException
161     * is thrown.
162     * <p>
163     * Calling this method has the same behavior as the following
164     * <pre>
165     * {@code port = service.getPort(portName, serviceEndpointInterface);}
166     * </pre>
167     * where the {@code portName} is retrieved from the
168     * metadata of the {@code endpointReference} or from the
169     * {@code serviceEndpointInterface} and the WSDL
170     * associated with this {@code Service} instance.
171     *
172     * @param <T> Service endpoint interface.
173     * @param endpointReference  The {@code EndpointReference}
174     * for the target service endpoint that will be invoked by the
175     * returned proxy.
176     * @param serviceEndpointInterface Service endpoint interface.
177     * @param features  A list of {@code WebServiceFeatures} to configure on the
178     *                proxy.  Supported features not in the {@code features
179     *                } parameter will have their default values.
180     * @return Object Proxy instance that supports the
181     *                  specified service endpoint interface.
182     * @throws WebServiceException
183     *                  <UL>
184     *                  <LI>If there is an error during creation
185     *                      of the proxy.
186     *                  <LI>If there is any missing WSDL metadata
187     *                      as required by this method.
188     *                  <LI>If the {@code endpointReference} metadata does
189     *                      not match the {@code serviceName} of this
190     *                      {@code Service} instance.
191     *                  <LI>If a {@code portName} cannot be extracted
192     *                      from the WSDL or {@code endpointReference} metadata.
193     *                  <LI>If an invalid
194     *                      {@code endpointReference}
195     *                      is specified.
196     *                  <LI>If an invalid
197     *                      {@code serviceEndpointInterface}
198     *                      is specified.
199     *                  <LI>If a feature is enabled that is not compatible
200     *                      with this port or is unsupported.
201     *                  </UL>
202     *
203     * @since 1.6, JAX-WS 2.1
204     **/
205    public abstract <T> T getPort(EndpointReference endpointReference,
206           Class<T> serviceEndpointInterface, WebServiceFeature... features);
207
208
209    /**
210     * The {@code getPort} method returns a proxy. The parameter
211     * {@code serviceEndpointInterface} specifies the service
212     * endpoint interface that is supported by the returned proxy.
213     * In the implementation of this method, the JAX-WS
214     * runtime system takes the responsibility of selecting a protocol
215     * binding (and a port) and configuring the proxy accordingly.
216     * The returned proxy should not be reconfigured by the client.
217     *
218     * @param <T> Service endpoint interface
219     * @param serviceEndpointInterface Service endpoint interface
220     * @return Object instance that supports the
221     *                  specified service endpoint interface
222     * @throws WebServiceException
223     *                  <UL>
224     *                  <LI>If there is an error during creation
225     *                      of the proxy
226     *                  <LI>If there is any missing WSDL metadata
227     *                      as required by this method
228     *                  <LI>If an illegal
229     *                      {@code serviceEndpointInterface}
230     *                      is specified
231     *                  </UL>
232     **/
233    public abstract <T> T getPort(Class<T> serviceEndpointInterface);
234
235
236    /**
237     * The {@code getPort} method returns a proxy. The parameter
238     * {@code serviceEndpointInterface} specifies the service
239     * endpoint interface that is supported by the returned proxy.
240     * In the implementation of this method, the JAX-WS
241     * runtime system takes the responsibility of selecting a protocol
242     * binding (and a port) and configuring the proxy accordingly.
243     * The returned proxy should not be reconfigured by the client.
244     *
245     * @param <T> Service endpoint interface
246     * @param serviceEndpointInterface Service endpoint interface
247     * @param features  An array of {@code WebServiceFeatures} to configure on the
248     *                proxy.  Supported features not in the {@code features
249     *                } parameter will have their default values.
250     * @return Object instance that supports the
251     *                  specified service endpoint interface
252     * @throws WebServiceException
253     *                  <UL>
254     *                  <LI>If there is an error during creation
255     *                      of the proxy
256     *                  <LI>If there is any missing WSDL metadata
257     *                      as required by this method
258     *                  <LI>If an illegal
259     *                      {@code serviceEndpointInterface}
260     *                      is specified
261     *                  <LI>If a feature is enabled that is not compatible
262     *                      with this port or is unsupported.
263     *                  </UL>
264     *
265     * @see WebServiceFeature
266     *
267     * @since 1.6, JAX-WS 2.1
268     **/
269    public abstract <T> T getPort(Class<T> serviceEndpointInterface,
270            WebServiceFeature... features);
271
272
273    /**
274     * Creates a new port for the service. Ports created in this way contain
275     * no WSDL port type information and can only be used for creating
276     * {@code Dispatch}instances.
277     *
278     * @param portName  Qualified name for the target service endpoint
279     * @param bindingId A URI identifier of a binding.
280     * @param endpointAddress Address of the target service endpoint as a URI
281     * @throws WebServiceException If any error in the creation of
282     * the port
283     *
284     * @see javax.xml.ws.soap.SOAPBinding#SOAP11HTTP_BINDING
285     * @see javax.xml.ws.soap.SOAPBinding#SOAP12HTTP_BINDING
286     * @see javax.xml.ws.http.HTTPBinding#HTTP_BINDING
287     **/
288    public abstract void addPort(QName portName, String bindingId,
289            String endpointAddress);
290
291
292
293    /**
294     * Creates a {@code Dispatch} instance for use with objects of
295     * the user's choosing.
296     *
297     * @param <T> type used for messages or message payloads. Implementations are required to
298     * support {@code javax.xml.transform.Source} and {@code javax.xml.soap.SOAPMessage}.
299     * @param portName  Qualified name for the target service endpoint
300     * @param type The class of object used for messages or message
301     * payloads. Implementations are required to support
302     * {@code javax.xml.transform.Source} and {@code javax.xml.soap.SOAPMessage}.
303     * @param mode Controls whether the created dispatch instance is message
304     * or payload oriented, i.e. whether the user will work with complete
305     * protocol messages or message payloads. E.g. when using the SOAP
306     * protocol, this parameter controls whether the user will work with
307     * SOAP messages or the contents of a SOAP body. Mode MUST be {@code MESSAGE}
308     * when type is {@code SOAPMessage}.
309     *
310     * @return Dispatch instance
311     * @throws WebServiceException If any error in the creation of
312     *                  the {@code Dispatch} object
313     * @see javax.xml.transform.Source
314     * @see javax.xml.soap.SOAPMessage
315     **/
316    public abstract <T> Dispatch<T> createDispatch(QName portName, Class<T> type,
317            Service.Mode mode);
318
319    /**
320     * Creates a {@code Dispatch} instance for use with objects of
321     * the user's choosing.
322     *
323     * @param <T> type used for messages or message payloads. Implementations are required to
324     * support {@code javax.xml.transform.Source} and {@code javax.xml.soap.SOAPMessage}.
325     * @param portName  Qualified name for the target service endpoint
326     * @param type The class of object used for messages or message
327     * payloads. Implementations are required to support
328     * {@code javax.xml.transform.Source} and {@code javax.xml.soap.SOAPMessage}.
329     * @param mode Controls whether the created dispatch instance is message
330     * or payload oriented, i.e. whether the user will work with complete
331     * protocol messages or message payloads. E.g. when using the SOAP
332     * protocol, this parameter controls whether the user will work with
333     * SOAP messages or the contents of a SOAP body. Mode MUST be {@code MESSAGE}
334     * when type is {@code SOAPMessage}.
335     * @param features  A list of {@code WebServiceFeatures} to configure on the
336     *                proxy.  Supported features not in the {@code features
337     *                } parameter will have their default values.
338     *
339     * @return Dispatch instance
340     * @throws WebServiceException If any error in the creation of
341     *                  the {@code Dispatch} object or if a
342     *                  feature is enabled that is not compatible with
343     *                  this port or is unsupported.
344     *
345     * @see javax.xml.transform.Source
346     * @see javax.xml.soap.SOAPMessage
347     * @see WebServiceFeature
348     *
349     * @since 1.6, JAX-WS 2.1
350     **/
351    public abstract <T> Dispatch<T> createDispatch(QName portName, Class<T> type,
352            Service.Mode mode, WebServiceFeature... features);
353
354    /**
355     * Creates a {@code Dispatch} instance for use with objects of
356     * the user's choosing. If there
357     * are any reference parameters in the
358     * {@code endpointReference}, then those reference
359     * parameters MUST appear as SOAP headers, indicating them to be
360     * reference parameters, on all messages sent to the endpoint.
361     * The {@code endpointReference's} address MUST be used
362     * for invocations on the endpoint.
363     * In the implementation of this method, the JAX-WS
364     * runtime system takes the responsibility of selecting a protocol
365     * binding (and a port) and configuring the dispatch accordingly from
366     * the WSDL associated with this {@code Service} instance or
367     * from the metadata from the {@code endpointReference}.
368     * If this {@code Service} instance has a WSDL and
369     * the {@code endpointReference}
370     * also has a WSDL in its metadata, then the WSDL from this instance MUST be used.
371     * If this {@code Service} instance does not have a WSDL and
372     * the {@code endpointReference} does have a WSDL, then the
373     * WSDL from the {@code endpointReference} MAY be used.
374     * An implementation MUST be able to retrieve the {@code portName} from the
375     * {@code endpointReference} metadata.
376     * <p>
377     * This method behaves the same as calling
378     * <pre>
379     * {@code dispatch = service.createDispatch(portName, type, mode, features);}
380     * </pre>
381     * where the {@code portName} is retrieved from the
382     * WSDL or {@code EndpointReference} metadata.
383     *
384     * @param <T> type of object used to messages or message
385     * payloads. Implementations are required to support
386     * {@code javax.xml.transform.Source} and {@code javax.xml.soap.SOAPMessage}.
387     * @param endpointReference  The {@code EndpointReference}
388     * for the target service endpoint that will be invoked by the
389     * returned {@code Dispatch} object.
390     * @param type The class of object used to messages or message
391     * payloads. Implementations are required to support
392     * {@code javax.xml.transform.Source} and {@code javax.xml.soap.SOAPMessage}.
393     * @param mode Controls whether the created dispatch instance is message
394     * or payload oriented, i.e. whether the user will work with complete
395     * protocol messages or message payloads. E.g. when using the SOAP
396     * protocol, this parameter controls whether the user will work with
397     * SOAP messages or the contents of a SOAP body. Mode MUST be {@code MESSAGE}
398     * when type is {@code SOAPMessage}.
399     * @param features  An array of {@code WebServiceFeatures} to configure on the
400     *                proxy.  Supported features not in the {@code features
401     *                } parameter will have their default values.
402     *
403     * @return Dispatch instance
404     * @throws WebServiceException
405     *                  <UL>
406     *                    <LI>If there is any missing WSDL metadata
407     *                      as required by this method.
408     *                    <li>If the {@code endpointReference} metadata does
409     *                      not match the {@code serviceName} or {@code portName}
410     *                      of a WSDL associated
411     *                      with this {@code Service} instance.
412     *                    <li>If the {@code portName} cannot be determined
413     *                    from the {@code EndpointReference} metadata.
414     *                    <li>If any error in the creation of
415     *                     the {@code Dispatch} object.
416     *                    <li>If a feature is enabled that is not
417     *                    compatible with this port or is unsupported.
418     *                  </UL>
419     *
420     * @see javax.xml.transform.Source
421     * @see javax.xml.soap.SOAPMessage
422     * @see WebServiceFeature
423     *
424     * @since 1.6, JAX-WS 2.1
425     **/
426    public abstract <T> Dispatch<T> createDispatch(EndpointReference endpointReference,
427            Class<T> type, Service.Mode mode,
428            WebServiceFeature... features);
429
430
431
432    /**
433     * Creates a {@code Dispatch} instance for use with JAXB
434     * generated objects.
435     *
436     * @param portName  Qualified name for the target service endpoint
437     * @param context The JAXB context used to marshall and unmarshall
438     * messages or message payloads.
439     * @param mode Controls whether the created dispatch instance is message
440     * or payload oriented, i.e. whether the user will work with complete
441     * protocol messages or message payloads. E.g. when using the SOAP
442     * protocol, this parameter controls whether the user will work with
443     * SOAP messages or the contents of a SOAP body.
444     *
445     * @return Dispatch instance
446     * @throws WebServiceException If any error in the creation of
447     *                  the {@code Dispatch} object
448     *
449     * @see javax.xml.bind.JAXBContext
450     **/
451    public abstract Dispatch<Object> createDispatch(QName portName,
452            JAXBContext context, Service.Mode mode);
453
454
455    /**
456     * Creates a {@code Dispatch} instance for use with JAXB
457     * generated objects.
458     *
459     * @param portName  Qualified name for the target service endpoint
460     * @param context The JAXB context used to marshall and unmarshall
461     * messages or message payloads.
462     * @param mode Controls whether the created dispatch instance is message
463     * or payload oriented, i.e. whether the user will work with complete
464     * protocol messages or message payloads. E.g. when using the SOAP
465     * protocol, this parameter controls whether the user will work with
466     * SOAP messages or the contents of a SOAP body.
467     * @param features  A list of {@code WebServiceFeatures} to configure on the
468     *                proxy.  Supported features not in the {@code features
469     *                } parameter will have their default values.
470     *
471     * @return Dispatch instance
472     * @throws WebServiceException If any error in the creation of
473     *                  the {@code Dispatch} object or if a
474     *                  feature is enabled that is not compatible with
475     *                  this port or is unsupported.
476     *
477     * @see javax.xml.bind.JAXBContext
478     * @see WebServiceFeature
479     *
480     * @since 1.6, JAX-WS 2.1
481     **/
482    public abstract Dispatch<Object> createDispatch(QName portName,
483            JAXBContext context, Service.Mode mode, WebServiceFeature... features);
484
485    /**
486     * Creates a {@code Dispatch} instance for use with JAXB
487     * generated objects. If there
488     * are any reference parameters in the
489     * {@code endpointReference}, then those reference
490     * parameters MUST appear as SOAP headers, indicating them to be
491     * reference parameters, on all messages sent to the endpoint.
492     * The {@code endpointReference's} address MUST be used
493     * for invocations on the endpoint.
494     * In the implementation of this method, the JAX-WS
495     * runtime system takes the responsibility of selecting a protocol
496     * binding (and a port) and configuring the dispatch accordingly from
497     * the WSDL associated with this {@code Service} instance or
498     * from the metadata from the {@code endpointReference}.
499     * If this {@code Service} instance has a WSDL and
500     * the {@code endpointReference}
501     * also has a WSDL in its metadata, then the WSDL from this instance
502     * MUST be used.
503     * If this {@code Service} instance does not have a WSDL and
504     * the {@code endpointReference} does have a WSDL, then the
505     * WSDL from the {@code endpointReference} MAY be used.
506     * An implementation MUST be able to retrieve the {@code portName} from the
507     * {@code endpointReference} metadata.
508     * <p>
509     * This method behavies the same as calling
510     * <pre>
511     * {@code dispatch = service.createDispatch(portName, context, mode, features);}
512     * </pre>
513     * where the {@code portName} is retrieved from the
514     * WSDL or {@code endpointReference} metadata.
515     *
516     * @param endpointReference  The {@code EndpointReference}
517     * for the target service endpoint that will be invoked by the
518     * returned {@code Dispatch} object.
519     * @param context The JAXB context used to marshall and unmarshall
520     * messages or message payloads.
521     * @param mode Controls whether the created dispatch instance is message
522     * or payload oriented, i.e. whether the user will work with complete
523     * protocol messages or message payloads. E.g. when using the SOAP
524     * protocol, this parameter controls whether the user will work with
525     * SOAP messages or the contents of a SOAP body.
526     * @param features  An array of {@code WebServiceFeatures} to configure on the
527     *                proxy.  Supported features not in the {@code features
528     *                } parameter will have their default values.
529     *
530     * @return Dispatch instance
531     * @throws WebServiceException
532     *                  <UL>
533     *                    <li>If there is any missing WSDL metadata
534     *                      as required by this method.
535     *                    <li>If the {@code endpointReference} metadata does
536     *                    not match the {@code serviceName} or {@code portName}
537     *                    of a WSDL associated
538     *                    with this {@code Service} instance.
539     *                    <li>If the {@code portName} cannot be determined
540     *                    from the {@code EndpointReference} metadata.
541     *                    <li>If any error in the creation of
542     *                    the {@code Dispatch} object.
543     *                    <li>if a feature is enabled that is not
544     *                    compatible with this port or is unsupported.
545     *                  </UL>
546     *
547     * @see javax.xml.bind.JAXBContext
548     * @see WebServiceFeature
549     *
550     * @since 1.6, JAX-WS 2.1
551    **/
552    public abstract Dispatch<Object> createDispatch(EndpointReference endpointReference,
553            JAXBContext context, Service.Mode mode,
554            WebServiceFeature... features);
555
556
557    /**
558     * Gets the name of this service.
559     * @return Qualified name of this service
560     **/
561    public abstract QName getServiceName();
562
563    /**
564     * Returns an {@code Iterator} for the list of
565     * {@code QName}s of service endpoints grouped by this
566     * service
567     *
568     * @return Returns {@code java.util.Iterator} with elements
569     *         of type {@code javax.xml.namespace.QName}
570     * @throws WebServiceException If this Service class does not
571     *         have access to the required WSDL metadata
572     **/
573    public abstract Iterator<javax.xml.namespace.QName> getPorts();
574
575    /**
576     * Gets the location of the WSDL document for this Service.
577     *
578     * @return URL for the location of the WSDL document for
579     *         this service
580     **/
581    public abstract java.net.URL getWSDLDocumentLocation();
582
583    /**
584     * Returns the configured handler resolver.
585     *
586     * @return HandlerResolver The {@code HandlerResolver} being
587     *         used by this {@code Service} instance, or {@code null}
588     *         if there isn't one.
589     **/
590    public abstract HandlerResolver getHandlerResolver();
591
592    /**
593     * Sets the {@code HandlerResolver} for this {@code Service}
594     * instance.
595     * <p>
596     * The handler resolver, if present, will be called once for each
597     * proxy or dispatch instance that is created, and the handler chain
598     * returned by the resolver will be set on the instance.
599     *
600     * @param handlerResolver The {@code HandlerResolver} to use
601     *        for all subsequently created proxy/dispatch objects.
602     *
603     * @see javax.xml.ws.handler.HandlerResolver
604     **/
605    public abstract void setHandlerResolver(HandlerResolver handlerResolver);
606
607    /**
608     * Returns the executor for this {@code Service}instance.
609     *
610     * The executor is used for all asynchronous invocations that
611     * require callbacks.
612     *
613     * @return The {@code java.util.concurrent.Executor} to be
614     *         used to invoke a callback.
615     *
616     * @see java.util.concurrent.Executor
617     **/
618    public abstract java.util.concurrent.Executor getExecutor();
619
620    /**
621     * Sets the executor for this {@code Service} instance.
622     *
623     * The executor is used for all asynchronous invocations that
624     * require callbacks.
625     *
626     * @param executor The {@code java.util.concurrent.Executor}
627     *        to be used to invoke a callback.
628     *
629     * @throws SecurityException If the instance does not support
630     *         setting an executor for security reasons (e.g. the
631     *         necessary permissions are missing).
632     *
633     * @see java.util.concurrent.Executor
634     **/
635    public abstract void setExecutor(java.util.concurrent.Executor executor);
636
637}
638