/*******************************************************************************
 * Copyright (c) 2001, 2005 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jem.java.internal.impl;
/*


 */
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.impl.EFactoryImpl;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;

import org.eclipse.jem.internal.java.instantiation.IInstantiationHandler;
import org.eclipse.jem.internal.java.instantiation.IInstantiationHandlerFactoryAdapter;

/**
 * The factory to use JavaRef packages. It will use the
 * IInstantiationHandler, if there is one, to do the
 * factory requests. Else it will let the superclass handle it.
 */
public class JavaFactoryImpl extends EFactoryImpl {
	
	private IInstantiationHandler instantiationHandler;
	private boolean retrievedHandler;

	/**
	 * Constructor for JavaFactoryImpl.
	 */
	public JavaFactoryImpl() {
		super();
	}

	protected IInstantiationHandler getInstantiationHandler() {
		if (!retrievedHandler) {
			// Need to retrieve handler lazily because when factory is created it does not yet know what ResourceSet it is in.
			// Can't know that until the first time we need a handler.
			ResourceSet rset = getEPackage().eResource().getResourceSet();
			if (rset != null) {
				retrievedHandler = true;
				IInstantiationHandlerFactoryAdapter factory = (IInstantiationHandlerFactoryAdapter) EcoreUtil.getExistingAdapter(rset, IInstantiationHandlerFactoryAdapter.ADAPTER_KEY);
				if (factory != null)
					instantiationHandler = factory.getInstantiationHandler(this);
			}
		}
		return instantiationHandler;
	}
	
	/**
	 * @see org.eclipse.emf.ecore.EFactory#create(EClass)
	 */
	public EObject create(EClass eClass) {
		IInstantiationHandler ia = getInstantiationHandler();
		if (ia == null || !ia.handlesClass(eClass))
			return super.create(eClass);
		else
			return ia.create(eClass);
	}

}
