/******************************************************************************
 * Copyright (c) 2004, 2006 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.gmf.runtime.emf.core.internal.validation;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EContentsEList;

import org.eclipse.emf.validation.AbstractModelConstraint;
import org.eclipse.emf.validation.IValidationContext;
import org.eclipse.gmf.runtime.emf.core.internal.plugin.EMFCorePlugin;
import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;

/**
 * Implements a validator that collects model reference errors and forwards them on to
 * the EMF model validation service.
 *
 * @author Steve Gutz (sgutz)
 */
public class ProxiesResolveConstraint
	extends AbstractModelConstraint {
	
	/** The rule ID for resource file path errors */
	public static final String	RESOURCE_RULE_ID	= "org.eclipse.gmf.runtime.emf.core.ResourceFixup"; //$NON-NLS-1$
	/** The rule ID for element ID errors */
	public static final String	ELEMENT_RULE_ID		= "org.eclipse.gmf.runtime.emf.core.IdFixup"; //$NON-NLS-1$

	public static final String DIAGNOSTIC_SOURCE = EMFCorePlugin.getPluginId();
	
	/**
	 * Initializes me.
	 */
	public ProxiesResolveConstraint() {
		super();
	}

	private String getObjectLabel(EObject eObject)
	{
		return EMFCoreUtil.getQualifiedName(eObject,true);
	}
	
	private String getFeatureLabel(EStructuralFeature eStructuralFeature)
	{
		return eStructuralFeature.getName();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.emf.validation.IValidationContext)
	 */
	public IStatus validate(IValidationContext ctx) {
    	EObject target = ctx.getTarget();
    	
    	EStructuralFeature feature = null;
    	EObject proxyObject = null;
    	
		for (EContentsEList.FeatureIterator i = (EContentsEList.FeatureIterator) target
			.eCrossReferences().iterator(); i.hasNext();) {
			
			EObject eCrossReferenceObject = (EObject) i.next();
			
			if (!i.feature().isDerived() && eCrossReferenceObject.eIsProxy()) {
				feature = i.feature();
				proxyObject = eCrossReferenceObject;
				ctx.addResult(proxyObject);
				break;
			}
		}
		
		if (feature != null) {
			ResourceSet rSet = target.eResource().getResourceSet();
			
			// Load the resource for the broken element
			URI proxyURI = ((InternalEObject)proxyObject).eProxyURI().trimFragment();
			Resource resource = rSet.getResource(proxyURI, false);

			// If we found a resource and it is loaded then the ID must be
			// incorrect
			if (resource != null && resource.isLoaded()) {
				
				// If we have been asked to find this case through the element fixup
				//  constraint then we will report this problem.
				if (ctx.getCurrentConstraintId().equals(ELEMENT_RULE_ID)) {
					return ctx.createFailureStatus(new Object[] {
						getFeatureLabel(feature), getObjectLabel(target),
						getObjectLabel(proxyObject)});
				}
				
				return ctx.createSuccessStatus();
			}
			// If we have been asked to find this case through the resource fixup
			//  constraint then we will report this problem.
			else if (ctx.getCurrentConstraintId().equals(RESOURCE_RULE_ID)) {
				return ctx.createFailureStatus(new Object[] {
					getFeatureLabel(feature), getObjectLabel(target),
					getObjectLabel(proxyObject)});
			}
		}
    	return ctx.createSuccessStatus();
	}

// cmcgee: KEEPING THIS CODE AROUND FOR FUTURE INSPECTION
//	/**
//	 * A simple status implementation to convert an EMF disagnostic
//	 *
//	 * @author Steve Gutz (sgutz)
//	 */
//	private final class FixupStatus implements IConstraintStatus {
//		
//		Diagnostic diagnostic;
//		IModelConstraint constraint;
//
//		public FixupStatus(Diagnostic diagnostic, IModelConstraint constraint) {
//			this.diagnostic = diagnostic;
//			this.constraint = constraint;
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#getChildren()
//		 */
//		public IStatus[] getChildren() {
//			List l = diagnostic.getChildren();
//			List paredList = new ArrayList();
//			for (int iCtr = l.size() - 1; iCtr >= 0; iCtr--) {
//				Diagnostic child = (Diagnostic) l.get(iCtr);
//
//				// Only collect diagnostic errors for things we care about
//				if (child.getData().size() == 3) {
//					paredList.add(child);
//				}
//			}
//
//			IStatus[] converted = new FixupStatus[paredList.size()];
//			int iCtr = 0;
//			for (Iterator it = paredList.iterator(); it.hasNext();) {
//				converted[iCtr++] = new FixupStatus((Diagnostic) it.next(), constraint);
//			}
//			return converted;
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#getCode()
//		 */
//		public int getCode() {
//			return diagnostic.getCode();
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#getMessage()
//		 */
//		public String getMessage() {
//			String msg = diagnostic.getMessage();
//			String source = ProxyUtil.getProxyQName( (InternalEObject)diagnostic.getData().get(0));
//			String target = ProxyUtil.getProxyQName( (InternalEObject)diagnostic.getData().get(2));
//
//			boolean foundSource = false;
//			int index = 0;
//			while ( index != -1 && index < msg.length()) {
//				
//				index = msg.indexOf('\'', index);
//				if (index > -1) {
//					int nextQuoteIndex = msg.indexOf('\'', index+1);
//					if( nextQuoteIndex != -1 ) {
//						String sub = msg.substring(index, nextQuoteIndex);
//						
//						if( sub.indexOf( '@') != -1 && sub.indexOf( '}') != -1) {
//							if( !foundSource ) {
//								msg = msg.substring(0, index+1)
//										+ source + msg.substring(nextQuoteIndex);
//								nextQuoteIndex = index+source.length()+1;
//								foundSource = true;
//							} else {
//								msg = msg.substring(0, index+1)
//								+ target + msg.substring(nextQuoteIndex);
//								nextQuoteIndex = index+target.length()+1;
//							}
//						}
//						index = nextQuoteIndex+1;
//					}
//				}
//			}
//			return msg;
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#getSeverity()
//		 */
//		public int getSeverity() {
//			return diagnostic.getSeverity();
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#getException()
//		 */
//		public Throwable getException() {
//			return null;
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#getPlugin()
//		 */
//		public String getPlugin() {
//			return MSLPlugin.getPluginId();
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#isMultiStatus()
//		 */
//		public boolean isMultiStatus() {
//			List l = diagnostic.getChildren();
//			if (l == null || l.size() == 0)
//				return false;
//			return true;
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#isOK()
//		 */
//		public boolean isOK() {
//			return false;
//		}
//	
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.core.runtime.IStatus#matches(int)
//		 */
//		public boolean matches(int severityMask) {
//			return (diagnostic.getSeverity() & severityMask) != 0;
//		}
//
//		/* (non-Javadoc)
//		 * @see org.eclipse.gmf.runtime.emf.core.IValidationStatus#getTarget()
//		 */
//		public EObject getTarget() {
//			if (diagnostic.getData() == null)
//				return null;
//
//			Object obj = diagnostic.getData().get(0);
//			if (obj instanceof EObject)
//				return (EObject) obj;
//			return null;
//		}
//
//		/*
//		 * (non-Javadoc)
//		 * 
//		 * @see org.eclipse.gmf.runtime.emf.core.IValidationStatus#getRelatedObjects()
//		 */
//		public Set getRelatedObjects() {
//			HashSet set = new HashSet();
//			set.add(diagnostic.getData().get(2));
//			return set;
//		}
//
//		/* (non-Javadoc)
//		 * @see org.eclipse.emf.validation.model.IConstraintStatus#getConstraint()
//		 */
//		public IModelConstraint getConstraint() {
//			return constraint;
//		}
//
//		/* (non-Javadoc)
//		 * @see org.eclipse.emf.validation.model.IConstraintStatus#getResultLocus()
//		 */
//		public Set getResultLocus() {
//			if (diagnostic.getData() == null || diagnostic.getData().size() > 0) {
//				Object o = diagnostic.getData().get(0);
//				
//				// If the first object is an EObject, then we assume that this
//				//  is the EObject for which there is a problem. See the
//				//  javadoc for emf.common.util.Diagnostic.getData() for more
//				//  information.
//				if (o instanceof EObject) {
//					return Collections.singleton(o);
//				}
//			}
//			
//			return Collections.EMPTY_SET;
//		}
//	}
//	
//	/**
//	 * Overrides the basic EObjectValidator's proxy-resolvableness constraint
//	 * to check only those features that are not derived.
//	 *
//	 * @author Christian W. Damus (cdamus)
//	 */
//	private static final class EFixupValidator
//		extends EObjectValidator {
//
//		public boolean validate_EveryProxyResolves(EObject eObject,
//				DiagnosticChain diagnostics, Map context) {
//			boolean result = true;
//			for (EContentsEList.FeatureIterator i = (EContentsEList.FeatureIterator) eObject
//				.eCrossReferences().iterator(); i.hasNext();) {
//				
//				EObject eCrossReferenceObject = (EObject) i.next();
//				
//				if (!i.feature().isDerived() && eCrossReferenceObject.eIsProxy()) {
//					result = false;
//					if (diagnostics != null) {
//						diagnostics.add(new BasicDiagnostic(Diagnostic.ERROR,
//							ProxiesResolveConstraint.DIAGNOSTIC_SOURCE,
//							EObjectValidator.EOBJECT__EVERY_PROXY_RESOLVES,
//							EcorePlugin.INSTANCE.getString(
//								"_UI_UnresolvedProxy_diagnostic", //$NON-NLS-1$
//								new Object[] {
//									getFeatureLabel(i.feature(), context),
//									getObjectLabel(eObject, context),
//									getObjectLabel(
//										eCrossReferenceObject,
//										context)}),
//								new Object[] {
//									eObject,
//									i.feature(),
//									eCrossReferenceObject}));
//					} else {
//						break;
//					}
//				}
//			}
//			return result;
//		}
//	}
}
