/*******************************************************************************
* Copyright (c) 2010, 2015 Willink Transformations 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:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.pivot.internal.delegate;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.Constraint;
import org.eclipse.ocl.pivot.ExpressionInOCL;
import org.eclipse.ocl.pivot.LanguageExpression;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.internal.ecore.es2as.Ecore2AS;
import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal;
import org.eclipse.ocl.pivot.internal.messages.PivotMessagesInternal;
import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
import org.eclipse.ocl.pivot.internal.utilities.PivotConstantsInternal;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.pivot.utilities.MetamodelManager;
import org.eclipse.ocl.pivot.utilities.NameUtil;
import org.eclipse.ocl.pivot.utilities.ParserException;
import org.eclipse.ocl.pivot.utilities.SemanticException;
/**
*/
public class ValidationBehavior extends AbstractDelegatedBehavior<EClassifier, EValidator.ValidationDelegate.Registry, ValidationDelegate.Factory>
{
public static final @NonNull ValidationBehavior INSTANCE = new ValidationBehavior();
public static final @NonNull String NAME = "validationDelegates"; //$NON-NLS-1$
public Constraint getConstraint(@NonNull MetamodelManager metamodelManager, @NonNull EClassifier eClassifier, @NonNull String constraintName) throws OCLDelegateException {
Resource ecoreMetamodel = ClassUtil.nonNullEMF(eClassifier.eResource());
Ecore2AS ecore2as = Ecore2AS.getAdapter(ecoreMetamodel, (EnvironmentFactoryInternal) metamodelManager.getEnvironmentFactory());
Type type = ecore2as.getCreated(Type.class, eClassifier);
if (type != null) {
Constraint constraint = NameUtil.getNameable(((MetamodelManagerInternal)metamodelManager).getAllInvariants(type), constraintName);
if (constraint != null) {
return constraint;
}
}
throw new OCLDelegateException(new SemanticException(PivotMessagesInternal.MissingSpecificationBody_ERROR_, type, PivotConstantsInternal.OWNED_CONSTRAINT_ROLE));
}
@Override
public ValidationDelegate.@Nullable Factory getDefaultFactory() {
return (ValidationDelegate.Factory) ValidationDelegate.Factory.Registry.INSTANCE.getValidationDelegate(getName());
}
@Override
public EValidator.ValidationDelegate.@NonNull Registry getDefaultRegistry() {
return ClassUtil.nonNullEMF(ValidationDelegate.Factory.Registry.INSTANCE);
}
@Override
public @NonNull EPackage getEPackage(@NonNull EClassifier eClassifier) {
return ClassUtil.nonNullEMF(eClassifier.getEPackage());
}
/* public ExpressionInOCL getExpressionInOCL(MetamodelManager metamodelManager, EClassifier eClassifier, String constraintName) throws OCLDelegateException {
Resource ecoreMetamodel = eClassifier.eResource();
Ecore2AS ecore2as = Ecore2AS.getAdapter(ecoreMetamodel, metamodelManager);
Type type = ecore2as.getCreated(Type.class, eClassifier);
Constraint constraint = PivotUtil.getNamedElement(type.getOwnedRule(), constraintName);
if (constraint != null) {
ExpressionInOCL expressionInOCL = getExpressionInOCL(metamodelManager, type, constraint);
if (expressionInOCL != null) {
return expressionInOCL;
}
}
String message = NLS.bind(OCLMessages.MissingBodyForInvocationDelegate_ERROR_, type);
throw new OCLDelegateException(message);
} */
@Override
public ValidationDelegate.@Nullable Factory getFactory(@NonNull DelegateDomain delegateDomain, @NonNull EClassifier eClassifier) {
Class<EValidator.ValidationDelegate.@NonNull Registry> castClass = ValidationDelegate.Registry.class;
EValidator.ValidationDelegate.@NonNull Registry registry = OCLDelegateDomain.getDelegateResourceSetRegistry(eClassifier, castClass, getDefaultRegistry());
String delegateURI = delegateDomain.getURI();
org.eclipse.emf.ecore.EValidator.ValidationDelegate validationDelegate = registry.getValidationDelegate(delegateURI);
return (ValidationDelegate.Factory) validationDelegate;
}
@Override
public @NonNull Class<ValidationDelegate.Factory> getFactoryClass() {
return ValidationDelegate.Factory.class;
}
@Override
public @NonNull String getName() {
return NAME;
}
/**
* Return the operation body associated with operation, if necessary using
* <code>ocl</code> to create the relevant parsing environment for a textual
* definition.
* @throws OCLDelegateException
*/
public @NonNull ExpressionInOCL getQueryOrThrow(@NonNull MetamodelManager metamodelManager, @NonNull Constraint constraint) throws OCLDelegateException {
LanguageExpression specification = constraint.getOwnedSpecification();
if (specification == null) {
throw new OCLDelegateException(new SemanticException(PivotMessagesInternal.MissingSpecificationBody_ERROR_, constraint, PivotConstantsInternal.OWNED_CONSTRAINT_ROLE));
}
try {
return metamodelManager.parseSpecification(specification);
} catch (ParserException e) {
throw new OCLDelegateException(e);
}
}
@Override
public @NonNull Class<ValidationDelegate.Factory.Registry> getRegistryClass() {
return ValidationDelegate.Factory.Registry.class;
}
}