/******************************************************************************* * Copyright (c) 2010, 2014 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 * E.D.Willink - Bug 306079 *******************************************************************************/ package org.eclipse.ocl.pivot.internal.delegate; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EOperation; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.utilities.ClassUtil; /** * DelegateEClassifierAdapter extends an EClassifier to cache its ValidationDelegate. */ public class DelegateEClassifierAdapter extends AdapterImpl { public static @NonNull DelegateEClassifierAdapter getAdapter(@NonNull EClassifier eClassifier) { DelegateEClassifierAdapter adapter; EList<Adapter> eAdapters = eClassifier.eAdapters(); synchronized (eAdapters) { adapter = (DelegateEClassifierAdapter) EcoreUtil.getAdapter(eAdapters, DelegateEClassifierAdapter.class); if (adapter == null) { adapter = new DelegateEClassifierAdapter(); eAdapters.add(adapter); } } return adapter; } protected /*@LazyNonNull*/ Map<String, ValidationDelegate> validationDelegateMap; public @Nullable ValidationDelegate getValidationDelegate(@NonNull String delegateURI) { if (validationDelegateMap == null) { getValidationDelegates(); } return validationDelegateMap.get(delegateURI); } public synchronized @NonNull Map<String, ValidationDelegate> getValidationDelegates() { Map<String, ValidationDelegate> validationDelegateMap2 = validationDelegateMap; if (validationDelegateMap2 == null) { EClassifier eClassifier = ClassUtil.nonNullState(getTarget()); validationDelegateMap = validationDelegateMap2 = new HashMap<String, ValidationDelegate>(); List<ValidationDelegate.Factory> factories = ValidationBehavior.INSTANCE.getFactories(eClassifier); if (eClassifier instanceof EClass) { for (EOperation eOperation : ((EClass)eClassifier).getEOperations()) { if ((eOperation != null) && EcoreUtil.isInvariant(eOperation)) { List<DelegateDomain> opDelegateDomains = InvocationBehavior.INSTANCE.getDelegateDomains(eOperation); for (DelegateDomain opDelegateDomain : opDelegateDomains) { if (opDelegateDomain != null) { ValidationDelegate.Factory opFactory = ValidationBehavior.INSTANCE.getFactory(opDelegateDomain, eClassifier); if ((opFactory != null) && !factories.contains(opFactory)) { factories.add(opFactory); } } } } } } if (!factories.isEmpty()) { for (ValidationDelegate.Factory factory : factories) { ValidationDelegate validationDelegate = factory.createValidationDelegate(eClassifier); if (validationDelegate != null) { validationDelegateMap2.put(factory.getURI(), validationDelegate); } } } } return validationDelegateMap2; } @Override public EClassifier getTarget() { return (EClassifier) super.getTarget(); } @Override public boolean isAdapterForType(Object type) { return type == DelegateEClassifierAdapter.class; } @Override public void setTarget(Notifier newTarget) { EClassifier resourceSet = (EClassifier) newTarget; super.setTarget(resourceSet); } }