/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 * 
 * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
 * for its Fraunhofer Institute for Computer Architecture and Software
 * Technology (FIRST), Berlin, Germany and Technical University Berlin,
 * Germany.
 * 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * $Id: IOTType.java 23416 2010-02-03 19:59:31Z stephan $
 * 
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 * 
 * Contributors:
 * Fraunhofer FIRST - Initial API and implementation
 * Technical University Berlin - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.core;

import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;

/**
 * OTM Type with Team/Role support and link to a corresponding JavaModel element
 *
 * @author jwloka
 * @version $Id: IOTType.java 23416 2010-02-03 19:59:31Z stephan $
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface IOTType extends IOTJavaElement, IType
{
    /**
     * Used for getRoleType(int) to indicate which role classes should be returned.
     */
	public static final int INLINED = 1;
    /**
     * Used for getRoleType(int) to indicate which role classes should be returned.
     */
	public static final int ROLEFILE = 2;
	/**
	 * If the given team is also role, traverse its implicit super hierarchy and 
	 * include the roles of all implicit super teams
	 */
	public static final int IMPLICTLY_INHERITED = 4;
	/**
	 * Traverse the explicit super hierarchy and include the roles of all explicit super teams
	 */
	public static final int EXPLICITLY_INHERITED = 8;
	/**
	 * Only search the roles in the super hierarchy. Must be combined with 
	 * EXPLICITLY_INHERITED or IMPLICITLY_INHERITED
	 */
	public static final int EXCLUDE_SELF = 16;
	/**
	 * Search in the given team and all implicit and explicit super teams.
	 * Equivalent to
	 * INLINED | ROLEFILE | IMPLICTLY_INHERITED | EXPLICITLY_INHERITED;
	 */
	public static final int ALL = INLINED | ROLEFILE | IMPLICTLY_INHERITED | EXPLICITLY_INHERITED;
	
	/**
	 * Indicates whether this type is a role or not 
	 */
	public boolean isRole();

	/**
	 * Indicates whether this type is a team or not 
	 */
	public boolean isTeam();

	/**
	 * Returns the flags from parsing. These flags provide additional
	 * information about the type's modifiers e.g. IConstants.AccTeam
	 * @see Flags
	 */	
	@Override
	public int getFlags();

	/**
	 * Returns all types defined in this type.
	 * @return array of IType's or an empty array   
	 */
	public IType[] getInnerTypes();
	
	/**
	 * Returns the role type associated conceptually contained by this team type
	 * or null.
	 * @param simpleName - the name of the desired role
	 */
	public IType getRoleType(String simpleName);
	
	/**
	 * Similar to getRoleType(String), but directly use the search engine
	 * thus avoiding exists() test on a non-existent ROFI type.
	 */
	public IType searchRoleType(String simpleName);

    /**
	 * Returns all role types (inlined and role files) contained by this team.
	 */
	public IType[] getRoleTypes() throws JavaModelException;
	
	/**
	 * Returns all roles of this team. Either the inlined, the role files or both are 
	 * returned.
	 * See {@link IOTType#getRoleTypes()} for gathering all role types.
	 * 
	 * @param which an ORed combination of IOTType.INLINED, IOTType.ROLEFILE, IOTType.IMPLICITLY_INHERITED,
	 * IOTType.EXPLICITLY_INHERITED and IOTType.EXCLUDE_SELF
	 */
	public IType[] getRoleTypes(int which) throws JavaModelException;
	
	/**
	 * Returns roles named roleName of this team. Either the inlined, the role files or both are 
	 * returned.
	 * See {@link IOTType#getRoleTypes()} for gathering all role types.
	 * 
	 * @param which an ORed combination of IOTType.INLINED, IOTType.ROLEFILE, IOTType.IMPLICITLY_INHERITED,
	 * IOTType.EXPLICITLY_INHERITED and IOTType.EXCLUDE_SELF
	 */
	public IType[] getRoleTypes(int which, String roleName) throws JavaModelException;

}
