From c763fff574b50eb198a6820d7d8cb0eb4eab5db5 Mon Sep 17 00:00:00 2001 From: Jongho Moon Date: Wed, 10 Dec 2014 11:47:21 +0900 Subject: [PATCH] [#120] Removed lucy-core dependency --- web/pom.xml | 43 -- .../db/mybatis/plugin/BindLogFormatter.java | 29 + .../util/DefaultBindingLogFormatter.java | 88 +++ .../PreparedStatementParameterLogger.java | 525 ++++++++++++++++++ .../db/mybatis/plugin/util/SqlUtils.java | 27 + 5 files changed, 669 insertions(+), 43 deletions(-) create mode 100644 web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/BindLogFormatter.java create mode 100644 web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/DefaultBindingLogFormatter.java create mode 100644 web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/PreparedStatementParameterLogger.java create mode 100644 web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/SqlUtils.java diff --git a/web/pom.xml b/web/pom.xml index b58fe2cc5..6bc611929 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -303,49 +303,6 @@ - - com.nhncorp.lucy - lucy-core - 1.7.7 - - - freemarker - org.freemarker - - - lucy-xss - com.nhncorp.lucy - - - spring-security-taglibs - org.springframework.security - - - spring-security-config - org.springframework.security - - - spring-security-web - org.springframework.security - - - spring-security-core - org.springframework.security - - - xercesImpl - xerces - - - jaxen - jaxen - - - xalan - xalan - - - commons-fileupload commons-fileupload diff --git a/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/BindLogFormatter.java b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/BindLogFormatter.java new file mode 100644 index 000000000..6d979a2d7 --- /dev/null +++ b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/BindLogFormatter.java @@ -0,0 +1,29 @@ +package com.nhncorp.lucy.spring.db.mybatis.plugin; + +import java.util.List; +import java.util.Properties; + +/** + * Bind Log의 format결정하는 interface + * + * @author Web Platform Development Lab + * @author emeroad + * @see com.nhncorp.lucy.spring.db.mybatis.plugin.util.DefaultBindingLogFormatter + * @since 1.7.4 + */ +public interface BindLogFormatter { + + /** + * query에 bind 변수를 치환위한 method + * @param query 원본 query + * @param parameters 바인딩 변수 + * @return 원본 query에 바인딩 변수를 치환한 query + */ + String format(String query, List parameters); + + /** + * 옵션 설정용 properties + * @param properties 옵션 properties + */ + void setProperties(Properties properties); +} diff --git a/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/DefaultBindingLogFormatter.java b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/DefaultBindingLogFormatter.java new file mode 100644 index 000000000..d2ba9c18a --- /dev/null +++ b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/DefaultBindingLogFormatter.java @@ -0,0 +1,88 @@ +package com.nhncorp.lucy.spring.db.mybatis.plugin.util; + +import com.nhncorp.lucy.spring.db.mybatis.plugin.BindLogFormatter; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.sql.Date; +import java.util.List; +import java.util.Properties; + +/** + * {@link org.apache.ibatis.mapping.BoundSql} 을 중간에 가로체 {@link org.apache.ibatis.mapping.BoundSql#getSql()} 의 동작을 변경하기 위한 proxy + * + * @author Web Platform Development Lab + * @author emeroad + * @since 1.7.4 + */ +public class DefaultBindingLogFormatter implements BindLogFormatter { + + private final Log logger = LogFactory.getLog(this.getClass()); + private boolean removeWhitespace = true; + + public void setRemoveWhitespace(boolean removeWhitespace) { + this.removeWhitespace = removeWhitespace; + } + + public String format(String query, List parameters) { + if (isEmpty(query)) { + return query; + } + if (removeWhitespace) { + query = SqlUtils.removeBreakingWhitespace(query); + } + StringBuilder builder = new StringBuilder(query.length() << 1); + + int index = 0; + int queryPrev = 0; + + for (int i = 0; i < query.length(); ) { + if (parameters != null && query.charAt(i) == '?') { + builder.append(query.substring(queryPrev, i)); + builder.append(parameters.size() > index ? convert(parameters.get(index)) : null); + queryPrev = ++i; + index++; + continue; + } + i++; + } + if (queryPrev < query.length()) { + builder.append(query.substring(queryPrev)); + } + + return builder.toString(); + } + + @Override + public void setProperties(Properties properties) { + if (properties == null) { + return; + } + String removeWhitespace = properties.getProperty("removeWhitespace"); + if (removeWhitespace != null) { + if (logger.isInfoEnabled()) { + logger.info("DefaultBindingLogFormatter removeWhitespace:" + removeWhitespace); + } + this.removeWhitespace = Boolean.parseBoolean(removeWhitespace); + } + } + + public static boolean isEmpty(String str) { + return str == null || str.length() == 0; + } + + + /** + * Convert. + * + * @param paramter the paramter + * @return the string + */ + private String convert(Object paramter) { + if (paramter instanceof String || paramter instanceof Date) { + return "'" + paramter + "'"; + } + + return String.valueOf(paramter); + } +} diff --git a/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/PreparedStatementParameterLogger.java b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/PreparedStatementParameterLogger.java new file mode 100644 index 000000000..bcf298b69 --- /dev/null +++ b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/PreparedStatementParameterLogger.java @@ -0,0 +1,525 @@ +package com.nhncorp.lucy.spring.db.mybatis.plugin.util; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.LinkedList; +import java.util.List; + +/** + * {@link PreparedStatement} 에 사용된 바인딩 변수를 추출하는 util + * + * @author Web Platform Development Lab + * @author emeroad + * @see PreparedStatement + * @since 1.7.4 + */ +public class PreparedStatementParameterLogger implements PreparedStatement { + + private List parameterList = new ArrayList(); + + private void setColumn(Object value) { + parameterList.add(value); + } + + public List getParameters() { + List parameterString = new ArrayList(parameterList.size()); + for (Object value : parameterList) { + if (value == null) { + parameterString.add("null"); + } else { + parameterString.add(value.toString()); + } + } + return parameterString; + } + + @Override + public ResultSet executeQuery() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int executeUpdate() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setNull(int parameterIndex, int sqlType) throws SQLException { + setColumn(null); + } + + @Override + public void setBoolean(int parameterIndex, boolean x) throws SQLException { + setColumn(x); + } + + @Override + public void setByte(int parameterIndex, byte x) throws SQLException { + setColumn(x); + } + + @Override + public void setShort(int parameterIndex, short x) throws SQLException { + setColumn(x); + } + + @Override + public void setInt(int parameterIndex, int x) throws SQLException { + setColumn(x); + } + + @Override + public void setLong(int parameterIndex, long x) throws SQLException { + setColumn(x); + } + + @Override + public void setFloat(int parameterIndex, float x) throws SQLException { + setColumn(x); + } + + @Override + public void setDouble(int parameterIndex, double x) throws SQLException { + setColumn(x); + } + + @Override + public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { + setColumn(x); + } + + @Override + public void setString(int parameterIndex, String x) throws SQLException { + setColumn(x); + } + + @Override + public void setBytes(int parameterIndex, byte[] x) throws SQLException { + setColumn(x); + } + + @Override + public void setDate(int parameterIndex, Date x) throws SQLException { + setColumn(x); + } + + @Override + public void setTime(int parameterIndex, Time x) throws SQLException { + setColumn(x); + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { + setColumn(x); + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { + setColumn(x); + } + + @Override + public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { + setColumn(x); + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { + setColumn(x); + } + + @Override + public void clearParameters() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { + setColumn(x); + } + + @Override + public void setObject(int parameterIndex, Object x) throws SQLException { + setColumn(x); + } + + @Override + public boolean execute() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void addBatch() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { + setColumn(reader); + } + + @Override + public void setRef(int parameterIndex, Ref x) throws SQLException { + setColumn(x); + } + + @Override + public void setBlob(int parameterIndex, Blob x) throws SQLException { + setColumn(x); + } + + @Override + public void setClob(int parameterIndex, Clob x) throws SQLException { + setColumn(x); + } + + @Override + public void setArray(int parameterIndex, Array x) throws SQLException { + setColumn(x); + } + + @Override + public ResultSetMetaData getMetaData() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { + setColumn(x); + } + + @Override + public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { + setColumn(x); + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { + setColumn(x); + } + + @Override + public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { + setColumn(null); + } + + @Override + public void setURL(int parameterIndex, URL x) throws SQLException { + setColumn(x); + } + + @Override + public ParameterMetaData getParameterMetaData() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setRowId(int parameterIndex, RowId x) throws SQLException { + setColumn(x); + } + + @Override + public void setNString(int parameterIndex, String value) throws SQLException { + setColumn(value); + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { + setColumn(value); + } + + @Override + public void setNClob(int parameterIndex, NClob value) throws SQLException { + setColumn(value); + } + + @Override + public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { + setColumn(reader); + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { + setColumn(inputStream); + } + + @Override + public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { + setColumn(reader); + } + + @Override + public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { + setColumn(xmlObject); + } + + @Override + public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { + setColumn(x); + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { + setColumn(x); + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { + setColumn(x); + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { + setColumn(reader); + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { + setColumn(x); + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { + setColumn(x); + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { + setColumn(reader); + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { + setColumn(value); + } + + @Override + public void setClob(int parameterIndex, Reader reader) throws SQLException { + setColumn(reader); + } + + @Override + public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { + setColumn(inputStream); + } + + @Override + public void setNClob(int parameterIndex, Reader reader) throws SQLException { + setColumn(reader); + } + + @Override + public ResultSet executeQuery(String sql) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int executeUpdate(String sql) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void close() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getMaxFieldSize() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setMaxFieldSize(int max) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getMaxRows() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setMaxRows(int max) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setEscapeProcessing(boolean enable) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getQueryTimeout() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setQueryTimeout(int seconds) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void cancel() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public SQLWarning getWarnings() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void clearWarnings() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setCursorName(String name) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean execute(String sql) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public ResultSet getResultSet() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getUpdateCount() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getMoreResults() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setFetchDirection(int direction) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getFetchDirection() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setFetchSize(int rows) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getFetchSize() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getResultSetConcurrency() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getResultSetType() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void addBatch(String sql) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void clearBatch() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int[] executeBatch() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public Connection getConnection() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getMoreResults(int current) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public ResultSet getGeneratedKeys() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int executeUpdate(String sql, String[] columnNames) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean execute(String sql, int[] columnIndexes) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean execute(String sql, String[] columnNames) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public int getResultSetHoldability() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isClosed() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public void setPoolable(boolean poolable) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isPoolable() throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public T unwrap(Class iface) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + throw new UnsupportedOperationException(); + } +} diff --git a/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/SqlUtils.java b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/SqlUtils.java new file mode 100644 index 000000000..03bd84092 --- /dev/null +++ b/web/src/main/java/com/nhncorp/lucy/spring/db/mybatis/plugin/util/SqlUtils.java @@ -0,0 +1,27 @@ +package com.nhncorp.lucy.spring.db.mybatis.plugin.util; + +import java.util.StringTokenizer; + +/** + * query 처리용 util 클래스 + * + * @author Web Platform Development Lab + * @author emeroad + * @since 1.7.4 + */ +public class SqlUtils { + /** + * query의 빈줄" \t\n\r\f"을 모두 제거하여 한줄로 만든다. + * @param original 원본 query + * @return 빈줄이 제거된 query + */ + public static String removeBreakingWhitespace(String original) { + StringTokenizer whitespaceStripper = new StringTokenizer(original); + StringBuilder builder = new StringBuilder(); + while (whitespaceStripper.hasMoreTokens()) { + builder.append(whitespaceStripper.nextToken()); + builder.append(" "); + } + return builder.toString(); + } +}