package com.impetus.kundera.hbase.client; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.management.RuntimeErrorException; import javax.persistence.EntityManager; import javax.persistence.PersistenceException; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.util.Bytes; import com.impetus.kundera.ejb.EntityManagerImpl; import com.impetus.kundera.hbase.admin.DataHandler; import com.impetus.kundera.hbase.admin.HBaseDataHandler; import com.impetus.kundera.loader.DBType; import com.impetus.kundera.metadata.EntityMetadata; import com.impetus.kundera.metadata.EntityMetadata.Column; import com.impetus.kundera.property.PropertyAccessException; import com.impetus.kundera.property.PropertyAccessorHelper; import com.impetus.kundera.proxy.EnhancedEntity; /** * HBase client. * @author impetus */ public class HBaseClient implements/* Client, */com.impetus.kundera.Client { String contactNode; String defaultPort; private DataHandler handler /*= new HBaseDataHandler("localhost","6000")*/; private boolean isConnected; private EntityManager em; /*@Override public void write(String tableName, String columnFamily, String rowKey, List<Column> columns, EnhancedEntity e) throws IOException{ handler.loadData(tableName, columnFamily, rowKey, columns,e); } @Override public HBaseData read(String tableName, String columnFamily, String rowKey, String...columnNames) throws IOException{ return handler.populateData(tableName, columnFamily, columnNames, rowKey); }*/ @Override public void writeColumns(String keyspace, String columnFamily, String rowKey, List<Column> columns, EnhancedEntity e) throws Exception { // em.persist(arg0) handler.loadData(e.getEntity().getClass().getSimpleName().toLowerCase(), columnFamily, rowKey, columns,e); } @Override public void writeColumns(EntityManagerImpl em, EnhancedEntity e, EntityMetadata m) throws Exception { throw new PersistenceException("Not yet implemented"); } @Override public <E> E loadColumns(EntityManagerImpl em, Class<E> clazz, String keyspace, String columnFamily, String rowKey, EntityMetadata m) throws Exception { HBaseData data = handler.populateData(clazz.getSimpleName().toLowerCase(), columnFamily, new String[0], rowKey); return onLoadFromHBase(clazz, data, m, rowKey); } @Override public <E> List<E> loadColumns(EntityManagerImpl em, Class<E> clazz, String keyspace, String columnFamily, EntityMetadata m, String... keys) throws Exception { List<E> entities = new ArrayList<E>(); for(String rowKey: keys) { HBaseData data = handler.populateData(clazz.getSimpleName().toLowerCase(), columnFamily, keys, rowKey); entities.add(onLoadFromHBase(clazz, data, m, rowKey)); } return entities; } /** * * @param <E> * @param clazz * @param data * @param m * @param columnFamily * @param id * @return */ private <E> E onLoadFromHBase(Class<E> clazz, HBaseData data, EntityMetadata m, String id){ // Instantiate a new instance E e=null; try { e = clazz.newInstance(); String colName = null; byte[] columnValue=null; PropertyAccessorHelper.set(e, m.getIdProperty(), id); List<KeyValue> values = data.getColumns(); for(KeyValue colData:values){ colName = Bytes.toString(colData.getQualifier()); columnValue = colData.getValue(); //Get Column from metadata com.impetus.kundera.metadata.EntityMetadata.Column column = m.getColumn(colName); PropertyAccessorHelper.set(e, column.getField(), columnValue); } } catch (InstantiationException e1) { throw new RuntimeException(e1.getMessage()); } catch (IllegalAccessException e1) { throw new RuntimeException(e1.getMessage()); } catch (PropertyAccessException e1) { throw new RuntimeException(e1.getMessage()); } return e; } @Override public void shutdown() { handler.shutdown(); } @Override public void connect() { if(!isConnected) { handler = new HBaseDataHandler(contactNode,defaultPort); isConnected=true; } } @Override public void setContactNodes(String... contactNodes) { this.contactNode = contactNodes[0]; } @Override public void setDefaultPort(int defaultPort) { this.defaultPort = String.valueOf(defaultPort); } @Override public void delete(String keyspace, String columnFamily, String rowId) throws Exception { throw new RuntimeException("TODO:not yet supprot"); } @Override public void setKeySpace(String keySpace) { //TODO not required. } @Override public DBType getType() { return DBType.HBASE; } }