src/jdk.incubator.adba/share/classes/jdk/incubator/sql2/Session.java
author lancea
Wed, 11 Jul 2018 19:36:23 -0400
branchJDK-8188051-branch
changeset 56828 64304e37e9b1
parent 56824 62e92191354d
child 56832 4f7713e6a308
permissions -rw-r--r--
JDK-8188051-branch javadoc updates and added TransactionCompletion.java
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     1
/*
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     2
 * Copyright (c)  2017, 2018, Oracle and/or its affiliates. All rights reserved.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     4
 *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    10
 *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    15
 * accompanied this code).
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    16
 *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    20
 *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    23
 * questions.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    24
 */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    25
package jdk.incubator.sql2;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    26
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    27
import java.time.Duration;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    28
import java.util.Map;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    29
import java.util.concurrent.CompletionStage;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    30
import java.util.function.Consumer;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    31
import java.util.function.LongConsumer;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    32
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    33
/**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    34
 * A {@link Session} is an abstraction of a SQL database and
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    35
 * a group of {@link Operation}s to be executed by that SQL database. No method
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    36
 * on {@link Session} or any of its dependent objects ({@link RowOperation}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    37
 * etc) blocks. Any method that might block must execute any potentially blocking
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    38
 * action in a thread other than the calling thread.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    39
 * 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    40
 * <p>
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    41
 * A {@link Session} is independent of any particular data source. Any data 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    42
 * source that meets the specifications set by the {@link Session.Builder} can
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    43
 * be used to execute the {@link Operation}s submitted to the {@link Session].
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    44
 * An application is expected to create, use, and close {@link Session}s as 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    45
 * needed. An application should hold a {@link Session} only when required by
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    46
 * data source semantics. An implementation should cache and reused data source
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    47
 * resources as appropriate. {@link Session}s should not be cached.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    48
 *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    49
 * <p>
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    50
 * An implementation of this type must be thread safe as result and error
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    51
 * handlers running asynchronously may be accessing a {@link Session} in
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    52
 * parallel with each other and with a user thread. {@link Session}s are not
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    53
 * required to support multiplexed use; a single {@link Session} should be
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    54
 * used for only one unit of work at a time. Executing independent units of work
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    55
 * on a single {@link Session} in parallel will most likely lead to
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    56
 * unpredictable outcomes. As a rule of thumb only one user thread should access
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    57
 * a {@link Session} at a time. Such a user thread should execute a complete
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    58
 * unit of work before another user thread accesses the {@link Session}. An
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    59
 * implementation may support parallel multiplexed use, but it is not required.</p>
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    60
 *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    61
 * <p>
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    62
 * All methods inherited from OperationGroup throw IllegalStateException if the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    63
 * the {@link Session} is not active.</p>
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    64
 */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    65
