2 * Inter Process Communication with Web browser
4 * License : The MIT License
5 * Copyright(c) 2009 olyutorskii
8 package jp.sfjp.jindolf.dxchg;
10 import java.awt.GraphicsEnvironment;
11 import java.awt.HeadlessException;
12 import java.io.IOException;
13 import java.lang.reflect.Field;
14 import java.lang.reflect.InvocationTargetException;
15 import java.lang.reflect.Method;
20 * java.awt.Desktopの代用品。
21 * JRE1.6でしか使えない。がしかし、JRE1.5でもコンパイル&ロード可能。
22 * ※参照: java.awt.Desktop
24 public final class WebIPC{
26 private static final Class<?> DESKTOP_KLASS;
27 private static final Method METHOD_ISDESKTOPSUPPORTED;
28 private static final Method METHOD_GETDESKTOP;
29 private static final Method METHOD_ISSUPPORTED;
30 private static final Method METHOD_BROWSE;
32 private static final Class<?> DESKTOP_ACTION_KLASS;
33 private static final Enum<?> BROWSE_ENUM;
36 DESKTOP_KLASS = getClass("java.awt.Desktop");
37 DESKTOP_ACTION_KLASS = getInnerClass(DESKTOP_KLASS,
38 "java.awt.Desktop.Action");
40 METHOD_ISDESKTOPSUPPORTED = getMethod("isDesktopSupported");
41 METHOD_GETDESKTOP = getMethod("getDesktop");
42 METHOD_ISSUPPORTED = getMethod("isSupported",
43 DESKTOP_ACTION_KLASS);
44 METHOD_BROWSE = getMethod("browse",
47 BROWSE_ENUM = getEnumMember(DESKTOP_ACTION_KLASS, "BROWSE");
51 private final Object desktop;
56 * @throws HeadlessException GUI環境が未接続
57 * @throws UnsupportedOperationException 未サポート
60 throws HeadlessException,
61 UnsupportedOperationException {
65 this.desktop = METHOD_GETDESKTOP.invoke(null, (Object[]) null);
66 }catch(InvocationTargetException e){
67 Throwable targetException = e.getTargetException();
69 if(targetException instanceof RuntimeException){
70 throw (RuntimeException) targetException;
72 if(targetException instanceof Error){
73 throw (Error) targetException;
76 AssertionError thw = new AssertionError();
79 }catch(IllegalAccessException e){
80 AssertionError thw = new AssertionError();
90 * クラス名からClassインスタンスを探す。
91 * @param klassName クラス名
92 * @return Classインスタンス。クラスが見つからなければnull。
94 private static Class<?> getClass(String klassName){
97 result = Class.forName(klassName);
98 }catch(ClassNotFoundException e){
105 * 内部クラス名からClassインスタンスを探す。
106 * @param parent 囲む親クラス。
107 * @param canonical 内部クラスのカノニカル名
108 * @return Classインスタンス。クラスが見つからなければnull。
110 private static Class<?> getInnerClass(Class<?> parent,
112 if(parent == null) return null;
114 Class<?> result = null;
116 Class<?>[] innerKlasses = parent.getClasses();
117 for(Class<?> klass : innerKlasses){
118 if(klass.getCanonicalName().equals(canonical)){
128 * Desktopクラスのメソッド名からMethodインスタンスを探す。
129 * @param methodName メソッド名
130 * @param paramTypes 引数型並び
131 * @return Methodインスタンス。見つからなければnull。
133 private static Method getMethod(String methodName,
134 Class<?>... paramTypes){
135 if(DESKTOP_KLASS == null) return null;
140 result = DESKTOP_KLASS.getMethod(methodName, paramTypes);
141 }catch(NoSuchMethodException e){
150 * @param parent Enumの型
151 * @param memberName メンバ名
152 * @return Enumインスタンス。見つからなければnull。
154 private static Enum<?> getEnumMember(Class<?> parent,
156 if(parent == null) return null;
160 field = parent.getField(memberName);
161 }catch(NoSuchFieldException e){
167 value = field.get(null);
168 }catch(IllegalAccessException e){
170 }catch(IllegalArgumentException e){
174 if( ! (value instanceof Enum) ) return null;
176 return (Enum<?>) value;
180 * JRE1.6より提供されたjava.awt.Desktopが利用可能か判定する。
181 * ※参照: java.awt.DesktopのisDesktopSupported()
182 * @return Desktopが利用可能ならtrue。JRE1.5以前だとたぶんfalse。
184 public static boolean isDesktopSupported(){
185 if(METHOD_ISDESKTOPSUPPORTED == null) return false;
189 invokeResult = METHOD_ISDESKTOPSUPPORTED.invoke(null,
191 }catch(InvocationTargetException e){
192 Throwable targetException = e.getTargetException();
194 if(targetException instanceof RuntimeException){
195 throw (RuntimeException) targetException;
196 }else if(targetException instanceof Error){
197 throw (Error) targetException;
200 AssertionError thw = new AssertionError();
203 }catch(IllegalAccessException e){
204 AssertionError thw = new AssertionError();
209 if( ! (invokeResult instanceof Boolean) ){
214 boolean result = (Boolean) invokeResult;
221 * ※参照: java.awt.DesktopのgetDesktop()
223 * @throws java.awt.HeadlessException スクリーンデバイスが見つからない
224 * @throws java.lang.UnsupportedOperationException 未サポートの機能
226 public static WebIPC getWebIPC()
227 throws HeadlessException,
228 UnsupportedOperationException {
229 if(GraphicsEnvironment.isHeadless()) throw new HeadlessException();
230 if( ! isDesktopSupported() ){
231 throw new UnsupportedOperationException();
234 WebIPC webIPC = new WebIPC();
240 * Webブラウザに任意のURIを表示させる。
241 * ※参照: java.awt.Desktopのbrowse(java.net.URI)
243 * @throws NullPointerException 引数がnull
244 * @throws UnsupportedOperationException 未サポートの機能
245 * @throws IOException ブラウザが見つからない
246 * @throws SecurityException セキュリティ違反
247 * @throws IllegalArgumentException URI形式が変
249 public void browse(URI uri)
250 throws NullPointerException,
251 UnsupportedOperationException,
254 IllegalArgumentException {
255 if(uri == null) throw new NullPointerException();
256 if( ! isSupported(Action.BROWSE) ){
257 throw new UnsupportedOperationException();
261 METHOD_BROWSE.invoke(this.desktop, uri);
262 }catch(InvocationTargetException e){
263 Throwable targetException = e.getTargetException();
265 if(targetException instanceof IOException){
266 throw (IOException) targetException;
268 if(targetException instanceof RuntimeException){
269 throw (RuntimeException) targetException;
271 if(targetException instanceof Error){
272 throw (Error) targetException;
275 AssertionError thw = new AssertionError();
278 }catch(IllegalAccessException e){
279 AssertionError thw = new AssertionError();
288 * 指定した機能(アクション)がサポートされているか否か判定する。
289 * ※参照: java.awt.Desktop#isSupported(java.awt.Desktop.Action)
290 * @param action アクション
291 * @return アクションがサポートされていればtrue。
293 public boolean isSupported(Action action){
303 invokeResult = METHOD_ISSUPPORTED.invoke(this.desktop,
305 }catch(InvocationTargetException e){
306 Throwable targetException = e.getTargetException();
308 if(targetException instanceof RuntimeException){
309 throw (RuntimeException) targetException;
311 if(targetException instanceof Error){
312 throw (Error) targetException;
315 AssertionError thw = new AssertionError();
318 }catch(IllegalAccessException e){
319 AssertionError thw = new AssertionError();
324 if( ! (invokeResult instanceof Boolean) ){
329 boolean result = (Boolean) invokeResult;
336 * ※参照 java.awt.Desktop.Action
338 public static enum Action{
339 /** Webブラウザでのブラウズ。 */