/** * Copyright (c) 2008-2009 Zeligsoft Inc. 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: * Zeligsoft - Initial API and implementation */ package org.eclipse.emf.ecore.util; import java.lang.reflect.InvocationTargetException; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.EOperation; /** * A basic implementation of the dynamic operation-invocation delegate API. In * fact, it is so basic that it isn't much an implementation at all, but merely * throws {@link UnsupportedOperationException} on every invocation, except for * the operations defined for the {@link EObject} class. * Subclasses should override the {@link #dynamicInvoke(InternalEObject, EList)} * method to not do that. * * @since 2.6 */ public class BasicInvocationDelegate implements EOperation.Internal.InvocationDelegate { protected EOperation eOperation; /** * Initializes me with the operation that delegates to me. * * @param operation my operation */ public BasicInvocationDelegate(EOperation operation) { this.eOperation = operation; } public Object dynamicInvoke(InternalEObject target, EList<?> arguments) throws InvocationTargetException { if (eOperation.getEContainingClass() == EcorePackage.Literals.EOBJECT) { switch (eOperation.getEContainingClass().getEAllOperations().indexOf(eOperation)) { case EcorePackage.EOBJECT___ECLASS: return target.eClass(); case EcorePackage.EOBJECT___EIS_PROXY: return target.eIsProxy(); case EcorePackage.EOBJECT___ERESOURCE: return target.eResource(); case EcorePackage.EOBJECT___ECONTAINER: return target.eContainer(); case EcorePackage.EOBJECT___ECONTAINING_FEATURE: return target.eContainingFeature(); case EcorePackage.EOBJECT___ECONTAINMENT_FEATURE: return target.eContainmentFeature(); case EcorePackage.EOBJECT___ECONTENTS: return target.eContents(); case EcorePackage.EOBJECT___EALL_CONTENTS: return target.eAllContents(); case EcorePackage.EOBJECT___ECROSS_REFERENCES: return target.eCrossReferences(); case EcorePackage.EOBJECT___EGET__ESTRUCTURALFEATURE: return target.eGet((EStructuralFeature)arguments.get(0)); case EcorePackage.EOBJECT___EGET__ESTRUCTURALFEATURE_BOOLEAN: return target.eGet((EStructuralFeature)arguments.get(0), (Boolean)arguments.get(1)); case EcorePackage.EOBJECT___ESET__ESTRUCTURALFEATURE_OBJECT: target.eSet((EStructuralFeature)arguments.get(0), arguments.get(1)); return null; case EcorePackage.EOBJECT___EIS_SET__ESTRUCTURALFEATURE: return target.eIsSet((EStructuralFeature)arguments.get(0)); case EcorePackage.EOBJECT___EUNSET__ESTRUCTURALFEATURE: target.eUnset((EStructuralFeature)arguments.get(0)); return null; case EcorePackage.EOBJECT___EINVOKE__EOPERATION_ELIST: return target.eInvoke((EOperation)arguments.get(0), (EList<?>)arguments.get(1)); } } throw new UnsupportedOperationException("eInvoke not implemented for " + eOperation.getName()); } }