org.sakaiproject.util.conversion.CheckConnection.java Source code

Java tutorial

Introduction

Here is the source code for org.sakaiproject.util.conversion.CheckConnection.java

Source

/**********************************************************************************
 * $URL: https://source.sakaiproject.org/svn/kernel/trunk/kernel-util/src/main/java/org/sakaiproject/util/conversion/CheckConnection.java $
 * $Id: CheckConnection.java 101634 2011-12-12 16:44:33Z aaronz@vt.edu $
 ***********************************************************************************
 *
 * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Sakai Foundation
 *
 * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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 org.sakaiproject.util.conversion;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.util.ByteStorageConversion;

/**
 * @author ieb
 * @deprecated unused as of 12 Dec 2011, planned for removal after 2.9
 */
public class CheckConnection {
    private static final Log log = LogFactory.getLog(CheckConnection.class);

    public void check(DataSource tds) throws Exception {
        Connection connection = null;
        Statement statement = null;
        try {
            connection = tds.getConnection();
            statement = connection.createStatement();
            try {
                statement.execute("drop table blobtest");
            } catch (Exception ex) {
            }
            statement.execute("create table blobtest ( id int, bval longtext, primary key(id) )");

            testUTF8Transport(connection);

            try {
                statement.execute("drop table blobtest");
            } catch (Exception ex) {
            }

        } finally {
            try {
                statement.close();
            } catch (Exception ex) {

            }
            try {
                connection.close();
            } catch (Exception ex) {

            }
        }

    }

    public void testUTF8Transport(Connection connection) throws Exception {
        /*
         * byte[] b = new byte[102400]; byte[] b2 = new byte[102400]; byte[] b3 =
         * new byte[102400]; char[] cin = new char[102400]; Random r = new
         * Random(); r.nextBytes(b);
         */
        byte[] bin = new byte[102400];
        char[] cin = new char[102400];
        byte[] bout = new byte[102400];

        {
            int i = 0;
            for (int bx = 0; i < bin.length; bx++) {
                bin[i++] = (byte) bx;
            }
        }
        ByteStorageConversion.toChar(bin, 0, cin, 0, cin.length);
        String sin = new String(cin);

        char[] cout = sin.toCharArray();
        ByteStorageConversion.toByte(cout, 0, bout, 0, cout.length);

        for (int i = 0; i < bin.length; i++) {
            if (bin[i] != bout[i]) {
                throw new Exception(
                        "Internal Byte conversion failed at " + bin[i] + "=>" + (int) cin[i] + "=>" + bout[i]);
            }
        }

        PreparedStatement statement = null;
        PreparedStatement statement2 = null;
        ResultSet rs = null;
        try {
            statement = connection.prepareStatement("insert into blobtest ( id, bval ) values ( ?, ? )");
            statement.clearParameters();
            statement.setInt(1, 20);
            statement.setString(2, sin);
            statement.executeUpdate();

            statement2 = connection.prepareStatement("select bval from blobtest where id =  ? ");
            statement2.clearParameters();
            statement2.setInt(1, 20);
            rs = statement2.executeQuery();
            String sout = null;
            if (rs.next()) {
                sout = rs.getString(1);
            }

            if (sout == null)
                throw new IllegalStateException("String sout == null!");
            cout = sout.toCharArray();
            ByteStorageConversion.toByte(cout, 0, bout, 0, cout.length);

            if (sin.length() != sout.length()) {
                throw new Exception("UTF-8 Data was lost communicating with the database, please "
                        + "check connection string and default table types (Truncation/Expansion)");
            }

            for (int i = 0; i < bin.length; i++) {
                if (bin[i] != bout[i]) {
                    throw new Exception("UTF-8 Data was corrupted communicating with the database, "
                            + "please check connectionstring and default table types (Conversion)" + "" + bin[i]
                            + "=>" + (int) cin[i] + "=>" + bout[i]);
                }
            }

            log.info("DB Connection passes UTF-8 tests");

        } finally {
            try {
                rs.close();
            } catch (Exception ex) {

            }
            try {
                statement2.close();
            } catch (Exception ex) {

            }
            try {
                statement.close();
            } catch (Exception ex) {

            }
        }

    }

}