1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.util;
45
46 import java.lang.reflect.Constructor;
47 import java.lang.reflect.InvocationTargetException;
48 import java.net.URL;
49
50 import org.ietf.jgss.GSSManager;
51
52
53
54
55
56
57 public abstract class GSSManagerFactory {
58
59
60
61
62
63 public static GSSManagerFactory detect() {
64 return (SunGSSManagerFactory.isSupported()) ? new SunGSSManagerFactory()
65 : new DefaultGSSManagerFactory();
66 }
67
68
69
70
71
72
73
74
75 public abstract GSSManager newInstance(URL url);
76
77
78
79
80
81
82
83 private static class DefaultGSSManagerFactory extends GSSManagerFactory {
84 private static final GSSManager INSTANCE = GSSManager.getInstance();
85
86 @Override
87 public GSSManager newInstance(URL url) {
88 return INSTANCE;
89 }
90 }
91
92 private static class SunGSSManagerFactory extends GSSManagerFactory {
93 private static boolean IS_SUPPORTED;
94 private static Constructor<?> HTTP_CALLER_INFO_CONSTRUCTOR;
95 private static Constructor<?> HTTP_CALLER_CONSTRUCTOR;
96
97 private static Constructor<?> GSS_MANAGER_IMPL_CONSTRUCTOR;
98
99 static {
100 try {
101 init();
102 IS_SUPPORTED = true;
103 } catch (Exception e) {
104 IS_SUPPORTED = false;
105 }
106 }
107
108 private static void init() throws ClassNotFoundException,
109 NoSuchMethodException {
110 Class<?> httpCallerInfoClazz = Class
111 .forName("sun.net.www.protocol.http.HttpCallerInfo");
112 HTTP_CALLER_INFO_CONSTRUCTOR = httpCallerInfoClazz
113 .getConstructor(URL.class);
114
115 Class<?> httpCallerClazz = Class
116 .forName("sun.security.jgss.HttpCaller");
117 HTTP_CALLER_CONSTRUCTOR = httpCallerClazz
118 .getConstructor(httpCallerInfoClazz);
119
120 Class<?> gssCallerClazz = Class
121 .forName("sun.security.jgss.GSSCaller");
122 Class<?> gssManagerImplClazz = Class
123 .forName("sun.security.jgss.GSSManagerImpl");
124 GSS_MANAGER_IMPL_CONSTRUCTOR = gssManagerImplClazz
125 .getConstructor(gssCallerClazz);
126
127 }
128
129
130
131
132
133
134 public static boolean isSupported() {
135 return IS_SUPPORTED;
136 }
137
138 @Override
139 public GSSManager newInstance(URL url) {
140 try {
141 Object httpCallerInfo = HTTP_CALLER_INFO_CONSTRUCTOR
142 .newInstance(url);
143 Object httpCaller = HTTP_CALLER_CONSTRUCTOR
144 .newInstance(httpCallerInfo);
145
146 return (GSSManager) GSS_MANAGER_IMPL_CONSTRUCTOR
147 .newInstance(httpCaller);
148 } catch (InstantiationException e) {
149 throw new Error(e);
150 } catch (IllegalAccessException e) {
151 throw new Error(e);
152 } catch (IllegalArgumentException e) {
153 throw new Error(e);
154 } catch (InvocationTargetException e) {
155 throw new Error(e);
156 }
157 }
158 }
159 }