PushInitiator.java
上传用户:weisa_1
上传日期:2007-10-14
资源大小:287k
文件大小:6k
源码类别:

手机WAP编程

开发平台:

Java

  1. package push;
  2. import java.net.URL;
  3. import java.net.HttpURLConnection;
  4. import java.io.*;
  5. /**
  6.  * <code>PushInitiator</code> class implements a simple push initiator. It can be used to create and 
  7.  * send messages to push proxy gateway (ppg)
  8.  *
  9.  */
  10. public final class PushInitiator {
  11.     /* xml version */
  12.     private final static String XML_VERSION = "<?xml version="1.0"?>"; 
  13.     /* Push Access Protocol (PAP) document type */
  14.     private final static String PAP_DOCTYPE = 
  15. "<!DOCTYPE pap PUBLIC "-//WAPFORUM//DTD PAP 1.0//EN" "http://www.wapforum.org/DTD/pap_1.0.dtd" >";
  16.     /* content type of the push request multipart body */
  17.     private final static String CONTENT_TYPE = 
  18. "multipart/related; boundary=multipart-boundary; type="application/xml"";
  19.     /* Service Indication (SI) document type */
  20.     private static final String SI_DOCTYPE = "<!DOCTYPE si PUBLIC "-//WAPFORUM//DTD SI 1.0//EN" " +
  21. ""http://www.wapforum.org/DTD/si.dtd">";
  22.     private static int pushId = 0;
  23.     /* PPG url where the pap message is to be sent  */
  24.     private final URL ppgUrl;
  25.     /* Some push proxy gateways may also require the authentication of the push initiator. 
  26.        For instance, the push initiator imay be required to send an HTTP "authorization" header 
  27.        in each request */
  28.     private final String authorization;
  29.     /**
  30.      * Creates a new <code>PushInitiator</code> instance.
  31.      *
  32.      * @param ppgUrl an <code>URL</code> value
  33.      */
  34.     public PushInitiator(URL ppgUrl) {
  35. this.ppgUrl = ppgUrl;
  36. authorization = null;
  37.     }
  38.     /**
  39.      * Creates a new <code>PushInitiator</code> instance.
  40.      *
  41.      * @param ppgUrl an <code>URL</code> value
  42.      * @param authorization a <code>String</code> value
  43.      */
  44.     public PushInitiator(URL ppgUrl, String authorization) {
  45. this.ppgUrl = ppgUrl;
  46. this.authorization = authorization;
  47. System.out.println("Push Initiator created: ppgUrl = " + ppgUrl);
  48.     }
  49.     /**
  50.      * <code>sendPushMessage</code> sends push message to ppg
  51.      *
  52.      * @param clientAddress a <code>String</code> value
  53.      * @param addressType a <code>String</code> value
  54.      * @param message a <code>String</code> value
  55.      * @param mimeType a <code>String</code> value
  56.      * @exception Exception if an error occurs
  57.      */
  58.     public void sendPushMessage(String clientAddress, String addressType, 
  59. String message, String mimeType) throws Exception {
  60. HttpURLConnection http = (HttpURLConnection)ppgUrl.openConnection();
  61. String ppgServer = ppgUrl.getHost();
  62. http.setDoInput(true);
  63. http.setRequestProperty("Content-Type", CONTENT_TYPE);
  64. if(authorization != null) {
  65.     if(!authorization.trim().equals(""))
  66. http.setRequestProperty("Authorization", authorization);
  67. }
  68. http.setDoOutput(true);
  69. PrintWriter out = new PrintWriter(new BufferedOutputStream(http.getOutputStream()));
  70. out.println("--multipart-boundary");
  71. out.println("Content-type: application/xml");
  72. out.println();
  73. out.println(createPapMessage(clientAddress, addressType, ppgServer, genPushId(), null));
  74. out.println();
  75.         out.println("--multipart-boundary");
  76.         out.println("Content-type: " + mimeType);
  77.         out.println();
  78. out.println(message);
  79. out.println();
  80. out.println("--multipart-boundary--");
  81. out.flush();
  82. out.close();
  83. http.connect();
  84. /* finally, read and debug the response received from PPG */
  85. try {
  86.     debugResponse(http);
  87. }
  88. catch (Exception e) { 
  89.     System.err.println("Error in receiving the response!"); 
  90. }
  91.     }
  92.     /**
  93.      * <code>createPapMessage</code> creates a Push Access Protocol type message
  94.      *
  95.      * @param address a <code>String</code> value
  96.      * @param addressType a <code>String</code> value
  97.      * @param ppgServer a <code>String</code> value
  98.      * @param pushId a <code>String</code> value
  99.      * @param notificationTo a <code>String</code> value
  100.      * @return a <code>String</code> value
  101.      */
  102.     public static String createPapMessage(String address, String addressType, 
  103.   String ppgServer, String pushId, String notificationTo) {
  104. return XML_VERSION + "n" + PAP_DOCTYPE + "n" +
  105.     "<pap product-name="Mobile Zoo Push Initiator">n" +
  106.     "<push-message push-id="" + pushId + 
  107.     (notificationTo != null ? " request-notification-to="" + notificationTo : "") + "">n" +
  108.     "<address address-value="WAPPUSH=" + address + "/TYPE=" + addressType + 
  109.  "@" + ppgServer + ""/>n"  + 
  110.     "</push-message>n</pap>";
  111.     }
  112.     /**
  113.      * <code>createSiMessage</code> creates a service indication type message
  114.      *
  115.      * @param url a <code>String</code> value
  116.      * @param created a <code>String</code> value
  117.      * @param expires a <code>String</code> value
  118.      * @param message a <code>String</code> value
  119.      * @return a <code>String</code> value
  120.      */
  121.     public static String createSiMessage(String url, String sid, String created, String expires, 
  122.  String action, String message) {
  123. return XML_VERSION + SI_DOCTYPE +
  124.     "<si>n" +
  125.     "<indication href="" + url + """ +
  126.     (sid != null ? " si-id="" + sid + """ : "") +
  127.     (created != null ? " created="" + created + """ : "") +
  128.     (action != null ? " action="" + action + """ : "") + 
  129.     (expires != null ? " expires="" + expires + """ : "") + ">" + 
  130.     message + 
  131.     "</indication>n</si>";
  132.     }
  133.     /**
  134.      * Debug response
  135.      *
  136.      * @param http a <code>HttpURLConnection</code> value
  137.      * @exception Exception if an error occurs
  138.      */
  139.     private void debugResponse(HttpURLConnection http) throws Exception {
  140. System.out.println(http.getResponseMessage());
  141. String headerName;
  142. int i=0;
  143. while((headerName = http.getHeaderFieldKey(i++)) != null) {
  144.     System.out.println("headerName" + ": " + http.getHeaderField(headerName));
  145. }
  146. System.out.println();
  147. InputStreamReader in = new InputStreamReader(new BufferedInputStream(http.getInputStream()));
  148. int c;
  149. while((c = in.read()) != -1) System.out.print((char)c);
  150. System.out.println();
  151.     }
  152.     /**
  153.      * <code>genPushId</code> generates an unique push id
  154.      *
  155.      * @return a <code>String</code> value
  156.      */
  157.     private String genPushId() {
  158. pushId %= 100000;
  159. return System.currentTimeMillis() + ":" +  pushId++;
  160.     }
  161. }