/*
 * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.queries;


/**
 * <p><b>Purpose</b>:
 * Provide a means of controlling the behavior of in-memory and conforming queries
 * that access un-instantiated indirection objects in processing the query against cached objects.
 *
 * <p><b>Description</b>:
 * This class defines the valid constant values for handling in-memory querying.
 * The constants should be set into the query's inMemoryQueryIndirectionPolicy.
 *
 * @author Gordon Yorke
 * @since TopLink/Java 3.6.3
 */
public class InMemoryQueryIndirectionPolicy implements java.io.Serializable {
    /** If a non-instantiated indirection object is encountered an exception is thrown. */
    public static final int SHOULD_THROW_INDIRECTION_EXCEPTION = 0;
    /** If a non-instantiated indirection object is encountered an exception it is instantiated.  Caution should be used in using this option. */
    public static final int SHOULD_TRIGGER_INDIRECTION = 1;
    /** If a non-instantiated indirection object is encountered the object is assumed to conform. */
    public static final int SHOULD_IGNORE_EXCEPTION_RETURN_CONFORMED = 2;
    /** If a non-instantiated indirection object is encountered the object is assumed to not conform. */
    public static final int SHOULD_IGNORE_EXCEPTION_RETURN_NOT_CONFORMED = 3;

    protected int policy;
    /** Used to set the policy state in the query. */
    protected ObjectLevelReadQuery query;

    public InMemoryQueryIndirectionPolicy() {
        this.policy = SHOULD_THROW_INDIRECTION_EXCEPTION;
    }

    public InMemoryQueryIndirectionPolicy(int policyValue) {
        this.policy = policyValue;
    }

    public InMemoryQueryIndirectionPolicy(int policy, ObjectLevelReadQuery query) {
        this.policy = policy;
        this.query = query;
    }

    public boolean shouldTriggerIndirection() {
        return this.policy == SHOULD_TRIGGER_INDIRECTION;
    }

    public boolean shouldThrowIndirectionException() {
        return this.policy == SHOULD_THROW_INDIRECTION_EXCEPTION;
    }

    public boolean shouldIgnoreIndirectionExceptionReturnConformed() {
        return this.policy == SHOULD_IGNORE_EXCEPTION_RETURN_CONFORMED;
    }

    public boolean shouldIgnoreIndirectionExceptionReturnNotConformed() {
        return this.policy == SHOULD_IGNORE_EXCEPTION_RETURN_NOT_CONFORMED;
    }

    public void ignoreIndirectionExceptionReturnNotConformed() {
        setPolicy(SHOULD_IGNORE_EXCEPTION_RETURN_NOT_CONFORMED);
    }

    public void ignoreIndirectionExceptionReturnConformed() {
        setPolicy(SHOULD_IGNORE_EXCEPTION_RETURN_CONFORMED);
    }

    public void triggerIndirection() {
        setPolicy(SHOULD_TRIGGER_INDIRECTION);
    }

    public void throwIndirectionException() {
        setPolicy(SHOULD_THROW_INDIRECTION_EXCEPTION);
    }

    public int getPolicy() {
        return this.policy;
    }

    public void setPolicy(int policy) {
        this.policy = policy;
        if (this.query != null) {
            this.query.setInMemoryQueryIndirectionPolicyState(policy);
        }
    }

    /**
     * INTERNAL:
     * Return the query.
     */
    public ObjectLevelReadQuery getQuery() {
        return query;
    }

    /**
     * INTERNAL:
     * Set the query.
     */
    public void setQuery(ObjectLevelReadQuery query) {
        this.query = query;
    }
}
