src/share/jaxws_classes/com/sun/xml/internal/ws/api/server/AbstractInstanceResolver.java

changeset 0
373ffda63c9a
child 637
9c07ef4934dd
equal deleted inserted replaced
-1:000000000000 0:373ffda63c9a
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
26 package com.sun.xml.internal.ws.api.server;
27
28 import com.sun.istack.internal.Nullable;
29 import com.sun.istack.internal.localization.Localizable;
30 import com.sun.xml.internal.ws.api.server.InstanceResolver;
31 import com.sun.xml.internal.ws.api.server.ResourceInjector;
32 import com.sun.xml.internal.ws.api.server.WSEndpoint;
33 import com.sun.xml.internal.ws.resources.ServerMessages;
34 import com.sun.xml.internal.ws.server.ServerRtException;
35
36 import java.lang.annotation.Annotation;
37 import java.lang.reflect.InvocationTargetException;
38 import java.lang.reflect.Method;
39 import java.security.AccessController;
40 import java.security.PrivilegedAction;
41
42 /**
43 * Partial implementation of {@link InstanceResolver} with
44 * convenience methods to do the resource injection.
45 *
46 * @author Kohsuke Kawaguchi
47 * @since 2.2.6
48 */
49 public abstract class AbstractInstanceResolver<T> extends InstanceResolver<T> {
50
51 protected static ResourceInjector getResourceInjector(WSEndpoint endpoint) {
52 ResourceInjector ri = endpoint.getContainer().getSPI(ResourceInjector.class);
53 if(ri==null)
54 ri = ResourceInjector.STANDALONE;
55 return ri;
56 }
57
58 /**
59 * Helper for invoking a method with elevated privilege.
60 */
61 protected static void invokeMethod(final @Nullable Method method, final Object instance, final Object... args) {
62 if(method==null) return;
63 AccessController.doPrivileged(new PrivilegedAction<Void>() {
64 public Void run() {
65 try {
66 if (!method.isAccessible()) {
67 method.setAccessible(true);
68 }
69 MethodUtil.invoke(instance,method, args);
70 } catch (IllegalAccessException e) {
71 throw new ServerRtException("server.rt.err",e);
72 } catch (InvocationTargetException e) {
73 throw new ServerRtException("server.rt.err",e);
74 }
75 return null;
76 }
77 });
78 }
79
80 /**
81 * Finds the method that has the given annotation, while making sure that
82 * there's only at most one such method.
83 */
84 protected final @Nullable Method findAnnotatedMethod(Class clazz, Class<? extends Annotation> annType) {
85 boolean once = false;
86 Method r = null;
87 for(Method method : clazz.getDeclaredMethods()) {
88 if (method.getAnnotation(annType) != null) {
89 if (once)
90 throw new ServerRtException(ServerMessages.ANNOTATION_ONLY_ONCE(annType));
91 if (method.getParameterTypes().length != 0)
92 throw new ServerRtException(ServerMessages.NOT_ZERO_PARAMETERS(method));
93 r = method;
94 once = true;
95 }
96 }
97 return r;
98 }
99 }

mercurial