blob: 250ac42782ba94f380e21a0d42de9032f8ac3542 [file] [log] [blame]
/*
* Copyright (c) 2013, 2015 Eike Stepper (Berlin, Germany) 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:
* Christian W. Damus (CEA LIST) - initial API and implementation
*/
package org.eclipse.emf.cdo.server.ocl;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EParameter;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.ocl.Environment;
import org.eclipse.ocl.TypeChecker;
import org.eclipse.ocl.ecore.CallOperationAction;
import org.eclipse.ocl.ecore.Constraint;
import org.eclipse.ocl.ecore.EcoreEnvironment;
import org.eclipse.ocl.ecore.EcoreEnvironmentFactory;
import org.eclipse.ocl.ecore.SendSignalAction;
import org.eclipse.ocl.utilities.TypedElement;
import java.util.List;
/**
* CDO-specific Ecore environment implementation. It adds operations that assist in building efficient OCL queries.
*
* @author Christian W. Damus
* @since 4.2
*/
class CDOEnvironment extends EcoreEnvironment
{
public CDOEnvironment(EcoreEnvironmentFactory fac, Resource resource)
{
super(fac, resource);
}
public CDOEnvironment(
Environment<EPackage, EClassifier, EOperation, EStructuralFeature, EEnumLiteral, EParameter, EObject, CallOperationAction, SendSignalAction, Constraint, EClass, EObject> parent)
{
super(parent);
}
@Override
protected TypeChecker<EClassifier, EOperation, EStructuralFeature> createTypeChecker()
{
TypeChecker<EClassifier, EOperation, EStructuralFeature> result = super.createTypeChecker();
if (result instanceof TypeChecker.Cached<?, ?, ?>)
{
return new DelegatingCachedTypeChecker((TypeChecker.Cached<EClassifier, EOperation, EStructuralFeature>)result);
}
return new DelegatingTypeChecker(result);
}
/**
* @author Christian W. Damus
*/
private static class DelegatingTypeChecker implements TypeChecker<EClassifier, EOperation, EStructuralFeature>
{
private final TypeChecker<EClassifier, EOperation, EStructuralFeature> delegate;
public DelegatingTypeChecker(TypeChecker<EClassifier, EOperation, EStructuralFeature> delegate)
{
this.delegate = delegate;
}
/**
* Overrides the superclass implementation to resolve generic result types of our
* CDO-specific operations according to their individual semantics.
*/
public EClassifier getResultType(Object problemObject, EClassifier owner, EOperation operation,
List<? extends TypedElement<EClassifier>> args)
{
CDOAdditionalOperation cdoOperation = CDOAdditionalOperation.getInstance(operation);
if (cdoOperation != null)
{
return cdoOperation.getResultType(owner, operation, args);
}
return delegate.getResultType(problemObject, owner, operation, args);
}
//
// Strict delegation of API
//
public int getRelationship(EClassifier type1, EClassifier type2)
{
return delegate.getRelationship(type1, type2);
}
public EClassifier getPropertyType(EClassifier owner, EStructuralFeature property)
{
return delegate.getPropertyType(owner, property);
}
public EClassifier commonSuperType(Object problemObject, EClassifier type1, EClassifier type2)
{
return delegate.commonSuperType(problemObject, type1, type2);
}
public boolean checkMutuallyComparable(Object problemObject, EClassifier type1, EClassifier type2, int opcode)
{
return delegate.checkMutuallyComparable(problemObject, type1, type2, opcode);
}
public boolean exactTypeMatch(EClassifier type1, EClassifier type2)
{
return delegate.exactTypeMatch(type1, type2);
}
public boolean compatibleTypeMatch(EClassifier type1, EClassifier type2)
{
return delegate.compatibleTypeMatch(type1, type2);
}
public List<EOperation> getOperations(EClassifier owner)
{
return delegate.getOperations(owner);
}
public List<EStructuralFeature> getAttributes(EClassifier owner)
{
return delegate.getAttributes(owner);
}
public EOperation resolveGenericSignature(EClassifier owner, EOperation oper)
{
return delegate.resolveGenericSignature(owner, oper);
}
public EClassifier findSignalMatching(EClassifier receiver, List<EClassifier> signals, String name,
List<? extends TypedElement<EClassifier>> args)
{
return delegate.findSignalMatching(receiver, signals, name, args);
}
public EOperation findOperationMatching(EClassifier owner, String name,
List<? extends TypedElement<EClassifier>> args)
{
return delegate.findOperationMatching(owner, name, args);
}
public boolean matchArgs(EClassifier owner, List<?> paramsOrProperties,
List<? extends TypedElement<EClassifier>> args)
{
return delegate.matchArgs(owner, paramsOrProperties, args);
}
public EStructuralFeature findAttribute(EClassifier owner, String name)
{
return delegate.findAttribute(owner, name);
}
public boolean isStandardLibraryFeature(EClassifier owner, Object feature)
{
return delegate.isStandardLibraryFeature(owner, feature);
}
}
/**
* @author Christian W. Damus
*/
private static class DelegatingCachedTypeChecker extends DelegatingTypeChecker
implements TypeChecker.Cached<EClassifier, EOperation, EStructuralFeature>
{
private final TypeChecker.Cached<EClassifier, EOperation, EStructuralFeature> delegate;
public DelegatingCachedTypeChecker(TypeChecker.Cached<EClassifier, EOperation, EStructuralFeature> delegate)
{
super(delegate);
this.delegate = delegate;
}
public EOperation getDynamicOperation(EClassifier dynamicType, EOperation staticOperation)
{
return delegate.getDynamicOperation(dynamicType, staticOperation);
}
public void reset()
{
delegate.reset();
}
public void setBypass(boolean bypass)
{
delegate.setBypass(bypass);
}
}
}