http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLiteSerializer.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLiteSerializer.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLiteSerializer.java deleted file mode 100644 index fe9b09a..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLiteSerializer.java +++ /dev/null @@ -1,338 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.pogo; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.Date; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.internal.DSCODE; -import com.gemstone.gemfire.internal.InternalDataSerializer; - -/** - * MapLiteSerializer serializes MapLite specifics. It is for internal use only. - * @author dpark - * - */ -abstract class MapLiteSerializer extends DataSerializer -{ - public static void write(Class cls, Object object, DataOutput out) throws IOException - { - if (cls == String.class) { - writeUTF((String) object, out); - } else if (cls == boolean.class || cls == Boolean.class) { - writeBoolean((Boolean) object, out); - } else if (cls == byte.class || cls == Byte.class) { - writeByte((Byte) object, out); - } else if (cls == char.class || cls == Character.class) { - writeCharacter((Character) object, out); - } else if (cls == double.class || cls == Double.class) { - writeDouble((Double) object, out); - } else if (cls == float.class || cls == Float.class) { - writeFloat((Float) object, out); - } else if (cls == int.class || cls == Integer.class) { - writeInteger((Integer) object, out); - } else if (cls == long.class || cls == Long.class) { - writeLong((Long) object, out); - } else if (cls == short.class || cls == Short.class) { - writeShort((Short) object, out); - } else if (cls == MapLite.class) { - writeMapLite((MapLite) object, out); - } else if (cls == Date.class) { - writeObject((Date) object, out); - } else if (cls == boolean[].class) { - writeBooleanArray((boolean[]) object, out); - } else if (cls == byte[].class) { - writeByteArray((byte[]) object, out); - } else if (cls == char[].class) { - writeCharArray((char[]) object, out); - } else if (cls == double[].class) { - writeDoubleArray((double[]) object, out); - } else if (cls == float[].class) { - writeFloatArray((float[]) object, out); - } else if (cls == int[].class) { - writeIntArray((int[]) object, out); - } else if (cls == long[].class) { - writeLongArray((long[]) object, out); - } else if (cls == short[].class) { - writeShortArray((short[]) object, out); - } else { - writeObject(object, out); - } - } - - public static Object read(Class cls, DataInput in) throws IOException, ClassNotFoundException - { - Object value; - if (cls == String.class) { - value = readUTF(in); - } else if (cls == boolean.class || cls == Boolean.class) { - value = readBoolean(in); - } else if (cls == byte.class || cls == Byte.class) { - value = readByte(in); - } else if (cls == char.class || cls == Character.class) { - value = readCharacter(in); - } else if (cls == double.class || cls == Double.class) { - value = readDouble(in); - } else if (cls == float.class || cls == Float.class) { - value = readFloat(in); - } else if (cls == int.class || cls == Integer.class) { - value = readInteger(in); - } else if (cls == long.class || cls == Long.class) { - value = readLong(in); - } else if (cls == short.class || cls == Short.class) { - value = readShort(in); - } else if (cls == MapLite.class) { - value = readMapLite(in); - } else if (cls == Date.class) { - value = readObject(in); - } else if (cls == boolean[].class) { - value = DataSerializer.readBooleanArray(in); - } else if (cls == byte[].class) { - value = DataSerializer.readByteArray(in); - } else if (cls == char[].class) { - value = DataSerializer.readCharacter(in); - } else if (cls == double[].class) { - value = DataSerializer.readByteArray(in); - } else if (cls == float[].class) { - value = DataSerializer.readByteArray(in); - } else if (cls == int[].class) { - value = DataSerializer.readByteArray(in); - } else if (cls == long[].class) { - value = DataSerializer.readByteArray(in); - } else if (cls == short[].class) { - value = DataSerializer.readByteArray(in); - } else { - value = DataSerializer.readObject(in); - } - return value; - } - - /** - * Writes the specified byte array to the output stream. This method is - * not thread safe. - * - * @param array The byte array to compress - * @param buffer The byte array buffer used as input to the deflater. This - * buffer must have enough space to hold the compressed data. - * @param compressor java.util.Deflater. - * @param output The data output stream. - * @throws IOException Thrown if unable to write to the output stream. - */ - public static void writeByteArray(byte array[], byte buffer[], Deflater compressor, DataOutput output) throws IOException - { - // Compress the bytes - compressor.setInput(array); - compressor.finish(); - int compressedDataLength = compressor.deflate(buffer); - DataSerializer.writeByteArray(buffer, compressedDataLength, output); - } - - /** - * Reads byte array from the input stream. This method is not thread safe. - * - * @param buffer The buffer to hold the decompressed data. This buffer - * must be large enough to hold the decompressed data. - * @param decompressor java.util.Inflater - * @param input The data input stream. - * @return Returns the actual byte array (not compressed) read from the - * input stream. - * @throws IOException Thrown if unable to read from the input stream or - * unable to decompress the data. - */ - public static byte[] readByteArray(byte buffer[], Inflater decompressor, DataInput input) throws IOException - { - byte compressedBuffer[] = DataSerializer.readByteArray(input); - // Decompress the bytes - decompressor.setInput(compressedBuffer, 0, compressedBuffer.length); - byte retval[] = null; - try { - int resultLength = decompressor.inflate(buffer); - retval = new byte[resultLength]; - System.arraycopy(compressedBuffer, 0, retval, 0, resultLength); - } catch (DataFormatException e) { - throw new IOException("Unable to decompress the byte array due to a data format error. " + e.getMessage()); - } - return retval; - } - - /** - * Reads UTF string from the input. This method is analogous to - * DataInput.readUTF() except that it supports null string. - * @param input The data input stream. - * @return Returns null or non-null string value. - * @throws IOException Thrown if unable to read from the input stream. - */ - public static String readUTF(DataInput input) throws IOException - { - byte header = input.readByte(); - if (header == DSCODE.NULL_STRING) { - return null; - } - return input.readUTF(); - } - - /** - * Writes the specified sting value to the output stream. This method - * is analogous to DataOutput.writeUTF() except that it supports null - * string. - * @param value The string value to write to the output stream. - * @param output The data output stream. - * @throws IOException Thrown if unable to write to the output stream. - */ - public static void writeUTF(String value, DataOutput output) throws IOException - { - if (value == null) { - output.writeByte(DSCODE.NULL_STRING); - } else { - output.writeByte(DSCODE.STRING); - output.writeUTF(value); - } - } - - /** - * Reads boolean value; - */ - public static Boolean readBoolean(DataInput input) throws IOException - { - return input.readBoolean(); - } - - /** - * Writes the specified boolean value to the stream. If the value is null - * then it write false. - * @param value The value to write - * @param output - * @throws IOException - */ - public static void writeBoolean(Boolean value, DataOutput output) throws IOException - { - if (value == null) { - output.writeBoolean(false); - } else { - output.writeBoolean(value); - } - } - - public static Byte readByte(DataInput input) throws IOException - { - return input.readByte(); - } - - public static void writeByte(Byte value, DataOutput output) throws IOException - { - if (value == null) { - output.writeByte(0); - } else { - output.writeByte(value); - } - } - - public static Character readCharacter(DataInput input) throws IOException - { - return input.readChar(); - } - - public static void writeCharacter(Character value, DataOutput output) throws IOException - { - if (value == null) { - output.writeChar(0); - } else { - output.writeChar(value); - } - } - - public static Double readDouble(DataInput input) throws IOException - { - return input.readDouble(); - } - - public static void writeDouble(Double value, DataOutput output) throws IOException - { - if (value == null) { - output.writeDouble(0); - } else { - output.writeDouble(value); - } - } - - public static Float readFloat(DataInput input) throws IOException - { - return input.readFloat(); - } - - public static void writeFloat(Float value, DataOutput output) throws IOException - { - if (value == null) { - output.writeFloat(0); - } else { - output.writeFloat(value); - } - } - - public static Integer readInteger(DataInput input) throws IOException - { - return input.readInt(); - } - - public static void writeInteger(Integer value, DataOutput output) throws IOException - { - if (value == null) { - output.writeInt(0); - } else { - output.writeInt(value); - } - } - - public static Long readLong(DataInput input) throws IOException - { - return input.readLong(); - } - - public static void writeLong(Long value, DataOutput output) throws IOException - { - if (value == null) { - output.writeLong(0); - } else { - output.writeLong(value); - } - } - - public static Short readShort(DataInput input) throws IOException - { - return input.readShort(); - } - - public static void writeShort(Short value, DataOutput output) throws IOException - { - if (value == null) { - output.writeShort(0); - } else { - output.writeShort(value); - } - } - - public static MapLite readMapLite(DataInput input) throws ClassNotFoundException, IOException - { - byte header = input.readByte(); - if (header == DSCODE.NULL){ - return null; - } - MapLite fo = new MapLite(); - InternalDataSerializer.invokeFromData(fo, input); - return fo; - } - - public static void writeMapLite(MapLite value, DataOutput output) throws IOException - { - if (value == null) { - output.writeByte(DSCODE.NULL); - } else { - output.writeByte(DSCODE.DS_NO_FIXED_ID); - InternalDataSerializer.invokeToData(value, output); - } - } -}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtil.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtil.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtil.java deleted file mode 100644 index 42ee2c7..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtil.java +++ /dev/null @@ -1,1094 +0,0 @@ -/*========================================================================= - * Copyright (c) 2008, Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * more patents listed at http://www.pivotal.io/patents. - *======================================================================== - */ -package com.gemstone.gemfire.internal.tools.gfsh.app.util; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.Set; - -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.query.SelectResults; -import com.gemstone.gemfire.cache.query.Struct; -import com.gemstone.gemfire.cache.query.types.CollectionType; -import com.gemstone.gemfire.cache.query.types.ObjectType; -import com.gemstone.gemfire.cache.query.types.StructType; -import com.gemstone.gemfire.internal.tools.gfsh.app.Gfsh; -import com.gemstone.gemfire.internal.tools.gfsh.app.command.task.QueryResults; -import com.gemstone.gemfire.internal.tools.gfsh.app.command.task.QueryTask; -import com.gemstone.gemfire.internal.tools.gfsh.app.misc.util.ReflectionUtil; -import com.gemstone.gemfire.internal.tools.gfsh.command.CommandResults; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -/** - * DBUtil is a simple database utility class that updates the database - * with the RBC TradeCapture specific objects. - * - * @author dpark - */ -public class DBUtil -{ - public static final int TYPE_KEYS = 0; - public static final int TYPE_VALUES = 1; - public static final int TYPE_KEYS_VALUES = 2; - - - private static DBUtil dbutil; - - static SimpleDateFormat dateFormat = new SimpleDateFormat( - "MM/dd/yyyy HH:mm:ss.SSS"); - static SimpleDateFormat smallDateFormat = new SimpleDateFormat( - "MM/dd/yy"); - - protected Connection conn; - private String driverName; - private String url; - private String userName; - - - /** - * Creates a DBUtil object that provides access to the database. - * - * @param driverName The JDBC dirver name. For example, - * com.nywe.db.sybaseImpl.SybaseDBConn. - * @throws DBUtilException Thrown if the driver does not exist. - */ - private DBUtil(String driverName) throws DBUtilException - { - init(driverName); - } - - @SuppressFBWarnings(value="LI_LAZY_INIT_UPDATE_STATIC",justification="This looks like singleton and at present looks like desired functionality") - public static DBUtil initialize(String driverName, String url, String userName, - String password) throws DBUtilException - { - if (dbutil != null) { - dbutil.close(); - } - dbutil = new DBUtil(driverName); - dbutil.connect(url, userName, password); - return dbutil; - } - - public static DBUtil getDBUtil() - { - return dbutil; - } - - /** - * Initializes DB. - * @param driverName The name of the JDBC Driver. For example, - * com.nywe.db.sybaseImpl.SybaseDBConn. - */ - private void init(String driverName) throws DBUtilException - { - try { - // finds and loads the driver dynamically - Driver driver = (Driver) Class.forName(driverName).newInstance(); - DriverManager.registerDriver(driver); - this.driverName = driverName; - } catch (Exception ex) { - throw new DBUtilException(ex); - } - } - - /** - * Establishes connection to the database server. - * @param url The database URL. - * @param userName The user name used to login to the database. - * @param password The password used to login to the database. - * @throws DBUtilException Thrown if it encounters a database connection error. - */ - private synchronized void connect(String url, String userName, - String password) throws DBUtilException - { - if (conn != null) { - throw new DBUtilException(DBUtilException.ERROR_CONNECTION_ALREADY_ESTABLISHED, - "The database connection has already been established. To establish a new connection, close it first."); - } - - Properties props = new Properties(); - props.put("user", userName); - props.put("password", password); - - try { - conn = DriverManager.getConnection(url, props); - this.url = url; - this.userName = userName; - } catch (SQLException ex) { - ex.printStackTrace(); - System.out.println("Error Code: " + ex.getErrorCode()); - } catch (Exception ex) { - ex.printStackTrace(); - throw new DBUtilException(ex); - } - } - - public String getDriverName() - { - return driverName; - } - - public String getUrl() - { - return url; - } - - public String getUserName() - { - return userName; - } - - /** - * Cloases the database connection and frees all system resources used - * by DBUtil. - * - * @throws DBUtilException Thrown if it encounters a database communcations - * error. - */ - public synchronized void close() throws DBUtilException - { - try { - if (conn != null) { - conn.close(); - conn = null; - } - } catch (Exception ex) { - throw new DBUtilException(ex); - } - } - - - /** - * Returns true if DBUtil has been closed, otherwise, false. If DBUtil is - * closed then DBUtil is no longer usable. To reconnect, call connect() again. - */ - public boolean isClosed() - { - return (conn == null); - } - - public int loadDB(Gfsh gfsh, Region region, - Class keyClass, - Class valueClass, - String sql, - String primaryColumn) throws DBUtilException - { - int count = 0; - PreparedStatement statement = null; - - try { - Map<String, Method> keySettersMap = ReflectionUtil.getAllSettersMap(keyClass); - Map<String, Method> valueSettersMap = ReflectionUtil.getAllSettersMap(valueClass); - - // realMap is for mapping methods to case-insensitive table columns - Map<String, Method> realMap = new HashMap(); - - if (sql.startsWith("select ") == false) { - // it's table name. create sql - sql = "select * from " + sql; - } - - statement = conn.prepareStatement(sql); - ResultSet resultSet = statement.executeQuery(); - - while (resultSet.next()) { - - // key - Object key = updateObject(gfsh, keyClass, keySettersMap, realMap, resultSet, primaryColumn); - - // value - Object value = updateObject(gfsh, valueClass, valueSettersMap, realMap, resultSet, null); - - region.put(key, value); - - count++; - } - - } catch (Exception ex) { - throw new DBUtilException(ex); - } finally { - if (statement != null) { - try { - statement.close(); - } catch (SQLException e) { - throw new DBUtilException(e); - } - } - } - - return count; - } - - public int storeDB(Gfsh gfsh, Region region, String tableName, - int storeType, String primaryColumn, - boolean isKeyPrimary) throws DBUtilException - { - int count = 0; - try { - DatabaseMetaData meta = conn.getMetaData(); - ResultSet resultSet = meta.getColumns(null, null, tableName, null); - ArrayList<ColumnInfo> columnList = new ArrayList(); - while (resultSet.next()) { - ColumnInfo info = new ColumnInfo(); - info.name = (String)resultSet.getObject("COLUMN_NAME"); - info.type = (Integer)resultSet.getObject("DATA_TYPE"); // java.sql.Types - columnList.add(info); - } - - // Collect all matching field names from the region object - Set<Region.Entry> entrySet = region.entrySet(); - - Map<String, Method> keyGettersMap = new HashMap(0); - Map<String, Method> valueGettersMap = new HashMap(0); - int columnCount = 0; - String keyKeys[] = new String[0]; - String valueKeys[] = new String[0]; - for (Region.Entry entry : entrySet) { - Object key = entry.getKey(); - Object value = entry.getValue(); - switch (storeType) { - case TYPE_KEYS: - keyGettersMap = ReflectionUtil.getAllGettersMap(key.getClass()); - keyGettersMap = getGettersMap(keyGettersMap, columnList); - columnCount = keyGettersMap.size(); - keyKeys = keyGettersMap.keySet().toArray(new String[0]); - break; - case TYPE_VALUES: - valueGettersMap = ReflectionUtil.getAllGettersMap(value.getClass()); - valueGettersMap = getGettersMap(valueGettersMap, columnList); - columnCount = valueGettersMap.size(); - valueKeys = valueGettersMap.keySet().toArray(new String[0]); - break; - case TYPE_KEYS_VALUES: - keyGettersMap = ReflectionUtil.getAllGettersMap(key.getClass()); - keyGettersMap = getGettersMap(keyGettersMap, columnList); - valueGettersMap = ReflectionUtil.getAllGettersMap(value.getClass()); - valueGettersMap = getGettersMap(valueGettersMap, columnList); - columnCount = keyGettersMap.size() + valueGettersMap.size(); - keyKeys = keyGettersMap.keySet().toArray(new String[0]); - valueKeys = valueGettersMap.keySet().toArray(new String[0]); - default: - break; - } - - Set<String> keySet = valueGettersMap.keySet(); - // take care of case senstiveness - if (primaryColumn != null) { - for (String keyStr : keySet) { - if (primaryColumn.equalsIgnoreCase(keyStr)) { - primaryColumn = keyStr; - break; - } - } - } - - // Remove all duplicate entries from keyGettersMap - // keep only primary key (column) - for (String keyStr : keySet) { - if (isKeyPrimary == false || primaryColumn == null || primaryColumn.equalsIgnoreCase(keyStr) == false) { - keyGettersMap.remove(keyStr); - } - } - break; - } - - try { - - String insertQuery = createInsertQuery(keyKeys, valueKeys, tableName); - String updateQuery = createUpdateQuery(keyKeys, valueKeys, tableName, primaryColumn, isKeyPrimary); -// -// System.out.println(insertQuery); -// System.out.println(updateQuery); - - // tries insert followed by update (upsert) - for (Region.Entry entry : entrySet) { - Object key = entry.getKey(); - Object value = entry.getValue(); - - // try insert first. if it fails then do update - PreparedStatement statement = createInsertPreparedStatement(keyGettersMap, valueGettersMap, keyKeys, valueKeys, key, value, insertQuery); -// System.out.println(statement.toString()); - try { - statement.executeUpdate(); - } catch (SQLException ex) { - - // try update - statement = createUpdatePreparedStatement(keyGettersMap, valueGettersMap, keyKeys, valueKeys, key, value, updateQuery, primaryColumn, isKeyPrimary); - statement.executeUpdate(); -// System.out.println(statement.toString()); - } - count++; - } - } catch (SQLException ex) { - throw new DBUtilException(ex); - } - - } catch (Exception ex) { - throw new DBUtilException(ex); - } - return count; - } - - private List<ColumnInfo> getColumnInfoList(String tableName) throws SQLException - { - String lowercase = tableName.toLowerCase(); - ArrayList<ColumnInfo> columnList = new ArrayList(); - if (lowercase.startsWith("insert ")) { - // insert - - - } else if (lowercase.startsWith("update ")) { - - // update - - // TODO: hack - // Replace the following with real parser - // This breaks if string literals that has '?', ',', or '=' character - String split[] = tableName.split("= *\\?"); - for (int i = 0; i < split.length; i++) { - String token = split[i].trim(); - int index = token.indexOf('='); - if (index >= 0) { - String x = token.substring(index); - x = x.trim(); - index = x.lastIndexOf(','); - if (index > 0) { - token = x.substring(index+1); - } else { - index = x.lastIndexOf(' '); - if (index > 0) { - token = x.substring(index+1); - } else { - continue; - } - } - } - index = token.lastIndexOf(' '); - if (index != -1) { - token = token.substring(index); - } - token = token.replace(',', ' '); - token = token.trim(); - ColumnInfo info = new ColumnInfo(); - info.name = token; - columnList.add(info); - } - - } else { - // table name - DatabaseMetaData meta = conn.getMetaData(); - ResultSet resultSet = meta.getColumns(null, null, tableName, null); - - while (resultSet.next()) { - ColumnInfo info = new ColumnInfo(); - info.name = (String)resultSet.getObject("COLUMN_NAME"); - info.type = (Integer)resultSet.getObject("DATA_TYPE"); // java.sql.Types - columnList.add(info); - } - } - - return columnList; - } - - private String[] getColumnNames(List<ColumnInfo> columnList) - { - String columnNames[] = new String[columnList.size()]; - for (int i = 0; i < columnList.size(); i++) { - columnNames[i] = ((ColumnInfo)columnList.get(i)).name; - } - return columnNames; - } - - private int storeMapDB(Gfsh gfsh, Map map, String tableName, - int storeType, String primaryColumn, - boolean isKeyPrimary, List<ColumnInfo> columnList, boolean isQuery) throws DBUtilException - { - int count = 0; - try { - - // Collect all matching field names from the region object - Set<Map.Entry> entrySet = map.entrySet(); - - Map<String, Method> keyGettersMap = new HashMap(0); - Map<String, Method> valueGettersMap = new HashMap(0); - int columnCount = 0; - String keyKeys[] = new String[0]; - String valueKeys[] = new String[0]; - for (Map.Entry entry : entrySet) { - Object key = entry.getKey(); - Object value = entry.getValue(); - switch (storeType) { - case TYPE_KEYS: - keyGettersMap = ReflectionUtil.getAllGettersMap(key.getClass()); - keyGettersMap = getGettersMap(keyGettersMap, columnList); - columnCount = keyGettersMap.size(); - if (isQuery) { - keyKeys = getColumnNames(columnList); - } else { - keyKeys = keyGettersMap.keySet().toArray(new String[0]); - } - - break; - case TYPE_VALUES: - valueGettersMap = ReflectionUtil.getAllGettersMap(value.getClass()); - valueGettersMap = getGettersMap(valueGettersMap, columnList); - columnCount = valueGettersMap.size(); - if (isQuery) { - valueKeys = getColumnNames(columnList); - } else { - valueKeys = valueGettersMap.keySet().toArray(new String[0]); - } - break; - case TYPE_KEYS_VALUES: - keyGettersMap = ReflectionUtil.getAllGettersMap(key.getClass()); - keyGettersMap = getGettersMap(keyGettersMap, columnList); - valueGettersMap = ReflectionUtil.getAllGettersMap(value.getClass()); - valueGettersMap = getGettersMap(valueGettersMap, columnList); - columnCount = keyGettersMap.size() + valueGettersMap.size(); - - if (isQuery) { - keyKeys = getColumnNames(columnList); - valueKeys = getColumnNames(columnList); - } else { - keyKeys = keyGettersMap.keySet().toArray(new String[0]); - valueKeys = valueGettersMap.keySet().toArray(new String[0]); - } - default: - break; - } - - Set<String> keySet = valueGettersMap.keySet(); - // take care of case senstiveness - if (primaryColumn != null) { - for (String keyStr : keySet) { - if (primaryColumn.equalsIgnoreCase(keyStr)) { - primaryColumn = keyStr; - break; - } - } - } - - // Remove all duplicate entries from keyGettersMap - // keep only primary key (column) - for (String keyStr : keySet) { - if (isKeyPrimary == false || primaryColumn == null || primaryColumn.equalsIgnoreCase(keyStr) == false) { - keyGettersMap.remove(keyStr); - } - } - break; - } - - try { - - String insertQuery = createInsertQuery(keyKeys, valueKeys, tableName); - String updateQuery = createUpdateQuery(keyKeys, valueKeys, tableName, primaryColumn, isKeyPrimary); - if (gfsh.isDebug()) { - System.out.println("insert: " + insertQuery); - System.out.println("update: " + updateQuery); - } - - // tries insert followed by update (upsert) - for (Map.Entry entry : entrySet) { - Object key = entry.getKey(); - Object value = entry.getValue(); - - // try insert first. if it fails then do update - PreparedStatement statement; - if (insertQuery != null) { - try { - statement = createInsertPreparedStatement(keyGettersMap, valueGettersMap, keyKeys, valueKeys, key, value, insertQuery); - statement.executeUpdate(); - } catch (SQLException ex) { - - // try update - if (updateQuery != null) { - statement = createUpdatePreparedStatement(keyGettersMap, valueGettersMap, keyKeys, valueKeys, key, value, updateQuery, primaryColumn, isKeyPrimary); - statement.executeUpdate(); - } - - } - } else { - statement = createUpdatePreparedStatement(keyGettersMap, valueGettersMap, keyKeys, valueKeys, key, value, updateQuery, primaryColumn, isKeyPrimary); - statement.executeUpdate(); - } - - count++; - } - } catch (SQLException ex) { - throw new DBUtilException(ex); - } - - } catch (Exception ex) { - throw new DBUtilException(ex); - } - return count; - } - - public int storeDB(Gfsh gfsh, String oql, String tableName, - int storeType, String primaryColumn, - boolean isKeyPrimary, int batchSize) throws DBUtilException - { - String lowercase = tableName.toLowerCase(); - boolean isQuery = lowercase.startsWith("insert ") || lowercase.startsWith("update "); - int count = 0; - int actualSize; - String insertQuery = null; - String updateQuery = null; - int columnCount = 0; - Map<String, Method> valueGettersMap = null; - String valueKeys[] = null; - try { - - List<ColumnInfo>columnList = getColumnInfoList(tableName); - - // Use command client to fetch data from the server - do { - CommandResults cr = gfsh.getCommandClient().execute(new QueryTask(oql, batchSize, true)); - if (cr.getCode() == QueryTask.ERROR_QUERY) { - gfsh.println(cr.getCodeMessage()); - return -1; - } - QueryResults results = (QueryResults) cr.getDataObject(); - if (results == null || results.getResults() == null) { - return count; - } - - if (results.getResults() instanceof Map) { - - // Map - - Map map = (Map)results.getResults(); - count += storeMapDB(gfsh, map, tableName, storeType, primaryColumn, isKeyPrimary, columnList, isQuery); - - } else { - - // SelectResults - - SelectResults sr = (SelectResults)results.getResults(); - CollectionType type = sr.getCollectionType(); - ObjectType elementType = type.getElementType(); - List srList = sr.asList(); - Object element = null; - StructType structType = null; - Struct struct = null; - - // Create insert prepared query strings - if (insertQuery == null && srList.size() > 0) { - element = srList.get(0); - - if (elementType.isStructType()) { - // struct - structType = (StructType) elementType; - insertQuery = createInsertQuery(structType.getFieldNames(), tableName); - updateQuery = createUpdateQuery(structType.getFieldNames(), tableName, primaryColumn); - } else { - // object - valueGettersMap = new HashMap(0); - valueGettersMap = ReflectionUtil.getAllGettersMap(element.getClass()); - valueGettersMap = getGettersMap(valueGettersMap, columnList); - columnCount = valueGettersMap.size(); - - if (isQuery) { - valueKeys = getColumnNames(columnList); - } else { - valueKeys = valueGettersMap.keySet().toArray(new String[0]); - } - - insertQuery = createInsertQuery(valueKeys, tableName); - updateQuery = createUpdateQuery(valueKeys, tableName, primaryColumn); - } - - if (gfsh.isDebug()) { - System.out.println("insert: " + insertQuery); - System.out.println("update: " + updateQuery); - } - } - - // Upsert - for (int i = 0; i < srList.size(); i++) { - element = srList.get(i); - - if (elementType.isStructType()) { - - structType = (StructType) elementType; - struct = (Struct) element; - PreparedStatement statement = createInsertPreparedStatement(struct, insertQuery); -// System.out.println(statement.toString()); - - try { - statement.executeUpdate(); - } catch (SQLException ex) { - - // try update - statement = createUpdatePreparedStatement(struct, updateQuery, primaryColumn); - statement.executeUpdate(); -// System.out.println(statement.toString()); - } - - } else { - - PreparedStatement statement; - if (insertQuery != null) { - try { - statement = createInsertPreparedStatement(valueGettersMap, valueKeys, element, insertQuery); - statement.executeUpdate(); - } catch (SQLException ex) { - - // try update - if (updateQuery != null) { - statement = createUpdatePreparedStatement(valueGettersMap, valueKeys, element, updateQuery, primaryColumn); - statement.executeUpdate(); - } - } - } else { - statement = createUpdatePreparedStatement(valueGettersMap, valueKeys, element, updateQuery, primaryColumn); - System.out.println(statement.toString()); - statement.executeUpdate(); - } - } - } - - count += sr.size(); - } - actualSize = results.getActualSize(); - oql = null; - } while (count < actualSize); - - } catch (Exception ex) { - throw new DBUtilException(ex); - } - return count; - } - - private PreparedStatement createUpdatePreparedStatement( - Struct struct, - String query, - String primaryColumn) throws SQLException, InvocationTargetException, IllegalAccessException - { - Object primaryObj = null; - PreparedStatement statement = conn.prepareStatement(query); - String fieldNames[] = struct.getStructType().getFieldNames(); - Object fieldValues[] = struct.getFieldValues(); - int i; - for (i = 0; i < fieldValues.length; i++) { - statement.setObject(i+1, fieldValues[i]); - Object obj = fieldValues[i]; - if (primaryColumn != null && primaryColumn.equals(fieldNames[i])) { - primaryObj = obj; - } else { - statement.setObject(i+1, obj); - } - } - - if (primaryObj != null) { - statement.setObject(i+1, primaryObj); - } - - return statement; - } - - private PreparedStatement createInsertPreparedStatement(Struct struct, String query) - throws SQLException, InvocationTargetException, IllegalAccessException - { - PreparedStatement statement = conn.prepareStatement(query); - Object fieldValues[] = struct.getFieldValues(); - for (int i = 0; i < fieldValues.length; i++) { - statement.setObject(i+1, fieldValues[i]); - } - return statement; - } - - - private PreparedStatement createUpdatePreparedStatement( - Map<String, Method> valueGettersMap, - String valueKeys[], - Object value, - String query, - String primaryColumn) throws SQLException, InvocationTargetException, IllegalAccessException - { - return createUpdatePreparedStatement(null, valueGettersMap, null, valueKeys, null, value, query, primaryColumn, false); - } - - private PreparedStatement createInsertPreparedStatement( - Map<String, Method> valueGettersMap, - String valueKeys[], - Object value, - String query) throws SQLException, InvocationTargetException, IllegalAccessException - { - return createInsertPreparedStatement(null, valueGettersMap, null, valueKeys, null, value, query); - } - - private PreparedStatement createUpdatePreparedStatement(Map<String, Method> keyGettersMap, - Map<String, Method> valueGettersMap, - String keyKeys[], - String valueKeys[], - Object key, - Object value, - String query, - String primaryColumn, - boolean isKeyPrimary) throws SQLException, InvocationTargetException, IllegalAccessException - { - Object primaryObj = null; - PreparedStatement statement = conn.prepareStatement(query); - int index = 1; - if (keyKeys != null) { - for (int i = 0; i < keyKeys.length; i++) { - Method method = keyGettersMap.get(keyKeys[i]); - Object obj = method.invoke(key, (Object[])null); - if (primaryColumn != null && isKeyPrimary==false && primaryColumn.equals(keyKeys[i])) { - primaryObj = obj; - } else { - statement.setObject(index++, obj); - } - } - } - - if (valueKeys != null) { - for (int i = 0; i < valueKeys.length; i++) { - Method method = valueGettersMap.get(valueKeys[i]); - Object obj = method.invoke(value, (Object[])null); - if (primaryColumn != null && isKeyPrimary == false && primaryColumn.equals(valueKeys[i])) { - primaryObj = obj; - } else { - statement.setObject(index++, obj); - } - } - } - - if (primaryObj != null) { - statement.setObject(index, primaryObj); - } - - return statement; - } - - private PreparedStatement createInsertPreparedStatement(Map<String, Method> keyGettersMap, - Map<String, Method> valueGettersMap, - String keyKeys[], - String valueKeys[], - Object key, - Object value, - String query) throws SQLException, InvocationTargetException, IllegalAccessException - { - PreparedStatement statement = conn.prepareStatement(query); - if (keyKeys!= null) { - for (int i = 0; i < keyKeys.length; i++) { - Method method = keyGettersMap.get(keyKeys[i]); - Object obj = method.invoke(key, (Object[])null); - statement.setObject(i+1, obj); - } - } - if (valueKeys != null) { - for (int i = 0; i < valueKeys.length; i++) { - Method method = valueGettersMap.get(valueKeys[i]); - Object obj = method.invoke(value, (Object[])null); - statement.setObject(i+1, obj); - } - } - - return statement; - } - - private String createUpdateQuery(String fieldNames[], - String tableName, - String primaryColumn) - { - String query = null; - String lowercase = tableName.trim().toLowerCase(); - if (lowercase.startsWith("insert ")) { - // insert not honored for update operation - query = null; - } else if (lowercase.startsWith("update ")) { - // use the passed in update statement - query = tableName; - } else { - - // build update - query = "UPDATE " + tableName + " SET "; - for (int i = 0; i < fieldNames.length; i++) { - if (primaryColumn != null && primaryColumn.equals(fieldNames[i])) { - // skip - } else { - query += fieldNames[i] + "=?,"; - } - } - - int index = query.lastIndexOf(","); - if (index != -1) { - query = query.substring(0, index); - } - if (primaryColumn != null) { - query += " WHERE " + primaryColumn + "=?"; - } - } - - return query; - } - - private String createInsertQuery(String fieldNames[], String tableName) - { - - String lowercase = tableName.trim().toLowerCase(); - String query = null; - - if (lowercase.startsWith("insert ")) { - // use the passed in insert statement - query = tableName; - } else if (lowercase.startsWith("update ")) { - // update not honored for insert operation - query = null; - } else { - - // build insert - query = "INSERT INTO " + tableName + " ("; - for (int i = 0; i < fieldNames.length; i++) { - query += fieldNames[i] + ","; - } - int index = query.lastIndexOf(','); - if (index != -1) { - query = query.substring(0, index); - } - int columnCount = fieldNames.length; - query += ") VALUES ("; - for (int i = 0; i < columnCount; i++) { - query += "?,"; - } - index = query.lastIndexOf(','); - if (index != -1) { - query = query.substring(0, index); - } - query += ")"; - } - - return query; - } - - private String createUpdateQuery(String keyKeys[], String valueKeys[], - String tableName, - String primaryColumn, - boolean isKeyPrimary) - { - String query = null; - String lowercase = tableName.trim().toLowerCase(); - if (lowercase.startsWith("insert ")) { - // insert not honored for update operation - query = null; - } else if (lowercase.startsWith("update ")) { - // use the passed in update statement - query = tableName; - } else { - - // build update - query = "UPDATE " + tableName + " SET "; - for (int i = 0; i < keyKeys.length; i++) { - if (primaryColumn != null && isKeyPrimary && primaryColumn.equals(keyKeys[i])) { - // skip - } else { - query += keyKeys[i] + "=?,"; - } - } - for (int i = 0; i < valueKeys.length; i++) { - if (primaryColumn != null && isKeyPrimary == false && primaryColumn.equals(valueKeys[i])) { - // skip - } else { - query += valueKeys[i] + "=?,"; - } - } - int index = query.lastIndexOf(","); - if (index != -1) { - query = query.substring(0, index); - } - if (primaryColumn != null) { - query += " WHERE " + primaryColumn + "=?"; - } - } - - return query; - } - - private String createInsertQuery(String keyKeys[], String valueKeys[], String tableName) - { - String lowercase = tableName.trim().toLowerCase(); - String query = null; - - if (lowercase.startsWith("insert ")) { - // use the passed in insert statement - query = tableName; - } else if (lowercase.startsWith("update ")) { - // update not honored for insert operation - query = null; - } else { - - // build insert - int columnCount = 0; - query = "INSERT INTO " + tableName + " ("; - if (keyKeys != null) { - for (int i = 0; i < keyKeys.length; i++) { - query += keyKeys[i] + ","; - } - columnCount += keyKeys.length; - } - if (valueKeys != null) { - for (int i = 0; i < valueKeys.length; i++) { - query += valueKeys[i] + ","; - } - columnCount += valueKeys.length; - } - int index = query.lastIndexOf(','); - if (index != -1) { - query = query.substring(0, index); - } - - query += ") VALUES ("; - for (int i = 0; i < columnCount; i++) { - query += "?,"; - } - index = query.lastIndexOf(','); - if (index != -1) { - query = query.substring(0, index); - } - query += ")"; - } - - return query; - } - - private Map getGettersMap(Map<String, Method> gettersMap, List<ColumnInfo> columnList) - { - HashMap map = new HashMap(); - Set<String> keySet = gettersMap.keySet(); - for (int i = 0; i < columnList.size(); i++) { - ColumnInfo info = columnList.get(i); - Method getterMethod = gettersMap.get("get" + info.name); - if (getterMethod == null) { - for (String key : keySet) { - if (key.substring(3).equalsIgnoreCase(info.name)) { - getterMethod = gettersMap.get(key); - break; - } - } - } - if (getterMethod != null) { - map.put(info.name, getterMethod); - } - } - return map; - } - - private Object updateObject(Gfsh gfsh, Class clazz, - Map<String, Method> settersMap, Map<String, Method> realMap, - ResultSet resultSet, - String primaryColumn) throws Exception - { - - // If primaryColumn is set then set the mapping method only - - if (primaryColumn != null) { - - // Set the primary column value only - Object obj = resultSet.getObject(primaryColumn); - if (clazz == null || - clazz == byte.class || clazz == Byte.class || - clazz == char.class || clazz == Character.class || - clazz == short.class || clazz == Short.class || - clazz == int.class || clazz == Integer.class || - clazz == long.class || clazz == Long.class || - clazz == float.class || clazz == Float.class || - clazz == double.class || clazz == Double.class || - clazz == Date.class || clazz == String.class) - { - return obj; - } - - Object value = clazz.newInstance(); - Method setterMethod = realMap.get(primaryColumn); - if (setterMethod == null) { - setterMethod = settersMap.get("set" + primaryColumn); - if (setterMethod == null) { - Set<Entry<String, Method>> entrySet = settersMap.entrySet(); //FindBugs - entrySet efficient over keyset - for (Entry<String, Method> entry : entrySet) { - String key = entry.getKey(); - if (key.substring(3).equalsIgnoreCase(primaryColumn)) { - setterMethod = entry.getValue(); - realMap.put(primaryColumn, settersMap.get(key)); - } - } - } - } - setterMethod.invoke(value, obj); - return value; - } - - // Set the entire object - - if (clazz == null || - clazz == byte.class || clazz == Byte.class || - clazz == char.class || clazz == Character.class || - clazz == short.class || clazz == Short.class || - clazz == int.class || clazz == Integer.class || - clazz == long.class || clazz == Long.class || - clazz == float.class || clazz == Float.class || - clazz == double.class || clazz == Double.class || - clazz == Date.class || clazz == String.class) - { - - return resultSet.getObject(1); - - } else { - - Object value = clazz.newInstance(); - ResultSetMetaData meta = resultSet.getMetaData(); - for (int i = 1; i <= meta.getColumnCount(); i++) { - String columnName = meta.getColumnName(i); - Method setterMethod = realMap.get(columnName); - if (setterMethod == null) { - setterMethod = settersMap.get("set" + columnName); - if (setterMethod == null) { - Set<String> keySet = settersMap.keySet(); - for (String key : keySet) { - if (key.substring(3).equalsIgnoreCase(columnName)) { - setterMethod = settersMap.get(key); - realMap.put(columnName, settersMap.get(key)); - } - } - } - } - if (setterMethod == null) { -// throw new DBUtilException(DBUtilException.ERROR_NO_MATCHING_METHOD_FOR_COLUMN, "Undefined method for the column " + columnName); - continue; - } - - Object obj = resultSet.getObject(i); - setterMethod.invoke(value, obj); - } - return value; - } - - } - //FindBugs - make static inner class - static class ColumnInfo - { - String name; - int type; - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtilException.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtilException.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtilException.java deleted file mode 100644 index 45c1c6a..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/DBUtilException.java +++ /dev/null @@ -1,48 +0,0 @@ -/*========================================================================= - * Copyright (c) 2008, Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * more patents listed at http://www.pivotal.io/patents. - *======================================================================== - */ -package com.gemstone.gemfire.internal.tools.gfsh.app.util; - -/** - * DBUtilException is thrown by DBUtil when it encounters DB errors. - * - * @author dpark - * - */ -public class DBUtilException extends Exception -{ - private static final long serialVersionUID = 1L; - - public static final int ERROR_CONNECTION_CLOSED = 1; - public static final int ERROR_CONNECTION_ALREADY_ESTABLISHED = 2; - public static final int ERROR_NO_MATCHING_METHOD_FOR_COLUMN = 3; - public static final int ERROR_UNDEFINED = -1; - - private int errorCode = ERROR_UNDEFINED; - - public DBUtilException() - { - } - - public DBUtilException(int errorCode, String message) - { - super(message); - this.errorCode = errorCode; - } - - public DBUtilException(String message, Throwable cause) - { - super(cause.getClass() + ": " + cause.getMessage() + ". " + message); - initCause(cause); - } - - public DBUtilException(Throwable cause) - { - super(cause.getClass() + ": " + cause.getMessage() + "."); - initCause(cause); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/GfshResultsBag.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/GfshResultsBag.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/GfshResultsBag.java deleted file mode 100644 index 7f88de7..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/GfshResultsBag.java +++ /dev/null @@ -1,600 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.util; - -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectIterator; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.AbstractCollection; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Set; - -import com.gemstone.gemfire.DataSerializable; -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.cache.query.SelectResults; -import com.gemstone.gemfire.cache.query.internal.ResultsCollectionWrapper; -import com.gemstone.gemfire.cache.query.internal.types.CollectionTypeImpl; -import com.gemstone.gemfire.cache.query.types.CollectionType; -import com.gemstone.gemfire.cache.query.types.ObjectType; - -// @todo probably should assert element type when elements added -// @todo support generics when no longer support Java 1.4 -/** - * Implementation of SelectResults that allows duplicates and - * extends HashMap. The keys store the elements of the collection and the - * the values store the number of occurrances as an int. - * If the elements are Structs, then use a StructBag instead. - * - * @author Eric Zoerner - * @since 5.1 - */ -public class GfshResultsBag extends AbstractCollection implements SelectResults, DataSerializable { - protected ObjectType elementType; - protected Object2IntOpenHashMap map; - protected int size = 0; - /** adds support for null elements, since a TObjectIntHashMap does not - support null elements - */ - protected int numNulls = 0; - //Asif: These fields are used for limiting the results based on the limit - //clause in the query - private int limit = -1; - boolean hasLimitIterator = false; - final Object limitLock = new Object(); - - public GfshResultsBag() { - this.map = new Object2IntOpenHashMap(); - } - - public void setElementType(ObjectType elementType) { - this.elementType = elementType; - } - - // @todo Currently does an iteration, could make this more efficient - // by providing a ListView - /** - * Returns this bag as a list. - */ - public List asList() { - return new ArrayList(this); - } - - /** - * Return an unmodifiable Set view of this bag. - * Does not require an iteration by using a lightweight wrapper. - */ - public Set asSet() { - return new SetView(); - } - - public CollectionType getCollectionType() { - return new CollectionTypeImpl(Collection.class, this.elementType); - } - - public boolean isModifiable() { - return true; - } - - public int occurrences(Object element) { - if (this.hasLimitIterator) { - // Asif: If limit iterator then occurence should be calculated - // via the limit iterator - int count = 0; - boolean encounteredObject = false; - for (Iterator itr = this.iterator()/* this.base.iterator() */; itr - .hasNext();) { - Object v = itr.next(); - if (element == null ? v == null : element.equals(v)) { - count++; - encounteredObject = true; - } - else if (encounteredObject) { - // Asif: No possibility of its occurence again - break; - } - } - return count; - } - else { - if (element == null) { - return this.numNulls; - } - return this.map.getInt(element); // returns 0 if not found - } - } - - /** - * Return an iterator over the elements in this collection. Duplicates will - * show up the number of times it has occurrances. - */ - @Override - public Iterator iterator() { - if (this.hasLimitIterator) { - // Asif: Return a new LimitIterator in the block so that - // the current Limit does not get changed by a remove - // operation of another thread. The current limit is - // set in the limit iterator. So the setting of the current limit - // & creation of iterator should be atomic .If any subsequent - // modifcation in limit occurs, the iterator will itself fail. - // Similarly a remove called by a iterator should decrease the - // current limit and underlying itr.remove atomically - synchronized (this.limitLock) { - return new LimitResultsBagIterator(); - } - } - else { - return new ResultsBagIterator(); - } - } - - @Override - public boolean contains(Object element) { - if (this.hasLimitIterator) { - return super.contains(element); - } - else { - if (element == null) { - return this.numNulls > 0; - } - return this.map.containsKey(element); - } - } - - // not thread safe! - @Override - public boolean add(Object element) { - if( this.limit > -1) { - throw new UnsupportedOperationException("Addition to the SelectResults not allowed as the query result is constrained by LIMIT"); - } - if (element == null) { - numNulls++; - } - else { - int count = this.map.getInt(element); // 0 if not found - this.map.put(element, count + 1); - } - this.size++; - assert this.size >= 0 : this.size; - return true; - } - - // Internal usage method - // Asif :In case of StructBag , we will ensure that it - // gets an Object [] indicating field values as parameter - // from the CompiledSelect - public int addAndGetOccurence(Object element) { - int occurence; - if (element == null) { - numNulls++; - occurence = numNulls; - } - else { - occurence = this.map.getInt(element); // 0 if not found - this.map.put(element, ++occurence); - } - this.size++; - assert this.size >= 0: this.size; - return occurence; - } - - @Override - public int size() { - if (this.hasLimitIterator) { - synchronized (this.limitLock) { - return this.limit; - } - } else { - return this.size; - } - } - - // not thread safe! - @Override - public boolean remove(Object element) { - if(this.hasLimitIterator) { - return super.remove(element); - }else { - if (element == null) { - if (this.numNulls > 0) { - this.numNulls--; - this.size--; - assert this.size >= 0 : this.size; - return true; - } - else { - return false; - } - } - int count = this.map.getInt(element); // 0 if not found - if (count == 0) { - return false; - } - if (count == 1) { - this.map.remove(element); - } - else { - this.map.put(element, --count); - } - this.size--; - assert this.size >= 0 : this.size; - return true; - } - } - - // not thread safe! - @Override - public void clear() { - this.map.clear(); - this.numNulls = 0; - this.size = 0; - if (this.hasLimitIterator) { - synchronized (this.limitLock) { - this.limit = 0; - } - } - } - - // not thread safe! - @Override - public boolean equals(Object o) { - if (!(o instanceof GfshResultsBag)) { - return false; - } - GfshResultsBag otherBag = (GfshResultsBag)o; - return this.size == otherBag.size - && this.elementType.equals(otherBag.elementType) - && this.map.equals(otherBag.map) - && this.numNulls == otherBag.numNulls; - } - - @Override // GemStoneAddition - public int hashCode() { - return this.map.hashCode(); - } - public boolean addAll(Collection coll) { - if(this.limit > -1) { - throw new UnsupportedOperationException("Addition to the SelectResults not allowed as the query result is constrained by LIMIT"); - }else { - return super.addAll(coll); - } - } - protected Object2IntOpenHashMap createMapForFromData() { - return new Object2IntOpenHashMap(this.size); - } - - public void fromData(DataInput in) throws IOException, ClassNotFoundException { - this.elementType = (ObjectType)DataSerializer.readObject(in); - this.size = in.readInt(); - assert this.size >= 0: this.size; - this.readNumNulls(in); - // Asif: The size will be including null so the Map should at max contain - // size - number of nulls - int numLeft = this.size - this.numNulls; - - while (numLeft > 0) { - Object key = DataSerializer.readObject(in); - int occurence = in.readInt(); - this.map.put(key, occurence); - numLeft -= occurence; - } - } -// -// public int getDSFID() { -// return RESULTS_BAG; -// } - - public void toData(DataOutput out) throws IOException { - DataSerializer.writeObject(this.elementType, out); - out.writeInt(this.size()); - this.writeNumNulls(out); - // TODO:Asif: Should we actually pass the limit in serialization? - // For the time being not passing , assuming PR Has parsed - // it - // out.writeInt(this.limit); - int numLeft = this.size() - this.numNulls; - for (ObjectIterator<Object2IntMap.Entry<?>> itr = this.map.object2IntEntrySet().fastIterator(); itr.hasNext() - && numLeft > 0;) { - Object2IntMap.Entry<?> entry = itr.next(); - Object key = entry.getKey(); - DataSerializer.writeObject(key, out); - int occurence = entry.getValue(); - if (numLeft < occurence) { - occurence = numLeft; - } - out.writeInt(occurence); - numLeft -= occurence; - } - } - - /** - * - * @param out - * @throws IOException - */ - void writeNumNulls(DataOutput out) throws IOException { - out.writeInt(this.numNulls); - } - - /** - * - * @param in - * @throws IOException - */ - void readNumNulls(DataInput in) throws IOException { - this.numNulls = in.readInt(); - } - - /** - */ - void createObject2IntHashMap() { - this.map = new Object2IntOpenHashMap(this.size - this.numNulls); - } - - void applyLimit(int limit) { - this.limit = limit; - // Asif : From the code of TObjectIntHashMap, it appears that if no data is - // going to be added , then the rehash does not occur & default code - // of rehash does not appear to change the order of data . So we can assume - // that this iterator will be returning data in order. - // Limit Iterator is needed if the limit happens to be less than the size - if (this.limit > -1 && this.size > this.limit) { - this.hasLimitIterator = true; - } - } - - protected class ResultsBagIterator implements Iterator { - final ObjectIterator<Object2IntMap.Entry<?>> mapIterator = GfshResultsBag.this.map.object2IntEntrySet().fastIterator(); - Object2IntMap.Entry<?> mapIteratorEntry; - Object current = null; - - /** - * duplicates are numbered from 1 to n; - * 0 = no current, otherwise goes from 1 to dupLimit, - * indicating the last dup that was emitted by next() - */ - int currentDup = 0; - /** - * dupLimit is the total number of occurrences; - * start by emitting the nulls - */ - int dupLimit = GfshResultsBag.this.numNulls; - - public boolean hasNext() { - return this.mapIterator.hasNext() || this.currentDup < this.dupLimit; - } - - public Object next() { - // see if there is another duplicate to emit - if (this.currentDup < this.dupLimit) { - this.currentDup++; - return this.current; - } - //otherwise, go to next object - this.mapIteratorEntry = this.mapIterator.next(); - this.dupLimit = this.mapIteratorEntry.getValue(); - this.currentDup = 1; - this.current = this.mapIteratorEntry.getKey(); - return this.current; - } - - public void remove() { -// if (this.currentDup == 0) { -// // next has not yet been called -// throw new IllegalStateException(LocalizedStrings.ResultsBag_NEXT_MUST_BE_CALLED_BEFORE_REMOVE.toLocalizedString()); -// } - - this.dupLimit--; - assert this.dupLimit >= 0 : this.dupLimit; - if (this.current == null) { - GfshResultsBag.this.numNulls = this.dupLimit; - assert GfshResultsBag.this.numNulls >= 0 : GfshResultsBag.this.numNulls; - } - else { - if (this.dupLimit > 0) { - this.mapIteratorEntry.setValue(this.dupLimit); - } - else { - this.mapIterator.remove(); - } - } - GfshResultsBag.this.size--; - this.currentDup--; - assert GfshResultsBag.this.size >= 0 : GfshResultsBag.this.size; - assert this.currentDup >= 0 : this.currentDup; - } - } - - /** package visibility so ResultsCollectionWrapper can reference - * it. - * This SetView is serialized as a special case by a - * ResultsCollectionWrapper. - * Keith: Refactored to add consideration for LIMIT, April 1, 2009 - * @see ResultsCollectionWrapper#toData - */ - class SetView extends AbstractSet { - - private int localLimit; - - SetView() { - localLimit = GfshResultsBag.this.limit; - } - - public Iterator iterator() { - if (localLimit > -1) { - return new LimitSetViewIterator(); - } else { - return new SetViewIterator(); - } - } - - @Override - public boolean add(Object o) { - if(contains(o)) { - return false; - } - return GfshResultsBag.this.add(o); - } - - @Override - public void clear() { - GfshResultsBag.this.clear(); - } - - @Override - public int size() { - int calculatedSize = GfshResultsBag.this.map.size() + - (GfshResultsBag.this.numNulls > 0 ? 1 : 0); - if (localLimit > -1) { - return Math.min(localLimit, calculatedSize); - } - return calculatedSize; - } - - @Override - public boolean contains(Object o) { - if (o == null) { - return GfshResultsBag.this.numNulls > 0; - } - return GfshResultsBag.this.map.containsKey(o); - } - - @Override - public boolean isEmpty() { - if(localLimit == 0) { - return true; - } - if (GfshResultsBag.this.numNulls > 0) { - return false; - } - return GfshResultsBag.this.map.isEmpty(); - } - - public class SetViewIterator implements Iterator { - /** need to emit a null value if true */ - boolean emitNull = GfshResultsBag.this.numNulls > 0; - final ObjectIterator<Object2IntMap.Entry<?>> it = GfshResultsBag.this.map.object2IntEntrySet().fastIterator(); - Object2IntMap.Entry<?> currEntry; - boolean currentIsNull = false; - - public Object next() { - if (this.emitNull) { - this.emitNull = false; - currentIsNull = true; - return null; - } - currEntry = it.next(); - currentIsNull = false; - return currEntry.getKey(); - } - - public boolean hasNext() { - if (this.emitNull) { - return true; - } - return it.hasNext(); - } - - public void remove() { - if(currentIsNull) { - GfshResultsBag.this.numNulls = 0; - } else { - it.remove(); - } - } - }; - - class LimitSetViewIterator extends SetViewIterator { - private int currPos = 0; - @Override - public Object next() { - if (this.currPos == GfshResultsBag.SetView.this.localLimit) { - throw new NoSuchElementException(); - } - else { - Object next = super.next(); - ++currPos; - return next; - } - } - - @Override - public boolean hasNext() { - return (this.currPos < GfshResultsBag.SetView.this.localLimit) - && super.hasNext(); - } - - @Override - public void remove() { - if (this.currPos == 0) { - // next has not yet been called - throw new IllegalStateException("next() must be called before remove()"); - } - synchronized (GfshResultsBag.this.limitLock) { - if(currentIsNull) { - GfshResultsBag.this.limit -= GfshResultsBag.this.numNulls; - GfshResultsBag.this.numNulls = 0; - GfshResultsBag.SetView.this.localLimit--; - } else { - Object key = currEntry.getKey(); - int count = GfshResultsBag.this.map.removeInt(key); - assert count != 0 : "Attempted to remove an element that was not in the map."; - GfshResultsBag.this.limit -= count; - GfshResultsBag.SetView.this.localLimit--; - } - } - } - } - } - - /** - * @author Asif - * - */ - protected class LimitResultsBagIterator extends GfshResultsBag.ResultsBagIterator { - final private int localLimit; - - private int currPos = 0; - - /** - *guarded by GfshResultsBag2.this.limitLock object - */ - public LimitResultsBagIterator() { - localLimit = GfshResultsBag.this.limit; - } - - public boolean hasNext() { - return this.currPos < this.localLimit; - } - - public Object next() { - if (this.currPos == this.localLimit) { - throw new NoSuchElementException(); - } - else { - Object next = super.next(); - ++currPos; - return next; - } - - } - - public void remove() { - if (this.currPos == 0) { - // next has not yet been called - throw new IllegalStateException("next() must be called before remove()"); - } - synchronized (GfshResultsBag.this.limitLock) { - super.remove(); - --GfshResultsBag.this.limit; - } - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/ObjectUtil.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/ObjectUtil.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/ObjectUtil.java deleted file mode 100644 index 1dd66de..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/ObjectUtil.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.util; - -import java.lang.reflect.Method; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Map; - -import com.gemstone.gemfire.internal.tools.gfsh.app.Gfsh; -import com.gemstone.gemfire.internal.tools.gfsh.app.misc.util.ReflectionUtil; - -public class ObjectUtil -{ - public static Object updateObject(Gfsh gfsh, - Map<String, Method> setterMap, - Object obj, - String setterMethodName, - String value, - SimpleDateFormat dateFormat, boolean isCsvFormat) throws Exception - { - Method setterMethod = setterMap.get(setterMethodName); - if (setterMethod == null) { - return obj; - } - - Class types[] = setterMethod.getParameterTypes(); - Class arg = types[0]; - if (arg == byte.class || arg == Byte.class) { - setterMethod.invoke(obj, Byte.parseByte(value)); - } else if (arg == char.class || arg == Character.class) { - setterMethod.invoke(obj, value.charAt(0)); - } else if (arg == short.class || arg == Short.class) { - setterMethod.invoke(obj, Short.parseShort(value)); - } else if (arg == int.class || arg == Integer.class) { - setterMethod.invoke(obj, Integer.parseInt(value)); - } else if (arg == long.class || arg == Long.class) { - setterMethod.invoke(obj, Long.parseLong(value)); - } else if (arg == float.class || arg == Float.class) { - setterMethod.invoke(obj, Float.parseFloat(value)); - } else if (arg == double.class || arg == Double.class) { - setterMethod.invoke(obj, Double.parseDouble(value)); - } else if (arg == Date.class) { - Date date = dateFormat.parse(value); - setterMethod.invoke(obj, date); - } else if (arg == String.class) { - - if (isCsvFormat) { - // Replace double quotes with single quotes - value = value.replaceAll("\"\"", "\""); - - // if begins with a quote then remove it - if (value.startsWith("\"")) { - value = value.substring(1); - } - // if ends with a quote then remove it - if (value.endsWith("\"")) { - value = value.substring(0, value.length() - 1); - } - } - setterMethod.invoke(obj, value); - } else { - gfsh.println("Error: unsupported type: " + setterMethod.getName() + "(" + arg.getName() + ")"); - } - return obj; - } - - public static Object getPrimitive(Gfsh gfsh, String value, boolean quoted) throws ParseException - { - if (quoted) { - // string - return value; - } - - - value = value.trim().toLowerCase(); - if (value.length() == 0) { - return null; - } - char firstChar = value.charAt(0); - if (!(firstChar == '.' || firstChar >= '0' && firstChar <= '9')) { - // it's not number - return null; - } - - Object obj = null; - if (value.endsWith("b")) { - // byte - obj = new Byte(value.substring(0, value.length() - 1)); - } else if (value.endsWith("c")) { - // char - obj = value.charAt(0); - } else if (value.endsWith("s")) { - // short - obj = new Short(value.substring(0, value.length() - 1)); - } else if (value.endsWith("i")) { - // int - obj = new Integer(value.substring(0, value.length() - 1)); - } else if (value.endsWith("l")) { - // long - obj = new Long(value.substring(0, value.length() - 1)); - } else if (value.endsWith("f")) { - // float - obj = new Float(value.substring(0, value.length() - 1)); - } else if (value.endsWith("d")) { - // double - obj = new Double(value.substring(0, value.length() - 1)); - } else if (value.startsWith("to_date")) { - obj = gfsh.getDate(value); - } else { - if (value.indexOf(".") != -1 || value.indexOf("e") != -1) { - // use double by default - obj = new Double(value); - } else { - // us int by default - obj = new Integer(value); - } - } - - return obj; - } - - public static Object updateObject(Gfsh gfsh, - Map<String, Method> setterMap, - Object obj, - String tableColumnName, - Object value) throws Exception - { - Method setterMethod = setterMap.get("set" + tableColumnName); - if (setterMethod == null) { - // TODO: need to search the map. column names can be case insensitive - return obj; - } - setterMethod.invoke(obj, value); - - return obj; - } - - public static Object getPrintableObject(Object object) - { - if (object == null) { - return "null"; - } - if (object instanceof String || object.getClass().isPrimitive() || - object.getClass() == Boolean.class || - object.getClass() == Byte.class || - object.getClass() == Character.class || - object.getClass() == Short.class || - object.getClass() == Integer.class || - object.getClass() == Long.class || - object.getClass() == Float.class || - object.getClass() == Double.class) - { - return object.toString(); - - } else if (object instanceof Date) { - - return object.toString(); - - } else { - return ReflectionUtil.toStringGettersAnd(object); - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/OutputUtil.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/OutputUtil.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/OutputUtil.java deleted file mode 100644 index 0f24d14..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/util/OutputUtil.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.util; - -import java.io.PrintWriter; -import java.lang.reflect.Method; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import com.gemstone.gemfire.internal.tools.gfsh.app.misc.util.ReflectionUtil; - -public class OutputUtil -{ - public static final int TYPE_KEYS = 0; - public static final int TYPE_VALUES = 1; - public static final int TYPE_KEYS_VALUES = 2; - - public static final String TAG_COLUMN_SEPARATOR = "#|"; - - public static final String TAG_KEY = "#%key"; - public static final String TAG_DATE_FORMAT = "#%date_format"; - public static final String TAG_VALUE = "#%value"; - public static final String TAG_VALUE_KEY = "#%value_key"; - - - public static void printEntries(PrintWriter writer, Map map, - String fieldTerminator, String rowTerminator, - int firstRow, int lastRow, - int printType, boolean printHeader, - SimpleDateFormat dateFormat, String valueKeyFieldName) - { - if (map == null) { - System.out.println("Error: map is null"); - return; - } - - // Get all getters - Set<Map.Entry> entrySet = map.entrySet(); - Object key = null; - Object value = null; - Method keyGetters[] = null; - Method valueGetters[] = null; - for (Entry entry : entrySet) { - key = entry.getKey(); - value = entry.getValue(); - keyGetters = ReflectionUtil.getAllGetters(key.getClass()); - if (value == null) { - valueGetters = new Method[0]; - } else { - valueGetters = ReflectionUtil.getAllGetters(value.getClass()); - } - break; - } - - if (value == null) { - System.out.println("Error: value is null"); - return; - } - - switch (printType) { - case TYPE_KEYS: - // Print keys - if (printHeader) { - writer.print(TAG_KEY + " " + key.getClass().getName()); - writer.print(rowTerminator); - writer.print(TAG_DATE_FORMAT + " " + dateFormat.toPattern()); - writer.print(rowTerminator); - printHeader(writer, key, keyGetters, fieldTerminator, rowTerminator); - } - for (Entry entry : entrySet) { - key = entry.getKey(); - printObject(writer, keyGetters, key, fieldTerminator, rowTerminator, dateFormat); - } - break; - case TYPE_VALUES: - // Print values - if (printHeader) { - if (value != null) { - writer.print(TAG_VALUE + " " + value.getClass().getName()); - } - writer.print(rowTerminator); - writer.print(TAG_VALUE_KEY + " " + valueKeyFieldName); - writer.print(rowTerminator); - writer.print(TAG_DATE_FORMAT + " " + dateFormat.toPattern()); - writer.print(rowTerminator); - printHeader(writer, value, valueGetters, fieldTerminator, rowTerminator); - } - for (Entry entry : entrySet) { - value = entry.getValue(); - printObject(writer, valueGetters, value, fieldTerminator, rowTerminator, dateFormat); - } - break; - case TYPE_KEYS_VALUES: - default: - // Print keys and values - if (printHeader) { - writer.print(TAG_KEY + " " + key.getClass().getName()); - writer.print(rowTerminator); - if (value != null) { - writer.print(TAG_VALUE + " " + value.getClass().getName()); - } - writer.print(rowTerminator); - writer.print(TAG_DATE_FORMAT + " " + dateFormat.toPattern()); - writer.print(rowTerminator); - printHeader(writer, key, keyGetters, fieldTerminator); - writer.print(","); - printHeader(writer, value, valueGetters, fieldTerminator, rowTerminator); - } - for (Entry entry : entrySet) { - key = entry.getKey(); - value = entry.getValue(); - printObject(writer, keyGetters, key, fieldTerminator, dateFormat); - writer.print(","); - printObject(writer, valueGetters, value, fieldTerminator, dateFormat); - writer.print(rowTerminator); - } - break; - - } - } - - private static void printHeader(PrintWriter writer, Object object, Method methods[], - String fieldTerminator, String rowTerminator) - { - printHeader(writer, object, methods, fieldTerminator); - writer.print(rowTerminator); - } - - private static void printHeader(PrintWriter writer, Object object, Method methods[], - String fieldTerminator) - { - writer.print(TAG_COLUMN_SEPARATOR); - - if (object == null || object instanceof String || object.getClass().isPrimitive() || - object.getClass() == Boolean.class || - object.getClass() == Byte.class || - object.getClass() == Character.class || - object.getClass() == Short.class || - object.getClass() == Integer.class || - object.getClass() == Long.class || - object.getClass() == Float.class || - object.getClass() == Double.class || - object instanceof Date) - { - writer.print("Value"); - } else { - for (int i = 0; i < methods.length; i++) { - String name = methods[i].getName().substring(3); - writer.print(name); - if (i < methods.length - 1) { - writer.print(fieldTerminator); - } - } - } - } - - public static void printObject(PrintWriter writer, - Method methods[], - Object object, - String fieldTerminator, String rowTerminator, - SimpleDateFormat dateFormat) - { - printObject(writer, methods, object, fieldTerminator, dateFormat); - writer.print(rowTerminator); - } - - private static void printObject(PrintWriter writer, - Method methods[], - Object object, - String fieldTerminator, - SimpleDateFormat dateFormat) - { - if (object == null) { - writer.print("null"); - } else if (object instanceof String ) { //FindBugs (Below) - Possible null pointer dereference of object - String value = object.toString(); - - // For each quote add matching quote - value = value.replaceAll("\"", "\"\""); - - // If contains a quote then enclose it with quotes - if (value.indexOf("\"") != -1) { - value = "\"" + value; - value = value + "\""; - } else { - - // If begins with a " then prepend a ". - if (value.startsWith("\"")) { - value = "\"" + value; - } - - // If ends with a " then end it with a ". - if (value.endsWith("\"")) { - value = value + "\""; - } - } - writer.print(value); - - } else if(object.getClass().isPrimitive() || - object.getClass() == Boolean.class || - object.getClass() == Byte.class || - object.getClass() == Character.class || - object.getClass() == Short.class || - object.getClass() == Integer.class || - object.getClass() == Long.class || - object.getClass() == Float.class || - object.getClass() == Double.class) - { - writer.print(object.toString()); - - } else if (object instanceof Date) { - - writer.print(dateFormat.format((Date)object)); - - } else if (methods != null) { - for (int i = 0; i < methods.length; i++) { - Method method = methods[i]; - String name = method.getName(); - try { - Object value = method.invoke(object, (Object[])null); - value = getPrintableValue(value); - printObject(writer, null, value, fieldTerminator, dateFormat); - if (i < methods.length - 1) { - writer.print(fieldTerminator); - } - } catch (Exception ex) { - } - } - } - } - - private static Object getPrintableValue(Object value) - { - if (value instanceof Byte) { - value = ((Byte) value).toString(); - } else if (value instanceof byte[]) { - value = "[B " + ((byte[])value).length; - } else if (value instanceof boolean[]) { - value = "[Z " + ((boolean[])value).length; - } else if (value instanceof short[]) { - value = "[S " + ((short[])value).length; - } else if (value instanceof int[]) { - value = "[I " + ((int[])value).length; - } else if (value instanceof long[]) { - value = "[J " + ((long[])value).length; - } else if (value instanceof float[]) { - value = "[F " + ((float[])value).length; - } else if (value instanceof double[]) { - value = "[D " + ((double[])value).length; - } - return value; - } - -}
