blob: 92bb5570d35ec154b4c6c524416fe9697d6cc36c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2018 CEA LIST and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink (CEA LIST) - initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.emf.validation.validity.locator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.emf.validation.validity.LeafConstrainingNode;
import org.eclipse.ocl.examples.emf.validation.validity.Result;
import org.eclipse.ocl.examples.emf.validation.validity.Severity;
import org.eclipse.ocl.examples.emf.validation.validity.manager.ConstrainingURI;
import org.eclipse.ocl.examples.emf.validation.validity.manager.TypeURI;
import org.eclipse.ocl.examples.emf.validation.validity.manager.ValidityManager;
import org.eclipse.ocl.examples.emf.validation.validity.manager.ValidityModel;
public abstract class AbstractConstraintLocator implements ConstraintLocator, ConstraintLocator.Descriptor
{
/**
* Perform the standalone initialization of the ValidityManager constraint locator registry with all EMF-only ConstraintLocators.
* (Use AbstractPivotConstraintLocator.initalize() for UML and OCL constraint locators as well.)
*/
public static void initialize() {
ValidityManager.addConstraintLocator(EcorePackage.eNS_URI, EClassConstraintLocator.INSTANCE);
ValidityManager.addConstraintLocator(EcorePackage.eNS_URI, EClassifierConstraintLocator.INSTANCE);
ValidityManager.addConstraintLocator(EcorePackage.eNS_URI, EValidatorConstraintLocator.INSTANCE);
ValidityManager.addConstraintLocator(null, EValidatorConstraintLocator.INSTANCE);
}
protected @NonNull Map<@NonNull EObject, @NonNull List<@NonNull LeafConstrainingNode>> createLeafConstrainingNode(@Nullable Map<@NonNull EObject, @NonNull List<@NonNull LeafConstrainingNode>> map,
@NonNull ValidityModel validityModel, @NonNull EObject constrainingType, @NonNull Object constrainingObject, @NonNull String label) {
LeafConstrainingNode constraint = validityModel.createLeafConstrainingNode();
constraint.setConstraintLocator(this);
constraint.setLabel(label);
constraint.setConstrainingObject(constrainingObject);
if (map == null) {
map = new HashMap<@NonNull EObject, @NonNull List<@NonNull LeafConstrainingNode>>();
}
/* EnvironmentFactoryInternal environmentFactory = PivotUtilInternal.findEnvironmentFactory(constrainingType);
if (environmentFactory != null) {
try {
Type asType = environmentFactory.getMetamodelManager().getASOf(Type.class, constrainingType);
if (asType != null) {
CompleteClass asCompleteClass = environmentFactory.getCompleteEnvironment().getCompleteClass(asType);
for (org.eclipse.ocl.pivot.Class asClass : asCompleteClass.getPartialClasses()) {
EObject eTarget = asClass.getETarget();
if (eTarget != null) {
List<LeafConstrainingNode> constraints = map.get(eTarget);
if (constraints == null) {
constraints = new ArrayList<LeafConstrainingNode>();
map.put(eTarget, constraints);
}
constraints.add(constraint);
}
}
return map;
}
} catch (ParserException e) {}
} */
List<@NonNull LeafConstrainingNode> constraints = map.get(constrainingType);
if (constraints == null) {
constraints = new ArrayList<@NonNull LeafConstrainingNode>();
map.put(constrainingType, constraints);
}
constraints.add(constraint);
return map;
}
public @NonNull Set<@NonNull TypeURI> getAllTypes(@NonNull ValidityManager validityManager, @NonNull EObject constrainingObject) {
Set<@NonNull TypeURI> allTypes = new HashSet<@NonNull TypeURI>();
allTypes.add(validityManager.getTypeURI(constrainingObject));
if (constrainingObject instanceof EClass) {
for (EClass eSuperClass : ((EClass)constrainingObject).getEAllSuperTypes()) {
if (eSuperClass != null) {
allTypes.add(validityManager.getTypeURI(eSuperClass));
}
}
}
return allTypes;
}
public @NonNull EObject getConstrainingType(@NonNull EObject constrainedType, @NonNull Object constrainingObject) {
return constrainedType;
}
public @Nullable ConstrainingURI getConstrainingURI(@NonNull EObject eObject) {
Resource resource = eObject.eResource();
if (resource == null) {
return null;
}
if (resource.getURI() == null) {
return null;
}
@NonNull URI uri = resource.getURI().appendFragment(resource.getURIFragment(eObject));
return new ConstrainingURI(uri);
}
public @NonNull ConstraintLocator getConstraintLocator() {
return this;
}
public @Nullable Object getImage() {
return null;
}
public @Nullable Collection<@NonNull Resource> getImports(@NonNull EPackage ePackage, @NonNull Resource resource) {
return null;
}
public @NonNull String getLabel(@NonNull EModelElement eObject) {
StringBuilder s = new StringBuilder();
if (eObject instanceof ENamedElement) {
EObject eContainer = eObject.eContainer();
if (eContainer instanceof ENamedElement) {
s.append(((ENamedElement)eContainer).getName() + "::");
}
s.append(((ENamedElement)eObject).getName());
}
else {
s.append(String.valueOf(eObject));
}
return s.toString();
}
protected @NonNull Severity getSeverity(@NonNull Diagnostic diagnostic) {
Severity severity;
switch (diagnostic.getSeverity()) {
case Diagnostic.OK: severity = Severity.OK; break;
case Diagnostic.INFO: severity = Severity.INFO; break;
case Diagnostic.WARNING: severity = Severity.WARNING; break;
case Diagnostic.ERROR: severity = Severity.ERROR; break;
case Diagnostic.CANCEL: severity = Severity.FATAL; break;
default: severity = Severity.UNKNOWN; break;
}
assert severity != null;
return severity;
}
public @Nullable String getSourceExpression(@NonNull LeafConstrainingNode node) {
return null;
}
public @Nullable Resource getSourceResource(@NonNull LeafConstrainingNode node) {
return null;
}
public @Nullable TypeURI getTypeURI(@NonNull EObject eObject) {
Resource resource = eObject.eResource();
if (resource == null) {
return null;
}
if (resource.getURI() == null) {
return null;
}
@NonNull URI uri = resource.getURI().appendFragment(resource.getURIFragment(eObject));
return new TypeURI(uri);
}
@Override
public @Nullable Set<@NonNull TypeURI> getTypeURIs(@NonNull ValidityManager validityManager, @NonNull EObject validatableObject) {
return null;
}
@Override
public String toString() {
return "\"" + getName() + "\"";
}
public void validate(@NonNull Result result, @NonNull ValidityManager validityManager, @Nullable Monitor monitor) {
result.setDiagnostic("Unimplemented validate for " + getClass().getName());
result.setSeverity(Severity.FATAL);
}
}