/**
* <copyright>
* </copyright>
*
*
*/
package org.dresdenocl.language.ocl.resource.ocl.mopp;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
public class OclReferenceResolverSwitch implements org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolverSwitch {
/**
* This map stores a copy of the options the were set for loading the resource.
*/
private Map<Object, Object> options;
protected org.dresdenocl.language.ocl.resource.ocl.analysis.PackageDeclarationNestedNamespaceCSNamespaceReferenceResolver packageDeclarationNestedNamespaceCSNamespaceReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.PackageDeclarationNestedNamespaceCSNamespaceReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.OperationDefinitionCSOperationReferenceResolver operationDefinitionCSOperationReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.OperationDefinitionCSOperationReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.ParameterCSParameterReferenceResolver parameterCSParameterReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.ParameterCSParameterReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.OperationCallBaseExpCSOperationNameReferenceResolver operationCallBaseExpCSOperationNameReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.OperationCallBaseExpCSOperationNameReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.PropertyCallBaseExpCSPropertyReferenceResolver propertyCallBaseExpCSPropertyReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.PropertyCallBaseExpCSPropertyReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.CollectionTypeIdentifierCSTypeNameReferenceResolver collectionTypeIdentifierCSTypeNameReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.CollectionTypeIdentifierCSTypeNameReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.StaticOperationCallExpCSOperationNameReferenceResolver staticOperationCallExpCSOperationNameReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.StaticOperationCallExpCSOperationNameReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.PathNameSimpleCSNamedElementReferenceResolver pathNameSimpleCSNamedElementReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.PathNameSimpleCSNamedElementReferenceResolver();
protected org.dresdenocl.language.ocl.resource.ocl.analysis.NamedElementCSNamedElementReferenceResolver namedElementCSNamedElementReferenceResolver = new org.dresdenocl.language.ocl.resource.ocl.analysis.NamedElementCSNamedElementReferenceResolver();
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.PackageDeclarationNestedNamespaceCS, org.dresdenocl.pivotmodel.Namespace> getPackageDeclarationNestedNamespaceCSNamespaceReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPackageDeclarationNestedNamespaceCS_Namespace(), packageDeclarationNestedNamespaceCSNamespaceReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.OperationDefinitionCS, org.dresdenocl.pivotmodel.Operation> getOperationDefinitionCSOperationReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getOperationDefinitionCS_Operation(), operationDefinitionCSOperationReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.ParameterCS, org.dresdenocl.pivotmodel.Parameter> getParameterCSParameterReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getParameterCS_Parameter(), parameterCSParameterReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.OperationCallBaseExpCS, org.dresdenocl.pivotmodel.Operation> getOperationCallBaseExpCSOperationNameReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getOperationCallBaseExpCS_OperationName(), operationCallBaseExpCSOperationNameReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.PropertyCallBaseExpCS, org.dresdenocl.pivotmodel.Property> getPropertyCallBaseExpCSPropertyReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPropertyCallBaseExpCS_Property(), propertyCallBaseExpCSPropertyReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.CollectionTypeIdentifierCS, org.dresdenocl.pivotmodel.Type> getCollectionTypeIdentifierCSTypeNameReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getCollectionTypeIdentifierCS_TypeName(), collectionTypeIdentifierCSTypeNameReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.StaticOperationCallExpCS, org.dresdenocl.pivotmodel.Operation> getStaticOperationCallExpCSOperationNameReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getStaticOperationCallExpCS_OperationName(), staticOperationCallExpCSOperationNameReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.PathNameSimpleCS, org.dresdenocl.pivotmodel.NamedElement> getPathNameSimpleCSNamedElementReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPathNameSimpleCS_NamedElement(), pathNameSimpleCSNamedElementReferenceResolver);
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<org.dresdenocl.language.ocl.NamedElementCS, org.dresdenocl.pivotmodel.NamedElement> getNamedElementCSNamedElementReferenceResolver() {
return getResolverChain(org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getNamedElementCS_NamedElement(), namedElementCSNamedElementReferenceResolver);
}
public void setOptions(Map<?, ?> options) {
if (options != null) {
this.options = new LinkedHashMap<Object, Object>();
this.options.putAll(options);
}
packageDeclarationNestedNamespaceCSNamespaceReferenceResolver.setOptions(options);
operationDefinitionCSOperationReferenceResolver.setOptions(options);
parameterCSParameterReferenceResolver.setOptions(options);
operationCallBaseExpCSOperationNameReferenceResolver.setOptions(options);
propertyCallBaseExpCSPropertyReferenceResolver.setOptions(options);
collectionTypeIdentifierCSTypeNameReferenceResolver.setOptions(options);
staticOperationCallExpCSOperationNameReferenceResolver.setOptions(options);
pathNameSimpleCSNamedElementReferenceResolver.setOptions(options);
namedElementCSNamedElementReferenceResolver.setOptions(options);
}
public void resolveFuzzy(String identifier, EObject container, EReference reference, int position, org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolveResult<EObject> result) {
if (container == null) {
return;
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPackageDeclarationNestedNamespaceCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Namespace> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Namespace>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("namespace")) {
packageDeclarationNestedNamespaceCSNamespaceReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.PackageDeclarationNestedNamespaceCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getOperationDefinitionCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Operation> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Operation>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("operation")) {
operationDefinitionCSOperationReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.OperationDefinitionCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getParameterCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Parameter> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Parameter>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("parameter")) {
parameterCSParameterReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.ParameterCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getOperationCallBaseExpCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Operation> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Operation>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("operationName")) {
operationCallBaseExpCSOperationNameReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.OperationCallBaseExpCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPropertyCallBaseExpCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Property> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Property>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("property")) {
propertyCallBaseExpCSPropertyReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.PropertyCallBaseExpCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getCollectionTypeIdentifierCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Type> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Type>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("typeName")) {
collectionTypeIdentifierCSTypeNameReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.CollectionTypeIdentifierCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getStaticOperationCallExpCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Operation> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.Operation>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("operationName")) {
staticOperationCallExpCSOperationNameReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.StaticOperationCallExpCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPathNameSimpleCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.NamedElement> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.NamedElement>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("namedElement")) {
pathNameSimpleCSNamedElementReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.PathNameSimpleCS) container, (EReference) feature, position, true, frr);
}
}
if (org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getNamedElementCS().isInstance(container)) {
OclFuzzyResolveResult<org.dresdenocl.pivotmodel.NamedElement> frr = new OclFuzzyResolveResult<org.dresdenocl.pivotmodel.NamedElement>(result);
String referenceName = reference.getName();
EStructuralFeature feature = container.eClass().getEStructuralFeature(referenceName);
if (feature != null && feature instanceof EReference && referenceName != null && referenceName.equals("namedElement")) {
namedElementCSNamedElementReferenceResolver.resolve(identifier, (org.dresdenocl.language.ocl.NamedElementCS) container, (EReference) feature, position, true, frr);
}
}
}
public org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<? extends EObject, ? extends EObject> getResolver(EStructuralFeature reference) {
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPackageDeclarationNestedNamespaceCS_Namespace()) {
return getResolverChain(reference, packageDeclarationNestedNamespaceCSNamespaceReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getOperationDefinitionCS_Operation()) {
return getResolverChain(reference, operationDefinitionCSOperationReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getParameterCS_Parameter()) {
return getResolverChain(reference, parameterCSParameterReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getOperationCallBaseExpCS_OperationName()) {
return getResolverChain(reference, operationCallBaseExpCSOperationNameReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPropertyCallBaseExpCS_Property()) {
return getResolverChain(reference, propertyCallBaseExpCSPropertyReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getCollectionTypeIdentifierCS_TypeName()) {
return getResolverChain(reference, collectionTypeIdentifierCSTypeNameReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getStaticOperationCallExpCS_OperationName()) {
return getResolverChain(reference, staticOperationCallExpCSOperationNameReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getPathNameSimpleCS_NamedElement()) {
return getResolverChain(reference, pathNameSimpleCSNamedElementReferenceResolver);
}
if (reference == org.dresdenocl.language.ocl.OclPackage.eINSTANCE.getNamedElementCS_NamedElement()) {
return getResolverChain(reference, namedElementCSNamedElementReferenceResolver);
}
return null;
}
@SuppressWarnings({"rawtypes", "unchecked"})
public <ContainerType extends EObject, ReferenceType extends EObject> org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<ContainerType, ReferenceType> getResolverChain(EStructuralFeature reference, org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver<ContainerType, ReferenceType> originalResolver) {
if (options == null) {
return originalResolver;
}
Object value = options.get(org.dresdenocl.language.ocl.resource.ocl.IOclOptions.ADDITIONAL_REFERENCE_RESOLVERS);
if (value == null) {
return originalResolver;
}
if (!(value instanceof Map)) {
// send this to the error log
new org.dresdenocl.language.ocl.resource.ocl.util.OclRuntimeUtil().logWarning("Found value with invalid type for option " + org.dresdenocl.language.ocl.resource.ocl.IOclOptions.ADDITIONAL_REFERENCE_RESOLVERS + " (expected " + Map.class.getName() + ", but was " + value.getClass().getName() + ")", null);
return originalResolver;
}
Map<?,?> resolverMap = (Map<?,?>) value;
Object resolverValue = resolverMap.get(reference);
if (resolverValue == null) {
return originalResolver;
}
if (resolverValue instanceof org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver) {
org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver replacingResolver = (org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver) resolverValue;
if (replacingResolver instanceof org.dresdenocl.language.ocl.resource.ocl.IOclDelegatingReferenceResolver) {
// pass original resolver to the replacing one
((org.dresdenocl.language.ocl.resource.ocl.IOclDelegatingReferenceResolver) replacingResolver).setDelegate(originalResolver);
}
return replacingResolver;
} else if (resolverValue instanceof Collection) {
Collection replacingResolvers = (Collection) resolverValue;
org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver replacingResolver = originalResolver;
for (Object next : replacingResolvers) {
if (next instanceof org.dresdenocl.language.ocl.resource.ocl.IOclReferenceCache) {
org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver nextResolver = (org.dresdenocl.language.ocl.resource.ocl.IOclReferenceResolver) next;
if (nextResolver instanceof org.dresdenocl.language.ocl.resource.ocl.IOclDelegatingReferenceResolver) {
// pass original resolver to the replacing one
((org.dresdenocl.language.ocl.resource.ocl.IOclDelegatingReferenceResolver) nextResolver).setDelegate(replacingResolver);
}
replacingResolver = nextResolver;
} else {
// The collection contains a non-resolver. Send a warning to the error log.
new org.dresdenocl.language.ocl.resource.ocl.util.OclRuntimeUtil().logWarning("Found value with invalid type in value map for option " + org.dresdenocl.language.ocl.resource.ocl.IOclOptions.ADDITIONAL_REFERENCE_RESOLVERS + " (expected " + org.dresdenocl.language.ocl.resource.ocl.IOclDelegatingReferenceResolver.class.getName() + ", but was " + next.getClass().getName() + ")", null);
}
}
return replacingResolver;
} else {
// The value for the option ADDITIONAL_REFERENCE_RESOLVERS has an unknown type.
new org.dresdenocl.language.ocl.resource.ocl.util.OclRuntimeUtil().logWarning("Found value with invalid type in value map for option " + org.dresdenocl.language.ocl.resource.ocl.IOclOptions.ADDITIONAL_REFERENCE_RESOLVERS + " (expected " + org.dresdenocl.language.ocl.resource.ocl.IOclDelegatingReferenceResolver.class.getName() + ", but was " + resolverValue.getClass().getName() + ")", null);
return originalResolver;
}
}
}