1 package com.ericsson.research.transport.ws.spi;
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 import java.io.IOException;
37 import java.util.Timer;
38 import java.util.TimerTask;
39
40 import com.ericsson.research.transport.ws.WSException;
41 import com.ericsson.research.transport.ws.WSSecurityContext;
42 import com.ericsson.research.transport.ws.WSURI;
43
44 public class WSHixie76 extends WSHixie75
45 {
46
47 protected final static Timer t = new Timer();
48
49 protected TimerTask task;
50
51 public WSHixie76(WSURI uri, WSSecurityContext securityContext)
52 {
53 super(uri, securityContext);
54 }
55
56 public WSHixie76(WSSecurityContext securityContext)
57 {
58 super(securityContext);
59 }
60
61 protected WSAbstractHandshake getHandshake()
62 {
63 if (this.handshake == null)
64 this.handshake = new WSHixie76Handshake(this);
65 return this.handshake;
66 }
67
68 public void close()
69 {
70 synchronized (this.wrapper)
71 {
72 if ((this.state == CLOSED) || (this.state == CLOSING))
73 return;
74 this.state = CLOSING;
75 try
76 {
77 this.task = new TimerTask() {
78 public void run()
79 {
80 WSHixie76.this.forceClose();
81 }
82 };
83 t.schedule(this.task, CLOSE_TIMEOUT);
84 this.internalClose();
85 }
86 catch (Exception e)
87 {
88 this.forceClose();
89 }
90 }
91 }
92
93 public void notifyDisconnected()
94 {
95 synchronized (this.wrapper)
96 {
97 if (this.task != null)
98 {
99 this.task.cancel();
100 this.task = null;
101 }
102 super.notifyDisconnected();
103 }
104 }
105
106 protected void dispatchFrame(WSAbstractFrame frame) throws IOException, WSException
107 {
108 switch (frame.getType())
109 {
110 case WSAbstractFrame.CLOSE_FRAME:
111 synchronized (this)
112 {
113 switch (this.state)
114 {
115 case OPEN:
116 this.close();
117 break;
118 case CLOSING:
119 this.forceClose();
120 break;
121
122 default:
123 throw new WSException("Invalid state");
124 }
125 }
126 break;
127 default:
128 super.dispatchFrame(frame);
129 }
130 }
131
132 protected void internalClose() throws IOException
133 {
134 new WSHixieFrame(WSAbstractFrame.CLOSE_FRAME, null).serialize(this.getRawOutput());
135 }
136
137 public String toString()
138 {
139 return "Hixie-76";
140 }
141
142 }