/* 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.wiki.auth; import java.io.Serializable; import java.security.Principal; import java.util.Arrays; import java.util.Comparator; /** * A lightweight, immutable Principal class. WikiPrincipals can be created with * and optional "type" to denote what type of user profile Principal it represents * (FULL_NAME, WIKI_NAME, LOGIN_NAME). Types are used to determine suitable * user and login Principals in classes like WikiSession. However, the type * property of a WikiPrincipal does not affect a WikiPrincipal's logical equality * or hash code; two WikiPrincipals with the same name but different types are still * considered equal. * * @since 2.2 */ public final class WikiPrincipal implements Principal, Comparable<Principal>, Serializable { private static final long serialVersionUID = 1L; /** * Represents an anonymous user. WikiPrincipals may be * created with an optional type designator: * LOGIN_NAME, WIKI_NAME, FULL_NAME or UNSPECIFIED. */ public static final Principal GUEST = new WikiPrincipal( "Guest" ); /** WikiPrincipal type denoting a user's full name. */ public static final String FULL_NAME = "fullName"; /** WikiPrincipal type denoting a user's login name. */ public static final String LOGIN_NAME = "loginName"; /** WikiPrincipal type denoting a user's wiki name. */ public static final String WIKI_NAME = "wikiName"; /** Generic WikiPrincipal of unspecified type. */ public static final String UNSPECIFIED = "unspecified"; /** Static instance of Comparator that allows Principals to be sorted. */ public static final Comparator<Principal> COMPARATOR = new PrincipalComparator(); private static final String[] VALID_TYPES; static { VALID_TYPES = new String[] { FULL_NAME, LOGIN_NAME, WIKI_NAME, UNSPECIFIED }; Arrays.sort( VALID_TYPES ); } private final String m_name; private final String m_type; /** For serialization purposes */ protected WikiPrincipal() { this(null); } /** * Constructs a new WikiPrincipal with a given name and a type of * {@link #UNSPECIFIED}. * @param name the name of the Principal */ public WikiPrincipal( String name ) { m_name = name; m_type = UNSPECIFIED; } /** * Constructs a new WikiPrincipal with a given name and optional type * designator. If the supplied <code>type</code> parameter is not * {@link #LOGIN_NAME}, {@link #FULL_NAME}, {@link #WIKI_NAME} * or {@link #WIKI_NAME}, this method throws * an {@link IllegalArgumentException}. * @param name the name of the Principal * @param type the type for this principal, which may be {@link #LOGIN_NAME}, * {@link #FULL_NAME}, {@link #WIKI_NAME} or {@link #WIKI_NAME}. */ public WikiPrincipal( String name, String type ) { m_name = name; if ( Arrays.binarySearch( VALID_TYPES, type ) < 0 ) { throw new IllegalArgumentException( "Principal type '" + type + "' is invalid."); } m_type = type; } /** * Returns the wiki name of the Principal. * @return the name */ public String getName() { return m_name; } /** * Two <code>WikiPrincipal</code>s are considered equal if their * names are equal (case-sensitive). * @param obj the object to compare * @return the result of the equality test */ public boolean equals( Object obj ) { if ( obj == null || !( obj instanceof WikiPrincipal ) ) { return false; } return m_name.equals( ( (WikiPrincipal) obj ).getName() ); } /** * The hashCode() returned for the WikiPrincipal is the same as * for its name. * @return the hash code */ public int hashCode() { return m_name.hashCode(); } /** * Returns the Principal "type": {@link #LOGIN_NAME}, {@link #FULL_NAME}, * {@link #WIKI_NAME} or {@link #WIKI_NAME} * @return the type */ public String getType() { return m_type; } /** * Returns a human-readable representation of the object. * @return the string representation */ public String toString() { return "[WikiPrincipal (" + m_type + "): " + getName() + "]"; } /** * Allows comparisons to any other Principal objects. Primary sorting * order is by the principal name, as returned by getName(). * * @param o {@inheritDoc} * @return {@inheritDoc} * @since 2.7.0 */ public int compareTo(Principal o) { return getName().compareTo( o.getName() ); } }