//  Copyright 2004 The Apache Software Foundation
//
// Licensed 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.tapestry.vlib.ejb;

import org.apache.commons.lang.enum.Enum;

/**
 *  Represents the different columns which may be sorted.
 *
 *  @author Howard Lewis Ship
 *  @version $Id$
 *  @since 3.0
 *
 **/

public class SortColumn extends Enum
{
	private static final long serialVersionUID = -9111154890216180024L;
	
	/**
	 *  Sort by book title.
	 * 
	 **/
	
	public static final SortColumn TITLE = new SortColumn("TITLE");
	
	/**
	 *  Sort by author name.
	 *  
	 **/
	
	public static final SortColumn AUTHOR = new SortColumn("AUTHOR");

	/**
	 *  Sort by publisher name.
	 * 
	 **/
	
	public static final SortColumn PUBLISHER = new SortColumn("PUBLISHER");
	
	/**
	 *  Sort by holder name (last name, then first).  Not applicable
	 *  to all queries.
	 * 
	 **/
	
	public static final SortColumn HOLDER = new SortColumn("HOLDER");

	/**
	 *  Sort by book owner (last name, then first).  Not applicable
	 *  to all queries.
	 * 
	 **/
	
	public static final SortColumn OWNER = new SortColumn("OWNER");
	
    private SortColumn(String name)
    {
        super(name);
    }

}
