blob: e68650728069d0ee3e134239d8dd774fdc8011da [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2005, 2008 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.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.validation.AbstractModelConstraint;
import org.eclipse.emf.validation.IValidationContext;
import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
/**
* A constraint that enforces universally unique IDs (UUIDs), that is, it fails
* if multiple eObjects have the same UUID.
*
* @author Scott Cowan
*/
public class UUIDConstraint
extends AbstractModelConstraint {
/** The rule ID for ambiguous ID errors */
public static final String RULE_ID = "org.eclipse.gmf.runtime.emf.core.UUIDConstraint"; //$NON-NLS-1$
public UUIDConstraint() {
super();
}
/**
* Return a label for an eObject.
*
* @param eObject
* an eObject
* @return a label
*/
private String getEObjectLabel(EObject eObject) {
return EMFCoreUtil.getQualifiedName(eObject, true);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.emf.validation.IValidationContext)
*/
public IStatus validate(IValidationContext ctx) {
EObject target = ctx.getTarget();
Resource resource = target.eResource();
if (!(resource instanceof XMLResource))
return ctx.createSuccessStatus();
// Fail constraint if target is the key of an eObject to ID map entry,
// but not the value of an ID to eObject map entry.
XMLResource xmlResource = (XMLResource) resource;
String id = xmlResource.getID(target);
// Only validate EObjects which have a UUID
if (null != id) {
EObject eObject = xmlResource.getEObject(id);
if (eObject != target) {
return ctx
.createFailureStatus(new Object[] {getEObjectLabel(target)});
}
}
return ctx.createSuccessStatus();
}
}