/*
* Copyright 2012 NGDATA nv
*
* 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 org.lilyproject.repository.impl;
import java.io.IOException;
import java.util.List;
import org.lilyproject.util.hbase.RepoAndTableUtil;
import com.google.common.collect.Lists;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.util.Bytes;
import org.lilyproject.repository.api.RepositoryTable;
import org.lilyproject.repository.api.TableCreateDescriptor;
import org.lilyproject.repository.api.TableManager;
import org.lilyproject.util.hbase.HBaseTableFactory;
import org.lilyproject.util.hbase.LilyHBaseSchema;
import org.lilyproject.util.hbase.LilyHBaseSchema.Table;
public class TableManagerImpl implements TableManager {
private String repositoryName;
private Configuration configuration;
private HBaseTableFactory tableFactory;
public TableManagerImpl(String repositoryName, Configuration configuration, HBaseTableFactory tableFactory) {
this.repositoryName = repositoryName;
this.configuration = configuration;
this.tableFactory = tableFactory;
}
@Override
public RepositoryTable createTable(String tableName) throws InterruptedException, IOException {
return createTable(new TableCreateDescriptor(tableName));
}
@Override
public RepositoryTable createTable(TableCreateDescriptor descriptor) throws InterruptedException, IOException {
if (!RepoAndTableUtil.isValidTableName(descriptor.getName())) {
throw new IllegalArgumentException(String.format("'%s' is not a valid table name. "
+ RepoAndTableUtil.VALID_NAME_EXPLANATION, descriptor.getName()));
}
if (tableExists(descriptor.getName())) {
throw new IllegalArgumentException(String.format("Table '%s' already exists", descriptor.getName()));
}
LilyHBaseSchema.getRecordTable(tableFactory, repositoryName, descriptor.getName(), descriptor.getSplitKeys());
return new RepositoryTableImpl(repositoryName, descriptor.getName());
}
@Override
public void dropTable(String tableName) throws InterruptedException, IOException {
if (Table.RECORD.name.equals(tableName)) {
throw new IllegalArgumentException("Can't delete the default record table");
}
HBaseAdmin hbaseAdmin = new HBaseAdmin(configuration);
String hbaseTableName = RepoAndTableUtil.getHBaseTableName(repositoryName, tableName);
try {
if (hbaseAdmin.tableExists(hbaseTableName)
&& LilyHBaseSchema.isRecordTableDescriptor(hbaseAdmin.getTableDescriptor(Bytes.toBytes(hbaseTableName)))) {
hbaseAdmin.disableTable(hbaseTableName);
hbaseAdmin.deleteTable(hbaseTableName);
} else {
throw new IllegalArgumentException(
String.format("Table '%s' is not a valid record table (HBase table name: '%s')",
tableName, hbaseTableName));
}
} finally {
hbaseAdmin.close();
}
}
@Override
public List<RepositoryTable> getTables() throws InterruptedException, IOException {
HBaseAdmin hbaseAdmin = new HBaseAdmin(configuration);
List<RepositoryTable> recordTables = Lists.newArrayList();
try {
for (HTableDescriptor tableDescriptor : hbaseAdmin.listTables()) {
if (LilyHBaseSchema.isRecordTableDescriptor(tableDescriptor)
&& RepoAndTableUtil.belongsToRepository(tableDescriptor.getNameAsString(), repositoryName)) {
String name = RepoAndTableUtil.extractLilyTableName(repositoryName, tableDescriptor.getNameAsString());
recordTables.add(new RepositoryTableImpl(repositoryName, name));
}
}
} finally {
hbaseAdmin.close();
}
return recordTables;
}
@Override
public boolean tableExists(String tableName) throws InterruptedException, IOException {
HBaseAdmin hbaseAdmin = new HBaseAdmin(configuration);
try {
return hbaseAdmin.tableExists(getHBaseTableName(tableName));
} finally {
hbaseAdmin.close();
}
}
private String getHBaseTableName(String tableName) {
return RepoAndTableUtil.getHBaseTableName(repositoryName, tableName);
}
}