blob: 30fc9bbe6568e6210595ae6942f4242118abd3eb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Johannes Faltermeier - initial API and implementation
******************************************************************************/
package org.eclipse.emf.ecp.internal.diagnostician;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.ecore.impl.EValidatorRegistryImpl;
import org.eclipse.emf.ecp.diagnostician.ECPValidator;
/**
* {@link org.eclipse.emf.ecore.EValidator.Registry Registry} for {@link org.eclipse.emf.ecp.diagnostician.ECPValidator
* ECPValidators}. The validators are retrieved
* from the extension point.
*
* @author jfaltermeier
*
*/
public final class ECPValidatorRegistry extends EValidatorRegistryImpl {
/**
* The instance.
*/
public static final ECPValidatorRegistry INSTANCE = new ECPValidatorRegistry();
private static final long serialVersionUID = -1274718490799689910L;
private final Map<EClassifier, Set<ECPValidator>> eclassifierToAllValidatorsMap;
private ECPValidatorRegistry() {
eclassifierToAllValidatorsMap = new LinkedHashMap<EClassifier, Set<ECPValidator>>();
final Map<EPackage, Map<EClassifier, ECPValidator>> registeredValidatorsPerPackage = readElementsFromExtensionPoint();
registerValidators(registeredValidatorsPerPackage);
}
private Map<EPackage, Map<EClassifier, ECPValidator>> readElementsFromExtensionPoint() {
final Map<EPackage, Map<EClassifier, ECPValidator>> registeredValidatorsPerPackage = new LinkedHashMap<EPackage, Map<EClassifier, ECPValidator>>();
IConfigurationElement[] batchValidators = Platform.getExtensionRegistry().getConfigurationElementsFor(
"org.eclipse.emf.ecp.validation.diagnostician.ecpValidators"); //$NON-NLS-1$
for (final IConfigurationElement element : batchValidators) {
batchValidators = null;
try {
final ECPValidator validator = (ECPValidator) element.createExecutableExtension("class"); //$NON-NLS-1$
final Set<EClassifier> validatedEClassifier = validator.getValidatedEClassifier();
for (final EClassifier eClassifier : validatedEClassifier) {
if (!eclassifierToAllValidatorsMap.containsKey(eClassifier)) {
eclassifierToAllValidatorsMap.put(eClassifier, new LinkedHashSet<ECPValidator>());
}
eclassifierToAllValidatorsMap.get(eClassifier).add(validator);
}
for (final EClassifier classifier : eclassifierToAllValidatorsMap.keySet()) {
ECPValidator validatorToRegister;
if (eclassifierToAllValidatorsMap.get(classifier).size() == 1) {
validatorToRegister = eclassifierToAllValidatorsMap.get(classifier).iterator().next();
} else {
validatorToRegister = new ClassifierValidatorWrapper(classifier,
eclassifierToAllValidatorsMap.get(classifier));
}
final EPackage ePackage = classifier.getEPackage();
if (!registeredValidatorsPerPackage.containsKey(ePackage)) {
registeredValidatorsPerPackage.put(ePackage, new LinkedHashMap<EClassifier, ECPValidator>());
}
registeredValidatorsPerPackage.get(ePackage).put(classifier, validatorToRegister);
}
} catch (final CoreException e) {
Activator.log(e);
}
}
return registeredValidatorsPerPackage;
}
private void registerValidators(Map<EPackage, Map<EClassifier, ECPValidator>> registeredValidatorsPerPackage) {
for (final EPackage ePackage : registeredValidatorsPerPackage.keySet()) {
final Map<EClassifier, ECPValidator> map = registeredValidatorsPerPackage.get(ePackage);
final EValidator validator = new PackageValidatorWrapper(map);
put(ePackage, validator);
}
}
/**
* Check if the registry contains a validator for the given classifier.
*
* @param classifier the classifier to check
* @return <code>true</code> if validator is registerd, <code>false</code> otherwise
*/
public boolean hasValidator(EClassifier classifier) {
return eclassifierToAllValidatorsMap.containsKey(classifier);
}
}