/*
* Copyright 2013 ZerothAngel <zerothangel@tyrannyofheaven.org>
*
* 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.tyrannyofheaven.bukkit.util;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.plugin.java.JavaPlugin;
import org.tyrannyofheaven.bukkit.util.ToHStringUtils;
import com.avaje.ebean.config.NamingConvention;
import com.avaje.ebean.config.TableName;
import com.avaje.ebean.config.UnderscoreNamingConvention;
/**
* Avaje {@link NamingConvention} implementation that accepts custom names for
* mapped beans. Otherwise behaves the same as {@link UnderscoreNamingConvention},
* the default used by Avaje.
*
* @author zerothangel
*/
public class ToHNamingConvention extends UnderscoreNamingConvention {
private final Map<String, String> tableNames = new HashMap<>();
private final String defaultSchemaTableName;
/**
* Construct a new instance and configure it so it only accepts table name
* mappings of the classes specified by {@link JavaPlugin#getDatabaseClasses()}.
*
* @param plugin the JavaPlugin subclass
*/
public ToHNamingConvention(JavaPlugin plugin, String defaultSchemaTableName) {
// Set up null placeholders
for (Class<?> clazz : plugin.getDatabaseClasses()) {
tableNames.put(clazz.getSimpleName(), null);
}
this.defaultSchemaTableName = defaultSchemaTableName;
}
/**
* Clear all table name mappings.
*/
public void clearTableNames() {
for (Map.Entry<String, String> me : tableNames.entrySet()) {
me.setValue(null);
}
}
/**
* Add a table name mapping for the given class.
*
* @param className the simple name of the class
* @param tableName the table name. May be qualified with catalog/schema. May be null.
*/
public void setTableName(String className, String tableName) {
if (!ToHStringUtils.hasText(tableName))
tableName = null; // Normalize
if (tableNames.containsKey(className)) {
tableNames.put(className, tableName);
}
}
/* (non-Javadoc)
* @see com.avaje.ebean.config.AbstractNamingConvention#getTableName(java.lang.Class)
*/
@Override
public TableName getTableName(Class<?> beanClass) {
String qualifiedTableName = tableNames.get(beanClass.getSimpleName());
if (qualifiedTableName != null) {
return new TableName(qualifiedTableName);
}
else if (beanClass == ToHSchemaVersion.class) {
// Special handling of default name for schema version table
TableName tableName = super.getTableName(beanClass);
return new TableName(tableName.getCatalog(), tableName.getSchema(), defaultSchemaTableName);
}
return super.getTableName(beanClass);
}
}