/***********************************************************************
 * Copyright (c) 2008 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 ***********************************************************************/
package org.eclipse.jst.jee.model.internal;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import org.eclipse.core.resources.IProject;
import org.eclipse.jst.j2ee.model.IModelProvider;
import org.eclipse.jst.j2ee.model.IModelProviderFactory;
import org.eclipse.jst.j2ee.model.IModelProviderListener;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;

/**
 * @author Kiril Mitov k.mitov@sap.com
 * 
 */
public class Web25MergedModelProviderFactory implements IModelProviderFactory {

	private HashMap<IProject, IModelProvider> xmlResources = new HashMap<IProject, IModelProvider>();

	public IModelProvider create(IProject project) {
		IModelProvider result = getResource(project);
		if(result == null || ((Web25MergedModelProvider)result).isDisposed()){
			//Transport listeners so they are not lost.
			Collection<IModelProviderListener> listeners = new ArrayList<IModelProviderListener>();
			if (result != null){
				listeners = ( (Web25MergedModelProvider)result).getListeners();
			}
			result = new Web25MergedModelProvider(project);
			
			addListeners(result, listeners);
			addResource(project, result);
		}
		return result;
	}

	private void addListeners(IModelProvider modelProvider,
			Collection<IModelProviderListener> listeners) {
		for (IModelProviderListener iModelProviderListener : listeners) {
			if (iModelProviderListener != null)
				modelProvider.addListener(iModelProviderListener);
		}
	}

	public IModelProvider create(IVirtualComponent component) {
		return create(component.getProject());
	}

	private void addResource(IProject project, IModelProvider modelProvider){
		xmlResources.put(project, modelProvider);
	}

	private IModelProvider getResource(IProject project){
		return xmlResources.get(project);
	}

}
