jdk/src/java.httpclient/share/classes/java/net/http/WSShared.java
author prappo
Mon, 09 May 2016 23:33:09 +0100
changeset 37874 02589df0999a
child 39730 196f4e25d9f5
permissions -rw-r--r--
8087113: Websocket API and implementation Reviewed-by: chegar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37874
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     1
/*
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     4
 *
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     6
 * under the terms of the GNU General  License version 2 only, as
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    10
 *
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General  License
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    15
 * accompanied this code).
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    16
 *
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    17
 * You should have received a copy of the GNU General  License version
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    20
 *
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    23
 * questions.
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    24
 */
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    25
package java.net.http;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    26
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    27
import java.nio.Buffer;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    28
import java.nio.ByteBuffer;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    29
import java.nio.CharBuffer;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    30
import java.util.Objects;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    31
import java.util.concurrent.atomic.AtomicBoolean;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    32
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    33
//
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    34
//  +-----------+---------------+------------ ~ ------+
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    35
//  |  shared#1 |    shared#2   | non-shared          |
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    36
//  +-----------+---------------+------------ ~ ------+
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    37
//  |                                                 |
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    38
//  |<------------------  shared0  ---------- ~ ----->|
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    39
//
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    40
//
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    41
// Objects of the type are not thread-safe. It's the responsibility of the
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    42
// client to access shared buffers safely between threads.
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    43
//
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    44
// It would be perfect if we could extend java.nio.Buffer, but it's not an
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    45
// option since Buffer and all its descendants have package-private
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    46
// constructors.
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    47
//
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    48
abstract class WSShared<T extends Buffer> implements WSDisposable {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    49
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    50
    protected final AtomicBoolean disposed = new AtomicBoolean();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    51
    protected final T buffer;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    52
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    53
    protected WSShared(T buffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    54
        this.buffer = Objects.requireNonNull(buffer);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    55
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    56
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    57
    static <T extends Buffer> WSShared<T> wrap(T buffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    58
        return new WSShared<>(buffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    59
            @Override
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    60
            WSShared<T> share(int pos, int limit) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    61
                throw new UnsupportedOperationException();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    62
            }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    63
        };
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    64
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    65
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    66
    // TODO: should be a terminal operation as after it returns the buffer might
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    67
    //       have escaped (we can't protect it any more)
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    68
    public T buffer() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    69
        checkDisposed();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    70
        return buffer;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    71
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    72
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    73
    abstract WSShared<T> share(final int pos, final int limit);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    74
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    75
    WSShared<T> select(final int pos, final int limit) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    76
        checkRegion(pos, limit, buffer());
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    77
        select(pos, limit, buffer());
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    78
        return this;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    79
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    80
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    81
    @Override
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    82
    public void dispose() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    83
        if (!disposed.compareAndSet(false, true)) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    84
            throw new IllegalStateException("Has been disposed previously");
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    85
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    86
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    87
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    88
    int limit() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    89
        return buffer().limit();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    90
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    91
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    92
    WSShared<T> limit(int newLimit) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    93
        buffer().limit(newLimit);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    94
        return this;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    95
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    96
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    97
    int position() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    98
        return buffer().position();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
    99
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   100
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   101
    WSShared<T> position(int newPosition) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   102
        buffer().position(newPosition);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   103
        return this;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   104
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   105
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   106
    int remaining() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   107
        return buffer().remaining();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   108
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   109
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   110
    boolean hasRemaining() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   111
        return buffer().hasRemaining();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   112
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   113
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   114
    WSShared<T> flip() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   115
        buffer().flip();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   116
        return this;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   117
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   118
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   119
    WSShared<T> rewind() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   120
        buffer().rewind();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   121
        return this;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   122
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   123
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   124
    WSShared<T> put(WSShared<? extends T> src) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   125
        put(this.buffer(), src.buffer());
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   126
        return this;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   127
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   128
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   129
    static void checkRegion(int position, int limit, Buffer buffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   130
        if (position < 0 || position > buffer.capacity()) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   131
            throw new IllegalArgumentException("position: " + position);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   132
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   133
        if (limit < 0 || limit > buffer.capacity()) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   134
            throw new IllegalArgumentException("limit: " + limit);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   135
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   136
        if (limit < position) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   137
            throw new IllegalArgumentException
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   138
                    ("limit < position: limit=" + limit + ", position=" + position);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   139
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   140
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   141
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   142
    void select(int newPos, int newLim, Buffer buffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   143
        int oldPos = buffer.position();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   144
        int oldLim = buffer.limit();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   145
        assert 0 <= oldPos && oldPos <= oldLim && oldLim <= buffer.capacity();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   146
        if (oldLim <= newPos) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   147
            buffer().limit(newLim).position(newPos);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   148
        } else {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   149
            buffer.position(newPos).limit(newLim);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   150
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   151
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   152
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   153
    // The same as dst.put(src)
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   154
    static <T extends Buffer> T put(T dst, T src) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   155
        if (dst instanceof ByteBuffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   156
            ((ByteBuffer) dst).put((ByteBuffer) src);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   157
        } else if (dst instanceof CharBuffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   158
            ((CharBuffer) dst).put((CharBuffer) src);
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   159
        } else {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   160
            // We don't work with buffers of other types
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   161
            throw new IllegalArgumentException();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   162
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   163
        return dst;
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   164
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   165
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   166
    // TODO: Remove when JDK-8150785 has been done
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   167
    @SuppressWarnings("unchecked")
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   168
    static <T extends Buffer> T slice(T buffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   169
        if (buffer instanceof ByteBuffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   170
            return (T) ((ByteBuffer) buffer).slice();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   171
        } else if (buffer instanceof CharBuffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   172
            return (T) ((CharBuffer) buffer).slice();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   173
        } else {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   174
            // We don't work with buffers of other types
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   175
            throw new IllegalArgumentException();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   176
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   177
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   178
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   179
    // TODO: Remove when JDK-8150785 has been done
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   180
    @SuppressWarnings("unchecked")
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   181
    static <T extends Buffer> T duplicate(T buffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   182
        if (buffer instanceof ByteBuffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   183
            return (T) ((ByteBuffer) buffer).duplicate();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   184
        } else if (buffer instanceof CharBuffer) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   185
            return (T) ((CharBuffer) buffer).duplicate();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   186
        } else {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   187
            // We don't work with buffers of other types
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   188
            throw new IllegalArgumentException();
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   189
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   190
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   191
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   192
    @Override
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   193
    public String toString() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   194
        return super.toString() + "[" + WSUtils.toString(buffer()) + "]";
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   195
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   196
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   197
    private void checkDisposed() {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   198
        if (disposed.get()) {
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   199
            throw new IllegalStateException("Has been disposed previously");
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   200
        }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   201
    }
02589df0999a 8087113: Websocket API and implementation
prappo
parents:
diff changeset
   202
}