/*
  Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.

  The MySQL Connector/J is licensed under the terms of the GPLv2
  <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most MySQL Connectors.
  There are special exceptions to the terms and conditions of the GPLv2 as it is applied to
  this software, see the FLOSS License Exception
  <http://www.mysql.com/about/legal/licensing/foss-exception.html>.

  This program is free software; you can redistribute it and/or modify it under the terms
  of the GNU General Public License as published by the Free Software Foundation; version 2
  of the License.

  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along with this
  program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth
  Floor, Boston, MA 02110-1301  USA
 
 */
package com.mysql.jdbc;

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.sql.DriverPropertyInfo;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;

import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.StringRefAddr;

import com.mysql.jdbc.log.Log;
import com.mysql.jdbc.log.StandardLogger;

/**
 * Represents configurable properties for Connections and DataSources. Can also
 * expose properties as JDBC DriverPropertyInfo if required as well.
 * 
 * @author Mark Matthews
 * @version $Id: ConnectionProperties.java,v 1.1.2.2 2005/05/17 14:58:56
 *          mmatthews Exp $
 */
public class ConnectionPropertiesImpl implements Serializable, ConnectionProperties {
	
	private static final long serialVersionUID = 4257801713007640580L;

	static class BooleanConnectionProperty extends ConnectionProperty implements Serializable {
	
		private static final long serialVersionUID = 2540132501709159404L;

		/**
		 * DOCUMENT ME!
		 * 
		 * @param propertyNameToSet
		 * @param defaultValueToSet
		 * @param descriptionToSet
		 *            DOCUMENT ME!
		 * @param sinceVersionToSet
		 *            DOCUMENT ME!
		 */
		BooleanConnectionProperty(String propertyNameToSet,
				boolean defaultValueToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			super(propertyNameToSet, Boolean.valueOf(defaultValueToSet), null, 0,
					0, descriptionToSet, sinceVersionToSet, category,
					orderInCategory);
		}

		/**
		 * @see com.mysql.jdbc.ConnectionPropertiesImpl.ConnectionProperty#getAllowableValues()
		 */
		String[] getAllowableValues() {
			return new String[] { "true", "false", "yes", "no" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
		}

		boolean getValueAsBoolean() {
			return ((Boolean) this.valueAsObject).booleanValue();
		}

		/**
		 * @see com.mysql.jdbc.ConnectionPropertiesImpl.ConnectionProperty#hasValueConstraints()
		 */
		boolean hasValueConstraints() {
			return true;
		}

		/**
		 * @see com.mysql.jdbc.ConnectionPropertiesImpl.ConnectionProperty#initializeFrom(java.util.Properties)
		 */
		void initializeFrom(String extractedValue, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			if (extractedValue != null) {
				validateStringValues(extractedValue, exceptionInterceptor);

				this.valueAsObject = Boolean.valueOf(extractedValue
						.equalsIgnoreCase("TRUE") //$NON-NLS-1$
						|| extractedValue.equalsIgnoreCase("YES")); //$NON-NLS-1$
			} else {
				this.valueAsObject = this.defaultValue;
			}
		}

		/**
		 * @see com.mysql.jdbc.ConnectionPropertiesImpl.ConnectionProperty#isRangeBased()
		 */
		boolean isRangeBased() {
			return false;
		}

		void setValue(boolean valueFlag) {
			this.valueAsObject = Boolean.valueOf(valueFlag);
		}
	}

	static abstract class ConnectionProperty implements Serializable {

		static final long serialVersionUID = -6644853639584478367L;

		String[] allowableValues;

		String categoryName;

		Object defaultValue;

		int lowerBound;

		int order;

		String propertyName;

		String sinceVersion;

		int upperBound;

		Object valueAsObject;

		boolean required;
		
		String description;
		
		public ConnectionProperty() {}
		
		ConnectionProperty(String propertyNameToSet, Object defaultValueToSet,
				String[] allowableValuesToSet, int lowerBoundToSet,
				int upperBoundToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			
			this.description = descriptionToSet;
			this.propertyName = propertyNameToSet;
			this.defaultValue = defaultValueToSet;
			this.valueAsObject = defaultValueToSet;
			this.allowableValues = allowableValuesToSet;
			this.lowerBound = lowerBoundToSet;
			this.upperBound = upperBoundToSet;
			this.required = false;
			this.sinceVersion = sinceVersionToSet;
			this.categoryName = category;
			this.order = orderInCategory;
		}

		String[] getAllowableValues() {
			return this.allowableValues;
		}

		/**
		 * @return Returns the categoryName.
		 */
		String getCategoryName() {
			return this.categoryName;
		}

		Object getDefaultValue() {
			return this.defaultValue;
		}

		int getLowerBound() {
			return this.lowerBound;
		}

		/**
		 * @return Returns the order.
		 */
		int getOrder() {
			return this.order;
		}

		String getPropertyName() {
			return this.propertyName;
		}

		int getUpperBound() {
			return this.upperBound;
		}

		Object getValueAsObject() {
			return this.valueAsObject;
		}

		abstract boolean hasValueConstraints();

		void initializeFrom(Properties extractFrom, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			String extractedValue = extractFrom.getProperty(getPropertyName());
			extractFrom.remove(getPropertyName());
			initializeFrom(extractedValue, exceptionInterceptor);
		}

		void initializeFrom(Reference ref, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			RefAddr refAddr = ref.get(getPropertyName());

			if (refAddr != null) {
				String refContentAsString = (String) refAddr.getContent();

				initializeFrom(refContentAsString, exceptionInterceptor);
			}
		}

		abstract void initializeFrom(String extractedValue, ExceptionInterceptor exceptionInterceptor) throws SQLException;

		abstract boolean isRangeBased();

		/**
		 * @param categoryName
		 *            The categoryName to set.
		 */
		void setCategoryName(String categoryName) {
			this.categoryName = categoryName;
		}

		/**
		 * @param order
		 *            The order to set.
		 */
		void setOrder(int order) {
			this.order = order;
		}

		void setValueAsObject(Object obj) {
			this.valueAsObject = obj;
		}

		void storeTo(Reference ref) {
			if (getValueAsObject() != null) {
				ref.add(new StringRefAddr(getPropertyName(), getValueAsObject()
						.toString()));
			}
		}

		DriverPropertyInfo getAsDriverPropertyInfo() {
			DriverPropertyInfo dpi = new DriverPropertyInfo(this.propertyName, null);
			dpi.choices = getAllowableValues();
			dpi.value = (this.valueAsObject != null) ? this.valueAsObject.toString() : null;
			dpi.required = this.required;
			dpi.description = this.description;
			
			return dpi;
		}
		

		void validateStringValues(String valueToValidate, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			String[] validateAgainst = getAllowableValues();

			if (valueToValidate == null) {
				return;
			}

			if ((validateAgainst == null) || (validateAgainst.length == 0)) {
				return;
			}

			for (int i = 0; i < validateAgainst.length; i++) {
				if ((validateAgainst[i] != null)
						&& validateAgainst[i].equalsIgnoreCase(valueToValidate)) {
					return;
				}
			}

			StringBuffer errorMessageBuf = new StringBuffer();

			errorMessageBuf.append("The connection property '"); //$NON-NLS-1$
			errorMessageBuf.append(getPropertyName());
			errorMessageBuf.append("' only accepts values of the form: "); //$NON-NLS-1$

			if (validateAgainst.length != 0) {
				errorMessageBuf.append("'"); //$NON-NLS-1$
				errorMessageBuf.append(validateAgainst[0]);
				errorMessageBuf.append("'"); //$NON-NLS-1$

				for (int i = 1; i < (validateAgainst.length - 1); i++) {
					errorMessageBuf.append(", "); //$NON-NLS-1$
					errorMessageBuf.append("'"); //$NON-NLS-1$
					errorMessageBuf.append(validateAgainst[i]);
					errorMessageBuf.append("'"); //$NON-NLS-1$
				}

				errorMessageBuf.append(" or '"); //$NON-NLS-1$
				errorMessageBuf
						.append(validateAgainst[validateAgainst.length - 1]);
				errorMessageBuf.append("'"); //$NON-NLS-1$
			}

			errorMessageBuf.append(". The value '"); //$NON-NLS-1$
			errorMessageBuf.append(valueToValidate);
			errorMessageBuf.append("' is not in this set."); //$NON-NLS-1$

			throw SQLError.createSQLException(errorMessageBuf.toString(),
					SQLError.SQL_STATE_ILLEGAL_ARGUMENT, exceptionInterceptor);
		}
	}

	static class IntegerConnectionProperty extends ConnectionProperty implements Serializable {

		private static final long serialVersionUID = -3004305481796850832L;

		int multiplier = 1;

		public IntegerConnectionProperty(String propertyNameToSet,
				Object defaultValueToSet, String[] allowableValuesToSet,
				int lowerBoundToSet, int upperBoundToSet,
				String descriptionToSet, String sinceVersionToSet,
				String category, int orderInCategory) {
			super(propertyNameToSet, defaultValueToSet, allowableValuesToSet,
					lowerBoundToSet, upperBoundToSet, descriptionToSet, sinceVersionToSet,
					category, orderInCategory);
		}

		IntegerConnectionProperty(String propertyNameToSet,
				int defaultValueToSet, int lowerBoundToSet,
				int upperBoundToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			super(propertyNameToSet, Integer.valueOf(defaultValueToSet), null,
					lowerBoundToSet, upperBoundToSet, descriptionToSet,
					sinceVersionToSet, category, orderInCategory);
		}

		/**
		 * DOCUMENT ME!
		 * 
		 * @param propertyNameToSet
		 * @param defaultValueToSet
		 * @param descriptionToSet
		 * @param sinceVersionToSet
		 *            DOCUMENT ME!
		 */

		IntegerConnectionProperty(String propertyNameToSet,
				int defaultValueToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			this(propertyNameToSet, defaultValueToSet, 0, 0, descriptionToSet,
					sinceVersionToSet, category, orderInCategory);
		}

		/**
		 * @see com.mysql.jdbc.ConnectionProperties.ConnectionProperty#getAllowableValues()
		 */
		String[] getAllowableValues() {
			return null;
		}

		/**
		 * @see com.mysql.jdbc.ConnectionProperties.ConnectionProperty#getLowerBound()
		 */
		int getLowerBound() {
			return this.lowerBound;
		}

		/**
		 * @see com.mysql.jdbc.ConnectionProperties.ConnectionProperty#getUpperBound()
		 */
		int getUpperBound() {
			return this.upperBound;
		}

		int getValueAsInt() {
			return ((Integer) this.valueAsObject).intValue();
		}

		/**
		 * @see com.mysql.jdbc.ConnectionProperties.ConnectionProperty#hasValueConstraints()
		 */
		boolean hasValueConstraints() {
			return false;
		}

		/**
		 * @see com.mysql.jdbc.ConnectionProperties.ConnectionProperty#initializeFrom(java.lang.String)
		 */
		void initializeFrom(String extractedValue, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			if (extractedValue != null) {
				try {
					// Parse decimals, too
					int intValue = (int) (Double.valueOf(extractedValue).doubleValue() * multiplier);

					setValue(intValue, extractedValue, exceptionInterceptor);
				} catch (NumberFormatException nfe) {
					throw SQLError.createSQLException("The connection property '" //$NON-NLS-1$
							+ getPropertyName()
							+ "' only accepts integer values. The value '" //$NON-NLS-1$
							+ extractedValue
							+ "' can not be converted to an integer.", //$NON-NLS-1$
							SQLError.SQL_STATE_ILLEGAL_ARGUMENT, exceptionInterceptor);
				}
			} else {
				this.valueAsObject = this.defaultValue;
			}
		}

		/**
		 * @see com.mysql.jdbc.ConnectionProperties.ConnectionProperty#isRangeBased()
		 */
		boolean isRangeBased() {
			return getUpperBound() != getLowerBound();
		}

		void setValue(int intValue, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			setValue(intValue, null, exceptionInterceptor);
		}
		
		void setValue(int intValue, String valueAsString, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			if (isRangeBased()) {
				if ((intValue < getLowerBound()) || (intValue > getUpperBound())) {
					throw SQLError.createSQLException("The connection property '" + getPropertyName()
							+ "' only accepts integer values in the range of " + getLowerBound() + " - "
							+ getUpperBound() + ", the value '" + (valueAsString == null ? intValue : valueAsString)
							+ "' exceeds this range.", SQLError.SQL_STATE_ILLEGAL_ARGUMENT, exceptionInterceptor);
				}
			}

			this.valueAsObject = Integer.valueOf(intValue);
		}
	}
	
	static public class LongConnectionProperty extends IntegerConnectionProperty {

		private static final long serialVersionUID = 6068572984340480895L;

		LongConnectionProperty(String propertyNameToSet,
				long defaultValueToSet, long lowerBoundToSet,
				long upperBoundToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			super(propertyNameToSet, Long.valueOf(defaultValueToSet), null,
					(int)lowerBoundToSet, (int)upperBoundToSet, descriptionToSet,
					sinceVersionToSet, category, orderInCategory);
		}
		

		LongConnectionProperty(String propertyNameToSet,
				long defaultValueToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			this(propertyNameToSet,
				defaultValueToSet, 0,
				0, descriptionToSet,
				sinceVersionToSet, category, orderInCategory);
		}
		
		void setValue(long longValue, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			setValue(longValue, null, exceptionInterceptor);
		}
			
		void setValue(long longValue, String valueAsString, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			if (isRangeBased()) {
				if ((longValue < getLowerBound()) || (longValue > getUpperBound())) {
					throw SQLError.createSQLException("The connection property '" + getPropertyName()
							+ "' only accepts long integer values in the range of " + getLowerBound() + " - "
							+ getUpperBound() + ", the value '" + (valueAsString == null ? longValue : valueAsString)
							+ "' exceeds this range.", SQLError.SQL_STATE_ILLEGAL_ARGUMENT, exceptionInterceptor);
				}
			}
			this.valueAsObject = Long.valueOf(longValue);
		}
		
		long getValueAsLong() {
			return ((Long) this.valueAsObject).longValue();
		}
		
		void initializeFrom(String extractedValue, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			if (extractedValue != null) {
				try {
					// Parse decimals, too
					long longValue = Double.valueOf(extractedValue).longValue();

					setValue(longValue, extractedValue, exceptionInterceptor);
				} catch (NumberFormatException nfe) {
					throw SQLError.createSQLException("The connection property '" //$NON-NLS-1$
							+ getPropertyName()
							+ "' only accepts long integer values. The value '" //$NON-NLS-1$
							+ extractedValue
							+ "' can not be converted to a long integer.", //$NON-NLS-1$
							SQLError.SQL_STATE_ILLEGAL_ARGUMENT, exceptionInterceptor);
				}
			} else {
				this.valueAsObject = this.defaultValue;
			}
		}
	}
	
	static class MemorySizeConnectionProperty extends IntegerConnectionProperty implements Serializable {

		private static final long serialVersionUID = 7351065128998572656L;

		private String valueAsString;
		
		MemorySizeConnectionProperty(String propertyNameToSet,
				int defaultValueToSet, int lowerBoundToSet,
				int upperBoundToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			super(propertyNameToSet, defaultValueToSet, lowerBoundToSet,
					upperBoundToSet, descriptionToSet, sinceVersionToSet,
					category, orderInCategory);
		}

		void initializeFrom(String extractedValue, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			valueAsString = extractedValue;
			multiplier = 1;
			
			if (extractedValue != null) {
				if (extractedValue.endsWith("k") //$NON-NLS-1$
						|| extractedValue.endsWith("K") //$NON-NLS-1$
						|| extractedValue.endsWith("kb") //$NON-NLS-1$
						|| extractedValue.endsWith("Kb") //$NON-NLS-1$
						|| extractedValue.endsWith("kB") //$NON-NLS-1$
						|| extractedValue.endsWith("KB")) { //$NON-NLS-1$
					multiplier = 1024;
					int indexOfK = StringUtils.indexOfIgnoreCase(
							extractedValue, "k"); //$NON-NLS-1$
					extractedValue = extractedValue.substring(0, indexOfK);
				} else if (extractedValue.endsWith("m") //$NON-NLS-1$
						|| extractedValue.endsWith("M") //$NON-NLS-1$
						|| extractedValue.endsWith("mb") //$NON-NLS-1$
						|| extractedValue.endsWith("Mb") //$NON-NLS-1$
						|| extractedValue.endsWith("mB") //$NON-NLS-1$
						|| extractedValue.endsWith("MB")) { //$NON-NLS-1$
					multiplier = 1024 * 1024;
					int indexOfM = StringUtils.indexOfIgnoreCase(
							extractedValue, "m"); //$NON-NLS-1$
					extractedValue = extractedValue.substring(0, indexOfM);
				} else if (extractedValue.endsWith("g") //$NON-NLS-1$
						|| extractedValue.endsWith("G") //$NON-NLS-1$
						|| extractedValue.endsWith("gb") //$NON-NLS-1$
						|| extractedValue.endsWith("Gb") //$NON-NLS-1$
						|| extractedValue.endsWith("gB") //$NON-NLS-1$
						|| extractedValue.endsWith("GB")) { //$NON-NLS-1$
					multiplier = 1024 * 1024 * 1024;
					int indexOfG = StringUtils.indexOfIgnoreCase(
							extractedValue, "g"); //$NON-NLS-1$
					extractedValue = extractedValue.substring(0, indexOfG);
				}
			}

			super.initializeFrom(extractedValue, exceptionInterceptor);
		}

		void setValue(String value, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			initializeFrom(value, exceptionInterceptor);
		}
		
		String getValueAsString() {
			return valueAsString;
		}
	}

	static class StringConnectionProperty extends ConnectionProperty implements Serializable {
	
		private static final long serialVersionUID = 5432127962785948272L;

		StringConnectionProperty(String propertyNameToSet,
				String defaultValueToSet, String descriptionToSet,
				String sinceVersionToSet, String category, int orderInCategory) {
			this(propertyNameToSet, defaultValueToSet, null, descriptionToSet,
					sinceVersionToSet, category, orderInCategory);
		}

		/**
		 * DOCUMENT ME!
		 * 
		 * @param propertyNameToSet
		 * @param defaultValueToSet
		 * @param allowableValuesToSet
		 * @param descriptionToSet
		 * @param sinceVersionToSet
		 *            DOCUMENT ME!
		 */
		StringConnectionProperty(String propertyNameToSet,
				String defaultValueToSet, String[] allowableValuesToSet,
				String descriptionToSet, String sinceVersionToSet,
				String category, int orderInCategory) {
			super(propertyNameToSet, defaultValueToSet, allowableValuesToSet,
					0, 0, descriptionToSet, sinceVersionToSet, category,
					orderInCategory);
		}

