/** * Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below. * 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: * Cloudsmith * */ package org.cloudsmith.geppetto.pp.dsl.linking; import java.util.List; import org.eclipse.emf.common.util.ECollections; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.xtext.diagnostics.Severity; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; /** * * */ public abstract class AbstractMessageAcceptor implements IMessageAcceptor { /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#accept(org.eclipse.xtext.diagnostics.Severity, java.lang.String, * org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature, int, java.lang.String, java.lang.String[]) */ @Override public abstract void accept(Severity severity, String message, EObject source, EStructuralFeature feature, int index, String issueCode, String... issueData); @Override public void accept(Severity severity, String message, EObject source, String issueCode, String... issueData) { accept( severity, message, source.eContainer(), source.eContainingFeature(), indexOfSourceInParent(source), issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#accept(org.eclipse.xtext.diagnostics.Severity, java.lang.String, * org.eclipse.xtext.nodemodel.INode, java.lang.String, java.lang.String[]) */ @Override public abstract void accept(Severity severity, String message, INode node, String issueCode, String... issueData); /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptError(java.lang.String, org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, int, java.lang.String, java.lang.String) */ @Override public void acceptError(String message, EObject source, EStructuralFeature feature, int index, String issueCode, String... issueData) { accept(Severity.ERROR, message, source, feature, index, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptError(java.lang.String, org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, java.lang.String, java.lang.String) */ @Override public void acceptError(String message, EObject source, EStructuralFeature feature, String issueCode, String... issueData) { acceptError(message, source, feature, INSIGNIFICANT_INDEX, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptError(java.lang.String, org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, int, java.lang.String, java.lang.String) */ @Override public void acceptError(String message, EObject source, int textOffset, int length, String issueCode, String... issueData) { accept(Severity.ERROR, message, source, textOffset, length, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptError(java.lang.String, org.eclipse.emf.ecore.EObject, int, * java.lang.String, java.lang.String) */ @Override public void acceptError(String message, EObject source, int index, String issueCode, String... issueData) { acceptError(message, source.eContainer(), source.eContainingFeature(), index, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptError(java.lang.String, org.eclipse.emf.ecore.EObject, java.lang.String, * java.lang.String) */ @Override public void acceptError(String message, EObject source, String issueCode, String... issueData) { acceptError( message, source.eContainer(), source.eContainingFeature(), indexOfSourceInParent(source), issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptError(java.lang.String, org.eclipse.xtext.nodemodel.INode, java.lang.String, * java.lang.String) */ @Override public void acceptError(String message, INode node, String issueCode, String... issueData) { accept(Severity.ERROR, message, node, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptWarning(java.lang.String, org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, int, java.lang.String, java.lang.String[]) */ @Override public void acceptWarning(String message, EObject source, EStructuralFeature feature, int index, String issueCode, String... issueData) { accept(Severity.WARNING, message, source, feature, index, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptWarning(java.lang.String, org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, java.lang.String, java.lang.String[]) */ @Override public void acceptWarning(String message, EObject source, EStructuralFeature feature, String issueCode, String... issueData) { acceptWarning(message, source, feature, INSIGNIFICANT_INDEX, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptError(java.lang.String, org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, int, java.lang.String, java.lang.String) */ @Override public void acceptWarning(String message, EObject source, int textOffset, int length, String issueCode, String... issueData) { accept(Severity.WARNING, message, source, textOffset, length, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptWarning(java.lang.String, org.eclipse.emf.ecore.EObject, int, * java.lang.String, java.lang.String[]) */ @Override public void acceptWarning(String message, EObject source, int index, String issueCode, String... issueData) { acceptWarning(message, source.eContainer(), source.eContainingFeature(), index, issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptWarning(java.lang.String, org.eclipse.emf.ecore.EObject, java.lang.String, * java.lang.String[]) */ @Override public void acceptWarning(String message, EObject source, String issueCode, String... issueData) { acceptWarning( message, source.eContainer(), source.eContainingFeature(), indexOfSourceInParent(source), issueCode, issueData); } /* * (non-Javadoc) * * @see org.cloudsmith.geppetto.pp.dsl.linking.IMessageAcceptor#acceptWarning(java.lang.String, org.eclipse.xtext.nodemodel.INode, * java.lang.String, java.lang.String[]) */ @Override public void acceptWarning(String message, INode node, String issueCode, String... issueData) { accept(Severity.WARNING, message, node, issueCode, issueData); } /** * @return the INode corresponding to the 'obj.structuralFeature([index])*' */ protected INode getNode(EObject obj, EStructuralFeature structuralFeature, int index) { INode parserNode = NodeModelUtils.getNode(obj); if(parserNode != null) { if(structuralFeature != null) { List<INode> nodes = NodeModelUtils.findNodesForFeature(obj, structuralFeature); if(index < 0) // insignificant index index = 0; if(nodes.size() > index) parserNode = nodes.get(index); } return parserNode; } return null; } /** * @return the index of source in its containing feature, or {@link #INSIGNIFICANT_INDEX} if containing feature is not indexed. */ private int indexOfSourceInParent(EObject source) { EObject container = source.eContainer(); if(container == null) throw new IllegalArgumentException("source is not contained"); EStructuralFeature feature = source.eContainingFeature(); if(!feature.isMany()) return INSIGNIFICANT_INDEX; List<?> featurelist = (List<?>) container.eGet(feature); return ECollections.indexOf(featurelist, source, 0); } }