/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.openjpa.trader.server;
import java.util.Arrays;
import java.util.List;
/**
* Adapts a server-side exception to a RuntimeException.
* This implementation a GWT compiler aware and hence any package dependency will require the
* source code for this dependent packages. The purpose of this translator is to translate
* the stack trace of those exceptions, such as <code>org.apache.openjpa.persistence.PersistenceException</code>
* <em>without</em> bringing in that dependency.
*
* @author Pinaki Poddar
*
*/
public class ExceptionAdapter {
static List<String> exceptionTypes = Arrays.asList("org.apache.openjpa.persistence.PersistenceException");
private boolean _printStackTrace;
public void setPrintServerSideStackTrace(boolean flag) {
_printStackTrace = flag;
}
public RuntimeException translate(Throwable t) {
if (_printStackTrace)
t.printStackTrace();
Throwable cause = searchForKnownButNonTranslatableException(t);
if (cause != null) {
t = cause;
}
RuntimeException e = new RuntimeException(t.getMessage());
e.setStackTrace(t.getStackTrace());
return e;
}
private Throwable searchForKnownButNonTranslatableException(Throwable t) {
if (isAssignable(t.getClass()))
return t;
Throwable nested = t.getCause();
if (nested != null && nested != t) {
return searchForKnownButNonTranslatableException(nested);
}
return null;
}
private boolean isAssignable(Class<?> t) {
if (exceptionTypes.contains(t.getName())) {
return true;
}
if (t.getSuperclass() != Object.class) {
return isAssignable(t.getSuperclass());
}
return false;
}
}