001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 */ 018 019package org.apache.commons.dbcp2; 020 021import java.sql.Connection; 022import java.sql.ResultSet; 023import java.sql.Statement; 024import java.text.MessageFormat; 025import java.util.HashSet; 026import java.util.ResourceBundle; 027import java.util.Set; 028 029/** 030 * Utility methods. 031 * 032 * @since 2.0 033 */ 034public final class Utils { 035 036 private static final ResourceBundle messages = ResourceBundle 037 .getBundle(Utils.class.getPackage().getName() + ".LocalStrings"); 038 039 /** 040 * Whether the security manager is enabled. 041 */ 042 public static final boolean IS_SECURITY_ENABLED = System.getSecurityManager() != null; 043 044 /** Any SQL_STATE starting with this value is considered a fatal disconnect */ 045 public static final String DISCONNECTION_SQL_CODE_PREFIX = "08"; 046 047 /** 048 * SQL codes of fatal connection errors. 049 * <ul> 050 * <li>57P01 (ADMIN SHUTDOWN)</li> 051 * <li>57P02 (CRASH SHUTDOWN)</li> 052 * <li>57P03 (CANNOT CONNECT NOW)</li> 053 * <li>01002 (SQL92 disconnect error)</li> 054 * <li>JZ0C0 (Sybase disconnect error)</li> 055 * <li>JZ0C1 (Sybase disconnect error)</li> 056 * </ul> 057 */ 058 public static final Set<String> DISCONNECTION_SQL_CODES; 059 060 static { 061 DISCONNECTION_SQL_CODES = new HashSet<>(); 062 DISCONNECTION_SQL_CODES.add("57P01"); // ADMIN SHUTDOWN 063 DISCONNECTION_SQL_CODES.add("57P02"); // CRASH SHUTDOWN 064 DISCONNECTION_SQL_CODES.add("57P03"); // CANNOT CONNECT NOW 065 DISCONNECTION_SQL_CODES.add("01002"); // SQL92 disconnect error 066 DISCONNECTION_SQL_CODES.add("JZ0C0"); // Sybase disconnect error 067 DISCONNECTION_SQL_CODES.add("JZ0C1"); // Sybase disconnect error 068 } 069 070 private Utils() { 071 // not instantiable 072 } 073 074 /** 075 * Closes the ResultSet (which may be null). 076 * 077 * @param resultSet 078 * a ResultSet, may be {@code null} 079 */ 080 public static void closeQuietly(final ResultSet resultSet) { 081 if (resultSet != null) { 082 try { 083 resultSet.close(); 084 } catch (final Exception e) { 085 // ignored 086 } 087 } 088 } 089 090 /** 091 * Closes the Connection (which may be null). 092 * 093 * @param connection 094 * a Connection, may be {@code null} 095 */ 096 public static void closeQuietly(final Connection connection) { 097 if (connection != null) { 098 try { 099 connection.close(); 100 } catch (final Exception e) { 101 // ignored 102 } 103 } 104 } 105 106 /** 107 * Closes the Statement (which may be null). 108 * 109 * @param statement 110 * a Statement, may be {@code null}. 111 */ 112 public static void closeQuietly(final Statement statement) { 113 if (statement != null) { 114 try { 115 statement.close(); 116 } catch (final Exception e) { 117 // ignored 118 } 119 } 120 } 121 122 /** 123 * Gets the correct i18n message for the given key. 124 * 125 * @param key 126 * The key to look up an i18n message. 127 * @return The i18n message. 128 */ 129 public static String getMessage(final String key) { 130 return getMessage(key, (Object[]) null); 131 } 132 133 /** 134 * Gets the correct i18n message for the given key with placeholders replaced by the supplied arguments. 135 * 136 * @param key 137 * A message key. 138 * @param args 139 * The message arguments. 140 * @return An i18n message. 141 */ 142 public static String getMessage(final String key, final Object... args) { 143 final String msg = messages.getString(key); 144 if (args == null || args.length == 0) { 145 return msg; 146 } 147 final MessageFormat mf = new MessageFormat(msg); 148 return mf.format(args, new StringBuffer(), null).toString(); 149 } 150 151 /** 152 * Converts the given String to a char[]. 153 * 154 * @param value 155 * may be null. 156 * @return a char[] or null. 157 */ 158 public static char[] toCharArray(final String value) { 159 return value != null ? value.toCharArray() : null; 160 } 161 162 /** 163 * Converts the given char[] to a String. 164 * 165 * @param value 166 * may be null. 167 * @return a String or null. 168 */ 169 public static String toString(final char[] value) { 170 return value == null ? null : String.valueOf(value); 171 } 172}