/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.sling.engine.auth;

import javax.jcr.Credentials;

/**
 * The <code>AuthenticationInfo</code> defines the data returned from the
 * {@link AuthenticationHandler#authenticate(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}
 * method.
 *
 * @deprecated see {@link AuthenticationHandler}
 */
@Deprecated
public class AuthenticationInfo {

    /**
     * This object is returned by the
     * {@link AuthenticationHandler#authenticate(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}
     * method to indicate an ongoing authentication transaction.
     */
    public static final AuthenticationInfo DOING_AUTH = new AuthenticationInfo();

    /** The type of authentication */
    private final String authType;

    /** The <code>javax.jcr.Credentials</code> extracted from the request */
    private final Credentials credentials;

    /**
     * The name of the workspace this user is wishing to login,
     * <code>null</code> means the default workspace.
     */
    private final String workspaceName;

    /** Creates an empty instance, used for the {@link #DOING_AUTH} constants */
    private AuthenticationInfo() {
        this(null, null, null);
    }

    /**
     * Creates an instance of this class with the given authentication type and
     * credentials connecting to the default workspace as if the
     * {@link #AuthenticationInfo(String, Credentials, String)} method would be
     * called with a <code>null</code> workspace name.
     *
     * @param authType The authentication type, must not be <code>null</code>.
     * @param credentials The credentials, must not be <code>null</code>.
     * @see #getAuthType()
     * @see #getCredentials()
     */
    public AuthenticationInfo(String authType, Credentials credentials) {
        this(authType, credentials, null);
    }

    /**
     * Creates an instance of this class with the given authentication type and
     * credentials.
     *
     * @param authType The authentication type, must not be <code>null</code>.
     * @param credentials The credentials, must not be <code>null</code>.
     * @param workspaceName The name of the workspace to connect to, may be
     *            <code>null</code> to connect to the default workspace.
     * @see #getAuthType()
     * @see #getCredentials()
     */
    public AuthenticationInfo(String authType, Credentials credentials,
            String workspaceName) {
        this.authType = authType;
        this.credentials = credentials;
        this.workspaceName = workspaceName;
    }

    /**
     * Returns type of authentication provisioning.
     * <p>
     * If authentication is taking place through one of the standard ways, such
     * as Basic or Digest, the return value is one of the predefined constants
     * of the <code>HttpServletRequest</code> interface. Otherwise the value
     * may be specific to the {@link AuthenticationHandler} implementation.
     */
    public String getAuthType() {
        return authType;
    }

    /**
     * Returns the credentials extracted from the client request to use for
     * authentication.
     */
    public Credentials getCredentials() {
        return credentials;
    }

    /**
     * Returns the name of the workspace the user contained in this instance
     * wishes to connect to. This may be <code>null</code>, in which case the
     * user is connected to the default workspace.
     */
    public String getWorkspaceName() {
        return workspaceName;
    }
}