public interface Session extends AutoCloseable, OperationGroup<Object, Object> {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    66
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    67
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    68
   * Identifies the operational state of a {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    69
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    70
  public enum Lifecycle {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    71
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    72
     * unattached. When a attach {@link Operation} is completed successfully
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    73
     * -&gt; {@link OPEN}. If {@link deactivate} is called -&gt;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    74
     * {@link NEW_INACTIVE}. If {@link abort} is called -&gt; {@link ABORTING}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    75
     * No {@link Operation}s other than attach and close will be performed. A
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    76
 Session in this state is both 'open' and 'active'.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    77
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    78
    NEW,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    79
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    80
     * Unattached and inactive. Any queued attach or close {@link Operation}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    81
     * is performed. No work can be submitted. If the {@link activate} method is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    82
     * called -&gt; {@link NEW}. If a attach {@link Operation} completes -&gt;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    83
     * {@link INACTIVE}. If a close {@link Operation} is executed -&gt;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    84
     * {@link CLOSING}. If {@link abort} is called -&gt; {@link ABORTING}. A
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    85
 Session in this state is 'open'.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    86
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    87
    NEW_INACTIVE,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    88
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    89
     * fully operational. Work is queued and performed. If {@link deactivate} is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    90
     * called -&gt; {@link INACTIVE}. If a close {@link Operation} is executed
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    91
     * -&gt; {@link CLOSING}. If {@link abort} is called -&gt; {@link ABORTING}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    92
 A Session in this state is both 'open' and 'active'.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    93
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    94
    OPEN,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    95
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    96
     * Not available for new work. Queued work is performed. No work can be
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    97
     * submitted. If the {@link activate} method is called -&gt; {@link OPEN}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    98
     * If a close {@link Operation} is executed -&gt; {@link CLOSING}. If
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
    99
     * {@link abort} is called -&gt; {@link ABORTING}. A {@link Session} in
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   100
     * this state is 'open'.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   101
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   102
    INACTIVE,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   103
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   104
     * Work in progress is completed but no additional work is started or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   105
     * queued. Attempting to queue work throws {@link IllegalStateException}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   106
     * When the currently executing {@link Operation}s are completed -&gt;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   107
     * {@link CLOSED}. All other queued Operations are completed exceptionally
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   108
 with SqlSkippedException. A Session in this state is 'closed'.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   109
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   110
    CLOSING,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   111
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   112
     * Work is neither queued nor performed. The currently executing
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   113
     * {@link Operation}s, if any, are terminated, exceptionally if necessary.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   114
     * Any queued {@link Operation}s are terminated exceptionally with
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   115
     * {@link SqlSkippedException}. Attempting to queue work throws
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   116
     * {@link IllegalStateException}. When the queue is empty -&lt;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   117
     * {@link CLOSED}. A Session in this state is 'closed'.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   118
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   119
    ABORTING,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   120
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   121
     * Work is neither queued nor performed. Attempting to queue work throws
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   122
     * {@link IllegalStateException}. A Session in this state is 'closed'.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   123
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   124
    CLOSED;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   125
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   126
    static {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   127
      NEW.init(true, true, NEW, NEW_INACTIVE, OPEN, ABORTING, CLOSING, CLOSED);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   128
      NEW_INACTIVE.init(true, false, NEW, NEW_INACTIVE, INACTIVE, ABORTING, CLOSING, CLOSED);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   129
      OPEN.init(true, true, OPEN, INACTIVE, OPEN, ABORTING, CLOSING, CLOSED);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   130
      INACTIVE.init(true, false, OPEN, INACTIVE, INACTIVE, ABORTING, INACTIVE, INACTIVE);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   131
      CLOSING.init(false, true, CLOSING, CLOSING, CLOSING, ABORTING, CLOSING, CLOSED);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   132
      ABORTING.init(false, true, ABORTING, ABORTING, ABORTING, ABORTING, ABORTING, CLOSED);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   133
      CLOSED.init(false, true, CLOSED, CLOSED, CLOSED, CLOSED, CLOSED, CLOSED);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   134
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   135
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   136
    private boolean isOpen;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   137
    private boolean isActive;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   138
    private Lifecycle onActivate;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   139
    private Lifecycle onDeactivate;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   140
    private Lifecycle onAttach;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   141
    private Lifecycle onAbort;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   142
    private Lifecycle onClose;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   143
    private Lifecycle onClosed;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   144
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   145
    private void init(boolean io, boolean ia, Lifecycle ac, Lifecycle da, Lifecycle cn, Lifecycle ab, Lifecycle cl, Lifecycle cd) {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   146
      isOpen = io;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   147
      isActive = ia;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   148
      onActivate = ac;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   149
      onDeactivate = da;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   150
      onAttach = cn;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   151
      onAbort = ab;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   152
      onClose = cl;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   153
      onClosed = cd;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   154
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   155
    public boolean isOpen() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   156
      return isOpen;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   157
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   158
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   159
    public boolean isActive() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   160
      return isActive;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   161
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   162
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   163
    public Lifecycle activate() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   164
      return onActivate;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   165
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   166
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   167
    public Lifecycle deactivate() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   168
      return onDeactivate;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   169
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   170
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   171
    public Lifecycle attach() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   172
      return onAttach;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   173
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   174
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   175
    public Lifecycle abort() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   176
      return onAbort;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   177
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   178
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   179
    public Lifecycle close() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   180
      return onClose;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   181
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   182
    
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   183
    public Lifecycle closed() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   184
      return onClosed;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   185
    }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   186
  
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   187
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   188
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   189
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   190
   * Specifiers for how much effort to put into validating a {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   191
   * The amount of effort put into checking should be non-decreasing from NONE
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   192
   * (least effort) to COMPLETE (most effort). Exactly what is checked is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   193
   * implementation dependent. For example, a memory resident database driver
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   194
   * might implement SOCKET and NETWORK to be the same as LOCAL. SERVER might
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   195
   * verify that a database manager thread is running and COMPLETE might trigger
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   196
   * the database manager thread to run a deadlock detection algorithm.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   197
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   198
  public enum Validation {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   199
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   200
     * isValid fails only if the {@link Session} is closed.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   201
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   202
    NONE,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   203
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   204
     * {@link NONE} plus check local resources
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   205
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   206
    LOCAL,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   207
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   208
     * {@link LOCAL} plus the server isn't obviously unreachable (dead socket)
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   209
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   210
    SOCKET,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   211
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   212
     * {@link SOCKET} plus the network is intact (network PING)
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   213
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   214
    NETWORK,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   215
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   216
     * {@link NETWORK} plus significant server processes are running
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   217
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   218
    SERVER,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   219
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   220
     * everything that can be checked is working. At least {@link SERVER}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   221
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   222
    COMPLETE;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   223
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   224
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   225
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   226
   * A Listener that is notified of changes in a Session's lifecycle.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   227
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   228
  public interface SessionLifecycleListener extends java.util.EventListener {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   229
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   230
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   231
     * If this {@link java.util.EventListener} is registered with a
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   232
     * {@link Session} this method is called whenever that
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   233
     * {@link Session}'s lifecycle changes. Note that the lifecycle may have
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   234
     * changed again by the time this method is called so the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   235
     * {@link Session}'s current lifecycle may be different from the value of
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   236
     * {@code current}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   237
     *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   238
     * @param session the {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   239
     * @param previous the previous value of the lifecycle
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   240
     * @param current the new value of the lifecycle
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   241
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   242
    public void lifecycleEvent(Session session, Lifecycle previous, Lifecycle current);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   243
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   244
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   245
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   246
   * A {@link Session} builder. A {@link Session} is initially in the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   247
   * {@link Session.Lifecycle#NEW} lifecycle state. It transitions to the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   248
   * {@link Session.Lifecycle#OPEN} lifecycle state when fully initialized or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   249
   * to {@link Session.Lifecycle#CLOSED} if initialization fails.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   250
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   251
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   252
  public interface Builder {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   253
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   254
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   255
     * Specify a property and its value for the built {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   256
     *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   257
     * @param p {@link SessionProperty} to set. Not {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   258
     * @param v value for the property
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   259
     * @return this {@link Builder}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   260
     * @throws IllegalArgumentException if {@code p.validate(v)} does not return
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   261
     * true, if this method has already been called with the property
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   262
     * {@code p}, or the implementation does not support the {@link SessionProperty}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   263
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   264
    public Builder property(SessionProperty p, Object v);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   265
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   266
    /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   267
     * Return a {@link Session} with the attributes specified. Note that the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   268
     * {@link Session} may not be attached to a server. Call one of the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   269
     * {@link attach} convenience methods to attach the {@link Session} to
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   270
     * a server. The lifecycle of the new {@link Session} is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   271
     * {@link Lifecycle#NEW}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   272
 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   273
 This method cannot block. If the DataSource is unable to support a new
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   274
 Session when this method is called, this method throws SqlException.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   275
 Note that the implementation does not have to allocate scarce resources to
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   276
 the new {@link Session} when this method is called so limiting the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   277
     * number of {@link Session}s is not required to limit the use of
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   278
     * scarce resources. It may be appropriate to limit the number of 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   279
     * {@link Session}s for other reasons, but that is implementation dependent.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   280
     *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   281
     * @return a {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   282
     * @throws IllegalStateException if this method has already been called or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   283
 if the implementation cannot create a Session with the specified
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   284
 {@link SessionProperty}s.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   285
     * @throws IllegalStateException if the {@link DataSource} that created this
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   286
     * {@link Builder} is closed
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   287
     * @throws SqlException if creating a {@link Session} would exceed some
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   288
     * limit
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   289
     */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   290
    public Session build();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   291
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   292
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   293
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   294
   * Returns an {@link Operation} that attaches this {@link Session} to a
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   295
   * data source. If the Operation completes successfully and the lifecycle is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   296
   * {@link Lifecycle#NEW} -&gt; {@link Lifecycle#OPEN}. If lifecycle is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   297
   * {@link Lifecycle#NEW_INACTIVE} -&gt; {@link Lifecycle#INACTIVE}. If the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   298
   * {@link Operation} completes exceptionally the lifecycle -&gt;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   299
   * {@link Lifecycle#CLOSED}. The lifecycle must be {@link Lifecycle#NEW} or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   300
   * {@link Lifecycle#NEW_INACTIVE} when the {@link Operation} is executed.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   301
   * Otherwise the {@link Operation} will complete exceptionally with
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   302
   * {@link SqlException}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   303
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   304
   * Note: It is highly recommended to use the {@link attach()} convenience
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   305
   * method or to use {@link DataSource#getSession} which itself calls
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   306
   * {@link attach()}. Unless there is a specific need, do not call this method
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   307
   * directly.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   308
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   309
   * @return an {@link Operation} that attaches this {@link Session} to a
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   310
   * server.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   311
   * @throws IllegalStateException if this {@link Session} is in a lifecycle
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   312
   * state other than {@link Lifecycle#NEW}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   313
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   314
  public Operation<Void> attachOperation();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   315
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   316
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   317
   * Convenience method that supports the fluent style of the builder needed by
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   318
   * try with resources.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   319
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   320
   * Note: A {@link Session} is an {@link OperationGroup} and so has some
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   321
   * advanced features that most users do not need. Management of these features
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   322
   * is encapsulated in this method and the corresponding {@link close()}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   323
   * convenience method. The vast majority of users should just use these
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   324
   * methods and not worry about the advanced features. The convenience methods
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   325
   * do the right thing for the overwhelming majority of use cases. A tiny
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   326
   * number of users might want to take advantage of the advanced features that
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   327
   * {@link OperationGroup} brings to {@link Session} and so would call
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   328
   * {@link attachOperation} directly.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   329
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   330
   * @return this Session
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   331
   * @throws IllegalStateException if this {@link Session} is in a lifecycle
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   332
   * state other than {@link Lifecycle#NEW}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   333
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   334
  public default Session attach() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   335
    this.submitHoldingForMoreMembers();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   336
    this.attachOperation()
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   337
            .submit();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   338
    return this;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   339
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   340
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   341
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   342
   * Convenience method that supports the fluent style of the builder needed by
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   343
   * try with resources.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   344
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   345
   * @param onError an Exception handler that is called if the attach
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   346
   * {@link Operation} completes exceptionally.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   347
   * @return this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   348
   * @throws IllegalStateException if this {@link Session} is in a lifecycle
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   349
   * state other than {@link Lifecycle#NEW}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   350
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   351
  public default Session attach(Consumer<Throwable> onError) {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   352
    this.submitHoldingForMoreMembers();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   353
    this.attachOperation()
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   354
            .submit()
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   355
            .getCompletionStage()
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   356
            .exceptionally(t -> { onError.accept(t); return null; } );
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   357
    return this;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   358
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   359
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   360
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   361
   * Returns an {@link Operation} that verifies that the resources are available
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   362
   * and operational. Successful completion of that {@link Operation} implies
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   363
   * that at some point between the beginning and end of the {@link Operation}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   364
 the Session was working properly to the extent specified by {@code depth}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   365
   * There is no guarantee that the {@link Session} is still working after 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   366
   * completion. If the {@link Session} is not valid the Operation completes
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   367
   * exceptionally.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   368
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   369
   * @param depth how completely to check that resources are available and
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   370
   * operational. Not {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   371
   * @return an {@link Operation} that will validate this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   372
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   373
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   374
  public Operation<Void> validationOperation(Validation depth);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   375
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   376
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   377
   * Convenience method to validate a {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   378
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   379
   * @param depth how completely to check that resources are available and
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   380
   * operational. Not {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   381
   * @param minTime how long to wait. If 0, wait forever
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   382
   * @param onError called if validation fails or times out. May be
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   383
   * {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   384
   * @return this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   385
   * @throws IllegalArgumentException if {@code milliseconds} &lt; 0 or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   386
   * {@code depth} is {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   387
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   388
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   389
  public default Session validate(Validation depth,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   390
          Duration minTime,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   391
          Consumer<Throwable> onError) {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   392
    this.validationOperation(depth)
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   393
            .timeout(minTime)
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   394
            .onError(onError)
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   395
            .submit();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   396
    return this;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   397
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   398
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   399
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   400
   * Create an {@link Operation} to close this {@link Session}. When the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   401
   * {@link Operation} is executed, if this {@link Session} is open -&gt;
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   402
   * {@link Lifecycle#CLOSING}. If this {@link Session} is closed executing
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   403
   * the returned {@link Operation} is a no-op. When the queue is empty and all
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   404
   * resources released -&gt; {@link Lifecycle#CLOSED}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   405
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   406
   * A close {@link Operation} is never skipped. Even when the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   407
   * {@link Session} is dependent, the default, and an {@link Operation}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   408
   * completes exceptionally, a close {@link Operation} is still executed. If
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   409
   * the {@link Session} is parallel, a close {@link Operation} is not
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   410
   * executed so long as there are other {@link Operation}s or the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   411
   * {@link Session} is held for more {@link Operation}s.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   412
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   413
   * Note: It is highly recommended to use try with resources or the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   414
   * {@link close()} convenience method. Unless there is a specific need, do not
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   415
   * call this method directly.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   416
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   417
   * @return an {@link Operation} that will close this {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   418
   * @throws IllegalStateException if the Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   419
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   420
  public Operation<Void> closeOperation();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   421
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   422
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   423
   * Create and submit an {@link Operation} to close this {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   424
   * Convenience method.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   425
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   426
   * Note: A {@link Session} is an {@link OperationGroup} and so has some
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   427
   * advanced features; that most users do not need. Management of these
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   428
   * features is encapsulated in this method and the corresponding
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   429
   * {@link attach()} convenience method. The vast majority of users should
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   430
   * just use these methods and not worry about the advanced features. The
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   431
   * convenience methods do the right thing for the overwhelming majority of use
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   432
   * cases. A tiny number of user might want to take advantage of the advanced
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   433
   * features that {@link OperationGroup} brings to {@link Session} and so
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   434
   * would call {@link closeOperation} directly.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   435
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   436
   * @throws IllegalStateException if the Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   437
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   438
  @Override
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   439
  public default void close() {
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   440
    this.closeOperation()
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   441
            .submit();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   442
    this.releaseProhibitingMoreMembers();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   443
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   444
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   445
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   446
   * Create a new {@link OperationGroup} for this {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   447
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   448
   * @param <S> the result type of the member {@link Operation}s of the returned
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   449
   * {@link OperationGroup}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   450
   * @param <T> the result type of the collected results of the member
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   451
   * {@link Operation}s
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   452
   * @return a new {@link OperationGroup}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   453
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   454
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   455
  public <S, T> OperationGroup<S, T> operationGroup();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   456
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   457
  /**
56828
64304e37e9b1 JDK-8188051-branch javadoc updates and added TransactionCompletion.java
lancea
parents: 56824
diff changeset
   458
   * Returns a new {@link TransactionCompletion} that can be used as an argument to an
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   459
   * endTransaction Operation.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   460
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   461
   * It is most likely an error to call this within an error handler, or any
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   462
   * handler as it is very likely that when the handler is executed the next
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   463
   * submitted endTransaction {@link Operation} will have been created with a 
56828
64304e37e9b1 JDK-8188051-branch javadoc updates and added TransactionCompletion.java
lancea
parents: 56824
diff changeset
   464
 different TransactionCompletion.
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   465
 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   466
 ISSUE: Should this be moved to OperationGroup?
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   467
   *
56828
64304e37e9b1 JDK-8188051-branch javadoc updates and added TransactionCompletion.java
lancea
parents: 56824
diff changeset
   468
   * @return a new {@link TransactionCompletion}. Not null.
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   469
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   470
   */
56828
64304e37e9b1 JDK-8188051-branch javadoc updates and added TransactionCompletion.java
lancea
parents: 56824
diff changeset
   471
  public TransactionCompletion transactionCompletion();
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   472
  
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   473
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   474
   * Unconditionally perform a transaction rollback. Create an endTransaction 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   475
   * {@link Operation}, set it to rollback only, and submit it. The endTransaction
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   476
   * is never skipped. Convenience method. To execute a commit call 
56828
64304e37e9b1 JDK-8188051-branch javadoc updates and added TransactionCompletion.java
lancea
parents: 56824
diff changeset
   477
   * {@link OperationGroup#commitMaybeRollback(jdk.incubator.sql2.TransactionCompletion)}.
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   478
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   479
   * @return this {@link OperationGroup}
56828
64304e37e9b1 JDK-8188051-branch javadoc updates and added TransactionCompletion.java
lancea
parents: 56824
diff changeset
   480
   * @see OperationGroup#commitMaybeRollback(jdk.incubator.sql2.TransactionCompletion) 
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   481
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   482
  public default CompletionStage<TransactionOutcome> rollback() {
56828
64304e37e9b1 JDK-8188051-branch javadoc updates and added TransactionCompletion.java
lancea
parents: 56824
diff changeset
   483
    TransactionCompletion t = transactionCompletion();
56824
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   484
    t.setRollbackOnly();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   485
    catchErrors();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   486
    return this.endTransactionOperation(t).submit().getCompletionStage();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   487
  }
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   488
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   489
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   490
   * Register a listener that will be called whenever there is a change in the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   491
   * lifecycle of this {@link Session}.If the listener is already registered
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   492
 this is a no-op. ISSUE: Should lifecycleListener be a SessionProperty so that it is 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   493
 always reestablished on Session.activate?
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   494
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   495
   * @param listener Not {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   496
   * @return this Session
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   497
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   498
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   499
  public Session registerLifecycleListener(SessionLifecycleListener listener);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   500
  
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   501
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   502
   * Removes a listener that was registered by calling
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   503
   * registerLifecycleListener.Sometime after this method is called the listener
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   504
   * will stop receiving lifecycle events. If the listener is not registered,
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   505
   * this is a no-op.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   506
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   507
   * @param listener Not {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   508
   * @return this Session
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   509
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   510
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   511
  public Session deregisterLifecycleListener(SessionLifecycleListener listener);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   512
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   513
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   514
   * Return the current lifecycle of this {@link Session}. 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   515
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   516
   * @return the current lifecycle of this {@link Session}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   517
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   518
  public Lifecycle getSessionLifecycle();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   519
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   520
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   521
   * Terminate this {@link Session}. If lifecycle is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   522
   * {@link Lifecycle#NEW}, {@link Lifecycle#OPEN}, {@link Lifecycle#INACTIVE}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   523
   * or {@link Lifecycle#CLOSING} -&gt; {@link Lifecycle#ABORTING} If lifecycle
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   524
   * is {@link Lifecycle#ABORTING} or {@link Lifecycle#CLOSED} this is a no-op.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   525
   * If an {@link Operation} is currently executing, terminate it immediately.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   526
   * Remove all remaining {@link Operation}s from the queue. {@link Operation}s
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   527
   * are not skipped. They are just removed from the queue.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   528
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   529
   * @return this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   530
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   531
  public Session abort();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   532
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   533
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   534
   * Return the set of properties configured on this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   535
   * excepting any sensitive properties. Neither the key nor the value for
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   536
   * sensitive properties are included in the result. Properties (other than
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   537
   * sensitive properties) that have default values are included even when not
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   538
   * explicitly set. Properties that have no default value and are not set
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   539
   * explicitly are not included.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   540
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   541
   * @return a {@link Map} of property, value. Not modifiable. May be retained.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   542
   * Not {@code null}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   543
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   544
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   545
  public Map<SessionProperty, Object> getProperties();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   546
  
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   547
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   548
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   549
   * @return a {@link ShardingKey.Builder} for this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   550
   * @throws IllegalStateException if this Session is not active
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   551
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   552
  public ShardingKey.Builder shardingKeyBuilder();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   553
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   554
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   555
   * Provide a method that this {@link Session} will call to control the rate
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   556
   * of {@link Operation} submission. This {@link Session} will call
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   557
   * {@code request} with a positive argument when the {@link Session} is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   558
   * able to accept more {@link Operation} submissions. The difference between
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   559
   * the sum of all arguments passed to {@code request} and the number of
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   560
   * {@link Operation}s submitted after this method is called is the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   561
   * <i>demand</i>. The demand must always be non-negative. If an
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   562
   * {@link Operation} is submitted that would make the demand negative the call
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   563
   * to {@link Operation#submit} throws {@link IllegalStateException}. Prior to
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   564
   * a call to {@code requestHook}, the demand is defined to be infinite.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   565
   * After a call to {@code requestHook}, the demand is defined to be
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   566
   * zero and is subsequently computed as described previously.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   567
   * {@link Operation}s submitted prior to the call to {@code requestHook} do
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   568
   * not affect the demand.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   569
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   570
   * @param request accepts calls to increase the demand. Not null.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   571
   * @return this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   572
   * @throws IllegalStateException if this method has been called previously or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   573
   * this {@link Session} is not active.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   574
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   575
  public Session requestHook(LongConsumer request);
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   576
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   577
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   578
   * Make this {@link Session} ready for use. A newly created
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   579
   * {@link Session} is active. Calling this method on a {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   580
   * that is active is a no-op. If the lifecycle is {@link Lifecycle#INACTIVE}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   581
   * -&gt; {@link Lifecycle#OPEN}. If the lifecycle is
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   582
   * {@link Lifecycle#NEW_INACTIVE} -&gt; {@link Lifecycle#NEW}.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   583
   *
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   584
   * @return this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   585
   * @throws IllegalStateException if this {@link Session} is closed.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   586
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   587
  public Session activate();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   588
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   589
  /**
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   590
   * Makes this {@link Session} inactive. After a call to this method
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   591
   * previously submitted Operations will be executed normally. If the lifecycle
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   592
   * is {@link Lifecycle#NEW} -&gt; {@link Lifecycle#NEW_INACTIVE}. if the
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   593
   * lifecycle is {@link Lifecycle#OPEN} -&gt; {@link Lifecycle#INACTIVE}. If
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   594
   * the lifecycle is {@link Lifecycle#INACTIVE} or
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   595
   * {@link Lifecycle#NEW_INACTIVE} this method is a no-op. After calling this
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   596
   * method or calling any method other than {@link deactivate}, {@link activate},
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   597
   * {@link abort}, or {@link getSessionLifecycle} will throw
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   598
   * {@link IllegalStateException}. Data source state not specified
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   599
   * by {@link Session.Builder} may not be preserved.
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   600
   * 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   601
   * <p>
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   602
   * In general {@link Session}s should not be pooled as the implementation
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   603
   * should cache and reuse the data source resources that back {@link Session}s
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   604
   * as appropriate, not cache the {@link Session}s themselves. 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   605
   * However, any {@link Session} pool is required by default to
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   606
   * call {@code deactivate} when putting a {@link Session} into the pool. The
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   607
   * pool is required by default to call {@code activate} when removing a
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   608
   * {@link Session} from the pool for use. A pool may have an optional mode where
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   609
   * it does not call {@code deactivate}/{@code activate} as required above. The
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   610
   * behavior of the pool and {@link Session}s cached in the pool in such a
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   611
   * mode is entirely implementation dependent.</p>
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   612
   * 
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   613
   * @return this {@link Session}
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   614
   * @throws IllegalStateException if this {@link Session} is closed
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   615
   */
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   616
  public Session deactivate();
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   617
  
62e92191354d JDK-8188051-branch latest updates
lancea
parents:
diff changeset
   618
}