blob: ed24fe427ac39fa7676a585c91a4bc21fed8d109 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 The University of York.
* 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:
* Dimitrios Kolovos - initial API and implementation
******************************************************************************/
package org.eclipse.epsilon.evl.emf.validation;
import java.net.URL;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.ecore.util.EObjectValidator;
import org.eclipse.epsilon.common.dt.util.LogUtil;
import org.eclipse.ui.IStartup;
public class EValidatorPopulator implements IStartup {
protected final String extensionPoint = "org.eclipse.epsilon.evl.emf.validation";
public void earlyStartup() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extenstionPoint = registry.getExtensionPoint(extensionPoint);
for (IConfigurationElement configurationElement : extenstionPoint.getConfigurationElements()) {
try {
String ePackageUri = configurationElement.getAttribute("namespaceURI");
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(ePackageUri);
if (ePackage == null) continue;
String bundleId = configurationElement.getAttribute("bundleId");
if (bundleId == null || bundleId.trim().length() == 0) {
bundleId = configurationElement.getDeclaringExtension().getNamespaceIdentifier();
}
URL url = Platform.getBundle(bundleId).getResource(configurationElement.getAttribute("constraints"));
if (url == null) {
LogUtil.log("Constraints file " +
configurationElement.getAttribute("constraints") +
" not found in bundle " + bundleId,
new Exception());
continue;
}
EValidator evlValidator = null;
if (url.toString().endsWith("evl")) {
String modelName = configurationElement.getAttribute("modelName");
if (modelName == null || modelName.trim().length() == 0) modelName = EvlValidator.DEFAULT_MODEL_NAME;
evlValidator = new EvlValidator(url.toURI(), modelName, ePackageUri, bundleId);
// Add variables for propagating EMF Diagnostician context entries
IConfigurationElement[] diagnosticVariables = configurationElement.getChildren("diagnosticVariable");
for (IConfigurationElement diagnosticVariable : diagnosticVariables) {
((EvlValidator) evlValidator).addDiagnosticianVariable(diagnosticVariable.getAttribute("name"));
}
}
else {
evlValidator = new OclValidator(url.toURI());
}
EValidator newValidator = null;
EValidator existingValidator = EValidator.Registry.INSTANCE.getEValidator(ePackage);
String composeAttributeValue = configurationElement.getAttribute("compose");
boolean compose = composeAttributeValue == null || Boolean.valueOf(composeAttributeValue).booleanValue();
if (compose) {
if (existingValidator == null) {
existingValidator = EObjectValidator.INSTANCE;
}
if (existingValidator instanceof CompositeEValidator) {
((CompositeEValidator) existingValidator).getDelegates().add(evlValidator);
newValidator = existingValidator;
}
else {
//newValidator = existingValidator;
newValidator = new CompositeEValidator();
((CompositeEValidator) newValidator).getDelegates().add(evlValidator);
((CompositeEValidator) newValidator).getDelegates().add(existingValidator);
}
}
else {
newValidator = evlValidator;
}
if (newValidator != existingValidator) {
EValidator.Registry.INSTANCE.put(ePackage, newValidator);
}
} catch (Exception e) {
LogUtil.log(e);
}
}
}
}