package siena.hbase; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; import siena.AbstractPersistenceManager; import siena.ClassInfo; import siena.PersistenceManager; import siena.Query; import siena.QueryAggregated; import siena.QueryFilter; import siena.QueryFilterSearch; import siena.QueryJoin; import siena.QueryOrder; import siena.QueryOwned; import siena.SienaException; import siena.core.Many4PM; import siena.core.One4PM; import siena.core.async.PersistenceManagerAsync; import siena.core.async.QueryAsync; import siena.core.options.QueryOption; public class HBasePersistenceManager extends AbstractPersistenceManager { private Configuration config; public HBasePersistenceManager() { config = HBaseConfiguration.create(); } public void beginTransaction(int isolationLevel) { // TODO Auto-generated method stub } public void beginTransaction() { // TODO Auto-generated method stub } public void closeConnection() { // TODO Auto-generated method stub } public void commitTransaction() { // TODO Auto-generated method stub } public <T> Query<T> createQuery(Class<T> clazz) { return new HBaseQuery<T>(clazz); } public void delete(Object obj) { Class<?> clazz = obj.getClass(); ClassInfo info = ClassInfo.getClassInfo(clazz); try { HTable table = new HTable(config, info.tableName); Field id = ClassInfo.getIdField(clazz); id.setAccessible(true); Delete d = new Delete(Bytes.toBytes(id.get(obj).toString())); table.delete(d); } catch(Exception e) { throw new SienaException(e); } } public void get(Object obj) { Class<?> clazz = obj.getClass(); ClassInfo info = ClassInfo.getClassInfo(clazz); try { HTable table = new HTable(config, info.tableName); Field id = ClassInfo.getIdField(clazz); id.setAccessible(true); Get g = new Get(Bytes.toBytes(id.get(obj).toString())); Result rowResult = table.get(g); if(rowResult.isEmpty()) throw new SienaException("No such object"); mapObject(clazz, obj, rowResult); } catch(Exception e) { throw new SienaException(e); } } public void init(Properties p) { } public void insert(Object obj) { Class<?> clazz = obj.getClass(); ClassInfo info = ClassInfo.getClassInfo(clazz); try { HTable table = new HTable(config, info.tableName); Field id = ClassInfo.getIdField(clazz); id.setAccessible(true); Put p = new Put(Bytes.toBytes(id.get(obj).toString())); List<Field> fields = info.insertFields; for (Field field : fields) { p.add(Bytes.toBytes("string"), Bytes.toBytes(ClassInfo.getColumnNames(field)[0]), Bytes.toBytes(field.get(obj).toString())); } table.put(p); } catch(Exception e) { throw new SienaException(e); } } public void rollbackTransaction() { // TODO Auto-generated method stub } public void update(Object obj) { insert(obj); } private <T> void mapObject(Class<T> clazz, Object obj, Result result) { try { String id = Bytes.toString(result.getRow()); ClassInfo info = ClassInfo.getClassInfo(clazz); for (Field field : info.insertFields) { String column = "string:"+ClassInfo.getColumnNames(field)[0]; String value = Bytes.toString( result.getValue( Bytes.toBytes("string"), Bytes.toBytes(ClassInfo.getColumnNames(field)[0]))); field.setAccessible(true); field.set(obj, value); } ClassInfo.getIdField(clazz).set(obj, id); } catch(Exception e) { throw new SienaException(e); } } private <T> T mapObject(Class<T> clazz, Result rowResult) { try { T obj = clazz.newInstance(); mapObject(clazz, obj, rowResult); return obj; } catch(SienaException e) { throw e; } catch(Exception e) { throw new SienaException(e); } } class HBaseQuery<T> implements Query<T> { private Class<T> clazz; private ClassInfo info; public HBaseQuery(Class<T> clazz) { this.clazz = clazz; info = ClassInfo.getClassInfo(clazz); } @Override public int count() { // TODO Auto-generated method stub return 0; } @Override public int count(int limit) { // TODO Auto-generated method stub return 0; } @Override public int count(int limit, Object offset) { // TODO Auto-generated method stub return 0; } @Override public List<T> fetch() { ResultScanner scanner = null; try { HTable table = new HTable(config, info.tableName); List<Field> fields = info.insertFields; List<String> names = new ArrayList<String>(); Scan s = new Scan(); for (Field field : fields) { s.addColumn( Bytes.toBytes("string"), Bytes.toBytes(ClassInfo.getColumnNames(field)[0])); } scanner = table.getScanner(s); List<T> results = new ArrayList<T>(); for (Result rr = scanner.next(); rr != null; rr = scanner.next()) { // print out the row we found and the columns we were looking for results.add(mapObject(clazz, rr)); } return results; } catch(SienaException e) { throw e; } catch(Exception e) { throw new SienaException(e); } finally { scanner.close(); } } @Override public List<T> fetch(int limit) { // TODO Auto-generated method stub return null; } @Override public List<T> fetch(int limit, Object offset) { // TODO Auto-generated method stub @Override return null; } @Override public Query<T> filter(String fieldName, Object value) { // TODO Auto-generated method stub return null; } @Override public T get() { List<T> list = fetch(); if(list.isEmpty()) return null; return list.get(0); } @Override public Iterable<T> iter() { // TODO Auto-generated method stub return null; } @Override public Iterable<T> iter(int limit) { // TODO Auto-generated method stub return null; } @Override public Iterable<T> iter(int limit, Object offset) { // TODO Auto-generated method stub return null; } @Override public Query<T> order(String fieldName) { // TODO Auto-generated method stub return null; } @Override public Query<T> search(String match, boolean inBooleanMode, String index) { // TODO Auto-generated method stub return null; } public HBaseQuery<T> clone() { return null; } @Override public Object nextOffset() { // TODO Auto-generated method stub return null; } @Override public int delete() { // TODO Auto-generated method stub return 0; } @Override public List<T> fetchKeys() { // TODO Auto-generated method stub return null; } @Override public List<T> fetchKeys(int limit) { // TODO Auto-generated method stub return null; } @Override public List<T> fetchKeys(int limit, Object offset) { // TODO Auto-generated method stub return null; } @Override public List<QueryFilter> getFilters() { // TODO Auto-generated method stub return null; } @Override public List<QueryOrder> getOrders() { // TODO Auto-generated method stub return null; } @Override public List<QueryFilterSearch> getSearches() { // TODO Auto-generated method stub return null; } @Override public void setNextOffset(Object nextOffset) { // TODO Auto-generated method stub } @Override public Class<T> getQueriedClass() { // TODO Auto-generated method stub return null; } @Override public List<QueryJoin> getJoins() { // TODO Auto-generated method stub return null; } @Override public Query<T> join(String field, String... sortFields) { // TODO Auto-generated method stub return null; } @Override public Query<T> paginate(int size) { // TODO Auto-generated method stub return null; } @Override public Query<T> customize(QueryOption... options) { // TODO Auto-generated method stub return null; } @Override public Map<Integer, QueryOption> options() { // TODO Auto-generated method stub return null; } @Override public Query<T> search(String match, String... fields) { // TODO Auto-generated method stub return null; } @Override public Query<T> search(String match, QueryOption opt, String... fields) { // TODO Auto-generated method stub return null; } @Override public QueryOption option(int option) { // TODO Auto-generated method stub return null; } @Override public Query<T> stateful() { // TODO Auto-generated method stub return null; } @Override public Query<T> release() { // TODO Auto-generated method stub return null; } @Override public int update(Map<String, ?> fieldValues) { // TODO Auto-generated method stub return 0; } @Override public Query<T> nextPage() { // TODO Auto-generated method stub return null; } @Override public Query<T> previousPage() { // TODO Auto-generated method stub return null; } @Override public Query<T> stateless() { // TODO Auto-generated method stub return null; } @Override public Query<T> resetData() { // TODO Auto-generated method stub return null; } @Override public String dump(QueryOption... options) { // TODO Auto-generated method stub return null; } @Override public void dump(OutputStream os, QueryOption... options) { // TODO Auto-generated method stub } @Override public Query<T> restore(String dump, QueryOption... options) { // TODO Auto-generated method stub return null; } @Override public Query<T> restore(InputStream dump, QueryOption... options) { // TODO Auto-generated method stub return null; } @Override public QueryAsync<T> async() { // TODO Auto-generated method stub return null; } @Override public PersistenceManager getPersistenceManager() { // TODO Auto-generated method stub return null; } @Override public Query<T> limit(int limit) { // TODO Auto-generated method stub return null; } @Override public Query<T> offset(Object offset) { // TODO Auto-generated method stub return null; } @Override public Iterable<T> iterPerPage(int limit) { // TODO Auto-generated method stub return null; } @Override public T getByKey(Object key) { // TODO Auto-generated method stub return null; } @Override public Query<T> copy() { // TODO Auto-generated method stub return null; } @Override public List<QueryAggregated> getAggregatees() { // TODO Auto-generated method stub return null; } @Override public Query<T> aggregated(Object aggregator, String fieldName) { // TODO Auto-generated method stub return null; } @Override public Query<T> owned(Object owner, String fieldName) { // TODO Auto-generated method stub return null; } @Override public List<QueryOwned> getOwnees() { // TODO Auto-generated method stub return null; } } @Override public void save(Object obj) { // TODO Auto-generated method stub } @Override public int save(Object... objects) { // TODO Auto-generated method stub return 0; } @Override public int save(Iterable<?> objects) { // TODO Auto-generated method stub return 0; } @Override public int insert(Object... objects) { // TODO Auto-generated method stub return 0; } @Override public int insert(Iterable<?> objects) { // TODO Auto-generated method stub return 0; } @Override public int delete(Object... models) { // TODO Auto-generated method stub return 0; } @Override public int delete(Iterable<?> models) { // TODO Auto-generated method stub return 0; } @Override public <T> int deleteByKeys(Class<T> clazz, Object... keys) { // TODO Auto-generated method stub return 0; } @Override public <T> int deleteByKeys(Class<T> clazz, Iterable<?> keys) { // TODO Auto-generated method stub return 0; } @Override public int get(Object... models) { // TODO Auto-generated method stub return 0; } @Override public <T> int get(Iterable<T> models) { // TODO Auto-generated method stub return 0; } @Override public <T> T getByKey(Class<T> clazz, Object key) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> getByKeys(Class<T> clazz, Object... keys) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> getByKeys(Class<T> clazz, Iterable<?> keys) { // TODO Auto-generated method stub return null; } @Override public <T> int update(Object... models) { // TODO Auto-generated method stub return 0; } @Override public <T> int update(Iterable<T> models) { // TODO Auto-generated method stub return 0; } @Override public <T> int delete(Query<T> query) { // TODO Auto-generated method stub return 0; } @Override public <T> int update(Query<T> query, Map<String, ?> fieldValues) { // TODO Auto-generated method stub return 0; } @Override public <T> Many4PM<T> createMany(Class<T> clazz) { // TODO Auto-generated method stub return null; } @Override public <T> One4PM<T> createOne(Class<T> clazz) { // TODO Auto-generated method stub return null; } @Override public <T> int count(Query<T> query) { // TODO Auto-generated method stub return 0; } @Override public <T> List<T> fetch(Query<T> query) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> fetch(Query<T> query, int limit) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> fetch(Query<T> query, int limit, Object offset) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> fetchKeys(Query<T> query) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> fetchKeys(Query<T> query, int limit) { // TODO Auto-generated method stub return null; } @Override public <T> List<T> fetchKeys(Query<T> query, int limit, Object offset) { // TODO Auto-generated method stub return null; } @Override public <T> Iterable<T> iter(Query<T> query) { // TODO Auto-generated method stub return null; } @Override public <T> Iterable<T> iter(Query<T> query, int limit) { // TODO Auto-generated method stub return null; } @Override public <T> Iterable<T> iter(Query<T> query, int limit, Object offset) { // TODO Auto-generated method stub return null; } @Override public <T> void paginate(Query<T> query) { // TODO Auto-generated method stub } @Override public <T> void nextPage(Query<T> query) { // TODO Auto-generated method stub } @Override public <T> void previousPage(Query<T> query) { // TODO Auto-generated method stub } @Override public <T> PersistenceManagerAsync async() { // TODO Auto-generated method stub return null; } @Override public String[] supportedOperators() { // TODO Auto-generated method stub return null; } }