/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/
package org.opensearch.dataprepper.expression;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @since 1.3
*
* Exception thrown by {@link ParseTreeParser} if ANTLR parse emits error events.
*/
class ParseTreeCompositeException extends RuntimeException {
private static final String SEPARATOR = System.getProperty("line.separator");
private final Set exceptions;
public ParseTreeCompositeException(final List exceptions) {
if (exceptions.isEmpty()) {
throw new IllegalArgumentException("exceptions is empty");
}
this.exceptions = exceptions.stream()
.map(this::mapNullToNullPointer)
.collect(Collectors.toSet());
}
private Throwable mapNullToNullPointer(@Nullable final Throwable throwable) {
if (throwable == null) {
return new NullPointerException("Throwable was null!");
}
else {
return throwable;
}
}
private String throwableListToString(final Set exceptions) {
final StringBuilder aggregateMessage = new StringBuilder();
aggregateMessage.append("Multiple exceptions (")
.append(exceptions.size())
.append(")")
.append(SEPARATOR);
for (final Throwable inner : exceptions) {
aggregateMessage.append("|-- ");
aggregateMessage.append(inner.getClass().getCanonicalName()).append(": ");
aggregateMessage.append(inner.getMessage());
final StackTraceElement[] stackTrace = inner.getStackTrace();
if (stackTrace.length > 0) {
aggregateMessage.append(SEPARATOR)
.append(" at ")
.append(stackTrace[0])
.append(SEPARATOR);
}
}
return aggregateMessage.toString().trim();
}
@Override
public synchronized Throwable getCause() {
if (exceptions.size() > 1) {
final String message = throwableListToString(exceptions);
return new ExceptionOverview(message);
}
else {
return exceptions.iterator().next();
}
}
}