/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
/*
* Created on May 15, 2004
*/
package org.apache.jmeter.protocol.jdbc.config;
import java.beans.PropertyDescriptor;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.jmeter.testbeans.BeanInfoSupport;
import org.apache.jmeter.testbeans.gui.TypeEditor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DataSourceElementBeanInfo extends BeanInfoSupport {
private static final Logger log = LoggerFactory.getLogger(DataSourceElementBeanInfo.class);
private static Map<String,Integer> TRANSACTION_ISOLATION_MAP = new HashMap<>(5);
static {
// Will use default isolation
TRANSACTION_ISOLATION_MAP.put("DEFAULT", Integer.valueOf(-1));
TRANSACTION_ISOLATION_MAP.put("TRANSACTION_NONE", Integer.valueOf(Connection.TRANSACTION_NONE));
TRANSACTION_ISOLATION_MAP.put("TRANSACTION_READ_COMMITTED", Integer.valueOf(Connection.TRANSACTION_READ_COMMITTED));
TRANSACTION_ISOLATION_MAP.put("TRANSACTION_READ_UNCOMMITTED", Integer.valueOf(Connection.TRANSACTION_READ_UNCOMMITTED));
TRANSACTION_ISOLATION_MAP.put("TRANSACTION_REPEATABLE_READ", Integer.valueOf(Connection.TRANSACTION_REPEATABLE_READ));
TRANSACTION_ISOLATION_MAP.put("TRANSACTION_SERIALIZABLE", Integer.valueOf(Connection.TRANSACTION_SERIALIZABLE));
}
public DataSourceElementBeanInfo() {
super(DataSourceElement.class);
createPropertyGroup("varName", new String[] { "dataSource" });
createPropertyGroup("pool", new String[] { "poolMax", "timeout",
"trimInterval", "autocommit", "transactionIsolation" });
createPropertyGroup("keep-alive", new String[] { "keepAlive", "connectionAge", "checkQuery" });
createPropertyGroup("database", new String[] { "dbUrl", "driver", "username", "password" });
PropertyDescriptor p = property("dataSource");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
p = property("poolMax");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "10");
p = property("timeout");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "10000");
p = property("trimInterval");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "60000");
p = property("autocommit");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, Boolean.TRUE);
p = property("transactionIsolation");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "DEFAULT");
p.setValue(NOT_EXPRESSION, Boolean.TRUE);
Set<String> modesSet = TRANSACTION_ISOLATION_MAP.keySet();
String[] modes = modesSet.toArray(new String[modesSet.size()]);
p.setValue(TAGS, modes);
p = property("keepAlive");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, Boolean.TRUE);
p = property("connectionAge");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "5000");
p = property("checkQuery");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "Select 1");
p = property("dbUrl");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
p = property("driver");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
p = property("username");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
p = property("password", TypeEditor.PasswordEditor);
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, "");
}
/**
* Converts a string description of a valid transaction isolation mode to the respective integer value.
* Currently supported tags and their values are:
* <dl>
* <dt>DEFAULT</dt><dd>-1</dd>
* <dt>TRANSACTION_NONE</dt><dd>{@value java.sql.Connection#TRANSACTION_NONE}</dd>
* <dt>TRANSACTION_READ_COMMITTED</dt><dd>{@value java.sql.Connection#TRANSACTION_READ_COMMITTED}</dd>
* <dt>TRANSACTION_READ_UNCOMMITTED</dt><dd>{@value java.sql.Connection#TRANSACTION_READ_UNCOMMITTED}</dd>
* <dt>TRANSACTION_REPEATABLE_READ</dt><dd>{@value java.sql.Connection#TRANSACTION_REPEATABLE_READ}</dd>
* <dt>TRANSACTION_SERIALIZABLE</dt><dd>{@value java.sql.Connection#TRANSACTION_SERIALIZABLE}</dd>
* </dl>
* @param tag name of the transaction isolation mode
* @return integer value of the given transaction isolation mode
*/
public static int getTransactionIsolationMode(String tag) {
if (!StringUtils.isEmpty(tag)) {
Integer isolationMode = TRANSACTION_ISOLATION_MAP.get(tag);
if (isolationMode == null) {
try {
return Integer.parseInt(tag);
} catch (NumberFormatException e) {
log.warn("Illegal transaction isolation configuration '" + tag + "'");
}
} else {
return isolationMode.intValue();
}
}
return -1;
}
}