OSDN Git Service

i
[luz/luz.git] / luz2 / src / com / lavans / luz2 / http / session / net / SessionServerConnection.java
1 /* $Id: SessionServerConnection.java 94 2008-12-18 11:07:17Z dobashi $\r
2  * created: 2005/08/03\r
3  */\r
4 package com.lavans.luz2.http.session.net;\r
5 \r
6 import java.io.BufferedInputStream;\r
7 import java.io.BufferedOutputStream;\r
8 import java.io.IOException;\r
9 import java.io.ObjectInputStream;\r
10 import java.io.ObjectOutputStream;\r
11 import java.net.URL;\r
12 import java.net.URLConnection;\r
13 \r
14 import org.apache.commons.logging.Log;\r
15 import org.apache.commons.logging.LogFactory;\r
16 import org.omg.CORBA.portable.ApplicationException;\r
17 \r
18 /**\r
19  *\r
20  * @author dobashi\r
21  */\r
22 public class SessionServerConnection {\r
23         /** ロガー。debug用 */\r
24         private static Log logger = LogFactory.getLog(SessionServerConnection.class.getName());\r
25 \r
26         private URLConnection con = null;\r
27         ObjectOutputStream os = null;\r
28         ObjectInputStream is = null;\r
29         private URL url = null;\r
30 \r
31         public SessionServerConnection(URL url) throws IOException{\r
32                 init(url);\r
33         }\r
34 \r
35         private void init(URL url) throws IOException{\r
36 //              logger.debug("create ApJConnection.");\r
37                 this.url = url;\r
38                 con = url.openConnection();\r
39                 con.setRequestProperty("Connection", "Keep-Alive");\r
40                 con.setDoOutput(true);\r
41                 con.connect();\r
42         }\r
43 \r
44         /**\r
45          * APへ問い合わせをかけて応答オブジェクトをもらう。\r
46          * AP側でキャッチした例外はApplicationExceptionとして帰ってくるので\r
47          * 応答オブジェクトがApplicationExceptionだった場合はそのままthrowする。\r
48          * APとの接続エラーの場合は1度だけ再接続を試みる。それ以外のエラーはここで\r
49          * ApplicationExceptionにくるんでActionへ伝える。\r
50          *\r
51          * 「余力不足で注文受付不可」などのエラーはExceptionではなく\r
52          * 戻りオブジェクトの中のパラメータに入っている。\r
53          *\r
54          * @param className\r
55          * @param methodName\r
56          * @param paramTypes\r
57          * @param args\r
58          * @return\r
59          * @throws ApplicationException\r
60          */\r
61         public Object execute(String className, String methodName,\r
62                         Class<?>[] paramTypes, Object[] args) throws Exception{\r
63                 String[] shortNames = className.split("\\.");\r
64                 String shortName = shortNames[shortNames.length - 1];\r
65                 logger.debug("session execute "+ url.toString() +"/"+ shortName +"#"+methodName +"()");\r
66                 Object result = null;\r
67                 try {\r
68                         os = new ObjectOutputStream(\r
69                                         new BufferedOutputStream(con.getOutputStream()));\r
70                         // クラス名\r
71                         os.writeObject(className);\r
72                         // メソッド名\r
73                         os.writeObject(methodName);\r
74                         // 引数の型\r
75                         os.writeObject(paramTypes);\r
76                         // 引数\r
77                         os.writeObject(args);\r
78 \r
79                         os.flush();\r
80 \r
81                         is = new ObjectInputStream(\r
82                                         new BufferedInputStream(con.getInputStream()));\r
83                         result = is.readObject();\r
84 \r
85                         // 受け取ったものが例外だったら(APで例外が起きた場合)\r
86                         if(result instanceof Exception){\r
87                                 // エラーメッセージが入っているのでそのままスローする。\r
88                                 throw (Exception)result;\r
89                         }\r
90                 }finally{\r
91                         try { os.close(); } catch (Exception e) { logger.warn(null, e); }\r
92                         try { is.close(); } catch (Exception e) { logger.warn(null, e); }\r
93                 }\r
94 \r
95                 return result;\r
96 \r
97         }\r
98 \r
99         /**\r
100          * @return url を戻します。\r
101          */\r
102         public URL getUrl() {\r
103                 return url;\r
104         }\r
105 }\r