/* * Copyright (C) 2014 Indeed Inc. * * Licensed 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 com.indeed.imhotep.web; import com.google.common.base.Throwables; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author vladimir */ public class IQLParseException extends RuntimeException { private final static Pattern columnErrorPattern = Pattern.compile("line 1, column (\\d+)[\\n:]"); // which clause the exception occurred in private final String clause; private final int offsetInClause; public IQLParseException(Throwable cause, String clause) { super(getSummaryMessage(Throwables.getRootCause(cause)), cause); this.clause = clause; this.setStackTrace(cause.getStackTrace()); offsetInClause = getOffset(cause); } private static int getOffset(Throwable cause) { if(cause != null) { final String causeMessage = cause.getMessage(); final Matcher columnMatcher = columnErrorPattern.matcher(causeMessage); if(columnMatcher.find()) { return Integer.valueOf(columnMatcher.group(1)); } } return -1; } public String getClause() { return clause; } public int getOffsetInClause() { return offsetInClause; } private static String getSummaryMessage(Throwable e) { String message = e.getMessage(); final Matcher columnErrorMatcher = columnErrorPattern.matcher(message); message = columnErrorMatcher.replaceAll(""); return message.trim(); } }