1956476d7SDamjan Jovanovic /************************************************************** 2956476d7SDamjan Jovanovic * 3956476d7SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 4956476d7SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 5956476d7SDamjan Jovanovic * distributed with this work for additional information 6956476d7SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 7956476d7SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 8956476d7SDamjan Jovanovic * "License"); you may not use this file except in compliance 9956476d7SDamjan Jovanovic * with the License. You may obtain a copy of the License at 10956476d7SDamjan Jovanovic * 11956476d7SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 12956476d7SDamjan Jovanovic * 13956476d7SDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 14956476d7SDamjan Jovanovic * software distributed under the License is distributed on an 15956476d7SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16956476d7SDamjan Jovanovic * KIND, either express or implied. See the License for the 17956476d7SDamjan Jovanovic * specific language governing permissions and limitations 18956476d7SDamjan Jovanovic * under the License. 19956476d7SDamjan Jovanovic * 20956476d7SDamjan Jovanovic *************************************************************/ 21956476d7SDamjan Jovanovic package com.sun.star.comp.sdbc; 22956476d7SDamjan Jovanovic 23956476d7SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.comphelper.ResourceBasedEventLogger; 24956476d7SDamjan Jovanovic import org.apache.openoffice.comp.sdbc.dbtools.util.StandardSQLState; 25956476d7SDamjan Jovanovic 26*8ccb802dSDamjan Jovanovic import com.sun.star.beans.NamedValue; 27*8ccb802dSDamjan Jovanovic import com.sun.star.beans.PropertyValue; 28*8ccb802dSDamjan Jovanovic import com.sun.star.lang.IllegalArgumentException; 29956476d7SDamjan Jovanovic import com.sun.star.logging.LogLevel; 30956476d7SDamjan Jovanovic import com.sun.star.sdbc.SQLException; 31956476d7SDamjan Jovanovic import com.sun.star.uno.Any; 32*8ccb802dSDamjan Jovanovic import com.sun.star.uno.AnyConverter; 33956476d7SDamjan Jovanovic 34956476d7SDamjan Jovanovic public class Tools { toUnoException(Object source, Throwable throwable)35956476d7SDamjan Jovanovic public static SQLException toUnoException(Object source, Throwable throwable) { 36956476d7SDamjan Jovanovic // FIXME: use SQLException.getNextException() instead of getCause()? 37956476d7SDamjan Jovanovic // There are up to 3 dimensions of exception chaining of warnings in Java, 38956476d7SDamjan Jovanovic // getCause(), getNextException(), and getNextWarning(). 39956476d7SDamjan Jovanovic // The C++ implementation used getNextException() only, 40956476d7SDamjan Jovanovic // but I am using the widely used and more helpful getCause(). 41956476d7SDamjan Jovanovic Throwable cause = throwable.getCause(); 42956476d7SDamjan Jovanovic Object unoCause = Any.VOID; 43956476d7SDamjan Jovanovic if (cause != null) { 44956476d7SDamjan Jovanovic unoCause = toUnoException(source, throwable); 45956476d7SDamjan Jovanovic } 46956476d7SDamjan Jovanovic if (throwable instanceof SQLException) { 47956476d7SDamjan Jovanovic return (SQLException)throwable; 48956476d7SDamjan Jovanovic } else if (throwable instanceof java.sql.SQLException) { 49956476d7SDamjan Jovanovic java.sql.SQLException sqlException = (java.sql.SQLException) throwable; 50956476d7SDamjan Jovanovic return new SQLException(sqlException.getMessage(), source, 51956476d7SDamjan Jovanovic sqlException.getSQLState(), sqlException.getErrorCode(), unoCause); 52956476d7SDamjan Jovanovic } else if (throwable instanceof com.sun.star.uno.Exception) { 53956476d7SDamjan Jovanovic // General UNO exception. Wrap in an SQLException and rethrow: 54956476d7SDamjan Jovanovic com.sun.star.uno.Exception exception = (com.sun.star.uno.Exception) throwable; 55956476d7SDamjan Jovanovic return new SQLException(exception.getMessage(), source, StandardSQLState.SQL_GENERAL_ERROR.text(), 56956476d7SDamjan Jovanovic 0, exception); 57956476d7SDamjan Jovanovic } else { 58956476d7SDamjan Jovanovic // General Java exception. We can't pass this to UNO, so convert it to an UNO SQLException: 59956476d7SDamjan Jovanovic String message = throwable.getMessage(); 60956476d7SDamjan Jovanovic if (message.isEmpty()) { 61956476d7SDamjan Jovanovic message = throwable.getLocalizedMessage(); 62956476d7SDamjan Jovanovic } 63956476d7SDamjan Jovanovic if (message.isEmpty()) { 64956476d7SDamjan Jovanovic message = throwable.toString(); 65956476d7SDamjan Jovanovic } 66956476d7SDamjan Jovanovic return new SQLException(message, source, "", -1, unoCause); 67956476d7SDamjan Jovanovic } 68956476d7SDamjan Jovanovic } 69956476d7SDamjan Jovanovic toUnoExceptionLogged(Object source, ResourceBasedEventLogger logger, Throwable throwable)70956476d7SDamjan Jovanovic public static SQLException toUnoExceptionLogged(Object source, ResourceBasedEventLogger logger, Throwable throwable) { 71956476d7SDamjan Jovanovic 72956476d7SDamjan Jovanovic SQLException exception = toUnoException(source, throwable); 73956476d7SDamjan Jovanovic logger.log(LogLevel.SEVERE, exception); 74956476d7SDamjan Jovanovic return exception; 75956476d7SDamjan Jovanovic } 76*8ccb802dSDamjan Jovanovic getOrDefault(PropertyValue[] properties, String name, String defaultValue)77*8ccb802dSDamjan Jovanovic public static String getOrDefault(PropertyValue[] properties, String name, String defaultValue) throws IllegalArgumentException { 78*8ccb802dSDamjan Jovanovic String ret = defaultValue; 79*8ccb802dSDamjan Jovanovic for (PropertyValue property : properties) { 80*8ccb802dSDamjan Jovanovic if (property.Name.equals(name)) { 81*8ccb802dSDamjan Jovanovic ret = AnyConverter.toString(property.Value); 82*8ccb802dSDamjan Jovanovic break; 83*8ccb802dSDamjan Jovanovic } 84*8ccb802dSDamjan Jovanovic } 85*8ccb802dSDamjan Jovanovic return ret; 86*8ccb802dSDamjan Jovanovic } 87*8ccb802dSDamjan Jovanovic getOrDefault(PropertyValue[] properties, String name, boolean defaultValue)88*8ccb802dSDamjan Jovanovic public static boolean getOrDefault(PropertyValue[] properties, String name, boolean defaultValue) throws IllegalArgumentException { 89*8ccb802dSDamjan Jovanovic boolean ret = defaultValue; 90*8ccb802dSDamjan Jovanovic for (PropertyValue property : properties) { 91*8ccb802dSDamjan Jovanovic if (property.Name.equals(name)) { 92*8ccb802dSDamjan Jovanovic ret = AnyConverter.toBoolean(property.Value); 93*8ccb802dSDamjan Jovanovic break; 94*8ccb802dSDamjan Jovanovic } 95*8ccb802dSDamjan Jovanovic } 96*8ccb802dSDamjan Jovanovic return ret; 97*8ccb802dSDamjan Jovanovic } 98*8ccb802dSDamjan Jovanovic getOrDefault(PropertyValue[] properties, String name, Object defaultValue)99*8ccb802dSDamjan Jovanovic public static Object getOrDefault(PropertyValue[] properties, String name, Object defaultValue) throws IllegalArgumentException { 100*8ccb802dSDamjan Jovanovic Object ret = defaultValue; 101*8ccb802dSDamjan Jovanovic for (PropertyValue property : properties) { 102*8ccb802dSDamjan Jovanovic if (property.Name.equals(name)) { 103*8ccb802dSDamjan Jovanovic ret = property.Value; 104*8ccb802dSDamjan Jovanovic break; 105*8ccb802dSDamjan Jovanovic } 106*8ccb802dSDamjan Jovanovic } 107*8ccb802dSDamjan Jovanovic return ret; 108*8ccb802dSDamjan Jovanovic } 109*8ccb802dSDamjan Jovanovic getOrDefault(PropertyValue[] properties, String name, NamedValue[] defaultValue)110*8ccb802dSDamjan Jovanovic public static NamedValue[] getOrDefault(PropertyValue[] properties, String name, NamedValue[] defaultValue) throws IllegalArgumentException { 111*8ccb802dSDamjan Jovanovic NamedValue[] ret = defaultValue; 112*8ccb802dSDamjan Jovanovic for (PropertyValue property : properties) { 113*8ccb802dSDamjan Jovanovic if (property.Name.equals(name)) { 114*8ccb802dSDamjan Jovanovic Object[] array = (Object[]) AnyConverter.toArray(property.Value); 115*8ccb802dSDamjan Jovanovic ret = new NamedValue[array.length]; 116*8ccb802dSDamjan Jovanovic for (int i = 0; i < array.length; i++) { 117*8ccb802dSDamjan Jovanovic ret[i] = (NamedValue) array[i]; 118*8ccb802dSDamjan Jovanovic } 119*8ccb802dSDamjan Jovanovic break; 120*8ccb802dSDamjan Jovanovic } 121*8ccb802dSDamjan Jovanovic } 122*8ccb802dSDamjan Jovanovic return ret; 123*8ccb802dSDamjan Jovanovic } 124956476d7SDamjan Jovanovic } 125