/*
 *  eXist Open Source Native XML Database
 *  Copyright (C) 2001-06 The eXist Project
 *  http://exist-db.org
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 *  $Id: AccessContext.java 3898 2006-07-25 15:38:16Z wolfgang_m $
 */

package org.exist.security.xacml;

/**
 * This class represents the context from which an access is made.
 */
public final class AccessContext
{
	/**
	 * The postfix for all internal accesses.
	 */
	public static final String INTERNAL = "(internal)";
	/**
	 * This represents when access is attempted as a result of a trigger.
	 */
	public static final AccessContext TRIGGER = new AccessContext("Trigger");
	/**
	 * This represents when access is made through SOAP.
	 */
	public static final AccessContext SOAP = new AccessContext("SOAP");
	/**
	 * This represents when access is made through XML:DB.
	 */
	public static final AccessContext XMLDB = new AccessContext("XML:DB");
	/**
	 * This represents when access is made through XQJ
	 */
	public static final AccessContext XQJ = new AccessContext("XQJ");
	/**
	 * The context for access through the REST-style interface. 
	 */
	public static final AccessContext REST = new AccessContext("REST");
	/**
	 * The context for remote access over XML-RPC.
	 */
	public static final AccessContext XMLRPC = new AccessContext("XML-RPC");

	/**
	 * The context for access through WEBDAV
	 */
	public static final AccessContext WEBDAV = new AccessContext("WebDAV");
	/**
	 * The context for access internally when the access is not made by any of the
	 * other contexts.  This should only be used if all actions
	 * are completely trusted, that is, no user input should be directly included
	 * in a query or any similar case. 
	 */
	public static final AccessContext INTERNAL_PREFIX_LOOKUP = new AccessContext("Prefix lookup " + INTERNAL);
	/**
	 * The context for trusted validation queries. 
	 */
	public static final AccessContext VALIDATION_INTERNAL = new AccessContext("Validation " + INTERNAL);
	/**
	 * The context for JUnit tests that directly make access not through the other
	 * contexts.
	 */
	public static final AccessContext TEST = new AccessContext("JUnit test");

	/**
	 * The context for evaluating XInclude paths.
	 */
	public static final AccessContext XINCLUDE = new AccessContext("XInclude");
	
	private final String value;
	
	private AccessContext()
	{
		throw new RuntimeException("The empty constructor is not supported.");
	}
	private AccessContext(String value)
	{
		if(value == null || value.length() == 0)
			throw new NullPointerException("Access context value cannot be null");
		this.value = value;
	}
	
	public String toString()
	{
		return value;
	}
}
