1 package com.ericsson.research.transport.ws.spi;
2
3 /*
4 * ##_BEGIN_LICENSE_##
5 * Transport Abstraction Package (trap)
6 * ----------
7 * Copyright (C) 2014 Ericsson AB
8 * ----------
9 * Redistribution and use in source and binary forms, with or without modification,
10 * are permitted provided that the following conditions are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright notice, this
13 * list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 *
19 * 3. Neither the name of the Ericsson AB nor the names of its contributors
20 * may be used to endorse or promote products derived from this software without
21 * specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
32 * OF THE POSSIBILITY OF SUCH DAMAGE.
33 * ##_END_LICENSE_##
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 }