// Path: src/main/java/org/tyrannyofheaven/bukkit/util/ToHStringUtils.java
// public class ToHStringUtils {
// 
//     private ToHStringUtils() {
//         throw new AssertionError("Don't instantiate me!");
//     }
// 
//     /**
//      * Returns true if text is non-null and contains non-whitespace characters.
//      * 
//      * @param text the string to test
//      * @return true if text is non-null and contains non-whitespace characters
//      */
//     public static boolean hasText(String text) {
//         return text != null && text.trim().length() > 0;
//     }
// 
//     /**
//      * Returns a string representation of each object, with each object delimited
//      * by the given delimiter. Similar to "string join" in other languages.
//      * 
//      * @param delimiter the string delimiter
//      * @param coll a collection of objects
//      * @return the delimited string
//      */
//     public static String delimitedString(String delimiter, Collection<?> coll) {
//         StringBuilder sb = new StringBuilder();
//         for (Iterator<?> i = coll.iterator(); i.hasNext();) {
//             sb.append(i.next());
//             if (i.hasNext())
//                 sb.append(delimiter);
//         }
//         return sb.toString();
//     }
// 
//     /**
//      * Returns a string representation of each object, with each object delimited
//      * by the given delimiter. Similar to "string join" in other languages.
//      * 
//      * @param delimiter the string delimiter
//      * @param objs an array of objects
//      * @return the delimited string
//      */
//     public static String delimitedString(String delimiter, Object... objs) {
//         return delimitedString(delimiter, Arrays.asList(objs));
//     }
// 
//     /**
//      * Quote a string suitable for the "quote aware" parser of {@link ToHCommandExecutor}.
//      * 
//      * @param input the input string
//      * @return the possibly escaped and quoted string
//      */
//     public static String quoteArgForCommand(String input) {
//         input = input.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\\\\"");
//         if (input.matches(".*\\s.*"))
//             return "\"" + input + "\""; // Enclose in quotes
//         else
//             return input;
//     }
// 
// }


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;
/*
 * 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;




/**
 * 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) {
// Path: src/main/java/org/tyrannyofheaven/bukkit/util/ToHStringUtils.java
// public class ToHStringUtils {
// 
//     private ToHStringUtils() {
//         throw new AssertionError("Don't instantiate me!");
//     }
// 
//     /**
//      * Returns true if text is non-null and contains non-whitespace characters.
//      * 
//      * @param text the string to test
//      * @return true if text is non-null and contains non-whitespace characters
//      */
//     public static boolean hasText(String text) {
//         return text != null && text.trim().length() > 0;
//     }
// 
//     /**
//      * Returns a string representation of each object, with each object delimited
//      * by the given delimiter. Similar to "string join" in other languages.
//      * 
//      * @param delimiter the string delimiter
//      * @param coll a collection of objects
//      * @return the delimited string
//      */
//     public static String delimitedString(String delimiter, Collection<?> coll) {
//         StringBuilder sb = new StringBuilder();
//         for (Iterator<?> i = coll.iterator(); i.hasNext();) {
//             sb.append(i.next());
//             if (i.hasNext())
//                 sb.append(delimiter);
//         }
//         return sb.toString();
//     }
// 
//     /**
//      * Returns a string representation of each object, with each object delimited
//      * by the given delimiter. Similar to "string join" in other languages.
//      * 
//      * @param delimiter the string delimiter
//      * @param objs an array of objects
//      * @return the delimited string
//      */
//     public static String delimitedString(String delimiter, Object... objs) {
//         return delimitedString(delimiter, Arrays.asList(objs));
//     }
// 
//     /**
//      * Quote a string suitable for the "quote aware" parser of {@link ToHCommandExecutor}.
//      * 
//      * @param input the input string
//      * @return the possibly escaped and quoted string
//      */
//     public static String quoteArgForCommand(String input) {
//         input = input.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\\\\"");
//         if (input.matches(".*\\s.*"))
//             return "\"" + input + "\""; // Enclose in quotes
//         else
//             return input;
//     }
// 
// }


// Path: src/main/java/org/tyrannyofheaven/bukkit/util/ToHNamingConvention.java
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;

/*
 * 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;




/**
 * 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))