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