/*******************************************************************************
 * Copyright (c) 2009 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.ws.jaxws.dom.runtime.api;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jst.ws.jaxws.dom.runtime.registry.IWsDOMRuntimeInfo;
import org.eclipse.jst.ws.jaxws.dom.runtime.registry.WsDOMRuntimeRegistry;
import org.eclipse.jst.ws.jaxws.utils.logging.ILogger;
import org.eclipse.jst.ws.jaxws.utils.logging.Logger;

/**
 * Factory class for instantiating DOM Runtimes and managing those instances.
 * 
 * @author Georgi Hristov
 *
 */
public class WsDOMRuntimeManager implements IWSDOMRuntimeManager
{
	private static WsDOMRuntimeManager instance = new WsDOMRuntimeManager();

	private Map<String,IWsDOMRuntimeExtension> domRuntimes = new HashMap<String,IWsDOMRuntimeExtension>();

	protected WsDOMRuntimeManager()
	{
		// singleton
	}
	
	public static IWSDOMRuntimeManager instance()
	{
		return instance;
	}	
	
	/**
	 * Instantiates the DOM Runtimes if not already.
	 *
	 */
	public synchronized void createDOMRuntimes(final IProgressMonitor monitor)
	{
		for (IWsDOMRuntimeInfo runtimeInfo : WsDOMRuntimeRegistry.getRegisteredRuntimesInfo()) {
			createDOMRuntime(runtimeInfo, monitor);
		}
	}
	
	protected IWsDOMRuntimeExtension createDOMRuntime(final IWsDOMRuntimeInfo runtimeInfo, final IProgressMonitor monitor)
	{
		final IWsDOMRuntimeExtension domRuntime = getDOMRuntime(runtimeInfo);		
		if (domRuntime == null) {
			return null;
		}
		
		try {
			domRuntime.createDOM(monitor);
		} 
		catch (Exception unexpected) {
			logger().logError("Unexpected Exception! Dom from runtime " + runtimeInfo.getName() + " will not be processed!", unexpected); //$NON-NLS-1$ //$NON-NLS-2$
		}
		
		return domRuntime;
	}
	
	/**
	 * This method should return the DOM runtime instance corresponding to the descriptor object
	 * of type IRuntimeInfo and instantiate such DOM runtime instance if non existent at the 
	 * moment of invocation of this method.
	 * 
	 * @param runtimeInfo - descriptor of the DOM runtime to be instantiated and returned 
	 * @return the DOM runtime instance
	 */
	public IWsDOMRuntimeExtension getDOMRuntime(final IWsDOMRuntimeInfo runtimeInfo)
	{
		if (runtimeInfo == null) {
			return null;
		}
		
		IWsDOMRuntimeExtension domRuntime = domRuntimes.get(runtimeInfo.getId());		
		if (domRuntime == null)
		{
			domRuntime = WsDOMRuntimeRegistry.instantiateRuntime(runtimeInfo);
			if (domRuntime != null) {
				synchronized(domRuntimes) {
					domRuntimes.put(runtimeInfo.getId(), domRuntime);
				}
			}
		}
		
		return domRuntime;
	}
	
	/**
	 * This method should return the DOM runtime instance corresponding to the runtime id
	 * and instantiate such DOM runtime instance if non existent at the 
	 * moment of invocation of this method.
	 * 
	 * @param runtimeId - string identifier of the runtime 
	 * @return the DOM runtime instance
	 */
	public IWsDOMRuntimeExtension getDOMRuntime(final String runtimeId)
	{
		return getDOMRuntime(WsDOMRuntimeRegistry.getRuntimeInfo(runtimeId));
	}
    
    /**
     * 
     * @return a list of all instantiated DOM Runtimes
     */
    public Collection<IWsDOMRuntimeExtension> getDOMRuntimes()
    {
    	if (domRuntimes.size() == 0) 
    	{
	    	final Collection<IWsDOMRuntimeInfo> rtInfos = WsDOMRuntimeRegistry.getRegisteredRuntimesInfo();
	    	for (IWsDOMRuntimeInfo runtimeInfo : rtInfos) {
				getDOMRuntime(runtimeInfo);
			}
    	}
    	
    	return domRuntimes.values();
    }
	
	/**
	 * This method should reload all instances of DOM Runtimes.
	 *
	 */
	public synchronized void reloadDOMRuntimes(final IProgressMonitor monitor)
	{
		synchronized(domRuntimes) {
			domRuntimes = new HashMap<String,IWsDOMRuntimeExtension>();
		}
		
		createDOMRuntimes(monitor);
	}

	private ILogger logger() {
		return new Logger();
	}
}
