Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source
   * Copyright 2006, Red Hat Middleware LLC, and individual contributors
   * as indicated by the @author tags.
   * See the copyright.txt in the distribution for a
   * full listing of individual contributors.
   * This copyrighted material is made available to anyone wishing to use,
   * modify, copy, or redistribute it subject to the terms and conditions
   * of the GNU Lesser General Public License, v. 2.1.
  * This program is distributed in the hope that it will be useful, but WITHOUT A
  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  * You should have received a copy of the GNU Lesser General Public License,
  * v.2.1 along with this distribution; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  * MA  02110-1301, USA.
  *
  * (C) 2005-2006,
  * @author JBoss Inc.
  */
 /*
  * Copyright (C) 2000, 2001,
  *
  * Arjuna Solutions Limited,
  * Newcastle upon Tyne,
  * Tyne and Wear,
  * UK.
  *
  * $Id: JDBCImple.java 2342 2006-03-30 13:06:17Z  $
  */
 
 package com.arjuna.ats.internal.arjuna.objectstore.jdbc;
 
 
 
An object store implementation which uses a JDBC database for maintaining object states. All states are maintained within a single table.
 
 
 public abstract class JDBCImple_driver {
 
 	// protected Connection connection;
 	protected String tableName;
 	private JDBCAccess jdbcAccess;
 
 	public boolean commit_state(Uid objUidString typeName)
 		// Taken this requirement from ObjStoreBrowser
 		if (typeName.startsWith("/"))
 			typeName = typeName.substring(1);
 
 		boolean result = false;
 		PreparedStatement pstmt = null;
 		PreparedStatement pstmt2 = null;
 		try {
 			Connection connection = .getConnection();
 			// Delete any previously committed state
 			pstmt = connection
 					.prepareStatement("DELETE FROM "
 							+ " WHERE UidString = ? AND TypeName = ? AND StateType = ?");
 
 			pstmt.setString(1, objUid.stringForm());
 			pstmt.setString(2, typeName);
 			pstmt.setInt(3, 1);
 
 			int rowcount = pstmt.executeUpdate();
 			if (rowcount > 0) {
 			}
 
 			// now do the commit itself:
 			pstmt2 = connection
 					.prepareStatement("UPDATE "
 							+ " SET StateType = 1 WHERE UidString = ? AND TypeName = ? AND StateType = "
 
 			pstmt2.setString(1, objUid.stringForm());
 			pstmt2.setString(2, typeName);
			int rowcount2 = pstmt2.executeUpdate();
			if (rowcount2 > 0) {
				result = true;
				connection.commit();
else {
				connection.rollback();
			}
			connection.close();
catch (SQLException e) {
finally {
			if (pstmt != null) {
				try {
					pstmt.close();
catch (SQLException e) {
					// Ignore
				}
			}
			if (pstmt2 != null) {
				try {
					pstmt2.close();
catch (SQLException e) {
					// Ignore
				}
			}
		}
		return result;
	}
	public boolean hide_state(Uid objUidString typeName)
		// Taken this requirement from ObjStoreBrowser
		if (typeName.startsWith("/"))
			typeName = typeName.substring(1);
		boolean result = false;
		PreparedStatement pstmt = null;
		try {
			pstmt = connection
					.prepareStatement("UPDATE "
" SET Hidden = 1 WHERE UidString = ? AND TypeName = ? AND Hidden = 0");
			pstmt.setString(1, objUid.stringForm());
			pstmt.setString(2, typeName);
			int rowcount = pstmt.executeUpdate();
			if (rowcount > 0) {
				result = true;
			}
			connection.commit();
			connection.close();
catch (SQLException e) {
finally {
			if (pstmt != null) {
				try {
					pstmt.close();
catch (SQLException e) {
					// Ignore
				}
			}
		}
		return result;
	}
	public boolean reveal_state(Uid objUidString typeName)
		// Taken this requirement from ObjStoreBrowser
		if (typeName.startsWith("/"))
			typeName = typeName.substring(1);
		boolean result = false;
		PreparedStatement pstmt = null;
		try {
			pstmt = connection
					.prepareStatement("UPDATE "
" SET Hidden = 0 WHERE UidString = ? AND TypeName = ? AND Hidden = 1");
			pstmt.setString(1, objUid.stringForm());
			pstmt.setString(2, typeName);
			int rowcount = pstmt.executeUpdate();
			if (rowcount > 0) {
				result = true;
			}
			connection.commit();
			connection.close();
catch (SQLException e) {
finally {
			if (pstmt != null) {
				try {
					pstmt.close();
catch (SQLException e) {
					// Ignore
				}
			}
		}
		return result;
	}

currentState - determine the current state of an object. State search is ordered OS_UNCOMMITTED, OS_UNCOMMITTED_HIDDEN, OS_COMMITTED, OS_COMMITTED_HIDDEN
	public int currentState(Uid objUidString typeName)
		// Taken this requirement from ObjStoreBrowser
		if (typeName.startsWith("/"))
			typeName = typeName.substring(1);
		int theState = .;
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		try {
			pstmt = connection
					.prepareStatement("SELECT StateType, Hidden FROM "
" WHERE UidString = ? AND TypeName = ?");
			pstmt.setString(1, objUid.stringForm());
			pstmt.setString(2, typeName);
			rs = pstmt.executeQuery();
			// we may have multiple states. need to sort out the order of
			// precedence
			// without making multiple round trips out to the db. this gets
			// a bit messy:
			boolean have_OS_UNCOMMITTED = false;
			boolean have_OS_COMMITTED = false;
			boolean have_OS_UNCOMMITTED_HIDDEN = false;
			boolean have_OS_COMMITTED_HIDDEN = false;
			while (rs.next()) {
				int stateStatus = rs.getInt(1);
				int hidden = rs.getInt(2);
				switch (stateStatus) {
					if (hidden == 0)
						have_OS_UNCOMMITTED = true;
					else
						have_OS_UNCOMMITTED_HIDDEN = true;
					break;
					if (hidden == 0)
						have_OS_COMMITTED = true;
					else
						have_OS_COMMITTED_HIDDEN = true;
					break;
				}
			}
			connection.commit();
			connection.close();
			// examine in reverse order:
			if (have_OS_COMMITTED_HIDDEN) {
			}
			if (have_OS_COMMITTED) {
			}
			if (have_OS_UNCOMMITTED_HIDDEN) {
			}
			if (have_OS_UNCOMMITTED) {
			}
catch (SQLException e) {
			theState = .;
finally {
			if (rs != null) {
				try {
					rs.close();
catch (SQLException e) {
					// ignore
				}
			}
			if (pstmt != null) {
				try {
					pstmt.close();
catch (SQLException e) {
					// Ignore
				}
			}
		}
		return theState;
	}

allObjUids - Given a type name, return an ObjectState that contains all of the uids of objects of that type.
	public boolean allObjUids(String typeNameInputObjectState stateint match)
		// Taken this requirement from ObjStoreBrowser
		if (typeName.startsWith("/"))
			typeName = typeName.substring(1);
		try {
			Statement stmt = connection.createStatement();
			ResultSet rs = null;
			try {
				/*
				 * Not used enough to warrant a PreparedStatement.
				 */
				rs = stmt.executeQuery("SELECT DISTINCT UidString FROM "
 + " WHERE TypeName = '" + typeName + "'");
				boolean finished = false;
				while (!finished && rs.next()) {
					Uid theUid = null;
					try {
						theUid = new Uid(rs.getString(1));
						UidHelper.packInto(theUidstore);
catch (IOException ex) {
						return false;
catch (Exception e) {
						finished = true;
					}
				}
				connection.commit();
				connection.close();
catch (Exception e) {
finally {
				if (rs != null)
					rs.close();
				if (stmt != null)
					stmt.close();
			}
			UidHelper.packInto(Uid.nullUid(), store);
			state.setBuffer(store.buffer());
			store = null;
			return true;
catch (Exception e) {
			return false;
		}
	}
	public boolean allTypes(InputObjectState foundTypes)
		try {
			Statement stmt = connection.createStatement();
			ResultSet rs = null;
			try {
				/*
				 * Not used enough to warrant a PreparedStatement.
				 */
				rs = stmt.executeQuery("SELECT DISTINCT TypeName FROM "
				boolean finished = false;
				while (!finished && rs.next()) {
					try {
						String type = rs.getString(1);
						store.packString(type);
catch (IOException ex) {
						return false;
catch (Exception e) {
						finished = true;
					}
				}
				connection.commit();
				connection.close();
catch (Exception e) {
finally {
				if (rs != null)
					rs.close();
				if (stmt != null)
					stmt.close();
			}
			store.packString("");
			foundTypes.setBuffer(store.buffer());
			return true;
catch (Exception e) {
			return false;
		}
	}
	public boolean remove_state(Uid objUidString typeNameint stateType)
		// Taken this requirement from ObjStoreBrowser
		if (typeName.startsWith("/"))
			typeName = typeName.substring(1);
		boolean result = false;
		if (typeName != null) {
			if ((stateType == .)
					|| (stateType == .)) {
				PreparedStatement pstmt = null;
				try {
					pstmt = connection
							.prepareStatement("DELETE FROM "
" WHERE UidString = ? AND TypeName = ? AND StateType = ?");
					pstmt.setString(1, objUid.stringForm());
					pstmt.setString(2, typeName);
					pstmt.setInt(3, stateType);
					if (pstmt.executeUpdate() > 0) {
						result = true;
					}
					connection.commit();
					connection.close();
catch (SQLException e) {
finally {
					if (pstmt != null) {
						try {
							pstmt.close();
catch (SQLException e) {
							// Ignore
						}
					}
				}
else {
				// can only remove (UN)COMMITTED objs
						Integer.toString(stateType), objUid);
			}
else {
		}
		return result;
	}
	public InputObjectState read_state(Uid objUidString typeName,
			int stateTypethrows ObjectStoreException {
		InputObjectState result = null;
		// Taken this requirement from ObjStoreBrowser
		if (typeName.startsWith("/"))
			typeName = typeName.substring(1);
		if ((stateType == .)
				|| (stateType == .)) {
			ResultSet rs = null;
			PreparedStatement pstmt = null;
			try {
				pstmt = connection
						.prepareStatement("SELECT ObjectState FROM "
" WHERE UidString = ? AND TypeName = ? AND StateType = ?");
				pstmt.setString(1, objUid.stringForm());
				pstmt.setString(2, typeName);
				pstmt.setInt(3, stateType);
				rs = pstmt.executeQuery();
				if (rs.next()) {
					byte[] buffer = rs.getBytes(1);
					if (buffer != null) {
						result = new InputObjectState(objUidtypeNamebuffer);
else {
					}
				}
				connection.commit();
				connection.close();
catch (SQLException e) {
finally {
				if (rs != null) {
					try {
						rs.close();
catch (SQLException e) {
						// Ignore
					}
				}
				if (pstmt != null) {
					try {
						pstmt.close();
catch (SQLException e) {
						// Ignore
					}
				}
			}
		}
		return result;
	}
	public boolean write_state(Uid objUidString typeName,
			OutputObjectState stateint stateTypethrows ObjectStoreException {
		// Taken this requirement from ObjStoreBrowser
		if (typeName.startsWith("/"))
			typeName = typeName.substring(1);
		boolean result = false;
		int imageSize = (intstate.length();
		if (imageSize > getMaxStateSize()) {
					imageSizegetMaxStateSize());
else if (imageSize > 0) {
			byte[] b = state.buffer();
			ResultSet rs = null;
			PreparedStatement pstmt = null;
			PreparedStatement pstmt2 = null;
			try {
				pstmt = connection
								"SELECT ObjectState, UidString, StateType, TypeName FROM "
" WHERE UidString = ? AND StateType = ? AND TypeName = ? FOR UPDATE",
				pstmt.setString(1, objUid.stringForm());
				pstmt.setInt(2, stateType);
				pstmt.setString(3, typeName);
				rs = pstmt.executeQuery();
				if (rs.next()) {
					updateBytes(rs, 1, b);
else {
					// TODO connection.get().commit();
					// not in database, do insert:
					pstmt2 = connection
							.prepareStatement("INSERT INTO "
" (StateType,Hidden,TypeName,UidString,ObjectState) VALUES (?,0,?,?,?)");
					pstmt2.setInt(1, stateType);
					pstmt2.setString(2, typeName);
					pstmt2.setString(3, objUid.stringForm());
					pstmt2.setBytes(4, b);
					pstmt2.executeUpdate();
				}
				connection.commit();
				connection.close();
				result = true;
catch (SQLException e) {
finally {
				if (rs != null) {
					try {
						rs.close();
catch (SQLException e) {
						// Ignore
					}
				}
				if (pstmt != null) {
					try {
						pstmt.close();
catch (SQLException e) {
						// Ignore
					}
				}
				if (pstmt2 != null) {
					try {
						pstmt2.close();
catch (SQLException e) {
						// Ignore
					}
				}
			}
		}
		return result;
	}

Set up the store for use.

	public void initialise(final JDBCAccess jdbcAccessString tableName,
			ObjectStoreEnvironmentBean jdbcStoreEnvironmentBean)
		this. = jdbcAccess;
		// connection = new ThreadLocal<Connection>() {
		//
		// @Override
		// protected Connection initialValue() {
		// try {
		// return jdbcAccess.getConnection();
		// } catch (Exception e) {
		// throw new RuntimeException(e);
		// }
		// }
		// };
		Connection connection = jdbcAccess.getConnection();
		Statement stmt = connection.createStatement();
		// table [type, object UID, format, blob]
		if (jdbcStoreEnvironmentBean.getDropTable()) {
			try {
				stmt.executeUpdate("DROP TABLE " + tableName);
catch (SQLException ex) {
				checkDropTableException(connectionex);
			}
		}
		if (jdbcStoreEnvironmentBean.getCreateTable()) {
			try {
				createTable(stmttableName);
catch (SQLException ex) {
			}
		}
		stmt.close();
		// This can be the case when triggering via EmptyObjectStore
		if (!connection.getAutoCommit()) {
			connection.commit();
		}
		connection.close();
		this. = tableName;
	}

Can be overridden by implementation-specific code to create the store table. Called from initialise() and addTable(), above.
	protected void createTable(Statement stmtString tableName)
			throws SQLException {
		String statement = "CREATE TABLE "
tableName
" (StateType INTEGER NOT NULL, Hidden INTEGER NOT NULL, "
"TypeName VARCHAR(255) NOT NULL, UidString VARCHAR(255) NOT NULL, ObjectState "
", PRIMARY KEY(UidString, TypeName, StateType))";
		stmt.executeUpdate(statement);
	}
		return "bytea";
	}
	protected abstract void checkCreateTableError(SQLException ex)
			throws SQLException;
	protected abstract void checkDropTableException(Connection connectionSQLException ex)
			throws SQLException;
	public int getMaxStateSize() {
		return 65535;
	}
	protected void updateBytes(ResultSet rsint ibyte[] b)
			throws SQLException {
		rs.updateBytes(ib);
	}
New to GrepCode? Check out our FAQ X