Merge remote-tracking branch 'upstream/master'

This commit is contained in:
kiki
2013-06-03 14:19:34 +08:00
20 changed files with 3882 additions and 3730 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,3 +1,18 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.pool;
import java.util.Properties;
@@ -33,7 +33,9 @@ import com.alibaba.druid.support.logging.LogFactory;
*/
public class DruidDataSourceStatLoggerImpl extends DruidDataSourceStatLoggerAdapter {
private static Log LOG = LogFactory.getLog(DruidDataSourceStatLoggerImpl.class);
private static Log LOG = LogFactory.getLog(DruidDataSourceStatLoggerImpl.class);
private Log logger = LOG;
public DruidDataSourceStatLoggerImpl(){
this.configFromProperties(System.getProperties());
@@ -44,12 +46,23 @@ public class DruidDataSourceStatLoggerImpl extends DruidDataSourceStatLoggerAdap
*/
@Override
public void configFromProperties(Properties properties) {
String property = properties.getProperty("druid.stat.loggerName");
if (property != null && property.length() > 0) {
setLoggerName(property);
}
}
public Log getLogger() {
return logger;
}
public void setLoggerName(String loggerName) {
logger = LogFactory.getLog(loggerName);
}
@Override
public void log(DruidDataSourceStatValue statValue) {
if (LOG.isInfoEnabled()) {
if (logger.isInfoEnabled()) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("url", statValue.url);
@@ -205,7 +218,7 @@ public class DruidDataSourceStatLoggerImpl extends DruidDataSourceStatLoggerAdap
String text = JSONUtils.toJSONString(map);
LOG.info(text);
logger.info(text);
}
}
@@ -1,3 +1,18 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.pool;
import java.sql.Connection;
@@ -36,6 +36,9 @@ public class SQLCastExpr extends SQLExprImpl {
}
public void setExpr(SQLExpr expr) {
if (expr != null) {
expr.setParent(this);
}
this.expr = expr;
}
@@ -796,6 +796,10 @@ public class SQLEvalVisitorUtils {
if (wallConditionContext != null) {
wallConditionContext.setConstArithmetic(true);
}
if (leftValue == null || rightValue == null) {
return false;
}
Object value = null;
switch (x.getOperator()) {
@@ -33,7 +33,7 @@ public class Concat implements Function {
Object itemValue = item.getAttributes().get(EVAL_VALUE);
if (itemValue == null) {
continue;
return null;
}
buf.append(itemValue.toString());
}
@@ -1,102 +1,102 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JakartaCommonsLoggingImpl implements com.alibaba.druid.support.logging.Log {
private Log log;
private int errorCount;
private int warnCount;
private int infoCount;
public JakartaCommonsLoggingImpl(Class<?> clazz){
log = LogFactory.getLog(clazz);
}
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
public void error(String s, Throwable e) {
log.error(s, e);
errorCount++;
}
public void error(String s) {
log.error(s);
errorCount++;
}
public void debug(String s) {
log.debug(s);
}
public void debug(String s, Throwable e) {
log.debug(s, e);
}
public void warn(String s) {
log.warn(s);
warnCount++;
}
@Override
public void warn(String s, Throwable e) {
log.warn(s, e);
warnCount++;
}
@Override
public int getWarnCount() {
return warnCount;
}
public int getErrorCount() {
return errorCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
@Override
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
@Override
public void info(String msg) {
log.info(msg);
infoCount++;
}
@Override
public int getInfoCount() {
return infoCount;
}
@Override
public boolean isWarnEnabled() {
return log.isWarnEnabled();
}
}
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JakartaCommonsLoggingImpl implements com.alibaba.druid.support.logging.Log {
private Log log;
private int errorCount;
private int warnCount;
private int infoCount;
public JakartaCommonsLoggingImpl(String loggerName){
log = LogFactory.getLog(loggerName);
}
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
public void error(String s, Throwable e) {
log.error(s, e);
errorCount++;
}
public void error(String s) {
log.error(s);
errorCount++;
}
public void debug(String s) {
log.debug(s);
}
public void debug(String s, Throwable e) {
log.debug(s, e);
}
public void warn(String s) {
log.warn(s);
warnCount++;
}
@Override
public void warn(String s, Throwable e) {
log.warn(s, e);
warnCount++;
}
@Override
public int getWarnCount() {
return warnCount;
}
public int getErrorCount() {
return errorCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
@Override
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
@Override
public void info(String msg) {
log.info(msg);
infoCount++;
}
@Override
public int getInfoCount() {
return infoCount;
}
@Override
public boolean isWarnEnabled() {
return log.isWarnEnabled();
}
}
@@ -1,105 +1,105 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Jdk14LoggingImpl implements Log {
private Logger log;
private int errorCount;
private int warnCount;
private int infoCount;
private String clazzName;
public Jdk14LoggingImpl(Class<?> clazz){
clazzName = clazz.getName();
log = Logger.getLogger(clazzName);
}
public boolean isDebugEnabled() {
return log.isLoggable(Level.FINE);
}
public void error(String s, Throwable e) {
log.logp(Level.SEVERE,clazzName, Thread.currentThread().getStackTrace()[1].getMethodName(), s, e);
errorCount++;
}
public void error(String s) {
log.logp(Level.SEVERE,clazzName, Thread.currentThread().getStackTrace()[1].getMethodName(), s);
errorCount++;
}
public void debug(String s) {
log.logp(Level.FINE, clazzName, Thread.currentThread().getStackTrace()[1].getMethodName(), s);
}
public void debug(String s, Throwable e) {
log.logp(Level.FINE, clazzName, Thread.currentThread().getStackTrace()[1].getMethodName(), s, e);
}
public void warn(String s) {
log.logp(Level.WARNING, clazzName, Thread.currentThread().getStackTrace()[1].getMethodName(), s);
warnCount++;
}
@Override
public void warn(String s, Throwable e) {
log.logp(Level.WARNING, clazzName, Thread.currentThread().getStackTrace()[1].getMethodName(), s, e);
warnCount++;
}
@Override
public int getWarnCount() {
return warnCount;
}
public int getErrorCount() {
return errorCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
@Override
public boolean isInfoEnabled() {
return log.isLoggable(Level.INFO);
}
@Override
public void info(String msg) {
log.logp(Level.INFO, clazzName, Thread.currentThread().getStackTrace()[1].getMethodName(), msg);
infoCount++;
}
@Override
public int getInfoCount() {
return infoCount;
}
@Override
public boolean isWarnEnabled() {
return log.isLoggable(Level.WARNING);
}
}
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Jdk14LoggingImpl implements Log {
private Logger log;
private int errorCount;
private int warnCount;
private int infoCount;
private String loggerName;
public Jdk14LoggingImpl(String loggerName){
this.loggerName = loggerName;
log = Logger.getLogger(loggerName);
}
public boolean isDebugEnabled() {
return log.isLoggable(Level.FINE);
}
public void error(String s, Throwable e) {
log.logp(Level.SEVERE, loggerName, Thread.currentThread().getStackTrace()[1].getMethodName(), s, e);
errorCount++;
}
public void error(String s) {
log.logp(Level.SEVERE, loggerName, Thread.currentThread().getStackTrace()[1].getMethodName(), s);
errorCount++;
}
public void debug(String s) {
log.logp(Level.FINE, loggerName, Thread.currentThread().getStackTrace()[1].getMethodName(), s);
}
public void debug(String s, Throwable e) {
log.logp(Level.FINE, loggerName, Thread.currentThread().getStackTrace()[1].getMethodName(), s, e);
}
public void warn(String s) {
log.logp(Level.WARNING, loggerName, Thread.currentThread().getStackTrace()[1].getMethodName(), s);
warnCount++;
}
@Override
public void warn(String s, Throwable e) {
log.logp(Level.WARNING, loggerName, Thread.currentThread().getStackTrace()[1].getMethodName(), s, e);
warnCount++;
}
@Override
public int getWarnCount() {
return warnCount;
}
public int getErrorCount() {
return errorCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
@Override
public boolean isInfoEnabled() {
return log.isLoggable(Level.INFO);
}
@Override
public void info(String msg) {
log.logp(Level.INFO, loggerName, Thread.currentThread().getStackTrace()[1].getMethodName(), msg);
infoCount++;
}
@Override
public int getInfoCount() {
return infoCount;
}
@Override
public boolean isWarnEnabled() {
return log.isLoggable(Level.WARNING);
}
}
@@ -1,101 +1,101 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Log4jImpl implements Log {
private static final String callerFQCN = Log4jImpl.class.getName();
private Logger log;
private int errorCount;
private int warnCount;
private int infoCount;
public Log4jImpl(Class<?> clazz){
log = Logger.getLogger(clazz);
}
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
public void error(String s, Throwable e) {
errorCount++;
log.log(callerFQCN, Level.ERROR, s, e);
}
public void error(String s) {
errorCount++;
log.log(callerFQCN, Level.ERROR, s, null);
}
public void debug(String s) {
log.log(callerFQCN, Level.DEBUG, s, null);
}
public void debug(String s, Throwable e) {
log.log(callerFQCN, Level.DEBUG, s, e);
}
public void warn(String s) {
log.log(callerFQCN, Level.WARN, s, null);
warnCount++;
}
public void warn(String s, Throwable e) {
log.log(callerFQCN, Level.WARN, s, e);
warnCount++;
}
public int getWarnCount() {
return warnCount;
}
public int getErrorCount() {
return errorCount;
}
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
public void info(String msg) {
infoCount++;
log.log(callerFQCN, Level.INFO, msg, null);
}
public boolean isWarnEnabled() {
return log.isEnabledFor(Level.WARN);
}
public int getInfoCount() {
return infoCount;
}
public String toString() {
return log.toString();
}
}
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Log4jImpl implements Log {
private static final String callerFQCN = Log4jImpl.class.getName();
private Logger log;
private int errorCount;
private int warnCount;
private int infoCount;
public Log4jImpl(String loggerName){
log = Logger.getLogger(loggerName);
}
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
public void error(String s, Throwable e) {
errorCount++;
log.log(callerFQCN, Level.ERROR, s, e);
}
public void error(String s) {
errorCount++;
log.log(callerFQCN, Level.ERROR, s, null);
}
public void debug(String s) {
log.log(callerFQCN, Level.DEBUG, s, null);
}
public void debug(String s, Throwable e) {
log.log(callerFQCN, Level.DEBUG, s, e);
}
public void warn(String s) {
log.log(callerFQCN, Level.WARN, s, null);
warnCount++;
}
public void warn(String s, Throwable e) {
log.log(callerFQCN, Level.WARN, s, e);
warnCount++;
}
public int getWarnCount() {
return warnCount;
}
public int getErrorCount() {
return errorCount;
}
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
public void info(String msg) {
infoCount++;
log.log(callerFQCN, Level.INFO, msg, null);
}
public boolean isWarnEnabled() {
return log.isEnabledFor(Level.WARN);
}
public int getInfoCount() {
return infoCount;
}
public String toString() {
return log.toString();
}
}
@@ -1,109 +1,101 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import java.lang.reflect.Constructor;
@SuppressWarnings("rawtypes")
public class LogFactory {
private static Constructor logConstructor;
static {
// TODO add slf4j logging
// 优先选择log4j,而非Apache Common Logging. 因为后者无法设置真实Log调用者的信息
tryImplementation("org.apache.log4j.Logger", "com.alibaba.druid.support.logging.Log4jImpl");
tryImplementation("java.util.logging.Logger", "com.alibaba.druid.support.logging.Jdk14LoggingImpl");
tryImplementation("org.slf4j.Logger", "com.alibaba.druid.support.logging.SLF4JImpl");
tryImplementation("org.apache.commons.logging.LogFactory",
"com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl");
if (logConstructor == null) {
try {
logConstructor = NoLoggingImpl.class.getConstructor(Class.class);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}
@SuppressWarnings("unchecked")
private static void tryImplementation(String testClassName, String implClassName) {
if (logConstructor != null) {
return;
}
try {
Resources.classForName(testClassName);
Class implClass = Resources.classForName(implClassName);
logConstructor = implClass.getConstructor(new Class[] { Class.class });
Class<?> declareClass = logConstructor.getDeclaringClass();
if (!Log.class.isAssignableFrom(declareClass)) {
logConstructor = null;
}
try {
logConstructor.newInstance(LogFactory.class);
} catch (Throwable t) {
logConstructor = null;
}
} catch (Throwable t) {
// skip
}
}
public static Log getLog(Class aClass) {
try {
return (Log) logConstructor.newInstance(new Object[] { aClass });
} catch (Throwable t) {
throw new RuntimeException("Error creating logger for class " + aClass + ". Cause: " + t, t);
}
}
/**
* This method will switch the logging implementation to Log4J if Log4J is available on the classpath. This is
* useful in situations where you want to use Log4J to log iBATIS activity but commons logging is on the classpath.
* Note that this method is only effective for log classes obtained after calling this method. If you intend to use
* this method you should call it before calling any other iBATIS method.
*/
@SuppressWarnings("unchecked")
public static synchronized void selectLog4JLogging() {
try {
Resources.classForName("org.apache.log4j.Logger");
Class implClass = Resources.classForName("com.alibaba.druid.support.logging.Log4jImpl");
logConstructor = implClass.getConstructor(new Class[] { Class.class });
} catch (Throwable t) {
}
}
/**
* This method will switch the logging implementation to Java native logging if you are running in JRE 1.4 or above.
* This is useful in situations where you want to use Java native logging to log iBATIS activity but commons logging
* or Log4J is on the classpath. Note that this method is only effective for log classes obtained after calling this
* method. If you intend to use this method you should call it before calling any other iBATIS method.
*/
@SuppressWarnings("unchecked")
public static synchronized void selectJavaLogging() {
try {
Resources.classForName("java.util.logging.Logger");
Class implClass = Resources.classForName("com.alibaba.druid.support.logging.Jdk14LoggingImpl");
logConstructor = implClass.getConstructor(new Class[] { Class.class });
} catch (Throwable t) {
}
}
}
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
import java.lang.reflect.Constructor;
@SuppressWarnings("rawtypes")
public class LogFactory {
private static Constructor logConstructor;
static {
// TODO add slf4j logging
// 优先选择log4j,而非Apache Common Logging. 因为后者无法设置真实Log调用者的信息
tryImplementation("org.apache.log4j.Logger", "com.alibaba.druid.support.logging.Log4jImpl");
tryImplementation("java.util.logging.Logger", "com.alibaba.druid.support.logging.Jdk14LoggingImpl");
tryImplementation("org.slf4j.Logger", "com.alibaba.druid.support.logging.SLF4JImpl");
tryImplementation("org.apache.commons.logging.LogFactory",
"com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl");
if (logConstructor == null) {
try {
logConstructor = NoLoggingImpl.class.getConstructor(String.class);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}
@SuppressWarnings("unchecked")
private static void tryImplementation(String testClassName, String implClassName) {
if (logConstructor != null) {
return;
}
try {
Resources.classForName(testClassName);
Class implClass = Resources.classForName(implClassName);
logConstructor = implClass.getConstructor(new Class[] { String.class });
Class<?> declareClass = logConstructor.getDeclaringClass();
if (!Log.class.isAssignableFrom(declareClass)) {
logConstructor = null;
}
try {
logConstructor.newInstance(LogFactory.class.getName());
} catch (Throwable t) {
logConstructor = null;
}
} catch (Throwable t) {
// skip
}
}
public static Log getLog(Class clazz) {
return getLog(clazz.getName());
}
public static Log getLog(String loggerName) {
try {
return (Log) logConstructor.newInstance(new Object[] { loggerName });
} catch (Throwable t) {
throw new RuntimeException("Error creating logger for logger '" + loggerName + "'. Cause: " + t, t);
}
}
@SuppressWarnings("unchecked")
public static synchronized void selectLog4JLogging() {
try {
Resources.classForName("org.apache.log4j.Logger");
Class implClass = Resources.classForName("com.alibaba.druid.support.logging.Log4jImpl");
logConstructor = implClass.getConstructor(new Class[] { String.class });
} catch (Throwable t) {
}
}
@SuppressWarnings("unchecked")
public static synchronized void selectJavaLogging() {
try {
Resources.classForName("java.util.logging.Logger");
Class implClass = Resources.classForName("com.alibaba.druid.support.logging.Jdk14LoggingImpl");
logConstructor = implClass.getConstructor(new Class[] { String.class });
} catch (Throwable t) {
}
}
}
@@ -1,97 +1,101 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
public class NoLoggingImpl implements Log {
private int infoCount;
private int errorCount;
private int warnCount;
private Class<?> clazz;
public NoLoggingImpl(Class<?> clazz){
this.clazz = clazz;
}
public boolean isDebugEnabled() {
return false;
}
public void error(String s, Throwable e) {
error(s);
if (e != null) {
e.printStackTrace();
}
}
public void error(String s) {
errorCount++;
if (s != null) {
System.err.println(clazz.getClass().getName() + " : " + s);
}
}
public void debug(String s) {
}
public void debug(String s, Throwable e) {
}
public void warn(String s) {
warnCount++;
}
@Override
public void warn(String s, Throwable e) {
warnCount++;
}
public int getErrorCount() {
return errorCount;
}
@Override
public int getWarnCount() {
return warnCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
@Override
public boolean isInfoEnabled() {
return false;
}
@Override
public void info(String s) {
infoCount++;
}
@Override
public boolean isWarnEnabled() {
return false;
}
public int getInfoCount() {
return infoCount;
}
}
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.support.logging;
public class NoLoggingImpl implements Log {
private int infoCount;
private int errorCount;
private int warnCount;
private String loggerName;
public NoLoggingImpl(String loggerName){
this.loggerName = loggerName;
}
public String getLoggerName() {
return this.loggerName;
}
public boolean isDebugEnabled() {
return false;
}
public void error(String s, Throwable e) {
error(s);
if (e != null) {
e.printStackTrace();
}
}
public void error(String s) {
errorCount++;
if (s != null) {
System.err.println(loggerName + " : " + s);
}
}
public void debug(String s) {
}
public void debug(String s, Throwable e) {
}
public void warn(String s) {
warnCount++;
}
@Override
public void warn(String s, Throwable e) {
warnCount++;
}
public int getErrorCount() {
return errorCount;
}
@Override
public int getWarnCount() {
return warnCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
@Override
public boolean isInfoEnabled() {
return false;
}
@Override
public void info(String s) {
infoCount++;
}
@Override
public boolean isWarnEnabled() {
return false;
}
public int getInfoCount() {
return infoCount;
}
}
@@ -20,102 +20,104 @@ import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
public class SLF4JImpl implements Log {
private static final String callerFQCN = SLF4JImpl.class.getName();
private static final Logger testLogger = LoggerFactory.getLogger(SLF4JImpl.class);
static {
//if the logger is not a LocationAwareLogger instance, it can not get correct stack StackTraceElement
//so ignore this implementation.
if (!(testLogger instanceof LocationAwareLogger)) {
throw new UnsupportedOperationException(testLogger.getClass()+" is not a suitable logger");
}
}
private int errorCount;
private int warnCount;
private int infoCount;
private LocationAwareLogger log;
public SLF4JImpl(Class<?> clazz) {
Logger log = LoggerFactory.getLogger(clazz);
if (log instanceof LocationAwareLogger) {
this.log = (LocationAwareLogger) log;
}
}
@Override
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
@Override
public void error(String msg, Throwable e) {
log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, e);
errorCount++;
}
@Override
public void error(String msg) {
log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, null);
errorCount++;
}
@Override
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
@Override
public void info(String msg) {
infoCount++;
log.log(null, callerFQCN, LocationAwareLogger.INFO_INT, msg, null, null);
}
@Override
public void debug(String msg) {
log.log(null, callerFQCN, LocationAwareLogger.DEBUG_INT, msg, null, null);
}
@Override
public void debug(String msg, Throwable e) {
log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, e);
}
@Override
public boolean isWarnEnabled() {
return log.isWarnEnabled();
}
@Override
public void warn(String msg) {
log.log(null, callerFQCN, LocationAwareLogger.WARN_INT, msg, null, null);
warnCount++;
}
@Override
public void warn(String msg, Throwable e) {
log.log(null, callerFQCN, LocationAwareLogger.WARN_INT, msg, null, e);
warnCount++;
}
@Override
public int getErrorCount() {
return errorCount;
}
@Override
public int getWarnCount() {
return warnCount;
}
@Override
public int getInfoCount() {
return infoCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
private static final String callerFQCN = SLF4JImpl.class.getName();
private static final Logger testLogger = LoggerFactory.getLogger(SLF4JImpl.class);
static {
// if the logger is not a LocationAwareLogger instance, it can not get correct stack StackTraceElement
// so ignore this implementation.
if (!(testLogger instanceof LocationAwareLogger)) {
throw new UnsupportedOperationException(testLogger.getClass() + " is not a suitable logger");
}
}
private int errorCount;
private int warnCount;
private int infoCount;
private LocationAwareLogger log;
public SLF4JImpl(Class<?> clazz){
this.log = (LocationAwareLogger) LoggerFactory.getLogger(clazz);
}
public SLF4JImpl(String loggerName){
this.log = (LocationAwareLogger) LoggerFactory.getLogger(loggerName);
}
@Override
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
@Override
public void error(String msg, Throwable e) {
log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, e);
errorCount++;
}
@Override
public void error(String msg) {
log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, null);
errorCount++;
}
@Override
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
@Override
public void info(String msg) {
infoCount++;
log.log(null, callerFQCN, LocationAwareLogger.INFO_INT, msg, null, null);
}
@Override
public void debug(String msg) {
log.log(null, callerFQCN, LocationAwareLogger.DEBUG_INT, msg, null, null);
}
@Override
public void debug(String msg, Throwable e) {
log.log(null, callerFQCN, LocationAwareLogger.ERROR_INT, msg, null, e);
}
@Override
public boolean isWarnEnabled() {
return log.isWarnEnabled();
}
@Override
public void warn(String msg) {
log.log(null, callerFQCN, LocationAwareLogger.WARN_INT, msg, null, null);
warnCount++;
}
@Override
public void warn(String msg, Throwable e) {
log.log(null, callerFQCN, LocationAwareLogger.WARN_INT, msg, null, e);
warnCount++;
}
@Override
public int getErrorCount() {
return errorCount;
}
@Override
public int getWarnCount() {
return warnCount;
}
@Override
public int getInfoCount() {
return infoCount;
}
@Override
public void resetStat() {
errorCount = 0;
warnCount = 0;
infoCount = 0;
}
}
@@ -57,6 +57,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
@@ -1079,7 +1080,7 @@ public class WallVisitorUtils {
}
}
if (isWhereOrHaving(x)) {
if (!(x.getParent() instanceof ValuesClause)) {
addViolation(visitor, ErrorCode.FUNCTION_DENY, "deny function : " + methodName, x);
}
}
@@ -0,0 +1,39 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed 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.
*/
package com.alibaba.druid.bvt.filter.wall;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.druid.wall.WallProvider;
import com.alibaba.druid.wall.spi.MySqlWallProvider;
public class MySqlWallTest_concat extends TestCase {
public void test_true() throws Exception {
WallProvider provider = new MySqlWallProvider();
provider.getConfig().setSelectHavingAlwayTrueCheck(true);
Assert.assertTrue(provider.checkValid(//
"select * from tb_product_word where name='' or CONCAT(name,style)='' or CONCAT(shop,style)='' or CONCAT(ename,style)=''"));
Assert.assertEquals(1, provider.getTableStats().size());
Assert.assertTrue(provider.getTableStats().containsKey("tb_product_word"));
}
}
@@ -0,0 +1,49 @@
package com.alibaba.druid.bvt.pool.dynamic;
import java.lang.reflect.Field;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceStatLogger;
import com.alibaba.druid.pool.DruidDataSourceStatLoggerImpl;
import com.alibaba.druid.support.logging.Log;
public class DruidDataSourceStatLoggerImplTest extends TestCase {
private DruidDataSource dataSource;
private Log statLog;
protected void setUp() throws Exception {
Field logField = DruidDataSourceStatLoggerImpl.class.getDeclaredField("LOG");
logField.setAccessible(true);
statLog = (Log) logField.get(null);
statLog.resetStat();
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setTestOnBorrow(false);
dataSource.setConnectionProperties("a=3;b=4");
dataSource.setFilters("stat");
dataSource.init();
}
protected void tearDown() throws Exception {
dataSource.close();
}
public void test_connectPropertiesChange() throws Exception {
Assert.assertTrue(dataSource.isWrapperFor(DruidDataSourceStatLogger.class));
Assert.assertTrue(dataSource.isWrapperFor(DruidDataSourceStatLoggerImpl.class));
DruidDataSourceStatLoggerImpl loggerImpl = dataSource.unwrap(DruidDataSourceStatLoggerImpl.class);
Assert.assertSame(statLog, loggerImpl.getLogger());
dataSource.setConnectionProperties("druid.stat.loggerName=xxx");
Assert.assertNotSame(statLog, loggerImpl.getLogger());
}
}
@@ -1,8 +0,0 @@
package com.alibaba.druid.bvt.pool.vendor;
import junit.framework.TestCase;
public class MySqlValidConnectionCheckerTest extends TestCase {
}
@@ -204,8 +204,9 @@ public class DruidStatServiceTest extends TestCase {
String result = DruidStatService.getInstance().service("/activeConnectionStackTrace.json");
Map<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<String> contentList = (List<String>) resultMap.get("Content");
Object first = contentList.get(0);
assertThat(contentList.get(0), is(not(nullValue())));
assertThat(first, is(not(nullValue())));
// close connection at last.
stmt.close();
conn.close();
@@ -23,9 +23,12 @@ import static org.junit.Assert.assertThat;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -38,13 +41,12 @@ import com.alibaba.druid.util.JdbcUtils;
/**
* Multiple data source test case.
*/
public class DruidStatServiceTest2 {
public class DruidStatServiceTest2 extends TestCase {
private DruidDataSource dataSource;
private DruidDataSource dataSource2;
// every test, two data source initialized.
@Before
public void setUp() throws Exception {
// DruidStatService is singleton, reset all for other testcase.
DruidStatService.getInstance().service("/reset-all.json");
@@ -62,13 +64,11 @@ public class DruidStatServiceTest2 {
dataSource2.init();
}
@After
public void tearDown() throws Exception {
JdbcUtils.close(dataSource);
JdbcUtils.close(dataSource2);
}
@Test
public void test_statService_getSqlList() throws Exception {
String sql = "select 1";
@@ -106,7 +106,6 @@ public class DruidStatServiceTest2 {
}
}
@Test
public void test_statService_getSqlById() throws Exception {
String sql = "select 1";
@@ -155,7 +154,6 @@ public class DruidStatServiceTest2 {
assertThat(resultMap.get("Content"), is(nullValue()));
}
@Test
public void test_statService_getDataSourceList() throws Exception {
String result = DruidStatService.getInstance().service("/datasource.json");
Map<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
@@ -167,5 +165,9 @@ public class DruidStatServiceTest2 {
assertThat((Integer) dataSourceStat.get("PoolingCount"), equalTo(0));
assertThat((Integer) dataSourceStat.get("ActiveCount"), equalTo(0));
}
public void test_getWallStatMap() throws Exception {
DruidStatService.getInstance().getWallStatMap(Collections.<String, String>emptyMap());
}
}