/**
 *                                                                            
 * 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;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// TODO: Auto-generated Javadoc
/**
 * The Class ASubOrganization.
 */
public class AbstractSubOrganization extends AbstractOrgElement implements ISubOrganization {

	/** The title of an organization. */
	private String title;
	/** The position map of all positions including of its sub organizations. */
	private Map<String, IPosition> positionMap = new HashMap<String, IPosition>();
	/**
	 * The position map only of the own positions without its sub organizations
	 * .
	 */
	private Map<String, IPosition> ownPositionMap = new HashMap<String, IPosition>();
	/** The sub organization map. */
	private Map<String, ISubOrganization> subOrgMap = new HashMap<String, ISubOrganization>();

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.osbp.authentication.provider.ISubOrganization#getFilterValueList
	 * ()
	 */
	@Override
	public List<String> getFilterValueList() {
		return null;
	}

	/**
	 * Gets the title.
	 *
	 * @return the title
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * Sets the title.
	 *
	 * @param title
	 *            the new title
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.osbp.ui.api.useraccess.IOrganizationService#getPosition(java
	 * .lang.String)
	 */
	@Override
	public IPosition getPosition(String name) {
		addSubOrgPositions();
		return positionMap.get(name);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.osbp.ui.api.useraccess.IOrganizationService#getPositions()
	 */
	@Override
	final public Collection<IPosition> getPositions() {
		addSubOrgPositions();
		return positionMap.values();
	}

	/**
	 * Maintains the position map up to date.
	 */
	private void addSubOrgPositions() {
		for (ISubOrganization subOrg : getSubOrganizations()) {
			if(subOrg instanceof AbstractSubOrganization) {
				((AbstractSubOrganization)subOrg).addSubOrgPositions();
			}
			for (IPosition subOrgPosition : subOrg.getOwnPositions()) {
				positionMap.put(subOrgPosition.getName(), subOrgPosition);
			}
		}
	}

	@Override
	final public Collection<IPosition> getOwnPositions() {
		return ownPositionMap.values();
	}

	final public void setPosition(IPosition position) {
		positionMap.put(position.getName(), position);
		ownPositionMap.put(position.getName(), position);
	}

	final public Collection<ISubOrganization> getSubOrganizations() {
		return subOrgMap.values();
	}

	public void setSubOrganization(ISubOrganization subOrg) {
		subOrgMap.put(subOrg.getName(), subOrg);
	}

}