		String getValueAsString() {
			return (String) this.valueAsObject;
		}

		/**
		 * @see com.mysql.jdbc.ConnectionPropertiesImpl.ConnectionProperty#hasValueConstraints()
		 */
		boolean hasValueConstraints() {
			return (this.allowableValues != null)
					&& (this.allowableValues.length > 0);
		}

		/**
		 * @see com.mysql.jdbc.ConnectionPropertiesImpl.ConnectionProperty#initializeFrom(java.util.Properties)
		 */
		void initializeFrom(String extractedValue, ExceptionInterceptor exceptionInterceptor) throws SQLException {
			if (extractedValue != null) {
				validateStringValues(extractedValue, exceptionInterceptor);

				this.valueAsObject = extractedValue;
			} else {
				this.valueAsObject = this.defaultValue;
			}
		}

		/**
		 * @see com.mysql.jdbc.ConnectionPropertiesImpl.ConnectionProperty#isRangeBased()
		 */
		boolean isRangeBased() {
			return false;
		}

		void setValue(String valueFlag) {
			this.valueAsObject = valueFlag;
		}
	}

	private static final String CONNECTION_AND_AUTH_CATEGORY = Messages.getString("ConnectionProperties.categoryConnectionAuthentication"); //$NON-NLS-1$

	private static final String NETWORK_CATEGORY = Messages.getString("ConnectionProperties.categoryNetworking"); //$NON-NLS-1$
	
	private static final String DEBUGING_PROFILING_CATEGORY = Messages.getString("ConnectionProperties.categoryDebuggingProfiling"); //$NON-NLS-1$

	private static final String HA_CATEGORY = Messages.getString("ConnectionProperties.categorryHA"); //$NON-NLS-1$

	private static final String MISC_CATEGORY = Messages.getString("ConnectionProperties.categoryMisc"); //$NON-NLS-1$

	private static final String PERFORMANCE_CATEGORY = Messages.getString("ConnectionProperties.categoryPerformance"); //$NON-NLS-1$
	
	private static final String SECURITY_CATEGORY = Messages.getString("ConnectionProperties.categorySecurity"); //$NON-NLS-1$
	
	private static final String[] PROPERTY_CATEGORIES = new String[] {
		CONNECTION_AND_AUTH_CATEGORY, NETWORK_CATEGORY,
		HA_CATEGORY, SECURITY_CATEGORY,
		PERFORMANCE_CATEGORY, DEBUGING_PROFILING_CATEGORY, MISC_CATEGORY };
	
	private static final ArrayList<java.lang.reflect.Field> PROPERTY_LIST = new ArrayList<java.lang.reflect.Field>();

	//
	// Yes, this looks goofy, but we're trying to avoid intern()ing here
	//
	private static final String STANDARD_LOGGER_NAME = StandardLogger.class.getName();

	protected static final String ZERO_DATETIME_BEHAVIOR_CONVERT_TO_NULL = "convertToNull"; //$NON-NLS-1$

	protected static final String ZERO_DATETIME_BEHAVIOR_EXCEPTION = "exception"; //$NON-NLS-1$

	protected static final String ZERO_DATETIME_BEHAVIOR_ROUND = "round"; //$NON-NLS-1$

	static {
		try {
			java.lang.reflect.Field[] declaredFields = ConnectionPropertiesImpl.class
					.getDeclaredFields();

			for (int i = 0; i < declaredFields.length; i++) {
				if (ConnectionPropertiesImpl.ConnectionProperty.class
						.isAssignableFrom(declaredFields[i].getType())) {
					PROPERTY_LIST.add(declaredFields[i]);
				}
			}
		} catch (Exception ex) {
			RuntimeException rtEx = new RuntimeException();
			rtEx.initCause(ex);
			
			throw rtEx;
		}
	}

	public ExceptionInterceptor getExceptionInterceptor() {
		return null;
	}
	
	/**
	 * Exposes all ConnectionPropertyInfo instances as DriverPropertyInfo
	 * 
	 * @param info
	 *            the properties to load into these ConnectionPropertyInfo
	 *            instances
	 * @param slotsToReserve
	 *            the number of DPI slots to reserve for 'standard' DPI
	 *            properties (user, host, password, etc)
	 * @return a list of all ConnectionPropertyInfo instances, as
	 *         DriverPropertyInfo
	 * @throws SQLException
	 *             if an error occurs
	 */
	protected static DriverPropertyInfo[] exposeAsDriverPropertyInfo(
			Properties info, int slotsToReserve) throws SQLException {
		return (new ConnectionPropertiesImpl() {
			private static final long serialVersionUID = 4257801713007640581L;
		}).exposeAsDriverPropertyInfoInternal(info, slotsToReserve);
	}

