//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.persistence.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.epf.persistence.UnnormalizedURIException;

/**
 * A extended resource set whose objects can references objects of other resource set
 * 
 * @author Phong Nguyen Le - Aug 9, 2006
 * @since  1.0
 */
public class ExtendedResourceSet extends ResourceSetImpl {
	public static final int URI_TYPE_UNKNOWN = 0;
	public static final int URI_TYPE_LOCAL = 1;
	public static final int URI_TYPE_EXTERNAL = 2;
	
	protected List<ResourceSet> referencedResourceSets = new ArrayList<ResourceSet>();

	
	/**
	 * Gets the type of the given URI.
	 * 
	 * @param uri
	 * @return one of URI type constants: {@link #URI_TYPE_EXTERNAL}, {@link #URI_TYPE_LOCAL}, {@link #URI_TYPE_UNKNOWN}
	 */
	protected int getURIType(URI uri) {
		return URI_TYPE_UNKNOWN;
	}
	
	public boolean add(ResourceSet referencedResourceSet) {
		if(!referencedResourceSets.contains(referencedResourceSet)) {
			return referencedResourceSets.add(referencedResourceSet);
		}
		return false;
	}
	
	@Override
	public EObject getEObject(URI uri, boolean loadOnDemand) {
		EObject object = null;
		UnnormalizedURIException ex = null;
		int uriType = getURIType(uri);
		if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_LOCAL) {
			try {
				object = super.getEObject(uri, loadOnDemand);
			} catch (UnnormalizedURIException e) {
				ex = e;
			}
			if(object != null) {
				return object;
			}
		}
		if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_EXTERNAL) {
			for (Iterator iter = referencedResourceSets.iterator(); iter.hasNext();) {
				ResourceSet resourceSet = (ResourceSet) iter.next();
				try {
					object = resourceSet.getEObject(uri, loadOnDemand);
					if(object != null) {
						return object;
					}
				} catch (UnnormalizedURIException e) {
					ex = e;
				}
			}
		} 
		
		if(ex != null) {
			throw ex;
		}
		return object;
	}	
	
	public void dispose() {
		referencedResourceSets.clear();
	}
}
