/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.painless;
import org.elasticsearch.painless.api.Debug;
import org.elasticsearch.script.ScriptException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import static java.util.Collections.singletonList;
/**
* Thrown by {@link Debug#explain(Object)} to explain an object. Subclass of {@linkplain Error} so it cannot be caught by painless
* scripts.
*/
public class PainlessExplainError extends Error {
private final Object objectToExplain;
public PainlessExplainError(Object objectToExplain) {
this.objectToExplain = objectToExplain;
}
Object getObjectToExplain() {
return objectToExplain;
}
/**
* Headers to be added to the {@link ScriptException} for structured rendering.
*/
public Map<String, List<String>> getHeaders(Definition definition) {
Map<String, List<String>> headers = new TreeMap<>();
String toString = "null";
String javaClassName = null;
String painlessClassName = null;
if (objectToExplain != null) {
toString = objectToExplain.toString();
javaClassName = objectToExplain.getClass().getName();
Definition.RuntimeClass runtimeClass = definition.getRuntimeClass(objectToExplain.getClass());
if (runtimeClass != null) {
painlessClassName = runtimeClass.getStruct().name;
}
}
headers.put("es.to_string", singletonList(toString));
if (painlessClassName != null) {
headers.put("es.painless_class", singletonList(painlessClassName));
}
if (javaClassName != null) {
headers.put("es.java_class", singletonList(javaClassName));
}
return headers;
}
}