	private BooleanConnectionProperty allowLoadLocalInfile = new BooleanConnectionProperty(
			"allowLoadLocalInfile", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.loadDataLocal"), //$NON-NLS-1$
			"3.0.3", SECURITY_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty allowMultiQueries = new BooleanConnectionProperty(
			"allowMultiQueries", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.allowMultiQueries"), //$NON-NLS-1$
			"3.1.1", SECURITY_CATEGORY, 1); //$NON-NLS-1$

	private BooleanConnectionProperty allowNanAndInf = new BooleanConnectionProperty(
			"allowNanAndInf", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.allowNANandINF"), //$NON-NLS-1$
			"3.1.5", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty allowUrlInLocalInfile = new BooleanConnectionProperty(
			"allowUrlInLocalInfile", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.allowUrlInLoadLocal"), //$NON-NLS-1$
			"3.1.4", SECURITY_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty alwaysSendSetIsolation = new BooleanConnectionProperty(
			"alwaysSendSetIsolation", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.alwaysSendSetIsolation"), //$NON-NLS-1$
			"3.1.7", PERFORMANCE_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty autoClosePStmtStreams = new BooleanConnectionProperty(
			"autoClosePStmtStreams",  //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.autoClosePstmtStreams"), //$NON-NLS-1$
			"3.1.12", //$NON-NLS-1$
			MISC_CATEGORY,
			Integer.MIN_VALUE);

	private BooleanConnectionProperty allowMasterDownConnections = new BooleanConnectionProperty(
			"allowMasterDownConnections",  //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.allowMasterDownConnections"), //$NON-NLS-1$
			"5.1.27", //$NON-NLS-1$
			HA_CATEGORY,
			Integer.MAX_VALUE);

	private BooleanConnectionProperty autoDeserialize = new BooleanConnectionProperty(
			"autoDeserialize", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.autoDeserialize"), //$NON-NLS-1$
			"3.1.5", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty autoGenerateTestcaseScript = new BooleanConnectionProperty(
			"autoGenerateTestcaseScript", false, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.autoGenerateTestcaseScript"), "3.1.9", //$NON-NLS-1$ //$NON-NLS-2$
			DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);

	private boolean autoGenerateTestcaseScriptAsBoolean = false;

	private BooleanConnectionProperty autoReconnect = new BooleanConnectionProperty(
			"autoReconnect", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.autoReconnect"), //$NON-NLS-1$
			"1.1", HA_CATEGORY, 0); //$NON-NLS-1$

	private BooleanConnectionProperty autoReconnectForPools = new BooleanConnectionProperty(
			"autoReconnectForPools", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.autoReconnectForPools"), //$NON-NLS-1$
			"3.1.3", HA_CATEGORY, 1); //$NON-NLS-1$

	private boolean autoReconnectForPoolsAsBoolean = false;

	private MemorySizeConnectionProperty blobSendChunkSize = new MemorySizeConnectionProperty(
			"blobSendChunkSize", //$NON-NLS-1$
			1024 * 1024,
			0,
			0,
			Messages.getString("ConnectionProperties.blobSendChunkSize"), //$NON-NLS-1$
			"3.1.9", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty autoSlowLog = new BooleanConnectionProperty(
			"autoSlowLog", true,
			Messages.getString("ConnectionProperties.autoSlowLog"),
			"5.1.4", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty blobsAreStrings = new BooleanConnectionProperty(
            "blobsAreStrings", false,
            "Should the driver always treat BLOBs as Strings - specifically to work around dubious metadata "
            + "returned by the server for GROUP BY clauses?",
            "5.0.8", MISC_CATEGORY, Integer.MIN_VALUE);

	private BooleanConnectionProperty functionsNeverReturnBlobs = new BooleanConnectionProperty(
            "functionsNeverReturnBlobs", false,
            "Should the driver always treat data from functions returning BLOBs as Strings - specifically to work around dubious metadata "
            + "returned by the server for GROUP BY clauses?",
            "5.0.8", MISC_CATEGORY, Integer.MIN_VALUE);
			
	private BooleanConnectionProperty cacheCallableStatements = new BooleanConnectionProperty(
			"cacheCallableStmts", false, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.cacheCallableStatements"), //$NON-NLS-1$
			"3.1.2", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty cachePreparedStatements = new BooleanConnectionProperty(
			"cachePrepStmts", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.cachePrepStmts"), //$NON-NLS-1$
			"3.0.10", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty cacheResultSetMetadata = new BooleanConnectionProperty(
			"cacheResultSetMetadata", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.cacheRSMetadata"), //$NON-NLS-1$
			"3.1.1", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private boolean cacheResultSetMetaDataAsBoolean;

	private StringConnectionProperty serverConfigCacheFactory = new StringConnectionProperty("serverConfigCacheFactory", //$NON-NLS-1$
			PerVmServerConfigCacheFactory.class.getName(), Messages.getString("ConnectionProperties.serverConfigCacheFactory"), "5.1.1", PERFORMANCE_CATEGORY, 12); //$NON-NLS-1$ //$NON-NLS-2$
	
	private BooleanConnectionProperty cacheServerConfiguration = new BooleanConnectionProperty(
			"cacheServerConfiguration", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.cacheServerConfiguration"), //$NON-NLS-1$
			"3.1.5", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private IntegerConnectionProperty callableStatementCacheSize = new IntegerConnectionProperty(
			"callableStmtCacheSize", //$NON-NLS-1$
			100,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.callableStmtCacheSize"), //$NON-NLS-1$
			"3.1.2", PERFORMANCE_CATEGORY, 5); //$NON-NLS-1$

	private BooleanConnectionProperty capitalizeTypeNames = new BooleanConnectionProperty(
			"capitalizeTypeNames", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.capitalizeTypeNames"), //$NON-NLS-1$
			"2.0.7", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private StringConnectionProperty characterEncoding = new StringConnectionProperty(
			"characterEncoding", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.characterEncoding"), //$NON-NLS-1$
			"1.1g", MISC_CATEGORY, 5); //$NON-NLS-1$

	private String characterEncodingAsString = null;
	
	protected boolean characterEncodingIsAliasForSjis = false;

	private StringConnectionProperty characterSetResults = new StringConnectionProperty(
			"characterSetResults", null, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.characterSetResults"), "3.0.13", //$NON-NLS-1$ //$NON-NLS-2$
			MISC_CATEGORY, 6);

	private StringConnectionProperty connectionAttributes = new StringConnectionProperty(
			"connectionAttributes", null, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.connectionAttributes"), "5.1.25", //$NON-NLS-1$ //$NON-NLS-2$
			MISC_CATEGORY, 7);

	
	private StringConnectionProperty clientInfoProvider = new StringConnectionProperty(
			"clientInfoProvider", "com.mysql.jdbc.JDBC4CommentClientInfoProvider", //$NON-NLS-1$ //$NON-NLS-2$
			Messages.getString("ConnectionProperties.clientInfoProvider"), //$NON-NLS-1$
			"5.1.0", //$NON-NLS-1$
			DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty clobberStreamingResults = new BooleanConnectionProperty(
			"clobberStreamingResults", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.clobberStreamingResults"), //$NON-NLS-1$
			"3.0.9", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private StringConnectionProperty clobCharacterEncoding = new StringConnectionProperty(
			"clobCharacterEncoding", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.clobCharacterEncoding"), //$NON-NLS-1$
			"5.0.0", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty compensateOnDuplicateKeyUpdateCounts = new BooleanConnectionProperty(
			"compensateOnDuplicateKeyUpdateCounts",
			false,
			Messages.getString("ConnectionProperties.compensateOnDuplicateKeyUpdateCounts"),
			"5.1.7", MISC_CATEGORY, Integer.MIN_VALUE);
	private StringConnectionProperty connectionCollation = new StringConnectionProperty(
			"connectionCollation", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.connectionCollation"), //$NON-NLS-1$
			"3.0.13", MISC_CATEGORY, 7); //$NON-NLS-1$

	private StringConnectionProperty connectionLifecycleInterceptors = new StringConnectionProperty(
			"connectionLifecycleInterceptors", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.connectionLifecycleInterceptors"),
			"5.1.4", CONNECTION_AND_AUTH_CATEGORY, Integer.MAX_VALUE);

	private IntegerConnectionProperty connectTimeout = new IntegerConnectionProperty(
			"connectTimeout", 0, 0, Integer.MAX_VALUE, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.connectTimeout"), //$NON-NLS-1$
			"3.0.1", CONNECTION_AND_AUTH_CATEGORY, 9); //$NON-NLS-1$

	private BooleanConnectionProperty continueBatchOnError = new BooleanConnectionProperty(
			"continueBatchOnError", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.continueBatchOnError"), //$NON-NLS-1$
			"3.0.3", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty createDatabaseIfNotExist = new BooleanConnectionProperty(
			"createDatabaseIfNotExist", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.createDatabaseIfNotExist"), //$NON-NLS-1$
			"3.1.9", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private IntegerConnectionProperty defaultFetchSize = new IntegerConnectionProperty("defaultFetchSize", 0, Messages.getString("ConnectionProperties.defaultFetchSize"), "3.1.9", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

        // Think really long and hard about changing the default for this
        // many, many applications have come to be acustomed to the
        // latency profile of preparing stuff client-side, rather than
        // prepare (round-trip), execute (round-trip), close (round-trip).
	private BooleanConnectionProperty detectServerPreparedStmts = new BooleanConnectionProperty(
			"useServerPrepStmts", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useServerPrepStmts"), //$NON-NLS-1$
			"3.1.0", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty dontTrackOpenResources = new BooleanConnectionProperty(
			"dontTrackOpenResources", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.dontTrackOpenResources"), "3.1.7", PERFORMANCE_CATEGORY, //$NON-NLS-1$ //$NON-NLS-2$
			Integer.MIN_VALUE);

	private BooleanConnectionProperty dumpQueriesOnException = new BooleanConnectionProperty(
			"dumpQueriesOnException", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.dumpQueriesOnException"), //$NON-NLS-1$
			"3.1.3", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty dynamicCalendars = new BooleanConnectionProperty(
			"dynamicCalendars", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.dynamicCalendars"), //$NON-NLS-1$
			"3.1.5", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty elideSetAutoCommits = new BooleanConnectionProperty(
			"elideSetAutoCommits", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.eliseSetAutoCommit"), //$NON-NLS-1$
			"3.1.3", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty emptyStringsConvertToZero = new BooleanConnectionProperty(
			"emptyStringsConvertToZero", true, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.emptyStringsConvertToZero"), "3.1.8", //$NON-NLS-1$ //$NON-NLS-2$
			MISC_CATEGORY, Integer.MIN_VALUE);

	private BooleanConnectionProperty emulateLocators = new BooleanConnectionProperty(
			"emulateLocators", false, Messages.getString("ConnectionProperties.emulateLocators"), "3.1.0", MISC_CATEGORY, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
			Integer.MIN_VALUE);

	private BooleanConnectionProperty emulateUnsupportedPstmts = new BooleanConnectionProperty(
			"emulateUnsupportedPstmts", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.emulateUnsupportedPstmts"), //$NON-NLS-1$
			"3.1.7", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty enablePacketDebug = new BooleanConnectionProperty(
			"enablePacketDebug", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.enablePacketDebug"), //$NON-NLS-1$
			"3.1.3", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty enableQueryTimeouts = new BooleanConnectionProperty(
			"enableQueryTimeouts", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.enableQueryTimeouts"), //$NON-NLS-1$
			"5.0.6", //$NON-NLS-1$
			PERFORMANCE_CATEGORY, Integer.MIN_VALUE);
			
	private BooleanConnectionProperty explainSlowQueries = new BooleanConnectionProperty(
			"explainSlowQueries", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.explainSlowQueries"), //$NON-NLS-1$
			"3.1.2", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private StringConnectionProperty exceptionInterceptors = new StringConnectionProperty(
			"exceptionInterceptors", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.exceptionInterceptors"),
			"5.1.8", MISC_CATEGORY, Integer.MIN_VALUE);
	
	/** When failed-over, set connection to read-only? */
	private BooleanConnectionProperty failOverReadOnly = new BooleanConnectionProperty(
			"failOverReadOnly", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.failoverReadOnly"), //$NON-NLS-1$
			"3.0.12", HA_CATEGORY, 2); //$NON-NLS-1$

	private BooleanConnectionProperty gatherPerformanceMetrics = new BooleanConnectionProperty(
			"gatherPerfMetrics", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.gatherPerfMetrics"), //$NON-NLS-1$
			"3.1.2", DEBUGING_PROFILING_CATEGORY, 1); //$NON-NLS-1$

	private BooleanConnectionProperty generateSimpleParameterMetadata = new BooleanConnectionProperty(
			"generateSimpleParameterMetadata", false, Messages.getString("ConnectionProperties.generateSimpleParameterMetadata"), "5.0.5", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private boolean highAvailabilityAsBoolean = false;

	private BooleanConnectionProperty holdResultsOpenOverStatementClose = new BooleanConnectionProperty(
			"holdResultsOpenOverStatementClose", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.holdRSOpenOverStmtClose"), //$NON-NLS-1$
			"3.1.7", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty includeInnodbStatusInDeadlockExceptions = new BooleanConnectionProperty(
			"includeInnodbStatusInDeadlockExceptions",
			false,
			Messages.getString("ConnectionProperties.includeInnodbStatusInDeadlockExceptions"),
			"5.0.7", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty includeThreadDumpInDeadlockExceptions = new BooleanConnectionProperty(
			"includeThreadDumpInDeadlockExceptions",
			false,
			Messages.getString("ConnectionProperties.includeThreadDumpInDeadlockExceptions"),
			"5.1.15", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty includeThreadNamesAsStatementComment = new BooleanConnectionProperty(
			"includeThreadNamesAsStatementComment",
			false,
			Messages.getString("ConnectionProperties.includeThreadNamesAsStatementComment"),
			"5.1.15", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty ignoreNonTxTables = new BooleanConnectionProperty(
			"ignoreNonTxTables", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.ignoreNonTxTables"), //$NON-NLS-1$
			"3.0.9", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private IntegerConnectionProperty initialTimeout = new IntegerConnectionProperty(
			"initialTimeout", 2, 1, Integer.MAX_VALUE, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.initialTimeout"), //$NON-NLS-1$
			"1.1", HA_CATEGORY, 5); //$NON-NLS-1$

	private BooleanConnectionProperty isInteractiveClient = new BooleanConnectionProperty(
			"interactiveClient", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.interactiveClient"), //$NON-NLS-1$
			"3.1.0", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty jdbcCompliantTruncation = new BooleanConnectionProperty(
			"jdbcCompliantTruncation", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.jdbcCompliantTruncation"), "3.1.2", MISC_CATEGORY, //$NON-NLS-1$ //$NON-NLS-2$
			Integer.MIN_VALUE);

	private boolean jdbcCompliantTruncationForReads = 
		this.jdbcCompliantTruncation.getValueAsBoolean();
	
	protected MemorySizeConnectionProperty largeRowSizeThreshold = new MemorySizeConnectionProperty("largeRowSizeThreshold",
			2048, 0, Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.largeRowSizeThreshold"),
			"5.1.1", PERFORMANCE_CATEGORY, Integer.MIN_VALUE);
	
	private StringConnectionProperty loadBalanceStrategy = new StringConnectionProperty(
			"loadBalanceStrategy", //$NON-NLS-1$
			"random", //$NON-NLS-1$
			null, //$NON-NLS-1$ //$NON-NLS-2$
			Messages.getString("ConnectionProperties.loadBalanceStrategy"), //$NON-NLS-1$
			"5.0.6", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private IntegerConnectionProperty loadBalanceBlacklistTimeout = new IntegerConnectionProperty(
			"loadBalanceBlacklistTimeout", 0, //$NON-NLS-1$
			0, Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.loadBalanceBlacklistTimeout"), //$NON-NLS-1$
			"5.1.0", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private IntegerConnectionProperty loadBalancePingTimeout = new IntegerConnectionProperty(
			"loadBalancePingTimeout", 0, //$NON-NLS-1$
			0, Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.loadBalancePingTimeout"), //$NON-NLS-1$
			"5.1.13", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty loadBalanceValidateConnectionOnSwapServer = new BooleanConnectionProperty(
			"loadBalanceValidateConnectionOnSwapServer",
			false,
			Messages.getString("ConnectionProperties.loadBalanceValidateConnectionOnSwapServer"), //$NON-NLS-1$
			"5.1.13", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private StringConnectionProperty loadBalanceConnectionGroup = new StringConnectionProperty(
			"loadBalanceConnectionGroup", //$NON-NLS-1$
			null, //$NON-NLS-1$ //$NON-NLS-2$
			Messages.getString("ConnectionProperties.loadBalanceConnectionGroup"), //$NON-NLS-1$
			"5.1.13", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private StringConnectionProperty loadBalanceExceptionChecker = new StringConnectionProperty(
			"loadBalanceExceptionChecker", //$NON-NLS-1$
			"com.mysql.jdbc.StandardLoadBalanceExceptionChecker", //$NON-NLS-1$
			null, //$NON-NLS-1$ //$NON-NLS-2$
			Messages.getString("ConnectionProperties.loadBalanceExceptionChecker"), //$NON-NLS-1$
			"5.1.13", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private StringConnectionProperty loadBalanceSQLStateFailover = new StringConnectionProperty(
			"loadBalanceSQLStateFailover", //$NON-NLS-1$
			null, //$NON-NLS-1$ //$NON-NLS-2$
			Messages.getString("ConnectionProperties.loadBalanceSQLStateFailover"), //$NON-NLS-1$
			"5.1.13", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private StringConnectionProperty loadBalanceSQLExceptionSubclassFailover = new StringConnectionProperty(
			"loadBalanceSQLExceptionSubclassFailover", //$NON-NLS-1$
			null, //$NON-NLS-1$ //$NON-NLS-2$
			Messages.getString("ConnectionProperties.loadBalanceSQLExceptionSubclassFailover"), //$NON-NLS-1$
			"5.1.13", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty loadBalanceEnableJMX = new BooleanConnectionProperty(
			"loadBalanceEnableJMX", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.loadBalanceEnableJMX"), //$NON-NLS-1$
			"5.1.13", MISC_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$
	
	private StringConnectionProperty loadBalanceAutoCommitStatementRegex = new StringConnectionProperty(
			"loadBalanceAutoCommitStatementRegex", //$NON-NLS-1$
			null, //$NON-NLS-1$ //$NON-NLS-2$
			Messages.getString("ConnectionProperties.loadBalanceAutoCommitStatementRegex"), //$NON-NLS-1$
			"5.1.15", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private IntegerConnectionProperty loadBalanceAutoCommitStatementThreshold = new IntegerConnectionProperty(
			"loadBalanceAutoCommitStatementThreshold", 0, //$NON-NLS-1$
			0, Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.loadBalanceAutoCommitStatementThreshold"), //$NON-NLS-1$
			"5.1.15", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	
	private StringConnectionProperty localSocketAddress = new StringConnectionProperty("localSocketAddress", //$NON-NLS-1$
			null, Messages.getString("ConnectionProperties.localSocketAddress"), //$NON-NLS-1$
			"5.0.5", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private MemorySizeConnectionProperty locatorFetchBufferSize = new MemorySizeConnectionProperty(
			"locatorFetchBufferSize", //$NON-NLS-1$
			1024 * 1024,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.locatorFetchBufferSize"), //$NON-NLS-1$
			"3.2.1", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private StringConnectionProperty loggerClassName = new StringConnectionProperty(
			"logger", STANDARD_LOGGER_NAME, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.logger", new Object[] {Log.class.getName(), STANDARD_LOGGER_NAME}), //$NON-NLS-1$
					 "3.1.1", DEBUGING_PROFILING_CATEGORY, //$NON-NLS-1$ //$NON-NLS-2$
			0);

	private BooleanConnectionProperty logSlowQueries = new BooleanConnectionProperty(
			"logSlowQueries", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.logSlowQueries"), //$NON-NLS-1$
			"3.1.2", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty logXaCommands = new BooleanConnectionProperty(
			"logXaCommands", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.logXaCommands"), //$NON-NLS-1$
			"5.0.5", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty maintainTimeStats = new BooleanConnectionProperty(
			"maintainTimeStats", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.maintainTimeStats"), "3.1.9", PERFORMANCE_CATEGORY, //$NON-NLS-1$ //$NON-NLS-2$
			Integer.MAX_VALUE);

	private boolean maintainTimeStatsAsBoolean = true;

	private IntegerConnectionProperty maxQuerySizeToLog = new IntegerConnectionProperty(
			"maxQuerySizeToLog", //$NON-NLS-1$
			2048,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.maxQuerySizeToLog"), //$NON-NLS-1$
			"3.1.3", DEBUGING_PROFILING_CATEGORY, 4); //$NON-NLS-1$

	private IntegerConnectionProperty maxReconnects = new IntegerConnectionProperty(
			"maxReconnects", //$NON-NLS-1$
			3,
			1,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.maxReconnects"), //$NON-NLS-1$
			"1.1", HA_CATEGORY, 4); //$NON-NLS-1$

	private IntegerConnectionProperty retriesAllDown = new IntegerConnectionProperty(
			"retriesAllDown", //$NON-NLS-1$
			120,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.retriesAllDown"), //$NON-NLS-1$
			"5.1.6", HA_CATEGORY, 4); //$NON-NLS-1$

	private IntegerConnectionProperty maxRows = new IntegerConnectionProperty(
			"maxRows", -1, -1, Integer.MAX_VALUE, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.maxRows"), //$NON-NLS-1$
			Messages.getString("ConnectionProperties.allVersions"), MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private int maxRowsAsInt = -1;

	private IntegerConnectionProperty metadataCacheSize = new IntegerConnectionProperty(
			"metadataCacheSize", //$NON-NLS-1$
			50,
			1,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.metadataCacheSize"), //$NON-NLS-1$
			"3.1.1", PERFORMANCE_CATEGORY, 5); //$NON-NLS-1$
	
	private IntegerConnectionProperty netTimeoutForStreamingResults = new IntegerConnectionProperty(
			"netTimeoutForStreamingResults", 600, //$NON-NLS-1$
			0, Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.netTimeoutForStreamingResults"), //$NON-NLS-1$
			"5.1.0", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty noAccessToProcedureBodies = new BooleanConnectionProperty(
			"noAccessToProcedureBodies",
			false,
			"When determining procedure parameter types for CallableStatements, and the connected user "
			+ " can't access procedure bodies through \"SHOW CREATE PROCEDURE\" or select on mysql.proc "
			+ " should the driver instead create basic metadata (all parameters reported as IN VARCHARs,"
			+ " but allowing registerOutParameter() to be called on them anyway) instead "
			+ " of throwing an exception?",
			"5.0.3", MISC_CATEGORY, Integer.MIN_VALUE);
			
	private BooleanConnectionProperty noDatetimeStringSync = new BooleanConnectionProperty(
			"noDatetimeStringSync", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.noDatetimeStringSync"), //$NON-NLS-1$
			"3.1.7", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty noTimezoneConversionForTimeType = new BooleanConnectionProperty(
			"noTimezoneConversionForTimeType", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.noTzConversionForTimeType"), //$NON-NLS-1$
			"5.0.0", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty nullCatalogMeansCurrent = new BooleanConnectionProperty(
			"nullCatalogMeansCurrent", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.nullCatalogMeansCurrent"), //$NON-NLS-1$
			"3.1.8", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty nullNamePatternMatchesAll = new BooleanConnectionProperty(
			"nullNamePatternMatchesAll", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.nullNamePatternMatchesAll"), //$NON-NLS-1$
			"3.1.8", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private IntegerConnectionProperty packetDebugBufferSize = new IntegerConnectionProperty(
			"packetDebugBufferSize", //$NON-NLS-1$
			20,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.packetDebugBufferSize"), //$NON-NLS-1$
			"3.1.3", DEBUGING_PROFILING_CATEGORY, 7); //$NON-NLS-1$
	
	private BooleanConnectionProperty padCharsWithSpace = new BooleanConnectionProperty(
			"padCharsWithSpace", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.padCharsWithSpace"), //$NON-NLS-1$
			"5.0.6", //$NON-NLS-1$
			MISC_CATEGORY,
			Integer.MIN_VALUE);

	private BooleanConnectionProperty paranoid = new BooleanConnectionProperty(
			"paranoid", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.paranoid"), //$NON-NLS-1$
			"3.0.1", SECURITY_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty pedantic = new BooleanConnectionProperty(
			"pedantic", false, Messages.getString("ConnectionProperties.pedantic"), "3.0.0", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
			MISC_CATEGORY, Integer.MIN_VALUE);

	private BooleanConnectionProperty pinGlobalTxToPhysicalConnection = new BooleanConnectionProperty(
			"pinGlobalTxToPhysicalConnection", false, Messages.getString("ConnectionProperties.pinGlobalTxToPhysicalConnection"), //$NON-NLS-1$
			"5.0.1", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty populateInsertRowWithDefaultValues = new BooleanConnectionProperty(
			"populateInsertRowWithDefaultValues", false, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.populateInsertRowWithDefaultValues"), //$NON-NLS-1$
			"5.0.5", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private IntegerConnectionProperty preparedStatementCacheSize = new IntegerConnectionProperty(
			"prepStmtCacheSize", 25, 0, Integer.MAX_VALUE, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.prepStmtCacheSize"), //$NON-NLS-1$
			"3.0.10", PERFORMANCE_CATEGORY, 10); //$NON-NLS-1$

	private IntegerConnectionProperty preparedStatementCacheSqlLimit = new IntegerConnectionProperty(
			"prepStmtCacheSqlLimit", //$NON-NLS-1$
			256,
			1,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.prepStmtCacheSqlLimit"), //$NON-NLS-1$
			"3.0.10", PERFORMANCE_CATEGORY, 11); //$NON-NLS-1$

	private StringConnectionProperty parseInfoCacheFactory = new StringConnectionProperty("parseInfoCacheFactory", //$NON-NLS-1$
			PerConnectionLRUFactory.class.getName(), Messages.getString("ConnectionProperties.parseInfoCacheFactory"), "5.1.1", PERFORMANCE_CATEGORY, 12); //$NON-NLS-1$ //$NON-NLS-2$
	
	private BooleanConnectionProperty processEscapeCodesForPrepStmts = 
		new BooleanConnectionProperty("processEscapeCodesForPrepStmts", //$NON-NLS-1$
				true,
				Messages.getString("ConnectionProperties.processEscapeCodesForPrepStmts"), //$NON-NLS-1$
				"3.1.12", //$NON-NLS-1$
				MISC_CATEGORY, Integer.MIN_VALUE);
	
	private StringConnectionProperty profilerEventHandler = new StringConnectionProperty(
			"profilerEventHandler",
			"com.mysql.jdbc.profiler.LoggingProfilerEventHandler",
			Messages.getString("ConnectionProperties.profilerEventHandler"),
			"5.1.6", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
			
	private StringConnectionProperty profileSql = new StringConnectionProperty(
			"profileSql", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.profileSqlDeprecated"), //$NON-NLS-1$
			"2.0.14", DEBUGING_PROFILING_CATEGORY, 3); //$NON-NLS-1$

	private BooleanConnectionProperty profileSQL = new BooleanConnectionProperty(
			"profileSQL", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.profileSQL"), //$NON-NLS-1$
			"3.1.0", DEBUGING_PROFILING_CATEGORY, 1); //$NON-NLS-1$

	private boolean profileSQLAsBoolean = false;

	private StringConnectionProperty propertiesTransform = new StringConnectionProperty(
			NonRegisteringDriver.PROPERTIES_TRANSFORM_KEY,
			null,
			Messages.getString("ConnectionProperties.connectionPropertiesTransform"), //$NON-NLS-1$
			"3.1.4", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private IntegerConnectionProperty queriesBeforeRetryMaster = new IntegerConnectionProperty(
			"queriesBeforeRetryMaster", //$NON-NLS-1$
			50,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.queriesBeforeRetryMaster"), //$NON-NLS-1$
			"3.0.2", HA_CATEGORY, 7); //$NON-NLS-1$

	private BooleanConnectionProperty queryTimeoutKillsConnection = new BooleanConnectionProperty(
			"queryTimeoutKillsConnection", false, 
			Messages.getString("ConnectionProperties.queryTimeoutKillsConnection"), "5.1.9", MISC_CATEGORY, Integer.MIN_VALUE);
			
	private BooleanConnectionProperty reconnectAtTxEnd = new BooleanConnectionProperty(
			"reconnectAtTxEnd", false, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.reconnectAtTxEnd"), "3.0.10", //$NON-NLS-1$ //$NON-NLS-2$
			HA_CATEGORY, 4);

	private boolean reconnectTxAtEndAsBoolean = false;

	private BooleanConnectionProperty relaxAutoCommit = new BooleanConnectionProperty(
			"relaxAutoCommit", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.relaxAutoCommit"), //$NON-NLS-1$
			"2.0.13", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private IntegerConnectionProperty reportMetricsIntervalMillis = new IntegerConnectionProperty(
			"reportMetricsIntervalMillis", //$NON-NLS-1$
			30000,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.reportMetricsIntervalMillis"), //$NON-NLS-1$
			"3.1.2", DEBUGING_PROFILING_CATEGORY, 3); //$NON-NLS-1$

	private BooleanConnectionProperty requireSSL = new BooleanConnectionProperty(
			"requireSSL", false, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.requireSSL"), //$NON-NLS-1$
			"3.1.0", SECURITY_CATEGORY, 3); //$NON-NLS-1$

	private StringConnectionProperty resourceId = new StringConnectionProperty(
			"resourceId", //$NON-NLS-1$
			null, Messages.getString("ConnectionProperties.resourceId"), //$NON-NLS-1$
			"5.0.1", //$NON-NLS-1$
			HA_CATEGORY,
			Integer.MIN_VALUE);
	
	private IntegerConnectionProperty resultSetSizeThreshold = new IntegerConnectionProperty("resultSetSizeThreshold", 100, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.resultSetSizeThreshold"), "5.0.5", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$ //$NON-NLS-2$
			
	private BooleanConnectionProperty retainStatementAfterResultSetClose = new BooleanConnectionProperty(
			"retainStatementAfterResultSetClose", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.retainStatementAfterResultSetClose"), //$NON-NLS-1$
			"3.1.11", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty rewriteBatchedStatements = new BooleanConnectionProperty(
			"rewriteBatchedStatements", //$NON-NLS-1$
			false, 
			Messages.getString("ConnectionProperties.rewriteBatchedStatements"), //$NON-NLS-1$
			"3.1.13", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty rollbackOnPooledClose = new BooleanConnectionProperty(
			"rollbackOnPooledClose", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.rollbackOnPooledClose"), //$NON-NLS-1$
			"3.0.15", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty roundRobinLoadBalance = new BooleanConnectionProperty(
			"roundRobinLoadBalance", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.roundRobinLoadBalance"), //$NON-NLS-1$
			"3.1.2", HA_CATEGORY, 5); //$NON-NLS-1$

	private BooleanConnectionProperty runningCTS13 = new BooleanConnectionProperty(
			"runningCTS13", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.runningCTS13"), //$NON-NLS-1$
			"3.1.7", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private IntegerConnectionProperty secondsBeforeRetryMaster = new IntegerConnectionProperty(
			"secondsBeforeRetryMaster", //$NON-NLS-1$
			30,
			1,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.secondsBeforeRetryMaster"), //$NON-NLS-1$
			"3.0.2", HA_CATEGORY, 8); //$NON-NLS-1$

	private IntegerConnectionProperty selfDestructOnPingSecondsLifetime = new IntegerConnectionProperty(
			"selfDestructOnPingSecondsLifetime",
			0,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.selfDestructOnPingSecondsLifetime"),
			"5.1.6", HA_CATEGORY, Integer.MAX_VALUE);
	
	private IntegerConnectionProperty selfDestructOnPingMaxOperations = new IntegerConnectionProperty(
			"selfDestructOnPingMaxOperations",
			0,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.selfDestructOnPingMaxOperations"),
			"5.1.6", HA_CATEGORY, Integer.MAX_VALUE);

	private BooleanConnectionProperty replicationEnableJMX = new BooleanConnectionProperty(
			"replicationEnableJMX", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.loadBalanceEnableJMX"), //$NON-NLS-1$
			"5.1.27", HA_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$

	private StringConnectionProperty serverTimezone = new StringConnectionProperty(
			"serverTimezone", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.serverTimezone"), //$NON-NLS-1$
			"3.0.2", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private StringConnectionProperty sessionVariables = new StringConnectionProperty(
			"sessionVariables", null, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.sessionVariables"), "3.1.8", //$NON-NLS-1$ //$NON-NLS-2$
			MISC_CATEGORY, Integer.MAX_VALUE);

	private IntegerConnectionProperty slowQueryThresholdMillis = new IntegerConnectionProperty(
			"slowQueryThresholdMillis", //$NON-NLS-1$
			2000,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.slowQueryThresholdMillis"), //$NON-NLS-1$
			"3.1.2", DEBUGING_PROFILING_CATEGORY, 9); //$NON-NLS-1$
	
	private LongConnectionProperty slowQueryThresholdNanos = new LongConnectionProperty(
			"slowQueryThresholdNanos", //$NON-NLS-1$
			0,
			Messages.getString("ConnectionProperties.slowQueryThresholdNanos"), //$NON-NLS-1$
			"5.0.7", //$NON-NLS-1$
			DEBUGING_PROFILING_CATEGORY,
			10);
	
	private StringConnectionProperty socketFactoryClassName = new StringConnectionProperty(
			"socketFactory", //$NON-NLS-1$
			StandardSocketFactory.class.getName(),
			Messages.getString("ConnectionProperties.socketFactory"), //$NON-NLS-1$
			"3.0.3", CONNECTION_AND_AUTH_CATEGORY, 4); //$NON-NLS-1$

	private IntegerConnectionProperty socketTimeout = new IntegerConnectionProperty(
			"socketTimeout", //$NON-NLS-1$
			0,
			0,
			Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.socketTimeout"), //$NON-NLS-1$
			"3.0.1", CONNECTION_AND_AUTH_CATEGORY, 10); //$NON-NLS-1$
	
	private StringConnectionProperty statementInterceptors = new StringConnectionProperty("statementInterceptors", //$NON-NLS-1$
			null, Messages.getString("ConnectionProperties.statementInterceptors"), "5.1.1", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$ //$NON-NLS-2$
	
	private BooleanConnectionProperty strictFloatingPoint = new BooleanConnectionProperty(
			"strictFloatingPoint", false, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.strictFloatingPoint"), "3.0.0", //$NON-NLS-1$ //$NON-NLS-2$
			MISC_CATEGORY, Integer.MIN_VALUE);

	private BooleanConnectionProperty strictUpdates = new BooleanConnectionProperty(
			"strictUpdates", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.strictUpdates"), //$NON-NLS-1$
			"3.0.4", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty overrideSupportsIntegrityEnhancementFacility =
		new BooleanConnectionProperty("overrideSupportsIntegrityEnhancementFacility", //$NON-NLS-1$
				false,
				Messages.getString("ConnectionProperties.overrideSupportsIEF"), //$NON-NLS-1$
				"3.1.12", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty tcpNoDelay = new BooleanConnectionProperty(
			StandardSocketFactory.TCP_NO_DELAY_PROPERTY_NAME,
			Boolean.valueOf(StandardSocketFactory.TCP_NO_DELAY_DEFAULT_VALUE).booleanValue(),
			Messages.getString("ConnectionProperties.tcpNoDelay"), //$NON-NLS-1$
			"5.0.7", NETWORK_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty tcpKeepAlive = new BooleanConnectionProperty(
			StandardSocketFactory.TCP_KEEP_ALIVE_PROPERTY_NAME,
			Boolean.valueOf(StandardSocketFactory.TCP_KEEP_ALIVE_DEFAULT_VALUE).booleanValue(),
			Messages.getString("ConnectionProperties.tcpKeepAlive"), //$NON-NLS-1$
			"5.0.7", NETWORK_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private IntegerConnectionProperty tcpRcvBuf = new IntegerConnectionProperty(
			StandardSocketFactory.TCP_RCV_BUF_PROPERTY_NAME,
			Integer.parseInt(StandardSocketFactory.TCP_RCV_BUF_DEFAULT_VALUE),
			0, Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.tcpSoRcvBuf"), //$NON-NLS-1$
			"5.0.7", NETWORK_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private IntegerConnectionProperty tcpSndBuf = new IntegerConnectionProperty(
			StandardSocketFactory.TCP_SND_BUF_PROPERTY_NAME,
			Integer.parseInt(StandardSocketFactory.TCP_SND_BUF_DEFAULT_VALUE),
			0, Integer.MAX_VALUE,
			Messages.getString("ConnectionProperties.tcpSoSndBuf"), //$NON-NLS-1$
			"5.0.7", NETWORK_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
			
	private IntegerConnectionProperty tcpTrafficClass = new IntegerConnectionProperty(
			StandardSocketFactory.TCP_TRAFFIC_CLASS_PROPERTY_NAME,
			Integer.parseInt(StandardSocketFactory.TCP_TRAFFIC_CLASS_DEFAULT_VALUE),
			0, 255,
			Messages.getString("ConnectionProperties.tcpTrafficClass"), //$NON-NLS-1$
			"5.0.7", NETWORK_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty tinyInt1isBit = new BooleanConnectionProperty(
			"tinyInt1isBit", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.tinyInt1isBit"), //$NON-NLS-1$
			"3.0.16", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	protected BooleanConnectionProperty traceProtocol = new BooleanConnectionProperty(
			"traceProtocol", false, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.traceProtocol"), "3.1.2", //$NON-NLS-1$ //$NON-NLS-2$
			DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);

	private BooleanConnectionProperty treatUtilDateAsTimestamp = new BooleanConnectionProperty(
			"treatUtilDateAsTimestamp", true, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.treatUtilDateAsTimestamp"), //$NON-NLS-1$
			"5.0.5", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty transformedBitIsBoolean = new BooleanConnectionProperty(
			"transformedBitIsBoolean", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.transformedBitIsBoolean"), //$NON-NLS-1$
			"3.1.9", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useBlobToStoreUTF8OutsideBMP = new BooleanConnectionProperty(
			"useBlobToStoreUTF8OutsideBMP",
			false,
			Messages.getString("ConnectionProperties.useBlobToStoreUTF8OutsideBMP"), //$NON-NLS-1$
			"5.1.3", MISC_CATEGORY, 128);
	
	private StringConnectionProperty utf8OutsideBmpExcludedColumnNamePattern = new StringConnectionProperty(
			"utf8OutsideBmpExcludedColumnNamePattern",
			null,
			Messages.getString("ConnectionProperties.utf8OutsideBmpExcludedColumnNamePattern"), //$NON-NLS-1$
			"5.1.3", MISC_CATEGORY, 129);
	
	private StringConnectionProperty utf8OutsideBmpIncludedColumnNamePattern = new StringConnectionProperty(
			"utf8OutsideBmpIncludedColumnNamePattern",
			null,
			Messages.getString("ConnectionProperties.utf8OutsideBmpIncludedColumnNamePattern"), //$NON-NLS-1$
			"5.1.3", MISC_CATEGORY, 129);
	
	private BooleanConnectionProperty useCompression = new BooleanConnectionProperty(
			"useCompression", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useCompression"), //$NON-NLS-1$
			"3.0.17", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useColumnNamesInFindColumn = new BooleanConnectionProperty(
			"useColumnNamesInFindColumn",
			false, 
			Messages.getString("ConnectionProperties.useColumnNamesInFindColumn"), //$NON-NLS-1$
			"5.1.7", MISC_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$
	
	private StringConnectionProperty useConfigs = new StringConnectionProperty(
			"useConfigs", //$NON-NLS-1$
			null,
			Messages.getString("ConnectionProperties.useConfigs"), //$NON-NLS-1$
			"3.1.5", CONNECTION_AND_AUTH_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useCursorFetch = new BooleanConnectionProperty(
			"useCursorFetch", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useCursorFetch"), //$NON-NLS-1$
			"5.0.0", PERFORMANCE_CATEGORY, Integer.MAX_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty useDynamicCharsetInfo = new BooleanConnectionProperty(
			"useDynamicCharsetInfo", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useDynamicCharsetInfo") //$NON-NLS-1$
			, "5.0.6", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty useDirectRowUnpack = new BooleanConnectionProperty(
			"useDirectRowUnpack",
			true, "Use newer result set row unpacking code that skips a copy from network buffers "
			+ " to a MySQL packet instance and instead reads directly into the result set row data buffers.",
			"5.1.1", PERFORMANCE_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty useFastIntParsing = new BooleanConnectionProperty(
			"useFastIntParsing", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useFastIntParsing"), //$NON-NLS-1$
			"3.1.4", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useFastDateParsing = new BooleanConnectionProperty(
			"useFastDateParsing", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useFastDateParsing"), //$NON-NLS-1$
			"5.0.5", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty useHostsInPrivileges = new BooleanConnectionProperty(
			"useHostsInPrivileges", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useHostsInPrivileges"), //$NON-NLS-1$
			"3.0.2", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	private BooleanConnectionProperty useInformationSchema = new BooleanConnectionProperty(
			"useInformationSchema", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useInformationSchema"), //$NON-NLS-1$
			"5.0.0", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	private BooleanConnectionProperty useJDBCCompliantTimezoneShift = new BooleanConnectionProperty(
			"useJDBCCompliantTimezoneShift", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useJDBCCompliantTimezoneShift"), //$NON-NLS-1$
			"5.0.0", //$NON-NLS-1$
			MISC_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty useLocalSessionState = new BooleanConnectionProperty(
			"useLocalSessionState", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useLocalSessionState"), //$NON-NLS-1$
			"3.1.7", PERFORMANCE_CATEGORY, 5); //$NON-NLS-1$
	
	private BooleanConnectionProperty useLocalTransactionState = new BooleanConnectionProperty(
			"useLocalTransactionState", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useLocalTransactionState"),
			"5.1.7", PERFORMANCE_CATEGORY, 6);
	
	private BooleanConnectionProperty useLegacyDatetimeCode = new BooleanConnectionProperty(
			"useLegacyDatetimeCode",
			true,
			Messages.getString("ConnectionProperties.useLegacyDatetimeCode"),
			"5.1.6", MISC_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty useNanosForElapsedTime = new BooleanConnectionProperty(
			"useNanosForElapsedTime", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useNanosForElapsedTime"), //$NON-NLS-1$
			"5.0.7", //$NON-NLS-1$
			DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty useOldAliasMetadataBehavior = new BooleanConnectionProperty(
			"useOldAliasMetadataBehavior", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useOldAliasMetadataBehavior"), //$NON-NLS-1$
		    "5.0.4", //$NON-NLS-1$
		    MISC_CATEGORY,
		    Integer.MIN_VALUE);
	
	private BooleanConnectionProperty useOldUTF8Behavior = new BooleanConnectionProperty(
			"useOldUTF8Behavior", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useOldUtf8Behavior"), //$NON-NLS-1$
			"3.1.6", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private boolean useOldUTF8BehaviorAsBoolean = false;

	private BooleanConnectionProperty useOnlyServerErrorMessages = new BooleanConnectionProperty(
			"useOnlyServerErrorMessages", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useOnlyServerErrorMessages"), //$NON-NLS-1$
			"3.0.15", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useReadAheadInput = new BooleanConnectionProperty(
			"useReadAheadInput", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useReadAheadInput"), //$NON-NLS-1$
			"3.1.5", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useSqlStateCodes = new BooleanConnectionProperty(
			"useSqlStateCodes", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useSqlStateCodes"), //$NON-NLS-1$
			"3.1.3", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useSSL = new BooleanConnectionProperty(
			"useSSL", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useSSL"), //$NON-NLS-1$
			"3.0.2", SECURITY_CATEGORY, 2); //$NON-NLS-1$

	private BooleanConnectionProperty useSSPSCompatibleTimezoneShift = new BooleanConnectionProperty(
			"useSSPSCompatibleTimezoneShift", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useSSPSCompatibleTimezoneShift"), //$NON-NLS-1$
			"5.0.5", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$
	
	private BooleanConnectionProperty useStreamLengthsInPrepStmts = new BooleanConnectionProperty(
			"useStreamLengthsInPrepStmts", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useStreamLengthsInPrepStmts"), //$NON-NLS-1$
			"3.0.2", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useTimezone = new BooleanConnectionProperty(
			"useTimezone", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useTimezone"), //$NON-NLS-1$
			"3.0.2", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useUltraDevWorkAround = new BooleanConnectionProperty(
			"ultraDevHack", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.ultraDevHack"), //$NON-NLS-1$
			"2.0.3", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useUnbufferedInput = new BooleanConnectionProperty(
			"useUnbufferedInput", true, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.useUnbufferedInput"), //$NON-NLS-1$
			"3.0.11", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private BooleanConnectionProperty useUnicode = new BooleanConnectionProperty(
			"useUnicode", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.useUnicode"), //$NON-NLS-1$
			"1.1g", MISC_CATEGORY, 0); //$NON-NLS-1$

	// Cache these values, they are 'hot'
	private boolean useUnicodeAsBoolean = true;

	private BooleanConnectionProperty useUsageAdvisor = new BooleanConnectionProperty(
			"useUsageAdvisor", //$NON-NLS-1$
			false,
			Messages.getString("ConnectionProperties.useUsageAdvisor"), //$NON-NLS-1$
			"3.1.1", DEBUGING_PROFILING_CATEGORY, 10); //$NON-NLS-1$

	private boolean useUsageAdvisorAsBoolean = false;

	private BooleanConnectionProperty yearIsDateType = new BooleanConnectionProperty(
			"yearIsDateType", //$NON-NLS-1$
			true,
			Messages.getString("ConnectionProperties.yearIsDateType"), //$NON-NLS-1$
			"3.1.9", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$

	private StringConnectionProperty zeroDateTimeBehavior = new StringConnectionProperty(
			"zeroDateTimeBehavior", //$NON-NLS-1$
			ZERO_DATETIME_BEHAVIOR_EXCEPTION,
			new String[] { ZERO_DATETIME_BEHAVIOR_EXCEPTION,
					ZERO_DATETIME_BEHAVIOR_ROUND,
					ZERO_DATETIME_BEHAVIOR_CONVERT_TO_NULL },
			Messages.getString("ConnectionProperties.zeroDateTimeBehavior", new Object[] {ZERO_DATETIME_BEHAVIOR_EXCEPTION, ZERO_DATETIME_BEHAVIOR_ROUND,ZERO_DATETIME_BEHAVIOR_CONVERT_TO_NULL}),  //$NON-NLS-1$
			"3.1.4", //$NON-NLS-1$ //$NON-NLS-2$
			MISC_CATEGORY, Integer.MIN_VALUE);

	private BooleanConnectionProperty useJvmCharsetConverters = new BooleanConnectionProperty("useJvmCharsetConverters", //$NON-NLS-1$
			false, Messages.getString("ConnectionProperties.useJvmCharsetConverters"), "5.0.1", PERFORMANCE_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$ //$NON-NLS-2$
	
	private BooleanConnectionProperty useGmtMillisForDatetimes = new BooleanConnectionProperty("useGmtMillisForDatetimes", false, Messages.getString("ConnectionProperties.useGmtMillisForDatetimes"), "3.1.12", MISC_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

	private BooleanConnectionProperty dumpMetadataOnColumnNotFound = new BooleanConnectionProperty("dumpMetadataOnColumnNotFound", false, Messages.getString("ConnectionProperties.dumpMetadataOnColumnNotFound"), "3.1.13", DEBUGING_PROFILING_CATEGORY, Integer.MIN_VALUE); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

	// SSL Options
	
	private StringConnectionProperty clientCertificateKeyStoreUrl = new StringConnectionProperty(
			"clientCertificateKeyStoreUrl", null, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.clientCertificateKeyStoreUrl"), "5.1.0", //$NON-NLS-1$ //$NON-NLS-2$
			SECURITY_CATEGORY, 5);
	
	private StringConnectionProperty trustCertificateKeyStoreUrl = new StringConnectionProperty(
			"trustCertificateKeyStoreUrl", null, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.trustCertificateKeyStoreUrl"), "5.1.0", //$NON-NLS-1$ //$NON-NLS-2$
			SECURITY_CATEGORY, 8);
	
	private StringConnectionProperty clientCertificateKeyStoreType = new StringConnectionProperty(
			"clientCertificateKeyStoreType", "JKS", //$NON-NLS-1$
			Messages.getString("ConnectionProperties.clientCertificateKeyStoreType"), "5.1.0", //$NON-NLS-1$ //$NON-NLS-2$
			SECURITY_CATEGORY, 6);
	
	private StringConnectionProperty clientCertificateKeyStorePassword = new StringConnectionProperty(
			"clientCertificateKeyStorePassword", null, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.clientCertificateKeyStorePassword"), "5.1.0", //$NON-NLS-1$ //$NON-NLS-2$
			SECURITY_CATEGORY, 7);
	
	private StringConnectionProperty trustCertificateKeyStoreType = new StringConnectionProperty(
			"trustCertificateKeyStoreType", "JKS", //$NON-NLS-1$
			Messages.getString("ConnectionProperties.trustCertificateKeyStoreType"), "5.1.0", //$NON-NLS-1$ //$NON-NLS-2$
			SECURITY_CATEGORY, 9);
	
	private StringConnectionProperty trustCertificateKeyStorePassword = new StringConnectionProperty(
			"trustCertificateKeyStorePassword", null, //$NON-NLS-1$
			Messages.getString("ConnectionProperties.trustCertificateKeyStorePassword"), "5.1.0", //$NON-NLS-1$ //$NON-NLS-2$
			SECURITY_CATEGORY, 10);

	private BooleanConnectionProperty verifyServerCertificate = new BooleanConnectionProperty(
			"verifyServerCertificate",
			true,
			Messages.getString("ConnectionProperties.verifyServerCertificate"),
			"5.1.6", SECURITY_CATEGORY, 4);
	
	private BooleanConnectionProperty useAffectedRows = new BooleanConnectionProperty("useAffectedRows",
			false,
			Messages.getString("ConnectionProperties.useAffectedRows"),
			"5.1.7", MISC_CATEGORY, Integer.MIN_VALUE);
	
	private StringConnectionProperty passwordCharacterEncoding = new StringConnectionProperty("passwordCharacterEncoding",
			null,
			Messages.getString("ConnectionProperties.passwordCharacterEncoding"),
			"5.1.7", SECURITY_CATEGORY, Integer.MIN_VALUE);
	
	private IntegerConnectionProperty maxAllowedPacket = new IntegerConnectionProperty("maxAllowedPacket",
			-1, Messages.getString("ConnectionProperties.maxAllowedPacket"), "5.1.8", NETWORK_CATEGORY,
			Integer.MIN_VALUE);

	private StringConnectionProperty authenticationPlugins = new StringConnectionProperty(
			"authenticationPlugins",
			null,
			Messages.getString("ConnectionProperties.authenticationPlugins"),
			"5.1.19", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE);
	
	private StringConnectionProperty disabledAuthenticationPlugins = new StringConnectionProperty(
			"disabledAuthenticationPlugins",
			null,
			Messages.getString("ConnectionProperties.disabledAuthenticationPlugins"),
			"5.1.19", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE);
	
	private StringConnectionProperty defaultAuthenticationPlugin = new StringConnectionProperty(
			"defaultAuthenticationPlugin",
			"com.mysql.jdbc.authentication.MysqlNativePasswordPlugin",
			Messages.getString("ConnectionProperties.defaultAuthenticationPlugin"),
			"5.1.19", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE);
	
	private BooleanConnectionProperty disconnectOnExpiredPasswords = new BooleanConnectionProperty("disconnectOnExpiredPasswords",
			true,
			Messages.getString("ConnectionProperties.disconnectOnExpiredPasswords"),
			"5.1.23", CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE);

	private BooleanConnectionProperty getProceduresReturnsFunctions = new BooleanConnectionProperty(
			"getProceduresReturnsFunctions", true,
			Messages.getString("ConnectionProperties.getProceduresReturnsFunctions"),
			"5.1.26", MISC_CATEGORY, Integer.MIN_VALUE);


	protected DriverPropertyInfo[] exposeAsDriverPropertyInfoInternal(
			Properties info, int slotsToReserve) throws SQLException {
		initializeProperties(info);

		int numProperties = PROPERTY_LIST.size();

		int listSize = numProperties + slotsToReserve;

		DriverPropertyInfo[] driverProperties = new DriverPropertyInfo[listSize];

		for (int i = slotsToReserve; i < listSize; i++) {
			java.lang.reflect.Field propertyField = PROPERTY_LIST
					.get(i - slotsToReserve);

			try {
				ConnectionProperty propToExpose = (ConnectionProperty) propertyField
						.get(this);

				if (info != null) {
					propToExpose.initializeFrom(info, getExceptionInterceptor());
				}

				
				driverProperties[i] = propToExpose.getAsDriverPropertyInfo();
			} catch (IllegalAccessException iae) {
				throw SQLError.createSQLException(Messages.getString("ConnectionProperties.InternalPropertiesFailure"), //$NON-NLS-1$
						SQLError.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor());
			}
		}

		return driverProperties;
	}

	protected Properties exposeAsProperties(Properties info)
			throws SQLException {
		if (info == null) {
			info = new Properties();
		}

		int numPropertiesToSet = PROPERTY_LIST.size();

		for (int i = 0; i < numPropertiesToSet; i++) {
			java.lang.reflect.Field propertyField = PROPERTY_LIST
					.get(i);

			try {
				ConnectionProperty propToGet = (ConnectionProperty) propertyField
						.get(this);

				Object propValue = propToGet.getValueAsObject();

				if (propValue != null) {
					info.setProperty(propToGet.getPropertyName(), propValue
							.toString());
				}
			} catch (IllegalAccessException iae) {
				throw SQLError.createSQLException("Internal properties failure", //$NON-NLS-1$
						SQLError.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor());
			}
		}

		return info;
	}

	class XmlMap {
		protected Map<Integer, Map<String, ConnectionProperty>> ordered = new TreeMap<Integer, Map<String, ConnectionProperty>>();
		protected Map<String, ConnectionProperty> alpha = new TreeMap<String, ConnectionProperty>();
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#exposeAsXml()
	 */
	public String exposeAsXml() throws SQLException {
		StringBuffer xmlBuf = new StringBuffer();
		xmlBuf.append("<ConnectionProperties>"); //$NON-NLS-1$

		int numPropertiesToSet = PROPERTY_LIST.size();

		int numCategories = PROPERTY_CATEGORIES.length;

		Map<String, XmlMap> propertyListByCategory = new HashMap<String, XmlMap>();

		for (int i = 0; i < numCategories; i++) {
			propertyListByCategory.put(PROPERTY_CATEGORIES[i], new XmlMap());
		}

		//
		// The following properties are not exposed as 'normal' properties, but
		// they are
		// settable nonetheless, so we need to have them documented, make sure
		// that they sort 'first' as #1 and #2 in the category
		//
		StringConnectionProperty userProp = new StringConnectionProperty(
				NonRegisteringDriver.USER_PROPERTY_KEY, null,
				Messages.getString("ConnectionProperties.Username"), Messages.getString("ConnectionProperties.allVersions"), CONNECTION_AND_AUTH_CATEGORY, //$NON-NLS-1$ //$NON-NLS-2$
				Integer.MIN_VALUE + 1);
		StringConnectionProperty passwordProp = new StringConnectionProperty(
				NonRegisteringDriver.PASSWORD_PROPERTY_KEY, null,
				Messages.getString("ConnectionProperties.Password"), Messages.getString("ConnectionProperties.allVersions"), //$NON-NLS-1$ //$NON-NLS-2$
				CONNECTION_AND_AUTH_CATEGORY, Integer.MIN_VALUE + 2);

		XmlMap connectionSortMaps = propertyListByCategory.get(CONNECTION_AND_AUTH_CATEGORY);
		TreeMap<String, ConnectionProperty> userMap = new TreeMap<String, ConnectionProperty>();
		userMap.put(userProp.getPropertyName(), userProp);
		
		connectionSortMaps.ordered.put(Integer.valueOf(userProp.getOrder()), userMap);
		
		TreeMap<String, ConnectionProperty> passwordMap = new TreeMap<String, ConnectionProperty>();
		passwordMap.put(passwordProp.getPropertyName(), passwordProp);
		
		connectionSortMaps.ordered.put(new Integer(passwordProp.getOrder()), passwordMap);

		try {
			for (int i = 0; i < numPropertiesToSet; i++) {
				java.lang.reflect.Field propertyField = PROPERTY_LIST
						.get(i);
				ConnectionProperty propToGet = (ConnectionProperty) propertyField
						.get(this);
				XmlMap sortMaps = propertyListByCategory.get(propToGet
						.getCategoryName());
				int orderInCategory = propToGet.getOrder();

				if (orderInCategory == Integer.MIN_VALUE) {
					sortMaps.alpha.put(propToGet.getPropertyName(), propToGet);
				} else {
					Integer order = Integer.valueOf(orderInCategory);
					Map<String, ConnectionProperty> orderMap = sortMaps.ordered.get(order);
					
					if (orderMap == null) {
						orderMap = new TreeMap<String, ConnectionProperty>();
						sortMaps.ordered.put(order, orderMap);
					}
					
					orderMap.put(propToGet.getPropertyName(), propToGet);
				}
			}

			for (int j = 0; j < numCategories; j++) {
				XmlMap sortMaps = propertyListByCategory.get(PROPERTY_CATEGORIES[j]);

				xmlBuf.append("\n <PropertyCategory name=\""); //$NON-NLS-1$
				xmlBuf.append(PROPERTY_CATEGORIES[j]);
				xmlBuf.append("\">"); //$NON-NLS-1$

				for (Map<String, ConnectionProperty> orderedEl : sortMaps.ordered.values()) {
					for (ConnectionProperty propToGet : orderedEl.values()) {
						xmlBuf.append("\n  <Property name=\""); //$NON-NLS-1$
						xmlBuf.append(propToGet.getPropertyName());
						xmlBuf.append("\" required=\""); //$NON-NLS-1$
						xmlBuf.append(propToGet.required ? "Yes" : "No"); //$NON-NLS-1$ //$NON-NLS-2$
	
						xmlBuf.append("\" default=\""); //$NON-NLS-1$
	
						if (propToGet.getDefaultValue() != null) {
							xmlBuf.append(propToGet.getDefaultValue());
						}
	
						xmlBuf.append("\" sortOrder=\""); //$NON-NLS-1$
						xmlBuf.append(propToGet.getOrder());
						xmlBuf.append("\" since=\""); //$NON-NLS-1$
						xmlBuf.append(propToGet.sinceVersion);
						xmlBuf.append("\">\n"); //$NON-NLS-1$
						xmlBuf.append("    "); //$NON-NLS-1$
						String escapedDescription = propToGet.description;
						escapedDescription = escapedDescription.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
						
						xmlBuf.append(escapedDescription);
						xmlBuf.append("\n  </Property>"); //$NON-NLS-1$
					}
				}

				for (ConnectionProperty propToGet : sortMaps.alpha.values()) {
					xmlBuf.append("\n  <Property name=\""); //$NON-NLS-1$
					xmlBuf.append(propToGet.getPropertyName());
					xmlBuf.append("\" required=\""); //$NON-NLS-1$
					xmlBuf.append(propToGet.required ? "Yes" : "No"); //$NON-NLS-1$ //$NON-NLS-2$

					xmlBuf.append("\" default=\""); //$NON-NLS-1$

					if (propToGet.getDefaultValue() != null) {
						xmlBuf.append(propToGet.getDefaultValue());
					}

					xmlBuf.append("\" sortOrder=\"alpha\" since=\""); //$NON-NLS-1$
					xmlBuf.append(propToGet.sinceVersion);
					xmlBuf.append("\">\n"); //$NON-NLS-1$
					xmlBuf.append("    "); //$NON-NLS-1$
					xmlBuf.append(propToGet.description);
					xmlBuf.append("\n  </Property>"); //$NON-NLS-1$
				}

				xmlBuf.append("\n </PropertyCategory>"); //$NON-NLS-1$
			}
		} catch (IllegalAccessException iae) {
			throw SQLError.createSQLException("Internal properties failure", //$NON-NLS-1$
					SQLError.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor());
		}

		xmlBuf.append("\n</ConnectionProperties>"); //$NON-NLS-1$

		return xmlBuf.toString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAllowLoadLocalInfile()
	 */
	public boolean getAllowLoadLocalInfile() {
		return this.allowLoadLocalInfile.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAllowMultiQueries()
	 */
	public boolean getAllowMultiQueries() {
		return this.allowMultiQueries.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAllowNanAndInf()
	 */
	public boolean getAllowNanAndInf() {
		return allowNanAndInf.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAllowUrlInLocalInfile()
	 */
	public boolean getAllowUrlInLocalInfile() {
		return this.allowUrlInLocalInfile.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAlwaysSendSetIsolation()
	 */
	public boolean getAlwaysSendSetIsolation() {
		return this.alwaysSendSetIsolation.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAutoDeserialize()
	 */
	public boolean getAutoDeserialize() {
		return autoDeserialize.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAutoGenerateTestcaseScript()
	 */
	public boolean getAutoGenerateTestcaseScript() {
		return this.autoGenerateTestcaseScriptAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAutoReconnectForPools()
	 */
	public boolean getAutoReconnectForPools() {
		return this.autoReconnectForPoolsAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getBlobSendChunkSize()
	 */
	public int getBlobSendChunkSize() {
		return blobSendChunkSize.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCacheCallableStatements()
	 */
	public boolean getCacheCallableStatements() {
		return this.cacheCallableStatements.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCachePreparedStatements()
	 */
	public boolean getCachePreparedStatements() {
		return ((Boolean) this.cachePreparedStatements.getValueAsObject())
				.booleanValue();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCacheResultSetMetadata()
	 */
	public boolean getCacheResultSetMetadata() {
		return this.cacheResultSetMetaDataAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCacheServerConfiguration()
	 */
	public boolean getCacheServerConfiguration() {
		return cacheServerConfiguration.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCallableStatementCacheSize()
	 */
	public int getCallableStatementCacheSize() {
		return this.callableStatementCacheSize.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCapitalizeTypeNames()
	 */
	public boolean getCapitalizeTypeNames() {
		return this.capitalizeTypeNames.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCharacterSetResults()
	 */
	public String getCharacterSetResults() {
		return this.characterSetResults.getValueAsString();
	}
	
	public String getConnectionAttributes() {
		return this.connectionAttributes.getValueAsString();
	}
	
	public void setConnectionAttributes(String val) {
		this.connectionAttributes.setValue(val);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getClobberStreamingResults()
	 */
	public boolean getClobberStreamingResults() {
		return this.clobberStreamingResults.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getClobCharacterEncoding()
	 */
	public String getClobCharacterEncoding() {
		return this.clobCharacterEncoding.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getConnectionCollation()
	 */
	public String getConnectionCollation() {
		return this.connectionCollation.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getConnectTimeout()
	 */
	public int getConnectTimeout() {
		return this.connectTimeout.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getContinueBatchOnError()
	 */
	public boolean getContinueBatchOnError() {
		return this.continueBatchOnError.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCreateDatabaseIfNotExist()
	 */
	public boolean getCreateDatabaseIfNotExist() {
		return this.createDatabaseIfNotExist.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getDefaultFetchSize()
	 */
	public int getDefaultFetchSize() {
		return this.defaultFetchSize.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getDontTrackOpenResources()
	 */
	public boolean getDontTrackOpenResources() {
		return this.dontTrackOpenResources.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getDumpQueriesOnException()
	 */
	public boolean getDumpQueriesOnException() {
		return this.dumpQueriesOnException.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getDynamicCalendars()
	 */
	public boolean getDynamicCalendars() {
		return this.dynamicCalendars.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getElideSetAutoCommits()
	 */
	public boolean getElideSetAutoCommits() {
		return this.elideSetAutoCommits.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getEmptyStringsConvertToZero()
	 */
	public boolean getEmptyStringsConvertToZero() {
		return this.emptyStringsConvertToZero.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getEmulateLocators()
	 */
	public boolean getEmulateLocators() {
		return this.emulateLocators.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getEmulateUnsupportedPstmts()
	 */
	public boolean getEmulateUnsupportedPstmts() {
		return this.emulateUnsupportedPstmts.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getEnablePacketDebug()
	 */
	public boolean getEnablePacketDebug() {
		return this.enablePacketDebug.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getEncoding()
	 */
	public String getEncoding() {
		return this.characterEncodingAsString;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getExplainSlowQueries()
	 */
	public boolean getExplainSlowQueries() {
		return this.explainSlowQueries.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getFailOverReadOnly()
	 */
	public boolean getFailOverReadOnly() {
		return this.failOverReadOnly.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getGatherPerformanceMetrics()
	 */
	public boolean getGatherPerformanceMetrics() {
		return this.gatherPerformanceMetrics.getValueAsBoolean();
	}

	/**
	 * DOCUMENT ME!
	 * 
	 * @return
	 */
	protected boolean getHighAvailability() {
		return this.highAvailabilityAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getHoldResultsOpenOverStatementClose()
	 */
	public boolean getHoldResultsOpenOverStatementClose() {
		return holdResultsOpenOverStatementClose.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getIgnoreNonTxTables()
	 */
	public boolean getIgnoreNonTxTables() {
		return this.ignoreNonTxTables.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getInitialTimeout()
	 */
	public int getInitialTimeout() {
		return this.initialTimeout.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getInteractiveClient()
	 */
	public boolean getInteractiveClient() {
		return this.isInteractiveClient.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getIsInteractiveClient()
	 */
	public boolean getIsInteractiveClient() {
		return this.isInteractiveClient.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getJdbcCompliantTruncation()
	 */
	public boolean getJdbcCompliantTruncation() {
		return this.jdbcCompliantTruncation.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getLocatorFetchBufferSize()
	 */
	public int getLocatorFetchBufferSize() {
		return this.locatorFetchBufferSize.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getLogger()
	 */
	public String getLogger() {
		return this.loggerClassName.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getLoggerClassName()
	 */
	public String getLoggerClassName() {
		return this.loggerClassName.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getLogSlowQueries()
	 */
	public boolean getLogSlowQueries() {
		return this.logSlowQueries.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getMaintainTimeStats()
	 */
	public boolean getMaintainTimeStats() {
		return maintainTimeStatsAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getMaxQuerySizeToLog()
	 */
	public int getMaxQuerySizeToLog() {
		return this.maxQuerySizeToLog.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getMaxReconnects()
	 */
	public int getMaxReconnects() {
		return this.maxReconnects.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getMaxRows()
	 */
	public int getMaxRows() {
		return this.maxRowsAsInt;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getMetadataCacheSize()
	 */
	public int getMetadataCacheSize() {
		return this.metadataCacheSize.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getNoDatetimeStringSync()
	 */
	public boolean getNoDatetimeStringSync() {
		return this.noDatetimeStringSync.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getNullCatalogMeansCurrent()
	 */
	public boolean getNullCatalogMeansCurrent() {
		return this.nullCatalogMeansCurrent.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getNullNamePatternMatchesAll()
	 */
	public boolean getNullNamePatternMatchesAll() {
		return this.nullNamePatternMatchesAll.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPacketDebugBufferSize()
	 */
	public int getPacketDebugBufferSize() {
		return this.packetDebugBufferSize.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getParanoid()
	 */
	public boolean getParanoid() {
		return this.paranoid.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPedantic()
	 */
	public boolean getPedantic() {
		return this.pedantic.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPreparedStatementCacheSize()
	 */
	public int getPreparedStatementCacheSize() {
		return ((Integer) this.preparedStatementCacheSize.getValueAsObject())
				.intValue();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPreparedStatementCacheSqlLimit()
	 */
	public int getPreparedStatementCacheSqlLimit() {
		return ((Integer) this.preparedStatementCacheSqlLimit
				.getValueAsObject()).intValue();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getProfileSql()
	 */
	public boolean getProfileSql() {
		return this.profileSQLAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getProfileSQL()
	 */
	public boolean getProfileSQL() {
		return this.profileSQL.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPropertiesTransform()
	 */
	public String getPropertiesTransform() {
		return this.propertiesTransform.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getQueriesBeforeRetryMaster()
	 */
	public int getQueriesBeforeRetryMaster() {
		return this.queriesBeforeRetryMaster.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getReconnectAtTxEnd()
	 */
	public boolean getReconnectAtTxEnd() {
		return this.reconnectTxAtEndAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getRelaxAutoCommit()
	 */
	public boolean getRelaxAutoCommit() {
		return this.relaxAutoCommit.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getReportMetricsIntervalMillis()
	 */
	public int getReportMetricsIntervalMillis() {
		return this.reportMetricsIntervalMillis.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getRequireSSL()
	 */
	public boolean getRequireSSL() {
		return this.requireSSL.getValueAsBoolean();
	}

	public boolean getRetainStatementAfterResultSetClose() {
		return this.retainStatementAfterResultSetClose.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getRollbackOnPooledClose()
	 */
	public boolean getRollbackOnPooledClose() {
		return this.rollbackOnPooledClose.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getRoundRobinLoadBalance()
	 */
	public boolean getRoundRobinLoadBalance() {
		return this.roundRobinLoadBalance.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getRunningCTS13()
	 */
	public boolean getRunningCTS13() {
		return this.runningCTS13.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getSecondsBeforeRetryMaster()
	 */
	public int getSecondsBeforeRetryMaster() {
		return this.secondsBeforeRetryMaster.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getServerTimezone()
	 */
	public String getServerTimezone() {
		return this.serverTimezone.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getSessionVariables()
	 */
	public String getSessionVariables() {
		return sessionVariables.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getSlowQueryThresholdMillis()
	 */
	public int getSlowQueryThresholdMillis() {
		return this.slowQueryThresholdMillis.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getSocketFactoryClassName()
	 */
	public String getSocketFactoryClassName() {
		return this.socketFactoryClassName.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getSocketTimeout()
	 */
	public int getSocketTimeout() {
		return this.socketTimeout.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getStrictFloatingPoint()
	 */
	public boolean getStrictFloatingPoint() {
		return this.strictFloatingPoint.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getStrictUpdates()
	 */
	public boolean getStrictUpdates() {
		return this.strictUpdates.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getTinyInt1isBit()
	 */
	public boolean getTinyInt1isBit() {
		return this.tinyInt1isBit.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getTraceProtocol()
	 */
	public boolean getTraceProtocol() {
		return this.traceProtocol.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getTransformedBitIsBoolean()
	 */
	public boolean getTransformedBitIsBoolean() {
		return this.transformedBitIsBoolean.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseCompression()
	 */
	public boolean getUseCompression() {
		return this.useCompression.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseFastIntParsing()
	 */
	public boolean getUseFastIntParsing() {
		return this.useFastIntParsing.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseHostsInPrivileges()
	 */
	public boolean getUseHostsInPrivileges() {
		return this.useHostsInPrivileges.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseInformationSchema()
	 */
	public boolean getUseInformationSchema() {
		return this.useInformationSchema.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseLocalSessionState()
	 */
	public boolean getUseLocalSessionState() {
		return this.useLocalSessionState.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseOldUTF8Behavior()
	 */
	public boolean getUseOldUTF8Behavior() {
		return this.useOldUTF8BehaviorAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseOnlyServerErrorMessages()
	 */
	public boolean getUseOnlyServerErrorMessages() {
		return this.useOnlyServerErrorMessages.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseReadAheadInput()
	 */
	public boolean getUseReadAheadInput() {
		return this.useReadAheadInput.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseServerPreparedStmts()
	 */
	public boolean getUseServerPreparedStmts() {
		return this.detectServerPreparedStmts.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseSqlStateCodes()
	 */
	public boolean getUseSqlStateCodes() {
		return this.useSqlStateCodes.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseSSL()
	 */
	public boolean getUseSSL() {
		return this.useSSL.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseStreamLengthsInPrepStmts()
	 */
	public boolean getUseStreamLengthsInPrepStmts() {
		return this.useStreamLengthsInPrepStmts.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseTimezone()
	 */
	public boolean getUseTimezone() {
		return this.useTimezone.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseUltraDevWorkAround()
	 */
	public boolean getUseUltraDevWorkAround() {
		return this.useUltraDevWorkAround.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseUnbufferedInput()
	 */
	public boolean getUseUnbufferedInput() {
		return this.useUnbufferedInput.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseUnicode()
	 */
	public boolean getUseUnicode() {
		return this.useUnicodeAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseUsageAdvisor()
	 */
	public boolean getUseUsageAdvisor() {
		return this.useUsageAdvisorAsBoolean;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getYearIsDateType()
	 */
	public boolean getYearIsDateType() {
		return this.yearIsDateType.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getZeroDateTimeBehavior()
	 */
	public String getZeroDateTimeBehavior() {
		return this.zeroDateTimeBehavior.getValueAsString();
	}

	/**
	 * Initializes driver properties that come from a JNDI reference (in the
	 * case of a javax.sql.DataSource bound into some name service that doesn't
	 * handle Java objects directly).
	 * 
	 * @param ref
	 *            The JNDI Reference that holds RefAddrs for all properties
	 * @throws SQLException
	 *             DOCUMENT ME!
	 */
	protected void initializeFromRef(Reference ref) throws SQLException {
		int numPropertiesToSet = PROPERTY_LIST.size();

		for (int i = 0; i < numPropertiesToSet; i++) {
			java.lang.reflect.Field propertyField = PROPERTY_LIST
					.get(i);

			try {
				ConnectionProperty propToSet = (ConnectionProperty) propertyField
						.get(this);

				if (ref != null) {
					propToSet.initializeFrom(ref, getExceptionInterceptor());
				}
			} catch (IllegalAccessException iae) {
				throw SQLError.createSQLException("Internal properties failure", //$NON-NLS-1$
						SQLError.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor());
			}
		}

		postInitialization();
	}

	/**
	 * Initializes driver properties that come from URL or properties passed to
	 * the driver manager.
	 * 
	 * @param info
	 *            DOCUMENT ME!
	 * @throws SQLException
	 *             DOCUMENT ME!
	 */
	protected void initializeProperties(Properties info) throws SQLException {
		if (info != null) {
			// For backwards-compatibility
			String profileSqlLc = info.getProperty("profileSql"); //$NON-NLS-1$

			if (profileSqlLc != null) {
				info.put("profileSQL", profileSqlLc); //$NON-NLS-1$
			}

			Properties infoCopy = (Properties) info.clone();

			infoCopy.remove(NonRegisteringDriver.HOST_PROPERTY_KEY);
			infoCopy.remove(NonRegisteringDriver.USER_PROPERTY_KEY);
			infoCopy.remove(NonRegisteringDriver.PASSWORD_PROPERTY_KEY);
			infoCopy.remove(NonRegisteringDriver.DBNAME_PROPERTY_KEY);
			infoCopy.remove(NonRegisteringDriver.PORT_PROPERTY_KEY);
			infoCopy.remove("profileSql"); //$NON-NLS-1$

			int numPropertiesToSet = PROPERTY_LIST.size();

			for (int i = 0; i < numPropertiesToSet; i++) {
				java.lang.reflect.Field propertyField = PROPERTY_LIST
						.get(i);

				try {
					ConnectionProperty propToSet = (ConnectionProperty) propertyField
							.get(this);

					propToSet.initializeFrom(infoCopy, getExceptionInterceptor());
				} catch (IllegalAccessException iae) {
					throw SQLError.createSQLException(
							Messages.getString("ConnectionProperties.unableToInitDriverProperties") //$NON-NLS-1$
									+ iae.toString(),
							SQLError.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor());
				}
			}

			postInitialization();
		}
	}

	protected void postInitialization() throws SQLException {
	
		// Support 'old' profileSql capitalization
		if (this.profileSql.getValueAsObject() != null) {
			this.profileSQL.initializeFrom(this.profileSql.getValueAsObject()
					.toString(), getExceptionInterceptor());
		}

		this.reconnectTxAtEndAsBoolean = ((Boolean) this.reconnectAtTxEnd
				.getValueAsObject()).booleanValue();

		// Adjust max rows
		if (this.getMaxRows() == 0) {
			// adjust so that it will become MysqlDefs.MAX_ROWS
			// in execSQL()
			this.maxRows.setValueAsObject(Integer.valueOf(-1));
		}

		//
		// Check character encoding
		//
		String testEncoding = this.getEncoding();

		if (testEncoding != null) {
			// Attempt to use the encoding, and bail out if it
			// can't be used
			try {
				String testString = "abc"; //$NON-NLS-1$
				StringUtils.getBytes(testString, testEncoding);
			} catch (UnsupportedEncodingException UE) {
				throw SQLError.createSQLException(Messages.getString(
						"ConnectionProperties.unsupportedCharacterEncoding", 
						new Object[] {testEncoding}), "0S100", getExceptionInterceptor()); //$NON-NLS-1$ //$NON-NLS-2$
			}
		}

		// Metadata caching is only supported on JDK-1.4 and newer
		// because it relies on LinkedHashMap being present.
		// Check (and disable) if not supported
		if (((Boolean) this.cacheResultSetMetadata.getValueAsObject())
				.booleanValue()) {
			try {
				Class.forName("java.util.LinkedHashMap"); //$NON-NLS-1$
			} catch (ClassNotFoundException cnfe) {
				this.cacheResultSetMetadata.setValue(false);
			}
		}

		this.cacheResultSetMetaDataAsBoolean = this.cacheResultSetMetadata
				.getValueAsBoolean();
		this.useUnicodeAsBoolean = this.useUnicode.getValueAsBoolean();
		this.characterEncodingAsString = ((String) this.characterEncoding
				.getValueAsObject());
		this.characterEncodingIsAliasForSjis = CharsetMapping.isAliasForSjis(this.characterEncodingAsString);
		this.highAvailabilityAsBoolean = this.autoReconnect.getValueAsBoolean();
		this.autoReconnectForPoolsAsBoolean = this.autoReconnectForPools
				.getValueAsBoolean();
		this.maxRowsAsInt = ((Integer) this.maxRows.getValueAsObject())
				.intValue();
		this.profileSQLAsBoolean = this.profileSQL.getValueAsBoolean();
		this.useUsageAdvisorAsBoolean = this.useUsageAdvisor
				.getValueAsBoolean();
		this.useOldUTF8BehaviorAsBoolean = this.useOldUTF8Behavior
				.getValueAsBoolean();
		this.autoGenerateTestcaseScriptAsBoolean = this.autoGenerateTestcaseScript
				.getValueAsBoolean();
		this.maintainTimeStatsAsBoolean = this.maintainTimeStats
				.getValueAsBoolean();
		this.jdbcCompliantTruncationForReads = getJdbcCompliantTruncation();
		
		if (getUseCursorFetch()) {
			// assume they want to use server-side prepared statements
			// because they're required for this functionality
			setDetectServerPreparedStmts(true);
		}
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAllowLoadLocalInfile(boolean)
	 */
	public void setAllowLoadLocalInfile(boolean property) {
		this.allowLoadLocalInfile.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAllowMultiQueries(boolean)
	 */
	public void setAllowMultiQueries(boolean property) {
		this.allowMultiQueries.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAllowNanAndInf(boolean)
	 */
	public void setAllowNanAndInf(boolean flag) {
		this.allowNanAndInf.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAllowUrlInLocalInfile(boolean)
	 */
	public void setAllowUrlInLocalInfile(boolean flag) {
		this.allowUrlInLocalInfile.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAlwaysSendSetIsolation(boolean)
	 */
	public void setAlwaysSendSetIsolation(boolean flag) {
		this.alwaysSendSetIsolation.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAutoDeserialize(boolean)
	 */
	public void setAutoDeserialize(boolean flag) {
		this.autoDeserialize.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAutoGenerateTestcaseScript(boolean)
	 */
	public void setAutoGenerateTestcaseScript(boolean flag) {
		this.autoGenerateTestcaseScript.setValue(flag);
		this.autoGenerateTestcaseScriptAsBoolean = this.autoGenerateTestcaseScript
				.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAutoReconnect(boolean)
	 */
	public void setAutoReconnect(boolean flag) {
		this.autoReconnect.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAutoReconnectForConnectionPools(boolean)
	 */
	public void setAutoReconnectForConnectionPools(boolean property) {
		this.autoReconnectForPools.setValue(property);
		this.autoReconnectForPoolsAsBoolean = this.autoReconnectForPools
				.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAutoReconnectForPools(boolean)
	 */
	public void setAutoReconnectForPools(boolean flag) {
		this.autoReconnectForPools.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setBlobSendChunkSize(java.lang.String)
	 */
	public void setBlobSendChunkSize(String value) throws SQLException {
		this.blobSendChunkSize.setValue(value, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCacheCallableStatements(boolean)
	 */
	public void setCacheCallableStatements(boolean flag) {
		this.cacheCallableStatements.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCachePreparedStatements(boolean)
	 */
	public void setCachePreparedStatements(boolean flag) {
		this.cachePreparedStatements.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCacheResultSetMetadata(boolean)
	 */
	public void setCacheResultSetMetadata(boolean property) {
		this.cacheResultSetMetadata.setValue(property);
		this.cacheResultSetMetaDataAsBoolean = this.cacheResultSetMetadata
				.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCacheServerConfiguration(boolean)
	 */
	public void setCacheServerConfiguration(boolean flag) {
		this.cacheServerConfiguration.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCallableStatementCacheSize(int)
	 */
	public void setCallableStatementCacheSize(int size) throws SQLException {
		this.callableStatementCacheSize.setValue(size, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCapitalizeDBMDTypes(boolean)
	 */
	public void setCapitalizeDBMDTypes(boolean property) {
		this.capitalizeTypeNames.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCapitalizeTypeNames(boolean)
	 */
	public void setCapitalizeTypeNames(boolean flag) {
		this.capitalizeTypeNames.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCharacterEncoding(java.lang.String)
	 */
	public void setCharacterEncoding(String encoding) {
		this.characterEncoding.setValue(encoding);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCharacterSetResults(java.lang.String)
	 */
	public void setCharacterSetResults(String characterSet) {
		this.characterSetResults.setValue(characterSet);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setClobberStreamingResults(boolean)
	 */
	public void setClobberStreamingResults(boolean flag) {
		this.clobberStreamingResults.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setClobCharacterEncoding(java.lang.String)
	 */
	public void setClobCharacterEncoding(String encoding) {
		this.clobCharacterEncoding.setValue(encoding);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setConnectionCollation(java.lang.String)
	 */
	public void setConnectionCollation(String collation) {
		this.connectionCollation.setValue(collation);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setConnectTimeout(int)
	 */
	public void setConnectTimeout(int timeoutMs) throws SQLException {
		this.connectTimeout.setValue(timeoutMs, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setContinueBatchOnError(boolean)
	 */
	public void setContinueBatchOnError(boolean property) {
		this.continueBatchOnError.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCreateDatabaseIfNotExist(boolean)
	 */
	public void setCreateDatabaseIfNotExist(boolean flag) {
		this.createDatabaseIfNotExist.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setDefaultFetchSize(int)
	 */
	public void setDefaultFetchSize(int n) throws SQLException {
		this.defaultFetchSize.setValue(n, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setDetectServerPreparedStmts(boolean)
	 */
	public void setDetectServerPreparedStmts(boolean property) {
		this.detectServerPreparedStmts.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setDontTrackOpenResources(boolean)
	 */
	public void setDontTrackOpenResources(boolean flag) {
		this.dontTrackOpenResources.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setDumpQueriesOnException(boolean)
	 */
	public void setDumpQueriesOnException(boolean flag) {
		this.dumpQueriesOnException.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setDynamicCalendars(boolean)
	 */
	public void setDynamicCalendars(boolean flag) {
		this.dynamicCalendars.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setElideSetAutoCommits(boolean)
	 */
	public void setElideSetAutoCommits(boolean flag) {
		this.elideSetAutoCommits.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setEmptyStringsConvertToZero(boolean)
	 */
	public void setEmptyStringsConvertToZero(boolean flag) {
		this.emptyStringsConvertToZero.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setEmulateLocators(boolean)
	 */
	public void setEmulateLocators(boolean property) {
		this.emulateLocators.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setEmulateUnsupportedPstmts(boolean)
	 */
	public void setEmulateUnsupportedPstmts(boolean flag) {
		this.emulateUnsupportedPstmts.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setEnablePacketDebug(boolean)
	 */
	public void setEnablePacketDebug(boolean flag) {
		this.enablePacketDebug.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setEncoding(java.lang.String)
	 */
	public void setEncoding(String property) {
		this.characterEncoding.setValue(property);
		this.characterEncodingAsString = this.characterEncoding
				.getValueAsString();
		this.characterEncodingIsAliasForSjis = CharsetMapping.isAliasForSjis(this.characterEncodingAsString);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setExplainSlowQueries(boolean)
	 */
	public void setExplainSlowQueries(boolean flag) {
		this.explainSlowQueries.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setFailOverReadOnly(boolean)
	 */
	public void setFailOverReadOnly(boolean flag) {
		this.failOverReadOnly.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setGatherPerformanceMetrics(boolean)
	 */
	public void setGatherPerformanceMetrics(boolean flag) {
		this.gatherPerformanceMetrics.setValue(flag);
	}

	/**
	 * DOCUMENT ME!
	 * 
	 * @param property
	 */
	protected void setHighAvailability(boolean property) {
		this.autoReconnect.setValue(property);
		this.highAvailabilityAsBoolean = this.autoReconnect.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setHoldResultsOpenOverStatementClose(boolean)
	 */
	public void setHoldResultsOpenOverStatementClose(boolean flag) {
		this.holdResultsOpenOverStatementClose.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setIgnoreNonTxTables(boolean)
	 */
	public void setIgnoreNonTxTables(boolean property) {
		this.ignoreNonTxTables.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setInitialTimeout(int)
	 */
	public void setInitialTimeout(int property) throws SQLException {
		this.initialTimeout.setValue(property, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setIsInteractiveClient(boolean)
	 */
	public void setIsInteractiveClient(boolean property) {
		this.isInteractiveClient.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setJdbcCompliantTruncation(boolean)
	 */
	public void setJdbcCompliantTruncation(boolean flag) {
		this.jdbcCompliantTruncation.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setLocatorFetchBufferSize(java.lang.String)
	 */
	public void setLocatorFetchBufferSize(String value) throws SQLException {
		this.locatorFetchBufferSize.setValue(value, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setLogger(java.lang.String)
	 */
	public void setLogger(String property) {
		this.loggerClassName.setValueAsObject(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setLoggerClassName(java.lang.String)
	 */
	public void setLoggerClassName(String className) {
		this.loggerClassName.setValue(className);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setLogSlowQueries(boolean)
	 */
	public void setLogSlowQueries(boolean flag) {
		this.logSlowQueries.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setMaintainTimeStats(boolean)
	 */
	public void setMaintainTimeStats(boolean flag) {
		this.maintainTimeStats.setValue(flag);
		this.maintainTimeStatsAsBoolean = this.maintainTimeStats
				.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setMaxQuerySizeToLog(int)
	 */
	public void setMaxQuerySizeToLog(int sizeInBytes) throws SQLException {
		this.maxQuerySizeToLog.setValue(sizeInBytes, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setMaxReconnects(int)
	 */
	public void setMaxReconnects(int property) throws SQLException {
		this.maxReconnects.setValue(property, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setMaxRows(int)
	 */
	public void setMaxRows(int property) throws SQLException {
		this.maxRows.setValue(property, getExceptionInterceptor());
		this.maxRowsAsInt = this.maxRows.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setMetadataCacheSize(int)
	 */
	public void setMetadataCacheSize(int value) throws SQLException {
		this.metadataCacheSize.setValue(value, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setNoDatetimeStringSync(boolean)
	 */
	public void setNoDatetimeStringSync(boolean flag) {
		this.noDatetimeStringSync.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setNullCatalogMeansCurrent(boolean)
	 */
	public void setNullCatalogMeansCurrent(boolean value) {
		this.nullCatalogMeansCurrent.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setNullNamePatternMatchesAll(boolean)
	 */
	public void setNullNamePatternMatchesAll(boolean value) {
		this.nullNamePatternMatchesAll.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPacketDebugBufferSize(int)
	 */
	public void setPacketDebugBufferSize(int size) throws SQLException {
		this.packetDebugBufferSize.setValue(size, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setParanoid(boolean)
	 */
	public void setParanoid(boolean property) {
		this.paranoid.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPedantic(boolean)
	 */
	public void setPedantic(boolean property) {
		this.pedantic.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPreparedStatementCacheSize(int)
	 */
	public void setPreparedStatementCacheSize(int cacheSize) throws SQLException {
		this.preparedStatementCacheSize.setValue(cacheSize, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPreparedStatementCacheSqlLimit(int)
	 */
	public void setPreparedStatementCacheSqlLimit(int cacheSqlLimit) throws SQLException {
		this.preparedStatementCacheSqlLimit.setValue(cacheSqlLimit, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setProfileSql(boolean)
	 */
	public void setProfileSql(boolean property) {
		this.profileSQL.setValue(property);
		this.profileSQLAsBoolean = this.profileSQL.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setProfileSQL(boolean)
	 */
	public void setProfileSQL(boolean flag) {
		this.profileSQL.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPropertiesTransform(java.lang.String)
	 */
	public void setPropertiesTransform(String value) {
		this.propertiesTransform.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setQueriesBeforeRetryMaster(int)
	 */
	public void setQueriesBeforeRetryMaster(int property) throws SQLException {
		this.queriesBeforeRetryMaster.setValue(property, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setReconnectAtTxEnd(boolean)
	 */
	public void setReconnectAtTxEnd(boolean property) {
		this.reconnectAtTxEnd.setValue(property);
		this.reconnectTxAtEndAsBoolean = this.reconnectAtTxEnd
				.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setRelaxAutoCommit(boolean)
	 */
	public void setRelaxAutoCommit(boolean property) {
		this.relaxAutoCommit.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setReportMetricsIntervalMillis(int)
	 */
	public void setReportMetricsIntervalMillis(int millis) throws SQLException {
		this.reportMetricsIntervalMillis.setValue(millis, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setRequireSSL(boolean)
	 */
	public void setRequireSSL(boolean property) {
		this.requireSSL.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setRetainStatementAfterResultSetClose(boolean)
	 */
	public void setRetainStatementAfterResultSetClose(boolean flag) {
		this.retainStatementAfterResultSetClose.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setRollbackOnPooledClose(boolean)
	 */
	public void setRollbackOnPooledClose(boolean flag) {
		this.rollbackOnPooledClose.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setRoundRobinLoadBalance(boolean)
	 */
	public void setRoundRobinLoadBalance(boolean flag) {
		this.roundRobinLoadBalance.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setRunningCTS13(boolean)
	 */
	public void setRunningCTS13(boolean flag) {
		this.runningCTS13.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setSecondsBeforeRetryMaster(int)
	 */
	public void setSecondsBeforeRetryMaster(int property) throws SQLException {
		this.secondsBeforeRetryMaster.setValue(property, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setServerTimezone(java.lang.String)
	 */
	public void setServerTimezone(String property) {
		this.serverTimezone.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setSessionVariables(java.lang.String)
	 */
	public void setSessionVariables(String variables) {
		this.sessionVariables.setValue(variables);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setSlowQueryThresholdMillis(int)
	 */
	public void setSlowQueryThresholdMillis(int millis) throws SQLException {
		this.slowQueryThresholdMillis.setValue(millis, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setSocketFactoryClassName(java.lang.String)
	 */
	public void setSocketFactoryClassName(String property) {
		this.socketFactoryClassName.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setSocketTimeout(int)
	 */
	public void setSocketTimeout(int property) throws SQLException {
		this.socketTimeout.setValue(property, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setStrictFloatingPoint(boolean)
	 */
	public void setStrictFloatingPoint(boolean property) {
		this.strictFloatingPoint.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setStrictUpdates(boolean)
	 */
	public void setStrictUpdates(boolean property) {
		this.strictUpdates.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setTinyInt1isBit(boolean)
	 */
	public void setTinyInt1isBit(boolean flag) {
		this.tinyInt1isBit.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setTraceProtocol(boolean)
	 */
	public void setTraceProtocol(boolean flag) {
		this.traceProtocol.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setTransformedBitIsBoolean(boolean)
	 */
	public void setTransformedBitIsBoolean(boolean flag) {
		this.transformedBitIsBoolean.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseCompression(boolean)
	 */
	public void setUseCompression(boolean property) {
		this.useCompression.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseFastIntParsing(boolean)
	 */
	public void setUseFastIntParsing(boolean flag) {
		this.useFastIntParsing.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseHostsInPrivileges(boolean)
	 */
	public void setUseHostsInPrivileges(boolean property) {
		this.useHostsInPrivileges.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseInformationSchema(boolean)
	 */
	public void setUseInformationSchema(boolean flag) {
		this.useInformationSchema.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseLocalSessionState(boolean)
	 */
	public void setUseLocalSessionState(boolean flag) {
		this.useLocalSessionState.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseOldUTF8Behavior(boolean)
	 */
	public void setUseOldUTF8Behavior(boolean flag) {
		this.useOldUTF8Behavior.setValue(flag);
		this.useOldUTF8BehaviorAsBoolean = this.useOldUTF8Behavior
				.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseOnlyServerErrorMessages(boolean)
	 */
	public void setUseOnlyServerErrorMessages(boolean flag) {
		this.useOnlyServerErrorMessages.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseReadAheadInput(boolean)
	 */
	public void setUseReadAheadInput(boolean flag) {
		this.useReadAheadInput.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseServerPreparedStmts(boolean)
	 */
	public void setUseServerPreparedStmts(boolean flag) {
		this.detectServerPreparedStmts.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseSqlStateCodes(boolean)
	 */
	public void setUseSqlStateCodes(boolean flag) {
		this.useSqlStateCodes.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseSSL(boolean)
	 */
	public void setUseSSL(boolean property) {
		this.useSSL.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseStreamLengthsInPrepStmts(boolean)
	 */
	public void setUseStreamLengthsInPrepStmts(boolean property) {
		this.useStreamLengthsInPrepStmts.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseTimezone(boolean)
	 */
	public void setUseTimezone(boolean property) {
		this.useTimezone.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseUltraDevWorkAround(boolean)
	 */
	public void setUseUltraDevWorkAround(boolean property) {
		this.useUltraDevWorkAround.setValue(property);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseUnbufferedInput(boolean)
	 */
	public void setUseUnbufferedInput(boolean flag) {
		this.useUnbufferedInput.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseUnicode(boolean)
	 */
	public void setUseUnicode(boolean flag) {
		this.useUnicode.setValue(flag);
		this.useUnicodeAsBoolean = this.useUnicode.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseUsageAdvisor(boolean)
	 */
	public void setUseUsageAdvisor(boolean useUsageAdvisorFlag) {
		this.useUsageAdvisor.setValue(useUsageAdvisorFlag);
		this.useUsageAdvisorAsBoolean = this.useUsageAdvisor
				.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setYearIsDateType(boolean)
	 */
	public void setYearIsDateType(boolean flag) {
		this.yearIsDateType.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setZeroDateTimeBehavior(java.lang.String)
	 */
	public void setZeroDateTimeBehavior(String behavior) {
		this.zeroDateTimeBehavior.setValue(behavior);
	}

	protected void storeToRef(Reference ref) throws SQLException {
		int numPropertiesToSet = PROPERTY_LIST.size();

		for (int i = 0; i < numPropertiesToSet; i++) {
			java.lang.reflect.Field propertyField = PROPERTY_LIST
					.get(i);

			try {
				ConnectionProperty propToStore = (ConnectionProperty) propertyField
						.get(this);

				if (ref != null) {
					propToStore.storeTo(ref);
				}
			} catch (IllegalAccessException iae) {
				throw SQLError.createSQLException(Messages.getString("ConnectionProperties.errorNotExpected"), getExceptionInterceptor()); //$NON-NLS-1$
			}
		}
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#useUnbufferedInput()
	 */
	public boolean useUnbufferedInput() {
		return this.useUnbufferedInput.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseCursorFetch()
	 */
	public boolean getUseCursorFetch() {
		return this.useCursorFetch.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseCursorFetch(boolean)
	 */
	public void setUseCursorFetch(boolean flag) {
		this.useCursorFetch.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getOverrideSupportsIntegrityEnhancementFacility()
	 */
	public boolean getOverrideSupportsIntegrityEnhancementFacility() {
		return this.overrideSupportsIntegrityEnhancementFacility.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setOverrideSupportsIntegrityEnhancementFacility(boolean)
	 */
	public void setOverrideSupportsIntegrityEnhancementFacility(boolean flag) {
		this.overrideSupportsIntegrityEnhancementFacility.setValue(flag);	
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getNoTimezoneConversionForTimeType()
	 */
	public boolean getNoTimezoneConversionForTimeType() {
		return this.noTimezoneConversionForTimeType.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setNoTimezoneConversionForTimeType(boolean)
	 */
	public void setNoTimezoneConversionForTimeType(boolean flag) {
		this.noTimezoneConversionForTimeType.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseJDBCCompliantTimezoneShift()
	 */
	public boolean getUseJDBCCompliantTimezoneShift() {
		return this.useJDBCCompliantTimezoneShift.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseJDBCCompliantTimezoneShift(boolean)
	 */
	public void setUseJDBCCompliantTimezoneShift(boolean flag) {
		this.useJDBCCompliantTimezoneShift.setValue(flag);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getAutoClosePStmtStreams()
	 */
	public boolean getAutoClosePStmtStreams() {
		return this.autoClosePStmtStreams.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setAutoClosePStmtStreams(boolean)
	 */
	public void setAutoClosePStmtStreams(boolean flag) {
		this.autoClosePStmtStreams.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getProcessEscapeCodesForPrepStmts()
	 */
	public boolean getProcessEscapeCodesForPrepStmts() {
		return this.processEscapeCodesForPrepStmts.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setProcessEscapeCodesForPrepStmts(boolean)
	 */
	public void setProcessEscapeCodesForPrepStmts(boolean flag) {
		this.processEscapeCodesForPrepStmts.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseGmtMillisForDatetimes()
	 */
	public boolean getUseGmtMillisForDatetimes() {
		return this.useGmtMillisForDatetimes.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseGmtMillisForDatetimes(boolean)
	 */
	public void setUseGmtMillisForDatetimes(boolean flag) {
		this.useGmtMillisForDatetimes.setValue(flag);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getDumpMetadataOnColumnNotFound()
	 */
	public boolean getDumpMetadataOnColumnNotFound() {
		return this.dumpMetadataOnColumnNotFound.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setDumpMetadataOnColumnNotFound(boolean)
	 */
	public void setDumpMetadataOnColumnNotFound(boolean flag) {
		this.dumpMetadataOnColumnNotFound.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getResourceId()
	 */
	public String getResourceId() {
		return this.resourceId.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setResourceId(java.lang.String)
	 */
	public void setResourceId(String resourceId) {
		this.resourceId.setValue(resourceId);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getRewriteBatchedStatements()
	 */
	public boolean getRewriteBatchedStatements() {
		return this.rewriteBatchedStatements.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setRewriteBatchedStatements(boolean)
	 */
	public void setRewriteBatchedStatements(boolean flag) {
		this.rewriteBatchedStatements.setValue(flag);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getJdbcCompliantTruncationForReads()
	 */
	public boolean getJdbcCompliantTruncationForReads() {
		return this.jdbcCompliantTruncationForReads;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setJdbcCompliantTruncationForReads(boolean)
	 */
	public void setJdbcCompliantTruncationForReads(
			boolean jdbcCompliantTruncationForReads) {
		this.jdbcCompliantTruncationForReads = jdbcCompliantTruncationForReads;
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseJvmCharsetConverters()
	 */
	public boolean getUseJvmCharsetConverters() {
		return this.useJvmCharsetConverters.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseJvmCharsetConverters(boolean)
	 */
	public void setUseJvmCharsetConverters(boolean flag) {
		this.useJvmCharsetConverters.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPinGlobalTxToPhysicalConnection()
	 */
	public boolean getPinGlobalTxToPhysicalConnection() {
		return this.pinGlobalTxToPhysicalConnection.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPinGlobalTxToPhysicalConnection(boolean)
	 */
	public void setPinGlobalTxToPhysicalConnection(boolean flag) {
		this.pinGlobalTxToPhysicalConnection.setValue(flag);
	}
	
	/*
	 * "Aliases" which match the property names to make using 
	 * from datasources easier.
	 */
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setGatherPerfMetrics(boolean)
	 */
	public void setGatherPerfMetrics(boolean flag) {
		setGatherPerformanceMetrics(flag);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getGatherPerfMetrics()
	 */
	public boolean getGatherPerfMetrics() {
		return getGatherPerformanceMetrics();
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUltraDevHack(boolean)
	 */
	public void setUltraDevHack(boolean flag) {
		setUseUltraDevWorkAround(flag);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUltraDevHack()
	 */
	public boolean getUltraDevHack() {
		return getUseUltraDevWorkAround();
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setInteractiveClient(boolean)
	 */
	public void setInteractiveClient(boolean property) {
		setIsInteractiveClient(property);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setSocketFactory(java.lang.String)
	 */
	public void setSocketFactory(String name) {
		setSocketFactoryClassName(name);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getSocketFactory()
	 */
	public String getSocketFactory() {
		return getSocketFactoryClassName();
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseServerPrepStmts(boolean)
	 */
	public void setUseServerPrepStmts(boolean flag) {
		setUseServerPreparedStmts(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseServerPrepStmts()
	 */
	public boolean getUseServerPrepStmts() {
		return getUseServerPreparedStmts();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCacheCallableStmts(boolean)
	 */
	public void setCacheCallableStmts(boolean flag) {
		setCacheCallableStatements(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCacheCallableStmts()
	 */
	public boolean getCacheCallableStmts() {
		return getCacheCallableStatements();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCachePrepStmts(boolean)
	 */
	public void setCachePrepStmts(boolean flag) {
		setCachePreparedStatements(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCachePrepStmts()
	 */
	public boolean getCachePrepStmts() {
		return getCachePreparedStatements();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setCallableStmtCacheSize(int)
	 */
	public void setCallableStmtCacheSize(int cacheSize) throws SQLException {
		setCallableStatementCacheSize(cacheSize);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getCallableStmtCacheSize()
	 */
	public int getCallableStmtCacheSize() {
		return getCallableStatementCacheSize();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPrepStmtCacheSize(int)
	 */
	public void setPrepStmtCacheSize(int cacheSize) throws SQLException {
		setPreparedStatementCacheSize(cacheSize);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPrepStmtCacheSize()
	 */
	public int getPrepStmtCacheSize() {
		return getPreparedStatementCacheSize();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPrepStmtCacheSqlLimit(int)
	 */
	public void setPrepStmtCacheSqlLimit(int sqlLimit) throws SQLException {
		setPreparedStatementCacheSqlLimit(sqlLimit);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPrepStmtCacheSqlLimit()
	 */
	public int getPrepStmtCacheSqlLimit() {
		return getPreparedStatementCacheSqlLimit();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getNoAccessToProcedureBodies()
	 */
	public boolean getNoAccessToProcedureBodies() {
		return this.noAccessToProcedureBodies.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setNoAccessToProcedureBodies(boolean)
	 */
	public void setNoAccessToProcedureBodies(boolean flag) {
		this.noAccessToProcedureBodies.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseOldAliasMetadataBehavior()
	 */
	public boolean getUseOldAliasMetadataBehavior() {
		return this.useOldAliasMetadataBehavior.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseOldAliasMetadataBehavior(boolean)
	 */
	public void setUseOldAliasMetadataBehavior(boolean flag) {
		this.useOldAliasMetadataBehavior.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getClientCertificateKeyStorePassword()
	 */
	public String getClientCertificateKeyStorePassword() {
		return clientCertificateKeyStorePassword.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setClientCertificateKeyStorePassword(java.lang.String)
	 */
	public void setClientCertificateKeyStorePassword(
			String value) {
		this.clientCertificateKeyStorePassword.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getClientCertificateKeyStoreType()
	 */
	public String getClientCertificateKeyStoreType() {
		return clientCertificateKeyStoreType.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setClientCertificateKeyStoreType(java.lang.String)
	 */
	public void setClientCertificateKeyStoreType(
			String value) {
		this.clientCertificateKeyStoreType.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getClientCertificateKeyStoreUrl()
	 */
	public String getClientCertificateKeyStoreUrl() {
		return clientCertificateKeyStoreUrl.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setClientCertificateKeyStoreUrl(java.lang.String)
	 */
	public void setClientCertificateKeyStoreUrl(
			String value) {
		this.clientCertificateKeyStoreUrl.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getTrustCertificateKeyStorePassword()
	 */
	public String getTrustCertificateKeyStorePassword() {
		return trustCertificateKeyStorePassword.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setTrustCertificateKeyStorePassword(java.lang.String)
	 */
	public void setTrustCertificateKeyStorePassword(
			String value) {
		this.trustCertificateKeyStorePassword.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getTrustCertificateKeyStoreType()
	 */
	public String getTrustCertificateKeyStoreType() {
		return trustCertificateKeyStoreType.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setTrustCertificateKeyStoreType(java.lang.String)
	 */
	public void setTrustCertificateKeyStoreType(
			String value) {
		this.trustCertificateKeyStoreType.setValue(value);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getTrustCertificateKeyStoreUrl()
	 */
	public String getTrustCertificateKeyStoreUrl() {
		return trustCertificateKeyStoreUrl.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setTrustCertificateKeyStoreUrl(java.lang.String)
	 */
	public void setTrustCertificateKeyStoreUrl(
			String value) {
		this.trustCertificateKeyStoreUrl.setValue(value);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseSSPSCompatibleTimezoneShift()
	 */
	public boolean getUseSSPSCompatibleTimezoneShift() {
		return this.useSSPSCompatibleTimezoneShift.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseSSPSCompatibleTimezoneShift(boolean)
	 */
	public void setUseSSPSCompatibleTimezoneShift(boolean flag) {
		this.useSSPSCompatibleTimezoneShift.setValue(flag);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getTreatUtilDateAsTimestamp()
	 */
	public boolean getTreatUtilDateAsTimestamp() {
		return this.treatUtilDateAsTimestamp.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setTreatUtilDateAsTimestamp(boolean)
	 */
	public void setTreatUtilDateAsTimestamp(boolean flag) {
		this.treatUtilDateAsTimestamp.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseFastDateParsing()
	 */
	public boolean getUseFastDateParsing() {
		return this.useFastDateParsing.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseFastDateParsing(boolean)
	 */
	public void setUseFastDateParsing(boolean flag) {
		this.useFastDateParsing.setValue(flag);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getLocalSocketAddress()
	 */
	public String getLocalSocketAddress() {
		return this.localSocketAddress.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setLocalSocketAddress(java.lang.String)
	 */
	public void setLocalSocketAddress(String address) {
		this.localSocketAddress.setValue(address);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseConfigs(java.lang.String)
	 */
	public void setUseConfigs(String configs) {
		this.useConfigs.setValue(configs);
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseConfigs()
	 */
	public String getUseConfigs() {
		return this.useConfigs.getValueAsString();
	}
	
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getGenerateSimpleParameterMetadata()
	 */
	public boolean getGenerateSimpleParameterMetadata() {
		return this.generateSimpleParameterMetadata.getValueAsBoolean();
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setGenerateSimpleParameterMetadata(boolean)
	 */
	public void setGenerateSimpleParameterMetadata(boolean flag) {
		this.generateSimpleParameterMetadata.setValue(flag);
	}	

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getLogXaCommands()
	 */
	public boolean getLogXaCommands() {
		return this.logXaCommands.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setLogXaCommands(boolean)
	 */
	public void setLogXaCommands(boolean flag) {
		this.logXaCommands.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getResultSetSizeThreshold()
	 */
	public int getResultSetSizeThreshold() {
		return this.resultSetSizeThreshold.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setResultSetSizeThreshold(int)
	 */
	public void setResultSetSizeThreshold(int threshold) throws SQLException {
		this.resultSetSizeThreshold.setValue(threshold, getExceptionInterceptor());
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getNetTimeoutForStreamingResults()
	 */
	public int getNetTimeoutForStreamingResults() {
		return this.netTimeoutForStreamingResults.getValueAsInt();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setNetTimeoutForStreamingResults(int)
	 */
	public void setNetTimeoutForStreamingResults(int value) throws SQLException {
		this.netTimeoutForStreamingResults.setValue(value, getExceptionInterceptor());
	}
	
	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getEnableQueryTimeouts()
	 */
	public boolean getEnableQueryTimeouts() {
		return this.enableQueryTimeouts.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setEnableQueryTimeouts(boolean)
	 */
	public void setEnableQueryTimeouts(boolean flag) {
		this.enableQueryTimeouts.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getPadCharsWithSpace()
	 */
	public boolean getPadCharsWithSpace() {
		return this.padCharsWithSpace.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setPadCharsWithSpace(boolean)
	 */
	public void setPadCharsWithSpace(boolean flag) {
		this.padCharsWithSpace.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getUseDynamicCharsetInfo()
	 */
	public boolean getUseDynamicCharsetInfo() {
		return this.useDynamicCharsetInfo.getValueAsBoolean();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setUseDynamicCharsetInfo(boolean)
	 */
	public void setUseDynamicCharsetInfo(boolean flag) {
		this.useDynamicCharsetInfo.setValue(flag);
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#getClientInfoProvider()
	 */
	public String getClientInfoProvider() {
		return this.clientInfoProvider.getValueAsString();
	}

	/* (non-Javadoc)
	 * @see com.mysql.jdbc.IConnectionProperties#setClientInfoProvider(java.lang.String)
	 */
	public void setClientInfoProvider(String classname) {
		this.clientInfoProvider.setValue(classname);
	}
	
	public boolean getPopulateInsertRowWithDefaultValues() {
		return this.populateInsertRowWithDefaultValues.getValueAsBoolean();
	}

	public void setPopulateInsertRowWithDefaultValues(boolean flag) {
		this.populateInsertRowWithDefaultValues.setValue(flag);
	}
	
	public String getLoadBalanceStrategy() {
		return this.loadBalanceStrategy.getValueAsString();
	}

	public void setLoadBalanceStrategy(String strategy) {
		this.loadBalanceStrategy.setValue(strategy);
	}
	
	public boolean getTcpNoDelay() {
		return this.tcpNoDelay.getValueAsBoolean();
	}

	public void setTcpNoDelay(boolean flag) {
		this.tcpNoDelay.setValue(flag);
	}

	public boolean getTcpKeepAlive() {
		return this.tcpKeepAlive.getValueAsBoolean();
	}

	public void setTcpKeepAlive(boolean flag) {
		this.tcpKeepAlive.setValue(flag);
	}

	public int getTcpRcvBuf() {
		return this.tcpRcvBuf.getValueAsInt();
	}

	public void setTcpRcvBuf(int bufSize) throws SQLException {
		this.tcpRcvBuf.setValue(bufSize, getExceptionInterceptor());
	}

	public int getTcpSndBuf() {
		return this.tcpSndBuf.getValueAsInt();
	}

	public void setTcpSndBuf(int bufSize) throws SQLException {
		this.tcpSndBuf.setValue(bufSize, getExceptionInterceptor());
	}

	public int getTcpTrafficClass() {
		return this.tcpTrafficClass.getValueAsInt();
	}

	public void setTcpTrafficClass(int classFlags) throws SQLException {
		this.tcpTrafficClass.setValue(classFlags, getExceptionInterceptor());
	}
	
	public boolean getUseNanosForElapsedTime() {
		return this.useNanosForElapsedTime.getValueAsBoolean();
	}

	public void setUseNanosForElapsedTime(boolean flag) {
		this.useNanosForElapsedTime.setValue(flag);
	}

	public long getSlowQueryThresholdNanos() {
		return this.slowQueryThresholdNanos.getValueAsLong();
	}

	public void setSlowQueryThresholdNanos(long nanos) throws SQLException {
		this.slowQueryThresholdNanos.setValue(nanos, getExceptionInterceptor());
	}

	public String getStatementInterceptors() {
		return this.statementInterceptors.getValueAsString();
	}

	public void setStatementInterceptors(String value) {
		this.statementInterceptors.setValue(value);
	}

	public boolean getUseDirectRowUnpack() {
		return this.useDirectRowUnpack.getValueAsBoolean();
	}

	public void setUseDirectRowUnpack(boolean flag) {
		this.useDirectRowUnpack.setValue(flag);
	}

	public String getLargeRowSizeThreshold() {
		return this.largeRowSizeThreshold.getValueAsString();
	}

	public void setLargeRowSizeThreshold(String value) throws SQLException {
		this.largeRowSizeThreshold.setValue(value, getExceptionInterceptor());
	}

	public boolean getUseBlobToStoreUTF8OutsideBMP() {
		return this.useBlobToStoreUTF8OutsideBMP.getValueAsBoolean();
	}

	public void setUseBlobToStoreUTF8OutsideBMP(boolean flag) {
		this.useBlobToStoreUTF8OutsideBMP.setValue(flag);
	}

	public String getUtf8OutsideBmpExcludedColumnNamePattern() {
		return this.utf8OutsideBmpExcludedColumnNamePattern.getValueAsString();
	}

	public void setUtf8OutsideBmpExcludedColumnNamePattern(String regexPattern) {
		this.utf8OutsideBmpExcludedColumnNamePattern.setValue(regexPattern);
	}

	public String getUtf8OutsideBmpIncludedColumnNamePattern() {
		return this.utf8OutsideBmpIncludedColumnNamePattern.getValueAsString();
	}

	public void setUtf8OutsideBmpIncludedColumnNamePattern(String regexPattern) {
		this.utf8OutsideBmpIncludedColumnNamePattern.setValue(regexPattern);
	}
	
	public boolean getIncludeInnodbStatusInDeadlockExceptions() {
		return this.includeInnodbStatusInDeadlockExceptions.getValueAsBoolean();
	}

	public void setIncludeInnodbStatusInDeadlockExceptions(boolean flag) {
		this.includeInnodbStatusInDeadlockExceptions.setValue(flag);
	}
	
	public boolean getBlobsAreStrings() {
        return this.blobsAreStrings.getValueAsBoolean();
    }

	public void setBlobsAreStrings(boolean flag) {
        this.blobsAreStrings.setValue(flag);
    }

    public boolean getFunctionsNeverReturnBlobs() {
        return this.functionsNeverReturnBlobs.getValueAsBoolean();
    }

    public void setFunctionsNeverReturnBlobs(boolean flag) {
        this.functionsNeverReturnBlobs.setValue(flag);
    }

	public boolean getAutoSlowLog() {
		return this.autoSlowLog.getValueAsBoolean();
	}

	public void setAutoSlowLog(boolean flag) {
		this.autoSlowLog.setValue(flag);
	}

	public String getConnectionLifecycleInterceptors() {
		return this.connectionLifecycleInterceptors.getValueAsString();
	}

	public void setConnectionLifecycleInterceptors(String interceptors) {
		this.connectionLifecycleInterceptors.setValue(interceptors);
    }

	public String getProfilerEventHandler() {
		return this.profilerEventHandler.getValueAsString();
	}

	public void setProfilerEventHandler(String handler) {
		this.profilerEventHandler.setValue(handler);
	}

	public boolean getVerifyServerCertificate() {
		return this.verifyServerCertificate.getValueAsBoolean();
	}

	public void setVerifyServerCertificate(boolean flag) {
		this.verifyServerCertificate.setValue(flag);
	}

	public boolean getUseLegacyDatetimeCode() {
		return this.useLegacyDatetimeCode.getValueAsBoolean();
	}

	public void setUseLegacyDatetimeCode(boolean flag) {
		this.useLegacyDatetimeCode.setValue(flag);
	}

	public int getSelfDestructOnPingSecondsLifetime() {
		return this.selfDestructOnPingSecondsLifetime.getValueAsInt();
	}

	public void setSelfDestructOnPingSecondsLifetime(int seconds) throws SQLException {
		this.selfDestructOnPingSecondsLifetime.setValue(seconds, getExceptionInterceptor());
	}

	public int getSelfDestructOnPingMaxOperations() {
		return this.selfDestructOnPingMaxOperations.getValueAsInt();
	}

	public void setSelfDestructOnPingMaxOperations(int maxOperations) throws SQLException {
		this.selfDestructOnPingMaxOperations.setValue(maxOperations, getExceptionInterceptor());
	}

	public boolean getUseColumnNamesInFindColumn() {
		return this.useColumnNamesInFindColumn.getValueAsBoolean();
	}

	public void setUseColumnNamesInFindColumn(boolean flag) {
		this.useColumnNamesInFindColumn.setValue(flag);
	}

	public boolean getUseLocalTransactionState() {
		return this.useLocalTransactionState.getValueAsBoolean();
	}

	public void setUseLocalTransactionState(boolean flag) {
		this.useLocalTransactionState.setValue(flag);
	}

	public boolean getCompensateOnDuplicateKeyUpdateCounts() {
		return this.compensateOnDuplicateKeyUpdateCounts.getValueAsBoolean();
	}

	public void setCompensateOnDuplicateKeyUpdateCounts(boolean flag) {
		this.compensateOnDuplicateKeyUpdateCounts.setValue(flag);
	}

	public int getLoadBalanceBlacklistTimeout() {
		return loadBalanceBlacklistTimeout.getValueAsInt();
	}

	public void setLoadBalanceBlacklistTimeout(int loadBalanceBlacklistTimeout) throws SQLException {
		this.loadBalanceBlacklistTimeout.setValue(loadBalanceBlacklistTimeout, getExceptionInterceptor());
	}

	public int getLoadBalancePingTimeout() {
		return loadBalancePingTimeout.getValueAsInt();
	}

	public void setLoadBalancePingTimeout(int loadBalancePingTimeout) throws SQLException {
		this.loadBalancePingTimeout.setValue(loadBalancePingTimeout, getExceptionInterceptor());
	}
	
	public void setRetriesAllDown(int retriesAllDown) throws SQLException {
		this.retriesAllDown.setValue(retriesAllDown, getExceptionInterceptor());
	}
	
	public int getRetriesAllDown() {
		return this.retriesAllDown.getValueAsInt();
	}

	public void setUseAffectedRows(boolean flag) {
		this.useAffectedRows.setValue(flag);
	}

	public boolean getUseAffectedRows() {
		return this.useAffectedRows.getValueAsBoolean();
	}

	public void setPasswordCharacterEncoding(String characterSet) {
		this.passwordCharacterEncoding.setValue(characterSet);
	}

	public String getPasswordCharacterEncoding() {
		return this.passwordCharacterEncoding.getValueAsString();
	}

	public void setExceptionInterceptors(String exceptionInterceptors) {
		this.exceptionInterceptors.setValue(exceptionInterceptors);
	}

	public String getExceptionInterceptors() {
		return this.exceptionInterceptors.getValueAsString();
	}
	
	public void setMaxAllowedPacket(int  max) throws SQLException {
		this.maxAllowedPacket.setValue(max, getExceptionInterceptor());
	}
	
	public int getMaxAllowedPacket() {
		return this.maxAllowedPacket.getValueAsInt();
	}

	public boolean getQueryTimeoutKillsConnection() {
		return this.queryTimeoutKillsConnection.getValueAsBoolean();
	}

	public void setQueryTimeoutKillsConnection(boolean queryTimeoutKillsConnection) {
		this.queryTimeoutKillsConnection.setValue(queryTimeoutKillsConnection);
	}

	public boolean getLoadBalanceValidateConnectionOnSwapServer() {
		return this.loadBalanceValidateConnectionOnSwapServer.getValueAsBoolean();
	}

	public void setLoadBalanceValidateConnectionOnSwapServer(
			boolean loadBalanceValidateConnectionOnSwapServer) {
		this.loadBalanceValidateConnectionOnSwapServer.setValue(loadBalanceValidateConnectionOnSwapServer);
		
	}
	
	public String getLoadBalanceConnectionGroup() {
		return loadBalanceConnectionGroup.getValueAsString();
	}

	public void setLoadBalanceConnectionGroup(String loadBalanceConnectionGroup) {
		this.loadBalanceConnectionGroup.setValue(loadBalanceConnectionGroup);
	}

	public String getLoadBalanceExceptionChecker() {
		return loadBalanceExceptionChecker.getValueAsString();
	}

	public void setLoadBalanceExceptionChecker(String loadBalanceExceptionChecker) {
		this.loadBalanceExceptionChecker.setValue(loadBalanceExceptionChecker);
	}

	public String getLoadBalanceSQLStateFailover() {
		return loadBalanceSQLStateFailover.getValueAsString();
	}

	public void setLoadBalanceSQLStateFailover(String loadBalanceSQLStateFailover) {
		this.loadBalanceSQLStateFailover.setValue(loadBalanceSQLStateFailover);
	}

	public String getLoadBalanceSQLExceptionSubclassFailover() {
		return loadBalanceSQLExceptionSubclassFailover.getValueAsString();
	}

	public void setLoadBalanceSQLExceptionSubclassFailover(String loadBalanceSQLExceptionSubclassFailover) {
		this.loadBalanceSQLExceptionSubclassFailover.setValue(loadBalanceSQLExceptionSubclassFailover);
	}

	public boolean getLoadBalanceEnableJMX() {
		return loadBalanceEnableJMX.getValueAsBoolean();
	}

	public void setLoadBalanceEnableJMX(boolean loadBalanceEnableJMX) {
		this.loadBalanceEnableJMX.setValue(loadBalanceEnableJMX);
	}

	public void setLoadBalanceAutoCommitStatementThreshold(int loadBalanceAutoCommitStatementThreshold) throws SQLException {
		this.loadBalanceAutoCommitStatementThreshold.setValue(loadBalanceAutoCommitStatementThreshold, getExceptionInterceptor());
	}

	public int getLoadBalanceAutoCommitStatementThreshold() {
		return loadBalanceAutoCommitStatementThreshold.getValueAsInt();
	}

	public void setLoadBalanceAutoCommitStatementRegex(String loadBalanceAutoCommitStatementRegex) {
		this.loadBalanceAutoCommitStatementRegex.setValue(loadBalanceAutoCommitStatementRegex);
	}

	public String getLoadBalanceAutoCommitStatementRegex() {
		return loadBalanceAutoCommitStatementRegex.getValueAsString();
	}

	public void setIncludeThreadDumpInDeadlockExceptions(boolean flag) {
		this.includeThreadDumpInDeadlockExceptions.setValue(flag);
	}

	public boolean getIncludeThreadDumpInDeadlockExceptions() {
		return includeThreadDumpInDeadlockExceptions.getValueAsBoolean();
	}

	public void setIncludeThreadNamesAsStatementComment(boolean flag) {
		this.includeThreadNamesAsStatementComment.setValue(flag);
	}

	public boolean getIncludeThreadNamesAsStatementComment() {
		return includeThreadNamesAsStatementComment.getValueAsBoolean();
	}

	public void setAuthenticationPlugins(String authenticationPlugins) {
		this.authenticationPlugins.setValue(authenticationPlugins);
	}

	public String getAuthenticationPlugins() {
		return this.authenticationPlugins.getValueAsString();
	}

	public void setDisabledAuthenticationPlugins(String disabledAuthenticationPlugins) {
		this.disabledAuthenticationPlugins.setValue(disabledAuthenticationPlugins);
	}

	public String getDisabledAuthenticationPlugins() {
		return this.disabledAuthenticationPlugins.getValueAsString();
	}

	public void setDefaultAuthenticationPlugin(String defaultAuthenticationPlugin) {
		this.defaultAuthenticationPlugin.setValue(defaultAuthenticationPlugin);
		
	}

	public String getDefaultAuthenticationPlugin() {
		return this.defaultAuthenticationPlugin.getValueAsString();
	}

	public void setParseInfoCacheFactory(String factoryClassname) {
		this.parseInfoCacheFactory.setValue(factoryClassname);	
	}

	public String getParseInfoCacheFactory() {
		return this.parseInfoCacheFactory.getValueAsString();
	}
	
	public void setServerConfigCacheFactory(String factoryClassname) {
		this.serverConfigCacheFactory.setValue(factoryClassname);	
	}

	public String getServerConfigCacheFactory() {
		return this.serverConfigCacheFactory.getValueAsString();
	}

	public void setDisconnectOnExpiredPasswords(boolean disconnectOnExpiredPasswords) {
		this.disconnectOnExpiredPasswords.setValue(disconnectOnExpiredPasswords);
	}

	public boolean getDisconnectOnExpiredPasswords() {
		return this.disconnectOnExpiredPasswords.getValueAsBoolean();
	}

	public boolean getAllowMasterDownConnections() {
		return this.allowMasterDownConnections.getValueAsBoolean();
	}

	public void setAllowMasterDownConnections(boolean connectIfMasterDown) {
		this.allowMasterDownConnections.setValue(connectIfMasterDown);
	}

	public boolean getReplicationEnableJMX() {
		return this.replicationEnableJMX.getValueAsBoolean();
	}

	public void setReplicationEnableJMX(boolean replicationEnableJMX) {
		this.replicationEnableJMX.setValue(replicationEnableJMX);
		
	}

	public void setGetProceduresReturnsFunctions(boolean getProcedureReturnsFunctions) {
		this.getProceduresReturnsFunctions.setValue(getProcedureReturnsFunctions);
	}

	public boolean getGetProceduresReturnsFunctions() {
		return this.getProceduresReturnsFunctions.getValueAsBoolean();
	}
}
