/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.ui.api.useraccess;

// TODO: Auto-generated Javadoc
/**
 * The Interface IPosition.
 */
public interface IOrgElement {

	/**
	 * Gets the name.
	 *
	 * @return the name
	 */
	String getName();

	/**
	 * Checks for superior.
	 *
	 * @return true, if successful
	 */
	boolean hasSuperior();

	/**
	 * Gets the superior.
	 *
	 * @return the superior
	 */
	String getSuperior();

	/**
	 * Checks for root node.
	 *
	 * @return true, if successful
	 */
	boolean hasRootNode();

	/**
	 * Gets the root node.
	 *
	 * @return the root node
	 */
	String getRootNode();
	
	/**
	 * Gets the organization the node belongs to.
	 *
	 * @return the organization
	 */
	ISubOrganization getOrganization();
}
