/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. 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
*/
package org.opendaylight.yangtools.yang.parser.rfc6020.repo;
import java.util.ArrayList;
import java.util.List;
import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class YangErrorListener extends BaseErrorListener {
private static final Logger LOG = LoggerFactory.getLogger(YangErrorListener.class);
private final List<YangSyntaxErrorException> exceptions = new ArrayList<>();
@Override
public void syntaxError(final Recognizer<?, ?> recognizer, final Object offendingSymbol, final int line,
final int charPositionInLine, final String msg, final RecognitionException e) {
LOG.debug("Syntax error at {}:{}: {}", line, charPositionInLine, msg, e);
final String module = getModuleName(recognizer);
exceptions.add(new YangSyntaxErrorException(module, line, charPositionInLine, msg, e));
}
private static String getModuleName(final Recognizer<?, ?> recognizer) {
if (!(recognizer instanceof Parser)) {
return null;
}
final Parser parser = (Parser) recognizer;
try {
String model = parser.getInputStream().getTokenSource().getInputStream().toString();
model = model.substring(0, model.indexOf('\n'));
model = model.substring(model.indexOf("module") + 6);
model = model.substring(0, model.indexOf('{'));
model = model.trim();
return model;
} catch (Exception e) {
LOG.debug("Failed to extract module name from parser {}", parser, e);
return null;
}
}
public void validate() throws YangSyntaxErrorException {
if (exceptions.isEmpty()) {
return;
}
// Single exception: just throw it
if (exceptions.size() == 1) {
throw exceptions.get(0);
}
final StringBuilder sb = new StringBuilder();
String module = null;
boolean first = true;
for (YangSyntaxErrorException e : exceptions) {
if (module == null) {
module = e.getModule();
}
if (first) {
first = false;
} else {
sb.append('\n');
}
sb.append(e.getFormattedMessage());
}
throw new YangSyntaxErrorException(module, 0, 0, sb.toString());
}
}