/*******************************************************************************
 * Copyright (c) 2001, 2004 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
 *******************************************************************************/
/*
 * Created on Jun 11, 2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package org.eclipse.jst.j2ee.commonarchivecore.internal.helpers;

import java.util.HashMap;
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.EReference;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMLResource;

/**
 * @author cbridgha
 * 
 * To change the template for this generated type comment go to Window>Preferences>Java>Code
 * Generation>Code and Comments
 */
final class ResourceProxyValidator {
	static HashMap resourceURIMap = new HashMap();

	private static void resolveContainedProxies(EObject refObject) {
		List contained = refObject.eContents();
		EObject mofObject;
		for (int i = 0; i < contained.size(); i++) {
			mofObject = (EObject) contained.get(i);
			resolveProxies(mofObject);
		}
	}

	private static void resolveNonContainedProxies(EObject refObject) {
		List references = refObject.eClass().getEAllReferences();
		EReference reference;
		EObject proxyOrObject;
		for (int i = 0; i < references.size(); i++) {
			reference = (EReference) references.get(i);
			if (!reference.isContainment() && !reference.isTransient()) {
				if (reference.isMany()) {
					Iterator value = ((List) refObject.eGet(reference)).iterator();
					while (value.hasNext()) {
						proxyOrObject = (EObject) value.next();
						if (proxyOrObject.eIsProxy())
							value.remove();
					}
				} else {
					proxyOrObject = (EObject) refObject.eGet(reference, false);
					if (proxyOrObject != null && proxyOrObject.eIsProxy()) {
						URI resourceURI = ((EObjectImpl) proxyOrObject).eProxyURI().trimFragment();
						String protocol = resourceURI.scheme();
						if (protocol == null || !protocol.equals("java")) { //$NON-NLS-1$
							String id = ((EObjectImpl) proxyOrObject).eProxyURI().fragment();
							if (resourceURIMap.get(resourceURI) != null) {
								Resource cachedResource = (Resource) resourceURIMap.get(resourceURI);
								proxyOrObject = ((XMLResource) cachedResource).getIDToEObjectMap().get(id);
							} else {
								proxyOrObject = (EObject) refObject.eGet(reference);
								resourceURIMap.put(resourceURI, proxyOrObject.eResource());
							}
							if (proxyOrObject == null || proxyOrObject.eIsProxy())
								refObject.eSet(reference, null);
						}
					}
				}
			}
		}
	}

	private static void resolveProxies(EObject refObject) {
		if (refObject != null) {
			resolveNonContainedProxies(refObject);
			resolveContainedProxies(refObject);
		}
	}

	/**
	 * Force all of the proxies with <code>resource</code> to be resolved.
	 */
	static void checkForUnresolvableProxies(Resource resource) {
		resourceURIMap = new HashMap(); //Reset hashmap on each call
		if (resource != null) {
			List topLevels = resource.getContents();
			EObject mofObject;
			for (int i = 0; i < topLevels.size(); i++) {
				mofObject = (EObject) topLevels.get(i);
				resolveProxies(mofObject);
			}
		}
	}

}
