/** * Copyright 2013 Cloudera Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.cloudera.cdk.data.hbase.manager; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.hbase.client.HTablePool; import com.cloudera.cdk.data.PartitionKey; import com.cloudera.cdk.data.hbase.avro.AvroEntitySchema; import com.cloudera.cdk.data.hbase.avro.AvroKeyEntitySchemaParser; import com.cloudera.cdk.data.hbase.avro.AvroUtils; import com.cloudera.cdk.data.hbase.avro.SpecificAvroDao; import com.cloudera.cdk.data.hbase.impl.Dao; import com.cloudera.cdk.data.hbase.impl.EntityScanner; import com.cloudera.cdk.data.hbase.manager.generated.ManagedSchema; /** * ManagedSchemaDao implementation backed by an HBase table. All of the managed * schemas are persisted to a table called "managed_schemas" unless otherwise * specified in the constructor. */ class ManagedSchemaHBaseDao implements ManagedSchemaDao { /** * The Default HBase table where this schema metadata is stored. */ public static final String DEFAULT_MANAGED_SCHEMA_TABLE = "managed_schemas"; /** * The schema parser we'll use to parse managed schemas. */ private static final AvroKeyEntitySchemaParser schemaParser = new AvroKeyEntitySchemaParser(); private static final AvroEntitySchema managedSchemaEntity; static { String str = AvroUtils.inputStreamToString(ManagedSchemaHBaseDao.class .getResourceAsStream("/ManagedSchema.avsc")); managedSchemaEntity = schemaParser.parseEntitySchema(str); } /** * An HBase Common DAO which is used to access the different entity schemas */ private Dao<ManagedSchema> managedSchemaDao; /** * Constructor which uses the default managed schema table name, which is * managed_schemas. * * @param tablePool * The pool of HBase tables */ public ManagedSchemaHBaseDao(HTablePool tablePool) { this(tablePool, DEFAULT_MANAGED_SCHEMA_TABLE); } public ManagedSchemaHBaseDao(HTablePool tablePool, String managedSchemaTable) { managedSchemaDao = new SpecificAvroDao<ManagedSchema>(tablePool, managedSchemaTable, managedSchemaEntity.getRawSchema(), ManagedSchema.class); } @Override public List<ManagedSchema> getManagedSchemas() { List<ManagedSchema> returnList = new ArrayList<ManagedSchema>(); EntityScanner<ManagedSchema> entityScanner = managedSchemaDao.getScanner(); entityScanner.open(); try { for (ManagedSchema entity : entityScanner) { returnList.add(entity); } } finally { entityScanner.close(); } return returnList; } @Override public ManagedSchema getManagedSchema(String tableName, String entityName) { PartitionKey key = managedSchemaDao.getPartitionStrategy().partitionKey( tableName, entityName); ManagedSchema managedSchemaRecord = managedSchemaDao.get(key); if (managedSchemaRecord == null) { return null; } else { return managedSchemaRecord; } } @Override public boolean save(ManagedSchema schema) { return managedSchemaDao.put(schema); } @Override public boolean delete(ManagedSchema schema) { return managedSchemaDao.delete(schema); } }