org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode.java

Source

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.resource.jdbc.spi;

import java.util.Locale;

import org.hibernate.ConnectionAcquisitionMode;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.internal.util.StringHelper;

import static org.hibernate.ConnectionAcquisitionMode.AS_NEEDED;
import static org.hibernate.ConnectionAcquisitionMode.IMMEDIATELY;
import static org.hibernate.ConnectionReleaseMode.AFTER_STATEMENT;
import static org.hibernate.ConnectionReleaseMode.AFTER_TRANSACTION;
import static org.hibernate.ConnectionReleaseMode.ON_CLOSE;

/**
 * Represents valid combinations of ConnectionAcquisitionMode and ConnectionReleaseMode
 *
 * @author Steve Ebersole
 */
public enum PhysicalConnectionHandlingMode {
    /**
     * The Connection will be acquired as soon as the Session is opened and
     * held until the Session is closed.  This is the only valid combination
     * including immediate acquisition of the Connection
     */
    IMMEDIATE_ACQUISITION_AND_HOLD(IMMEDIATELY, ON_CLOSE),
    /**
     * The Connection will be acquired as soon as it is needed and then held
     * until the Session is closed.  This is the original Hibernate behavior.
     */
    DELAYED_ACQUISITION_AND_HOLD(AS_NEEDED, ON_CLOSE),
    /**
     * The Connection will be acquired as soon as it is needed; it will be released
     * after each statement is executed.
     */
    DELAYED_ACQUISITION_AND_RELEASE_AFTER_STATEMENT(AS_NEEDED, AFTER_STATEMENT),
    /**
     * The Connection will be acquired as soon as it is needed; it will be released
     * after each transaction is completed.
     */
    DELAYED_ACQUISITION_AND_RELEASE_AFTER_TRANSACTION(AS_NEEDED, AFTER_TRANSACTION);

    private final ConnectionAcquisitionMode acquisitionMode;
    private final ConnectionReleaseMode releaseMode;

    PhysicalConnectionHandlingMode(ConnectionAcquisitionMode acquisitionMode, ConnectionReleaseMode releaseMode) {
        this.acquisitionMode = acquisitionMode;
        this.releaseMode = releaseMode;
    }

    public ConnectionAcquisitionMode getAcquisitionMode() {
        return acquisitionMode;
    }

    public ConnectionReleaseMode getReleaseMode() {
        return releaseMode;
    }

    public static PhysicalConnectionHandlingMode interpret(Object setting) {
        if (setting == null) {
            return null;
        }

        if (setting instanceof PhysicalConnectionHandlingMode) {
            return (PhysicalConnectionHandlingMode) setting;
        }

        final String value = setting.toString().trim();
        if (value.isEmpty()) {
            return null;
        }

        return PhysicalConnectionHandlingMode.valueOf(value.toUpperCase(Locale.ROOT));
    }

    public static PhysicalConnectionHandlingMode interpret(ConnectionAcquisitionMode acquisitionMode,
            ConnectionReleaseMode releaseMode) {
        if (acquisitionMode == IMMEDIATELY) {
            if (releaseMode != null && releaseMode != ON_CLOSE) {
                throw new IllegalArgumentException(
                        "Only ConnectionReleaseMode.ON_CLOSE can be used in combination with "
                                + "ConnectionAcquisitionMode.IMMEDIATELY; but ConnectionReleaseMode."
                                + releaseMode.name() + " was specified.");
            }
            return IMMEDIATE_ACQUISITION_AND_HOLD;
        } else {
            switch (releaseMode) {
            case AFTER_STATEMENT: {
                return DELAYED_ACQUISITION_AND_RELEASE_AFTER_STATEMENT;
            }
            case AFTER_TRANSACTION: {
                return DELAYED_ACQUISITION_AND_RELEASE_AFTER_TRANSACTION;
            }
            default: {
                return DELAYED_ACQUISITION_AND_HOLD;
            }
            }
        }
    }
}