/**
 * 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.
 */
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.1.5-b01-fcs 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2008.07.15 at 04:13:34 PM PDT 
//


package org.apache.geronimo.components.jaspi.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.message.AuthException;
import javax.security.auth.message.MessageInfo;
import javax.security.auth.message.config.ClientAuthConfig;
import javax.security.auth.message.config.ClientAuthContext;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.apache.geronimo.components.jaspi.impl.ClientAuthConfigImpl;


/**
 * <p>Java class for clientAuthConfigType complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="clientAuthConfigType">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="messageLayer" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="appContext" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="authenticationContextID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="protected" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
 *         &lt;element name="clientAuthContext" type="{http://geronimo.apache.org/xml/ns/geronimo-jaspi}clientAuthContextType" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 * @version $Rev: 939768 $ $Date: 2010-04-30 11:26:46 -0700 (Fri, 30 Apr 2010) $
 */
@XmlRootElement(name = "clientAuthConfig", namespace = "http://geronimo.apache.org/xml/ns/geronimo-jaspi")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "clientAuthConfigType", propOrder = {
    "messageLayer",
    "appContext",
    "authenticationContextID",
    "_protected",
    "clientAuthContext"
})
public class ClientAuthConfigType
    implements Serializable, KeyedObject
{

    private final static long serialVersionUID = 12343L;
    protected String messageLayer;
    protected String appContext;
    protected String authenticationContextID;
    @XmlElement(name = "protected")
    protected boolean _protected;
    //TODO go back to a map
//    @XmlJavaTypeAdapter(KeyedObjectMapAdapter.class)
    protected List<ClientAuthContextType> clientAuthContext;


    public ClientAuthConfigType() {
    }

    public ClientAuthConfigType(ClientAuthContextType clientAuthContextType, boolean _protected) {
        this.messageLayer = clientAuthContextType.getMessageLayer();
        this.appContext = clientAuthContextType.getAppContext();
        this.authenticationContextID = clientAuthContextType.getAuthenticationContextID();
        this.clientAuthContext = Collections.singletonList(clientAuthContextType);
        this._protected = _protected;
    }

    /**
     * Gets the value of the messageLayer property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getMessageLayer() {
        return messageLayer;
    }

    /**
     * Sets the value of the messageLayer property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setMessageLayer(String value) {
        this.messageLayer = value;
    }

    /**
     * Gets the value of the appContext property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getAppContext() {
        return appContext;
    }

    /**
     * Sets the value of the appContext property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setAppContext(String value) {
        this.appContext = value;
    }

    /**
     * Gets the value of the authenticationContextID property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getAuthenticationContextID() {
        return authenticationContextID;
    }

    /**
     * Sets the value of the authenticationContextID property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setAuthenticationContextID(String value) {
        this.authenticationContextID = value;
    }

    /**
     * Gets the value of the protected property.
     *
     * @return whether the client auth config is protected
     */
    public boolean isProtected() {
        return _protected;
    }

    public void refresh() throws AuthException, SecurityException {
    }

    /**
     * Sets the value of the protected property.
     *
     * @param value whether client auth config is protected.
     */
    public void setProtected(boolean value) {
        this._protected = value;
    }

    /**
     * Gets the value of the clientAuthContext property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the clientAuthContext property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getClientAuthContext().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link ClientAuthContextType }
     * 
     *
     * @return map of id to client auth context
     */
    public List<ClientAuthContextType> getClientAuthContext() {
        if (clientAuthContext == null) {
            clientAuthContext = new ArrayList<ClientAuthContextType>();
        }
        return clientAuthContext;
    }


    //TODO move to ClientAuthContextImpl
    public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException {
        if (authenticationContextID != null) {
            return authenticationContextID;
        }
        for (ClientAuthContextType clientAuthContextType: clientAuthContext) {
            String authContextID = clientAuthContextType.getAuthenticationContextID(messageInfo);
            if (authContextID != null) {
                return authContextID;
            }
        }
        return null;
    }

    public String getKey() {
        return ConfigProviderType.getRegistrationKey(messageLayer, appContext);
    }

}
