package org.eclipse.xtext.xdoc.validation;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.xtext.validation.Check;
import org.eclipse.xtext.validation.ValidationMessageAcceptor;
import org.eclipse.xtext.xdoc.generator.util.LatexUtils;
import org.eclipse.xtext.xdoc.xdoc.AbstractSection;
import org.eclipse.xtext.xdoc.xdoc.CodeBlock;
import org.eclipse.xtext.xdoc.xdoc.CodeRef;
import org.eclipse.xtext.xdoc.xdoc.ImageRef;
import org.eclipse.xtext.xdoc.xdoc.Ref;
import org.eclipse.xtext.xdoc.xdoc.Table;
import org.eclipse.xtext.xdoc.xdoc.TableRow;
import org.eclipse.xtext.xdoc.xdoc.XdocPackage;
public class XdocJavaValidator extends AbstractXdocJavaValidator {
@Check
public void checkConsistentNumberOfColumns(Table t) {
int columns = -1;
EList<TableRow> rows = t.getRows();
for (TableRow tableRow : rows) {
if (columns==-1)
columns = tableRow.getData().size();
if (tableRow.getData().size()!=columns) {
error("Each row must have the same number of entries (expected "+columns+" but was "+tableRow.getData().size()+")",
tableRow,
XdocPackage.Literals.TABLE_ROW__DATA,
ValidationMessageAcceptor.INSIGNIFICANT_INDEX);
}
}
}
@Check
public void checkAbstractSectionHasTitle(AbstractSection section) {
if(section.getTitle() == null)
warning("This element should have a title.", null,0);
}
@Check
public void checkNoCodeInTitle(CodeBlock code) {
if(!LatexUtils.inline(code)) {
EObject tom = code.eContainer();
while(!(tom.eContainer() instanceof AbstractSection)){
tom = tom.eContainer();
}
if(tom.eContainer() instanceof AbstractSection) {
AbstractSection section = (AbstractSection) tom.eContainer();
if(section.getTitle() == tom) {
error("Headings can not contain code blocks", null);
}
}
}
}
@Check
public void checkImagePath(ImageRef image) {
URI inPath = URI.createURI(image.eResource().getURI().trimSegments(1).toString() + "/" + image.getPath());
if(!image.eResource().getResourceSet().getURIConverter().exists(inPath, null))
error("Cannot find image", XdocPackage.Literals.IMAGE_REF__PATH);
}
@Check
public void checkNestedLinkElements(EObject linkElement) {
if(isLinkElement(linkElement)) {
EObject currentElement = linkElement.eContainer();
while(currentElement != null) {
if(isLinkElement(currentElement)) {
error("Cannot nest link element "
+ linkElement.eClass().getName()
+ " in "
+ currentElement.eClass().getName(),
null);
}
currentElement = currentElement.eContainer();
}
}
}
private boolean isLinkElement(EObject element) {
return element instanceof Ref || element instanceof CodeRef;
}
@Override
protected List<EPackage> getEPackages() {
return Collections.singletonList((EPackage)XdocPackage.eINSTANCE);
}
}