//------------------------------------------------------------------------------
// 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.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EClass;
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.library.edit.IFilter;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.edit.validation.IValidator;
import org.eclipse.epf.library.edit.validation.IValidatorFactory;
import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory.TypeFilter;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.ContentPackage;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.DescribableElement;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.Milestone;
import org.eclipse.epf.uma.NamedElement;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.ProcessPackage;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.util.AssociationHelper;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.epf.validation.Activator;
import org.eclipse.epf.validation.util.ValidationStatus;
/**
* @author Phong Nguyen Le
* @since 1.1
*/
public class NameConstraint extends AbstractModelConstraint {
private static final boolean DEBUG = Activator.getDefault().isDebugging();
// private static final EClass[] CONTENT_ELEMENT_TYPES = getContentElementTypes();
//
// private static EClass[] getContentElementTypes() {
// ArrayList types = new ArrayList();
// for (Iterator iter = UmaPackage.eINSTANCE.getEClassifiers().iterator(); iter.hasNext();) {
// Object type = iter.next();
// if(type instanceof EClass && UmaPackage.Literals.CONTENT_ELEMENT.isSuperTypeOf((EClass) type)) {
// types.add(type);
// }
// }
// EClass[] eClasses = new EClass[types.size()];
// types.toArray(eClasses);
// return eClasses;
// }
private boolean canCheck(Object eObj) {
return eObj instanceof MethodPlugin
|| eObj instanceof MethodConfiguration
|| eObj instanceof ContentPackage
|| eObj instanceof ProcessComponent
|| ((eObj instanceof ProcessPackage || eObj instanceof ContentElement) && UmaUtil
.getProcessComponent((MethodElement) eObj) == null);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.emf.validation.IValidationContext)
*/
public IStatus validate(IValidationContext ctx) {
EObject eObj = ctx.getTarget();
EMFEventType eType = ctx.getEventType();
if(DEBUG) {
if(eObj instanceof NamedElement) {
NamedElement e = (NamedElement) eObj;
System.out.println("NameConstraint.validate(): " + TngUtil.getTypeText(e) + ": '" + e.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if(eObj instanceof Milestone) {
System.out.println();
}
}
MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
// In the case of batch mode.
if (eType == EMFEventType.NULL) {
if((eObj instanceof MethodElement && TngUtil.isPredefined((MethodElement) eObj)))
{
// skip validating predefined method elements, ContentDescription
//
return ctx.createSuccessStatus();
}
// validate object's name
//
if(eObj instanceof CustomCategory) {
CustomCategory cc = (CustomCategory)eObj;
List list = AssociationHelper.getCustomCategories(cc);
for (Iterator iter = list.iterator(); iter.hasNext();) {
CustomCategory parent = (CustomCategory) iter.next();
IValidator validator = IValidatorFactory.INSTANCE.createNameValidator(parent, cc);
String msg = validator.isValid(cc.getName());
if(msg != null) {
multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, cc, UmaPackage.Literals.NAMED_ELEMENT__NAME));
}
validator = IValidatorFactory.INSTANCE.createPresentationNameValidator(parent, cc);
msg = validator.isValid(cc.getPresentationName());
if(msg != null) {
multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, cc, UmaPackage.Literals.METHOD_ELEMENT__PRESENTATION_NAME));
}
}
}
else if(canCheck(eObj))
{
NamedElement e = (NamedElement)eObj;
IValidator validator = IValidatorFactory.INSTANCE.createNameValidator(eObj.eContainer(), e);
String msg = validator.isValid(e.getName());
if(msg != null) {
multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, e, UmaPackage.Literals.NAMED_ELEMENT__NAME));
}
/* if(eObj instanceof DescribableElement) {
DescribableElement de = (DescribableElement) eObj;
validator = IValidatorFactory.INSTANCE.createPresentationNameValidator(eObj.eContainer(), de);
msg = validator.isValid(de.getPresentationName());
if(msg != null) {
multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, e, UmaPackage.Literals.METHOD_ELEMENT__PRESENTATION_NAME));
}
}*/
}
// // validate name of the children
// //
// if(eObj instanceof MethodLibrary) {
// IStatus status = checkChildren(eObj, UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS,
// UmaPackage.Literals.METHOD_PLUGIN);
// if(!status.isOK()) {
// multiStatus.merge(status);
// }
// status = checkChildren(eObj, UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS,
// UmaPackage.Literals.METHOD_CONFIGURATION);
// if(!status.isOK()) {
// multiStatus.merge(status);
// }
// }
// else if(eObj instanceof ContentPackage) {
// ContentPackage pkg = (ContentPackage) eObj;
// boolean checked = false;
// if(TngUtil.isPredefined(pkg)) {
// String name = pkg.getName();
// if(ModelStructure.DISCIPLINE_PACKAGE_NAME.equals(name)) {
// IStatus status = checkChildren(eObj, UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
// UmaPackage.Literals.DISCIPLINE);
// if(!status.isOK()) {
// multiStatus.merge(status);
// }
// checked = true;
// }
// else if (ModelStructure.ROLE_SET_PACKAGE_NAME.equals(name)) {
// IStatus status = checkChildren(eObj, UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
// UmaPackage.Literals.ROLE_SET);
// if(!status.isOK()) {
// multiStatus.merge(status);
// }
// checked = true;
// }
// else if (!(ModelStructure.CORE_CONTENT_PACAKGE_NAME.equals(name))) {
// checked = true;
// }
// }
// if(!checked) {
// for (int i = 0; i < CONTENT_ELEMENT_TYPES.length; i++) {
// IStatus status = checkChildren(eObj, UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
// CONTENT_ELEMENT_TYPES[i]);
// if(!status.isOK()) {
// multiStatus.merge(status);
// }
// }
// }
// }
// else if(eObj instanceof ProcessPackage) {
// IStatus status = checkChildren(eObj, UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES,
// UmaPackage.Literals.PROCESS_PACKAGE);
// if(!status.isOK()) {
// multiStatus.merge(status);
// }
// }
if(multiStatus.isOK()) {
return ctx.createSuccessStatus();
}
else {
return multiStatus;
}
// In the case of live mode.
} else {
Object newValue = ctx.getFeatureNewValue();
if (newValue == null || ((String)newValue).length() == 0) {
return ctx.createFailureStatus(new Object[] {eObj.eClass().getName()});
}
}
return ctx.createSuccessStatus();
}
private static class ChildFilter extends TypeFilter {
private Set checkedChildren;
public ChildFilter(EClass eClass, Set checkedChildren) {
super(eClass);
this.checkedChildren = checkedChildren;
}
public boolean accept(Object obj) {
if (checkedChildren.contains(obj)) {
return false;
}
return super.accept(obj);
}
}
private IStatus checkChildren(EObject object, EReference childFeature,
EClass eClass) {
List statusList = new ArrayList();
List children = (List) object.eGet(childFeature);
Set checkedChildren = new HashSet();
IFilter childFilter = new ChildFilter(eClass, checkedChildren);
for (Iterator iter = children.iterator(); iter.hasNext();) {
EObject child = (EObject) iter.next();
if (child instanceof NamedElement) {
IValidator validator = IValidatorFactory.INSTANCE
.createValidator(object, childFeature, childFilter,
child, UmaPackage.Literals.NAMED_ELEMENT__NAME);
NamedElement e = (NamedElement) child;
String msg = validator.isValid(e.getName());
if (msg != null) {
statusList.add(new ValidationStatus(IStatus.ERROR, 0, msg,
e, UmaPackage.Literals.NAMED_ELEMENT__NAME));
}
}
if (child instanceof DescribableElement) {
IValidator validator = IValidatorFactory.INSTANCE
.createValidator(
object,
childFeature,
childFilter,
child,
UmaPackage.Literals.METHOD_ELEMENT__PRESENTATION_NAME);
DescribableElement e = (DescribableElement) child;
String msg = validator.isValid(e.getPresentationName());
if (msg != null) {
statusList
.add(new ValidationStatus(
IStatus.ERROR,
0,
msg,
e,
UmaPackage.Literals.METHOD_ELEMENT__PRESENTATION_NAME));
}
}
}
if (!statusList.isEmpty()) {
if (statusList.size() == 1) {
return (IStatus) statusList.get(0);
} else {
IStatus[] newChildren = new IStatus[statusList.size()];
statusList.toArray(newChildren);
return new MultiStatus(Activator.PLUGIN_ID, 0, newChildren,
"", null); //$NON-NLS-1$
}
}
return Status.OK_STATUS;
}
}