blob: 8a5eca2d713c8a9fa2a6bc67c5015b1ffc10c473 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.validation.constraints;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.validation.AbstractModelConstraint;
import org.eclipse.emf.validation.EMFEventType;
import org.eclipse.emf.validation.IValidationContext;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.edit.validation.DependencyChecker;
import org.eclipse.epf.uma.NamedElement;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.validation.Activator;
import org.eclipse.epf.validation.ValidationResources;
import org.eclipse.epf.validation.util.ValidationStatus;
import org.eclipse.osgi.util.NLS;
/**
* @author Phong Nguyen Le
* @since 1.0
*/
public class RelationshipConstraint extends AbstractModelConstraint {
private static final boolean DEBUG = Activator.getDefault().isDebugging();
private static final Collection referencesToCheckForCircularDependency = Arrays.asList(new Object[] {
UmaPackage.Literals.METHOD_PLUGIN__BASES
, UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT
, UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS
, UmaPackage.Literals.DELIVERABLE__DELIVERED_WORK_PRODUCTS
, UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS
});
/* (non-Javadoc)
* @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.emf.validation.IValidationContext)
*/
public IStatus validate(IValidationContext ctx) {
if (DependencyChecker.newCheck) {
return Status.OK_STATUS;
}
EObject eObj = ctx.getTarget();
EMFEventType eType = ctx.getEventType();
if(DEBUG) {
if(eObj instanceof NamedElement) {
NamedElement e = (NamedElement) eObj;
System.out.println("RelationshipConstraint.validate(): " + TngUtil.getTypeText(e) + ": '" + e.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
// In the case of batch mode.
if (eType == EMFEventType.NULL) {
Collection features = new ArrayList(referencesToCheckForCircularDependency);
features.retainAll(eObj.eClass().getEAllReferences());
for (Iterator iter = features.iterator(); iter.hasNext();) {
EReference ref = (EReference) iter.next();
if(ref.isMany()) {
for (Iterator iterator = ((List)eObj.eGet(ref)).iterator(); iterator.hasNext();) {
Object o = iterator.next();
IStatus status = DependencyChecker.checkCircularDependency(eObj, ref, o);
if(!status.isOK()) {
String msg = status.getMessage();
if(StrUtil.isBlank(msg)) {
msg = NLS.bind(ValidationResources.circularDependency_error, ref.getEContainingClass().getName(), ref.getName());
}
multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, eObj, ref));
}
}
}
else {
Object o = eObj.eGet(ref);
if(o != null) {
IStatus status = DependencyChecker.checkCircularDependency(eObj, ref, o);
if(!status.isOK()) {
String msg = status.getMessage();
if(StrUtil.isBlank(msg)) {
msg = NLS.bind(ValidationResources.circularDependency_error, ref.getEContainingClass().getName(), ref.getName());
}
multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, eObj, ref));
}
}
}
}
if(multiStatus.isOK()) {
return ctx.createSuccessStatus();
}
else {
return multiStatus;
}
}
return ctx.createSuccessStatus();
}
}