From 1d483e8555526091c09cb0202f563490bb735685 Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Fri, 4 Sep 2015 15:26:49 +0200 Subject: [PATCH] =?utf8?q?Removed=20all=20TDGP-related=20classes=20as=20Pe?= =?utf8?q?rsistence=20is=20coming=20Signed-off-by:Roland=20H=C3=A4der=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../mxchange/jcore/BaseFrameworkSystem.java | 560 ------------------ .../mxchange/jcore/FrameworkInterface.java | 5 - .../mxchange/jcore/contact/BaseContact.java | 102 ---- src/org/mxchange/jcore/contact/Contact.java | 18 +- .../mxchange/jcore/criteria/BaseCriteria.java | 95 --- src/org/mxchange/jcore/criteria/Criteria.java | 74 --- .../jcore/criteria/logical/Logical.java | 38 -- .../logical/and/AndLogicalMatcher.java | 78 --- .../criteria/searchable/SearchCriteria.java | 139 ----- .../searchable/SearchableCriteria.java | 68 --- .../database/backend/BaseDatabaseBackend.java | 144 ----- .../database/backend/DatabaseBackend.java | 107 ---- .../base64/Base64CsvDatabaseBackend.java | 478 --------------- .../datasource/DataSourceDatabaseBackend.java | 142 ----- .../backend/mysql/MySqlDatabaseBackend.java | 435 -------------- .../jcore/database/file/DatabaseFile.java | 87 --- .../database/file/SynchronizeableFile.java | 40 -- .../frontend/BaseDatabaseFrontend.java | 203 ------- .../database/frontend/DatabaseFrontend.java | 102 ---- .../jcore/database/result/DatabaseResult.java | 148 ----- .../jcore/database/result/Result.java | 67 --- .../jcore/database/storage/Storable.java | 53 -- .../jcore/exceptions/BadTokenException.java | 38 -- .../CorruptedDatabaseFileException.java | 36 -- .../UnsupportedDatabaseBackendException.java | 38 -- .../UnsupportedDatabaseDriverException.java | 37 -- .../database/backend/BackendFactory.java | 91 --- 27 files changed, 2 insertions(+), 3421 deletions(-) delete mode 100644 src/org/mxchange/jcore/criteria/BaseCriteria.java delete mode 100644 src/org/mxchange/jcore/criteria/Criteria.java delete mode 100644 src/org/mxchange/jcore/criteria/logical/Logical.java delete mode 100644 src/org/mxchange/jcore/criteria/logical/and/AndLogicalMatcher.java delete mode 100644 src/org/mxchange/jcore/criteria/searchable/SearchCriteria.java delete mode 100644 src/org/mxchange/jcore/criteria/searchable/SearchableCriteria.java delete mode 100644 src/org/mxchange/jcore/database/backend/BaseDatabaseBackend.java delete mode 100644 src/org/mxchange/jcore/database/backend/DatabaseBackend.java delete mode 100644 src/org/mxchange/jcore/database/backend/base64/Base64CsvDatabaseBackend.java delete mode 100644 src/org/mxchange/jcore/database/backend/datasource/DataSourceDatabaseBackend.java delete mode 100644 src/org/mxchange/jcore/database/backend/mysql/MySqlDatabaseBackend.java delete mode 100644 src/org/mxchange/jcore/database/file/DatabaseFile.java delete mode 100644 src/org/mxchange/jcore/database/file/SynchronizeableFile.java delete mode 100644 src/org/mxchange/jcore/database/frontend/BaseDatabaseFrontend.java delete mode 100644 src/org/mxchange/jcore/database/frontend/DatabaseFrontend.java delete mode 100644 src/org/mxchange/jcore/database/result/DatabaseResult.java delete mode 100644 src/org/mxchange/jcore/database/result/Result.java delete mode 100644 src/org/mxchange/jcore/database/storage/Storable.java delete mode 100644 src/org/mxchange/jcore/exceptions/BadTokenException.java delete mode 100644 src/org/mxchange/jcore/exceptions/CorruptedDatabaseFileException.java delete mode 100644 src/org/mxchange/jcore/exceptions/UnsupportedDatabaseBackendException.java delete mode 100644 src/org/mxchange/jcore/exceptions/UnsupportedDatabaseDriverException.java delete mode 100644 src/org/mxchange/jcore/factory/database/backend/BackendFactory.java diff --git a/src/org/mxchange/jcore/BaseFrameworkSystem.java b/src/org/mxchange/jcore/BaseFrameworkSystem.java index 1a96607..81f93c9 100644 --- a/src/org/mxchange/jcore/BaseFrameworkSystem.java +++ b/src/org/mxchange/jcore/BaseFrameworkSystem.java @@ -16,32 +16,17 @@ */ package org.mxchange.jcore; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.MessageFormat; import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Properties; import java.util.ResourceBundle; import java.util.StringTokenizer; -import org.apache.commons.lang3.ArrayUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mxchange.jcore.application.Application; import org.mxchange.jcore.client.Client; import org.mxchange.jcore.contact.Contact; -import org.mxchange.jcore.database.backend.DatabaseBackend; -import org.mxchange.jcore.database.frontend.DatabaseFrontend; -import org.mxchange.jcore.database.storage.Storable; import org.mxchange.jcore.manager.Manageable; /** @@ -56,11 +41,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { */ private static ResourceBundle bundle; - /** - * Instance for own properties - */ - private static final Properties properties = new Properties(System.getProperties()); - /** * Self instance */ @@ -76,11 +56,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { */ private Application application; - /** - * Instance for database backend - */ - private DatabaseBackend backend; - /** * Client instance */ @@ -91,11 +66,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { */ private Contact contact; - /** - * DatabaseFrontend instance - */ - private DatabaseFrontend frontend; - /** * Manager instance */ @@ -347,43 +317,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { this.getLogger().catching(exception); } - /** - * Initializes properties with default values - */ - private void initPropertiesWithDefault () { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Init default values: - // Default database backend - BaseFrameworkSystem.properties.put("org.mxchange.database.backend.class", "org.mxchange.jcore.database.backend.base64.Base64CsvDatabaseBackend"); //NOI18N - BaseFrameworkSystem.properties.put("org.mxchange.database.backend.storagepath", "data/"); //NOI18N - BaseFrameworkSystem.properties.put("org.mxchange.database.datasource.name", ""); //NOI18N - - // For MySQL backend - BaseFrameworkSystem.properties.put("org.mxchange.database.mysql.host", "localhost"); //NOI18N - BaseFrameworkSystem.properties.put("org.mxchange.database.mysql.dbname", "test"); //NOI18N - BaseFrameworkSystem.properties.put("org.mxchange.database.mysql.login", ""); //NOI18N - BaseFrameworkSystem.properties.put("org.mxchange.database.mysql.password", ""); //NOI18N - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Writes the properties file to disk - */ - private void writePropertiesFile () throws IOException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Write it - BaseFrameworkSystem.properties.store(new PrintWriter(FrameworkInterface.PROPERTIES_CONFIG_FILE), "This file is automatically generated. You may wish to alter it."); //NOI18N - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - /** * Converts a column name like "foo_bar" to an attribute name like "fooBar" * @@ -630,16 +563,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { return value; } - /** - * Getter for property which must exist - * - * @param key Key to get - * @return Propety value - */ - protected final String getProperty (final String key) { - return BaseFrameworkSystem.properties.getProperty(String.format("org.mxchange.%s", key)); //NOI18N - } - /** * Name of used database table, handled over to backend * @@ -649,78 +572,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { this.tableName = tableName; } - /** - * Some getter for type reflection of given column name - * - * @param instance The instance to check - * @param targetClass Target class to check - * @param columnName Column name - * @return Type reflection of value - */ - private Class getType (final FrameworkInterface instance, final String targetClass, final String columnName) { - // Trace message - this.getLogger().trace(MessageFormat.format("instance={0},targetClass={1},columnName={2} - CALLED!", instance, targetClass, columnName)); //NOI18N - - // Init field tye - Class type = null; - - // Get super class fields - Field[] superFields = this.getClassFromTarget(instance, "BaseFrameworkSystem").getDeclaredFields(); //NOI18N - - // Get all attributes from given instance - Field[] fields = ArrayUtils.addAll(superFields, this.getClassFromTarget(instance, targetClass).getDeclaredFields()); - - // Debug message - this.getLogger().debug(MessageFormat.format("fields()={0}", fields.length)); //NOI18N - - // Convert column_name to fieldName ;-) - String fieldName = this.convertColumnNameToFieldName(columnName); - - // Debug message - this.getLogger().debug(MessageFormat.format("fieldName={0}", fieldName)); //NOI18N - - // Search for proper field instance - for (final Field field : fields) { - // Is a dollar character there? - if (field.getName().startsWith("$")) { //NOI18N - // Debug message - this.getLogger().debug(MessageFormat.format("Field name {0} starts with a dollar, skipped.", field.getName())); //NOI18N - // Skip this - continue; - } - - // Debug message - this.getLogger().debug(MessageFormat.format("field.getName()={0},fieldName={1}", field.getName(), fieldName)); //NOI18N - - // Does it match? - if (field.getName().equals(fieldName)) { - // Found it - type = field.getType(); - - // Debug message - this.getLogger().debug(MessageFormat.format("Found fieldName={0}: setting type={1}", fieldName, type.getSimpleName())); //NOI18N - - // Don't continue with searching - break; - } - } - - // Debug message - this.getLogger().debug(MessageFormat.format("type={0}", type)); //NOI18N - - // type should not be null - if (null == type) { - // No null allowed - throw new NullPointerException("type is null"); //NOI18N - } - - // Trace message - this.getLogger().debug(MessageFormat.format("type={0} - EXIT!", type)); //NOI18N - - // Return it - return type; - } - /** * Converts null to empty string or leaves original string. * @@ -744,82 +595,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { return str; } - /** - * Creates an iterator from given instance and class name. - * - * @param instance Instance to run getter calls on - * @param className Class name to iterate over - * @return An iterator over all object's fields - * @throws java.lang.NoSuchMethodException If the called method does not - * exist - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - protected Iterator> fieldIterator (final Storable instance, final String className) throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("instance={0},className={1} - CALLED!", instance, className)); //NOI18N - - // Get all attributes from given instance - Field[] fields = this.getClassFromTarget(instance, className).getDeclaredFields(); - - // Debug message - this.getLogger().debug(MessageFormat.format("Found {0} fields.", fields.length)); //NOI18N - - // A simple map with K=fieldName and V=Value is fine - Map map = new HashMap<>(fields.length); - - // Walk through all - for (final Field field : fields) { - // Debug log - this.getLogger().debug(MessageFormat.format("field={0}", field.getName())); //NOI18N - - // Does the field start with "$"? - if (field.getName().startsWith("$")) { //NOI18N - // Debug message - this.getLogger().debug(MessageFormat.format("Skipping field={0} as it starts with a dollar character.", field.getName())); //NOI18N - - // Skip it silently - continue; - } - - // Debug message - this.getLogger().debug(MessageFormat.format("Calling getValueFromColumn({0}) on instance {1} ...", field.getName(), instance)); //NOI18N - - // Get value from it - Object value = instance.getValueFromColumn(field.getName()); - - // Debug message - this.getLogger().debug(MessageFormat.format("Adding field={0},value={1}", field.getName(), value)); //NOI18N - - // Add it to list - map.put(field, value); - } - - // Debug message - this.getLogger().debug(MessageFormat.format("Returning iterator for {0} entries ...", map.size())); //NOI18N - - // Return list iterator - return map.entrySet().iterator(); - } - - /** - * Instance for database backend - * - * @return the backend - */ - protected final DatabaseBackend getBackend () { - return this.backend; - } - - /** - * Instance for database backend - * - * @param backend the backend to set - */ - protected final void setBackend (final DatabaseBackend backend) { - this.backend = backend; - } - /** * Getter for Contact instance * @@ -838,90 +613,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { this.contact = contact; } - /** - * Getter for DatabaseFrontend instance - * - * @return DatabaseFrontend instance - */ - protected final DatabaseFrontend getFrontend () { - return this.frontend; - } - - /** - * Setter for wrapper instance - * - * @param frontend A DatabaseFrontend instance - */ - protected final void setFrontend (final DatabaseFrontend frontend) { - this.frontend = frontend; - } - - /** - * Some getter for properties names (without org.mxchange) - * - * @return An array with property names - */ - protected String[] getPropertyNames () { - // Init array - String[] names = { - "database.backend.class", //NOI18N - "database.backend.storagepath", //NOI18N - "database.mysql.login", //NOI18N - "database.mysql.host", //NOI18N - "database.mysql.password", //NOI18N - "database.mysql.dbname", //NOI18N - }; - - // Return it - return names; - } - - /** - * Some "getter" for a value from given Storable instance and target class - * - * @param instance An instance of a Storable class - * @param targetClass The target class (where the field resides) - * @param columnName Column name (= field name) - * @return value Value to get - * @throws java.lang.NoSuchMethodException If the getter was not found - * @throws java.lang.IllegalAccessException If the getter cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Some other problems? - */ - protected Object getValueInStorableFromColumn (final Storable instance, final String targetClass, final String columnName) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("instance={0},targetClass={1},columnName={2} - CALLED!", instance, targetClass, columnName)); //NOI18N - - // A '$' means not our field - if (columnName.startsWith("$")) { //NOI18N - // Don't handle these - throw new IllegalArgumentException("columnsName contains $"); //NOI18N - } - - // Determine if the given column is boolean - if (this.isBooleanField(instance, targetClass, columnName)) { - // Debug message - this.getLogger().debug(MessageFormat.format("Column {0} represents a boolean field.", columnName)); //NOI18N - - // Yes, then call other method - return this.getBooleanField(instance, targetClass, this.convertColumnNameToGetterMethod(columnName, true)); - } - - // Convert column name to field name - String methodName = this.convertColumnNameToGetterMethod(columnName, false); - - // Debug message - this.getLogger().debug(MessageFormat.format("methodName={0}", methodName)); //NOI18N - - // Get field - Object value = this.getField(instance, targetClass, methodName); - - // Trace message - this.getLogger().trace(MessageFormat.format("value={0} - EXIT!", value)); //NOI18N - - // Return value - return value; - } - /** * Initializes i18n bundles */ @@ -942,87 +633,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { this.getLogger().trace("EXIT!"); //NOI18N } - /** - * Prepares all properties, the file is written if it is not found - * - * @throws java.io.IOException If any IO problem occurs - */ - protected void initProperties () throws IOException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Debug message - this.getLogger().debug(MessageFormat.format("{0} properties are loaded already.", BaseFrameworkSystem.properties.size())); //NOI18N - - // Are some properties loaded? - if (!BaseFrameworkSystem.properties.isEmpty()) { - // Some are already loaded, abort here - return; - } - - try { - // Try to read it - BaseFrameworkSystem.properties.load(new BufferedReader(new InputStreamReader(new FileInputStream(FrameworkInterface.PROPERTIES_CONFIG_FILE)))); - - // Debug message - this.getLogger().debug(MessageFormat.format("{0} properties has been loaded.", BaseFrameworkSystem.properties.size())); //NOI18N - } catch (final FileNotFoundException ex) { - // Debug message - this.getLogger().debug(MessageFormat.format("Properties file {0} not found: {1}", FrameworkInterface.PROPERTIES_CONFIG_FILE, ex)); //NOI18N - - /* - * The file is not found which is normal for first run, so - * initialize default values. - */ - this.initPropertiesWithDefault(); - - // Write file - this.writePropertiesFile(); - } - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Checks whether the given field is a boolean field by probing it. - * - * @param instance Instance to call - * @param targetClass Target class - * @param columnName Column name to check - * @return Whether the given column name represents a boolean field - */ - protected boolean isBooleanField (final FrameworkInterface instance, final String targetClass, final String columnName) { - // Trace message - this.getLogger().trace(MessageFormat.format("instance={0},targetCLass={1},columnName={2} - CALLED!", instance, targetClass, columnName)); //NOI18N - - // Convert column name to getter name (boolean) - String methodName = this.convertColumnNameToGetterMethod(columnName, true); - - // Get class instance - Class c = this.getClassFromTarget(instance, targetClass); - - // Defauzlt is boolean - boolean isBool = true; - - try { - // Now try to instance the method - Method method = c.getDeclaredMethod(methodName, new Class[0]); - } catch (final NoSuchMethodException ex) { - // Debug message - this.getLogger().debug(MessageFormat.format("Method {0} does not exist, field {1} cannot be boolean: {2}", methodName, columnName, ex)); //NOI18N - - // Not found - isBool = false; - } - - // Trace message - this.getLogger().trace(MessageFormat.format("isBool={0} - EXIT!", isBool)); //NOI18N - - // Return result - return isBool; - } - /** * Checks if the bundle is initialized * @@ -1032,174 +642,4 @@ public class BaseFrameworkSystem implements FrameworkInterface { // Check it return (bundle instanceof ResourceBundle); } - - /** - * Sets boolean field value with given method name by invoking it - * - * @param instance The instance to call - * @param targetClass Target class to look in - * @param methodName Method name to look for - * @param columnName Column name - * @param value Boolean value from field - * @throws java.lang.NoSuchMethodException If the method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Some other problems? - */ - protected void setBooleanField (final FrameworkInterface instance, final String targetClass, final String methodName, final String columnName, final Boolean value) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - // Trace messahe - this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N - - // Get field type - Class type = this.getType(instance, targetClass, columnName); - - // Get method instance - Method method = this.getMethodFromName(instance, targetClass, methodName, type); - - // Try to get the value by invoking the method - method.invoke(instance, value); - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Sets any field value with given method name by invoking it - * - * @param instance The instance to call - * @param targetClass Target class to look in - * @param methodName Method name to look for - * @param columnName Column name - * @param value Any value from field - * @throws java.lang.NoSuchMethodException If the method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Some other problems? - */ - protected void setField (final FrameworkInterface instance, final String targetClass, final String methodName, final String columnName, final Object value) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - // Trace messahe - this.getLogger().trace(MessageFormat.format("instance={0},targetClass={1},methodName={2},value={3}", instance, targetClass, methodName, value)); //NOI18N - - // Get field type - Class type = this.getType(instance, targetClass, columnName); - - // Debug message - this.getLogger().debug(MessageFormat.format("type={0}", type)); //NOI18N - - // Init object - Object object = value; - - // Is the value null? - if ("null".equals(value)) { //NOI18N - // Warning message - this.getLogger().warn(MessageFormat.format("columnName={0} has null value.", columnName)); //NOI18N - - // Set null - object = null; - } else { - // Hard-coded "cast" again ... :-( - // TODO Can't we get rid of this??? - switch (type.getSimpleName()) { - case "Long": // Long object //NOI18N - object = Long.parseLong((String) value); - break; - - case "Float": // Float object //NOI18N - object = Float.parseFloat((String) value); - break; - - case "Boolean": // Boolean object //NOI18N - object = Boolean.parseBoolean((String) value); - break; - - case "String": // String object //NOI18N - break; - - default: // Unsupported type - throw new IllegalArgumentException(MessageFormat.format("value {0} has unsupported type {1}", value, type.getSimpleName())); //NOI18N - } - } - - // Debug message - this.getLogger().debug(MessageFormat.format("object={0}", object)); //NOI18N - - // Get method to call - Method method = this.getMethodFromName(instance, targetClass, methodName, type); - - // Debug message - this.getLogger().debug(MessageFormat.format("method={0},instance={1},value[{2}]={3}", method, instance, value.getClass().getSimpleName(), value)); //NOI18N - - // Get value from field - method.invoke(instance, object); - - // Trace messahe - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Sets value in properties instance. - * - * @param key Property key (part) to set - * @param value Property value to set - */ - protected void setProperty (final String key, final String value) { - // Trace message - this.getLogger().trace(MessageFormat.format("key={0},value={1} - CALLED!", key, value)); //NOI18N - - // Both should not be null - if (null == key) { - // key is null - throw new NullPointerException("key is null"); //NOI18N - } else if (null == value) { - // value is null - throw new NullPointerException("value is null"); //NOI18N - } - - // Set it - properties.setProperty(String.format("org.mxchange.%s", key), value); //NOI18N - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Some "setter" for a value in given Storable instance and target class - * - * @param instance An instance of a Storable class - * @param targetClass The target class (where the field resides) - * @param columnName Column name (= field name) - * @param value Value to set - * @throws java.lang.NoSuchMethodException If the setter is not found - * @throws java.lang.IllegalAccessException If the setter cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problem? - */ - protected void setValueInStorableFromColumn (final Storable instance, final String targetClass, final String columnName, final Object value) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("instance={0},targetClass={1},columnName={2},value={3} - CALLED!", instance, targetClass, columnName, value)); //NOI18N - - // A '$' means not our field - if (columnName.startsWith("$")) { //NOI18N - // Don't handle these - throw new IllegalArgumentException("columnsName contains $"); //NOI18N - } - - // Determine if the given column is boolean - if (this.isBooleanField(instance, targetClass, columnName)) { - // Debug message - this.getLogger().debug(MessageFormat.format("Column {0} represents a boolean field.", columnName)); //NOI18N - - // Yes, then call other method - this.setBooleanField(instance, targetClass, this.convertColumnNameToSetterMethod(columnName), columnName, (Boolean) value); - } - - // Convert column name to field name - String methodName = this.convertColumnNameToSetterMethod(columnName); - - // Debug message - this.getLogger().debug(MessageFormat.format("methodName={0}", methodName)); //NOI18N - - // Get field - this.setField(instance, targetClass, methodName, columnName, value); - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } } diff --git a/src/org/mxchange/jcore/FrameworkInterface.java b/src/org/mxchange/jcore/FrameworkInterface.java index bf9b1e8..03dd111 100644 --- a/src/org/mxchange/jcore/FrameworkInterface.java +++ b/src/org/mxchange/jcore/FrameworkInterface.java @@ -33,11 +33,6 @@ public interface FrameworkInterface { */ public static final String I18N_BUNDLE_FILE = "org/mxchange/localization/bundle"; - /* - * Properties file name - */ - public static final String PROPERTIES_CONFIG_FILE = "config.properties"; - /** * Getter for manager * diff --git a/src/org/mxchange/jcore/contact/BaseContact.java b/src/org/mxchange/jcore/contact/BaseContact.java index 61455d5..c07b89b 100644 --- a/src/org/mxchange/jcore/contact/BaseContact.java +++ b/src/org/mxchange/jcore/contact/BaseContact.java @@ -16,11 +16,7 @@ */ package org.mxchange.jcore.contact; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; import java.text.MessageFormat; -import java.util.Iterator; -import java.util.Map; import java.util.Objects; import org.mxchange.jcore.BaseFrameworkSystem; import org.mxchange.jcore.client.Client; @@ -469,49 +465,6 @@ public class BaseContact extends BaseFrameworkSystem implements Contact, Compara return translated; } - /** - * Some "getter for a value from given column name. This name will be - * translated into a method name and then this method is called. - * - * @param columnName Column name - * @return Value from field - */ - @Override - public Object getValueFromColumn (final String columnName) throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName)); //NOI18N - - // A '$' means not our field - if (columnName.startsWith("$")) { //NOI18N - // Don't handle these - throw new IllegalArgumentException("columnsName contains $"); //NOI18N - } - - // Determine if the given column is boolean - if (this.isBooleanField(this, "BaseContact", columnName)) { //NOI18N - // Debug message - this.getLogger().debug(MessageFormat.format("Column {0} represents a boolean field.", columnName)); //NOI18N - - // Yes, then call other method - return this.getBooleanField(this, "BaseContact", this.convertColumnNameToGetterMethod(columnName, true)); //NOI18N - } - - // Convert column name to field name - String methodName = this.convertColumnNameToGetterMethod(columnName, false); - - // Debug message - this.getLogger().debug(MessageFormat.format("field={0}", methodName)); //NOI18N - - // Get field - Object value = this.getField(this, "BaseContact", methodName); //NOI18N - - // Trace message - this.getLogger().trace(MessageFormat.format("value={0} - EXIT!", value)); //NOI18N - - // Return it - return value; - } - /** * ZIP code * @@ -544,40 +497,6 @@ public class BaseContact extends BaseFrameworkSystem implements Contact, Compara return hash; } - /** - * Checks if given boolean field is available and set to same value - * - * @param columnName Column name to check - * @param bool Boolean value - * @return Whether all conditions are met - */ - @Override - public boolean isFieldValueEqual (final String columnName, final boolean bool) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("columnName={0},bool={1} - CALLED!", columnName, bool)); //NOI18N - - // Convert column name to field name - String methodName = this.convertColumnNameToGetterMethod(columnName, true); - - // Debug message - this.getLogger().debug(MessageFormat.format("field={0}", methodName)); //NOI18N - - // Init class instance - boolean value = this.getBooleanField(this, "BaseContact", methodName); //NOI18N - - // Debug message - this.getLogger().debug(MessageFormat.format("value={0}", value)); //NOI18N - - // Compare it - boolean isFound = (bool == value); - - // Trace message - this.getLogger().trace(MessageFormat.format("isFound={0} - EXIT!", isFound)); //NOI18N - - // Return result - return isFound; - } - /** * Checks whether the contact is user's own data * @@ -588,27 +507,6 @@ public class BaseContact extends BaseFrameworkSystem implements Contact, Compara return this.ownContact; } - /** - * Returns an iterator of all values from this object - * @return An iterator - */ - @Override - public Iterator> iterator () throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { - return this.fieldIterator(this, "BaseContact"); //NOI18N - } - - @Override - public void setValueFromColumn (final String columnName, final Object value) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("columnName={0},value={1} - CALLED!", columnName, value)); //NOI18N - - // Call super method - this.setValueInStorableFromColumn(this, "BaseContact", columnName, value); //NOI18N - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - /** * Shows this contact to the user * diff --git a/src/org/mxchange/jcore/contact/Contact.java b/src/org/mxchange/jcore/contact/Contact.java index 4ac21d8..8e59943 100644 --- a/src/org/mxchange/jcore/contact/Contact.java +++ b/src/org/mxchange/jcore/contact/Contact.java @@ -16,30 +16,16 @@ */ package org.mxchange.jcore.contact; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.util.Iterator; -import java.util.Map; +import org.mxchange.jcore.FrameworkInterface; import org.mxchange.jcore.client.Client; import org.mxchange.jcore.contact.gender.Gender; -import org.mxchange.jcore.database.storage.Storable; /** * A general contact interface * * @author Roland Haeder */ -public interface Contact extends Storable, Comparable { - /** - * Returns an iterator of all values from this object - * - * @return An iterator - * @throws java.lang.NoSuchMethodException If the invoked method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public Iterator> iterator ()throws NoSuchMethodException, IllegalAccessException, InvocationTargetException; - +public interface Contact extends FrameworkInterface, Comparable { /** * Some "getter" for translated gender of the contact * diff --git a/src/org/mxchange/jcore/criteria/BaseCriteria.java b/src/org/mxchange/jcore/criteria/BaseCriteria.java deleted file mode 100644 index 0467781..0000000 --- a/src/org/mxchange/jcore/criteria/BaseCriteria.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.criteria; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import org.mxchange.jcore.BaseFrameworkSystem; -import org.mxchange.jcore.criteria.logical.Logical; - -/** - * A general criteria class - * - * @author Roland Haeder - */ -public class BaseCriteria extends BaseFrameworkSystem implements Criteria { - /** - * Criteria map - */ - private final Map criteria; - - /** - * Logical matcher instance - */ - private Logical logcial; - - /** - * Protected default construtctor - */ - protected BaseCriteria () { - // Init criteria instance - this.criteria = new HashMap<>(); - } - - @Override - public void addCriteria (final String key, final Boolean value) { - // Add to map - this.criteria.put(key, value); - } - - @Override - public void addCriteria (final String key, final String value) { - // Add to map - this.criteria.put(key, value); - } - - @Override - public void addCriteria (final String key, final Number value) { - this.criteria.put(key, value); - } - - @Override - public Set> entrySet () { - return this.criteria.entrySet(); - } - - /** - * Setter for Logical instance - * - * @param logcial the Logical instance to set - */ - public final void setLogical (final Logical logcial) { - this.logcial = logcial; - } - - @Override - public Iterable values () { - // Call map's method - return this.criteria.values(); - - } - - /** - * Getter for Logical matcher instance - * - * @return Logical matcher instance - */ - protected final Logical getLogical () { - return this.logcial; - } -} diff --git a/src/org/mxchange/jcore/criteria/Criteria.java b/src/org/mxchange/jcore/criteria/Criteria.java deleted file mode 100644 index 4af20fb..0000000 --- a/src/org/mxchange/jcore/criteria/Criteria.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.criteria; - -import java.util.Map; -import java.util.Set; -import org.mxchange.jcore.FrameworkInterface; -import org.mxchange.jcore.criteria.logical.Logical; - -/** - * A general interface for criteria - * - * @author Roland Haeder - */ -public interface Criteria extends FrameworkInterface { - /** - * Adds a boolean criteria - * - * @param key Key of criteria - * @param value Value of criteria - */ - public void addCriteria (final String key, final Boolean value); - - /** - * Adds a string criteria - * - * @param key Key of criteria - * @param value Value of criteria - */ - public void addCriteria (final String key, final String value); - - /** - * Adds a number criteria - * - * @param key Key of criteria - * @param value Value of criteria - */ - public void addCriteria (final String key, final Number value); - - /** - * Gets all values from underlaying map in an iterator. - * - * @return Values iteratable - */ - public Iterable values (); - - /** - * Gets all entries as a key-value pair - * - * @return Key-value paira of all entries - */ - public Set> entrySet (); - - /** - * Setter for logical matcher instance - * - * @param logical Logical matcher instance - */ - public void setLogical (final Logical logical); -} diff --git a/src/org/mxchange/jcore/criteria/logical/Logical.java b/src/org/mxchange/jcore/criteria/logical/Logical.java deleted file mode 100644 index 0de068a..0000000 --- a/src/org/mxchange/jcore/criteria/logical/Logical.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.criteria.logical; - -import java.util.Map; -import java.util.Set; -import org.mxchange.jcore.FrameworkInterface; - -/** - * An interface for logical tests - * - * @author Roland Haeder - */ -public interface Logical extends FrameworkInterface { - - /** - * Checks logical match condition - * - * @param entrySet Entry set where the values are - * @param criteriaMatches Criteria matches - * @return Whether it matches - */ - public boolean matches (final Set> entrySet, final Map criteriaMatches); -} diff --git a/src/org/mxchange/jcore/criteria/logical/and/AndLogicalMatcher.java b/src/org/mxchange/jcore/criteria/logical/and/AndLogicalMatcher.java deleted file mode 100644 index 91430ef..0000000 --- a/src/org/mxchange/jcore/criteria/logical/and/AndLogicalMatcher.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.criteria.logical.and; - -import java.text.MessageFormat; -import java.util.Map; -import java.util.Set; -import org.mxchange.jcore.BaseFrameworkSystem; -import org.mxchange.jcore.criteria.logical.Logical; - -/** - * A boolean AND "logical matcher" class - * - * @author Roland Haeder - */ -public class AndLogicalMatcher extends BaseFrameworkSystem implements Logical { - /** - * Default constructor - */ - public AndLogicalMatcher () { - } - - @Override - public boolean matches (final Set> entrySet, final Map criteriaMatches) { - // Trace message - this.getLogger().trace(MessageFormat.format("entrySet={0},criteriaMatches={1} - CALLED!", entrySet, criteriaMatches)); //NOI18N - - // Default is matching, then check if something is not matching and set result to false - boolean matches = true; - - // Walk through set - for (Map.Entry entry : entrySet) { - // Debug message - this.getLogger().debug(MessageFormat.format("entry.key={0},entry.value={1}", entry.getKey(), entry.getValue())); //NOI18N - - // Check all matches - for (Map.Entry criteriaMatch : criteriaMatches.entrySet()) { - // Get key and value - String criteriaKey = criteriaMatch.getKey(); - Boolean criteriaMatching = criteriaMatch.getValue(); - - // Debug message - this.getLogger().debug(MessageFormat.format("criteriaKey={0},criteriaMatching={1}", criteriaKey, criteriaMatching)); //NOI18N - - // Is both the same and false? - if ((entry.getKey().equals(criteriaKey)) && (!criteriaMatching)) { - // Debug message - this.getLogger().debug("Not matching, aborting search."); //NOI18N - - // Doesn't match - matches = false; - break; - } - } - } - - // Trace message - this.getLogger().trace(MessageFormat.format("matches={0} - EXIT!", matches)); //NOI18N - - // Return it - return matches; - } - -} diff --git a/src/org/mxchange/jcore/criteria/searchable/SearchCriteria.java b/src/org/mxchange/jcore/criteria/searchable/SearchCriteria.java deleted file mode 100644 index 403a195..0000000 --- a/src/org/mxchange/jcore/criteria/searchable/SearchCriteria.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.criteria.searchable; - -import java.lang.reflect.InvocationTargetException; -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; -import org.mxchange.jcore.criteria.BaseCriteria; -import org.mxchange.jcore.database.storage.Storable; - -/** - * A search criteria class - * - * @author Roland Haeder - */ -public class SearchCriteria extends BaseCriteria implements SearchableCriteria { - /** - * Limit of matches - */ - private int limit; - - /** - * Skipping of matches - */ - private int skip; - - /** - * Default constructor - */ - public SearchCriteria () { - } - - @Override - public int getLimit () { - return this.limit; - } - - @Override - public final void setLimit (final int limit) { - this.limit = limit; - } - - @Override - public int getSkip () { - return this.skip; - } - - @Override - public final void setSkip (final int skip) { - this.skip = skip; - } - - @Override - public boolean matches (final Storable storable) throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("storable={0} - CALLED!", storable)); //NOI18N - - // Must not be null - if (null == storable) { - // Abort here - throw new NullPointerException("storable is null"); //NOI18N - } - - // Debug message - this.getLogger().debug(MessageFormat.format("this.entrySet().size()={0}", this.entrySet().size())); //NOI18N //NOI18N - - // No matches found? - if (this.entrySet().isEmpty()) { - // Debug message - this.getLogger().debug("No criteria set, returning true ..."); //NOI18N - - // Then there is nothing to match! - return true; - } - - // Init matches array - Map criteriaMatches = new HashMap<>(this.entrySet().size()); - - // Check all conditions - for (final Map.Entry criteria : this.entrySet()) { - // Debug message - this.getLogger().debug(MessageFormat.format("criteria: key={0},value[{1}]={2}", criteria.getKey(), criteria.getValue().getClass().getSimpleName(), criteria.getValue())); //NOI18N - - // Get value from column name - Object value = storable.getValueFromColumn(criteria.getKey()); - - // Debug message - this.getLogger().debug(MessageFormat.format("value={0},getValue()={1}", value, criteria.getValue())); //NOI18N - - // Is both same? - if (((null == value) && ("null".equals(criteria.getValue()))) || ((value != null) && (value.equals(criteria.getValue())))) { //NOI18N - // Debug message - this.getLogger().debug(MessageFormat.format("value={0} - MATCHES!", value)); //NOI18N - - // Matching criteria found - criteriaMatches.put(criteria.getKey(), true); - } - } - - // Init matches - boolean matches = false; - - // Is only one entry given? - if (this.entrySet().size() == 1) { - // Okay, one criteria only, no need for a "complex" logical match check - matches = (criteriaMatches.size() == 1); - } else if (this.getLogical() == null) { - // Logical instance is null - throw new NullPointerException(MessageFormat.format("logical is not set, but more than one column ({0}/{1}) shall be matched.", this.entrySet().size(), criteriaMatches.size())); //NOI18N - } else if (this.entrySet().size() == criteriaMatches.size()) { - // Debug message - this.getLogger().debug(MessageFormat.format("entrySet.size()={0},criteriaMatches.size()={1} - Calling matches() on {2} ...", this.entrySet().size(), criteriaMatches.size(), this.getLogical())); //NOI18N - - // Now for the final test - matches = this.getLogical().matches(this.entrySet(), criteriaMatches); - } - - // Trace message - this.getLogger().trace(MessageFormat.format("matches={0} - EXIT!", matches)); //NOI18N - - // Return result - return matches; - } -} diff --git a/src/org/mxchange/jcore/criteria/searchable/SearchableCriteria.java b/src/org/mxchange/jcore/criteria/searchable/SearchableCriteria.java deleted file mode 100644 index e72a662..0000000 --- a/src/org/mxchange/jcore/criteria/searchable/SearchableCriteria.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.criteria.searchable; - -import java.lang.reflect.InvocationTargetException; -import org.mxchange.jcore.criteria.Criteria; -import org.mxchange.jcore.database.storage.Storable; - -/** - * A searchable criteria - * - * @author Roland Haeder - */ -public interface SearchableCriteria extends Criteria { - /** - * Checks if the given instance of a Storable class matches - * - * @param storable A Storable instance to check - * @return Whether the Storable instance matches - * @throws IllegalArgumentException Some implementations may throw this - * @throws java.lang.NoSuchMethodException If the invoked method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public boolean matches (final Storable storable) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException; - - /** - * Setter for limit of possible matches - * - * @param limit Limit of matches - */ - public void setLimit (final int limit); - - /** - * Getter for limit of possible matches - * - * @return Limit of matches - */ - public int getLimit (); - - /** - * Setter for skipping of possible matches - * - * @param skip Skipping of matches - */ - public void setSkip (final int skip); - - /** - * Getter for skipping of possible matches - * - * @return Skipping of matches - */ - public int getSkip (); -} diff --git a/src/org/mxchange/jcore/database/backend/BaseDatabaseBackend.java b/src/org/mxchange/jcore/database/backend/BaseDatabaseBackend.java deleted file mode 100644 index 69192fe..0000000 --- a/src/org/mxchange/jcore/database/backend/BaseDatabaseBackend.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.backend; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.text.MessageFormat; -import java.util.Enumeration; -import org.mxchange.jcore.BaseFrameworkSystem; -import org.mxchange.jcore.criteria.searchable.SearchableCriteria; -import org.mxchange.jcore.database.result.Result; -import org.mxchange.jcore.database.storage.Storable; -import org.mxchange.jcore.exceptions.BadTokenException; -import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; -import org.mxchange.jcore.exceptions.UnsupportedDatabaseDriverException; - -/** - * Generall database backend - * - * @author Roland Haeder - */ -public abstract class BaseDatabaseBackend extends BaseFrameworkSystem { - - /** - * No instances from this class - */ - protected BaseDatabaseBackend () { - } - - /** - * Validates driver name and throws an exception if the driver is not valid - * - * @param driverName Driver name (e.g. "mysql") - * @throws org.mxchange.jcore.exceptions.UnsupportedDatabaseDriverException If the given driver name cannot be solved into a driver instance - */ - protected void validateDriver (final String driverName) throws UnsupportedDatabaseDriverException { - // Trace message - this.getLogger().trace(MessageFormat.format("driverName={0} - CALLED!", driverName)); //NOI18N - - // driverName shall not be null - if (null == driverName) { - // Is null - throw new NullPointerException("driverName is null"); - } - - // Get all registered/installed drivers - Enumeration drivers = DriverManager.getDrivers(); - - // Default is not found - boolean isFound = false; - - // Search for it - while (drivers.hasMoreElements()) { - // Get element - Driver driver = drivers.nextElement(); - - // Debug message - this.getLogger().debug(MessageFormat.format("Driver {0} is installed.", driver)); //NOI18N - - // Get class name - String className = driver.getClass().getName(); - - // Debug message - this.getLogger().debug(MessageFormat.format("className={0}", className)); - - // Is this wanted? - if (className.contains(driverName)) { - // Debug message - this.getLogger().debug("Found driver!"); //NOI18N - - // Found it - isFound = true; - break; - } - } - - // Debug message - this.getLogger().debug("isFound=" + isFound); - - // Is it found? - if (!isFound) { - // Throw exception - throw new UnsupportedDatabaseDriverException(driverName); - } - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - public int numRows (final SearchableCriteria criteria) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - // Trace message - this.getLogger().trace("criteria=" + criteria + " - CALLED!"); - - // Criteria should not be null - if (null == criteria) { - // Abort here - throw new NullPointerException("criteria is null"); - } - - // Run "SELECT" - Result result = this.doSelectByCriteria(criteria); - - // Get size - int numRows = result.size(); - - // Trace message - this.getLogger().trace("numRows=" + numRows + " - EXIT!"); - - // Return it - return numRows; - } - - /** - * Runs a SELECT "query" on database backend - * - * @param criteria Criteria instance - * @return Result instance - * @throws java.io.IOException If any IO error occurs - * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found - * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the file is badly damaged - * @throws java.sql.SQLException If any SQL error occurs - * @throws java.lang.NoSuchMethodException If a method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public abstract Result doSelectByCriteria (SearchableCriteria criteria) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException; -} diff --git a/src/org/mxchange/jcore/database/backend/DatabaseBackend.java b/src/org/mxchange/jcore/database/backend/DatabaseBackend.java deleted file mode 100644 index 45522c8..0000000 --- a/src/org/mxchange/jcore/database/backend/DatabaseBackend.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.backend; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.sql.SQLException; -import java.util.Map; -import javax.naming.NamingException; -import org.mxchange.jcore.FrameworkInterface; -import org.mxchange.jcore.criteria.searchable.SearchableCriteria; -import org.mxchange.jcore.database.result.Result; -import org.mxchange.jcore.database.storage.Storable; -import org.mxchange.jcore.exceptions.BadTokenException; -import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; - -/** - * A generic interface for database frontends - * - * @author Roland Haeder - */ -public interface DatabaseBackend extends FrameworkInterface { - - /** - * Tries a connection to the database - * - * @throws java.sql.SQLException If the connection attempt fails - * @throws javax.naming.NamingException May be thrown by a backend implementation - */ - public void connectToDatabase () throws SQLException, NamingException; - - /** - * Inserts given dataset instance and returns a Result instance on success. - * The callee should not modify any content of the dataset instance. - * - * @param dataset A dataset instance - * @return An instance of Result - * @throws java.sql.SQLException If any SQL error occurs - * @throws java.io.IOException If an IO error occurs - */ - public Result doInsertDataSet (final Map dataset) throws SQLException, IOException; - - /** - * Run a "SELECT" statement with given criteria and always return a Result - * instance. The result instance then provides methods to iterate over all - * found entries. - * - * The callee should not modify any content of the criteria instance. - * - * @param criteria Search criteria - * @return A result instance - * @throws java.io.IOException If any IO error occurs - * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found - * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the file is badly damaged - * @throws java.sql.SQLException If any SQL error occurs - * @throws java.lang.NoSuchMethodException If a method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public Result doSelectByCriteria (final SearchableCriteria criteria) throws IOException, BadTokenException, CorruptedDatabaseFileException, SQLException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException; - - /** - * Shuts down this backend - * - * @throws java.sql.SQLException If any SQL error occurs - * @throws java.io.IOException If any IO error occurs - */ - public void doShutdown () throws SQLException, IOException; - - /** - * Some getter for total rows - * - * @return Total rows - * @throws java.io.IOException If an IO error occurs - * @throws java.sql.SQLException If any SQL error occurs - */ - public int getTotalRows () throws IOException, SQLException; - - /** - * Number of total found rows. - * - * @param criteria Search criteria instance - * @return Number of found rows - * @throws java.io.IOException If any IO error occurs - * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token was found - * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If the file is badly damaged - * @throws java.sql.SQLException If any SQL error occurs - * @throws java.lang.NoSuchMethodException If a method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public int numRows (final SearchableCriteria criteria) throws IOException, SQLException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; -} diff --git a/src/org/mxchange/jcore/database/backend/base64/Base64CsvDatabaseBackend.java b/src/org/mxchange/jcore/database/backend/base64/Base64CsvDatabaseBackend.java deleted file mode 100644 index 6eba92a..0000000 --- a/src/org/mxchange/jcore/database/backend/base64/Base64CsvDatabaseBackend.java +++ /dev/null @@ -1,478 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.backend.base64; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.codec.binary.Base64; -import org.mxchange.jcore.criteria.searchable.SearchableCriteria; -import org.mxchange.jcore.database.backend.BaseDatabaseBackend; -import org.mxchange.jcore.database.backend.DatabaseBackend; -import org.mxchange.jcore.database.file.DatabaseFile; -import org.mxchange.jcore.database.file.SynchronizeableFile; -import org.mxchange.jcore.database.frontend.DatabaseFrontend; -import org.mxchange.jcore.database.result.DatabaseResult; -import org.mxchange.jcore.database.result.Result; -import org.mxchange.jcore.database.storage.Storable; -import org.mxchange.jcore.exceptions.BadTokenException; -import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; - -/** - * A database backend with CSV file as storage implementation - * - * @author Roland Haeder - */ -public class Base64CsvDatabaseBackend extends BaseDatabaseBackend implements DatabaseBackend { - /** - * File name to access - */ - private final String fileName; - - /** - * Output stream for this storage engine - */ - private final SynchronizeableFile storageFile; - - /** - * Constructor with table name - * - * @param frontend Wrapper instance to call back - * @throws java.io.FileNotFoundException If the file was not found - */ - public Base64CsvDatabaseBackend (final DatabaseFrontend frontend) throws FileNotFoundException { - // Trace message - this.getLogger().trace(MessageFormat.format("frontend={0} - CALLED!", frontend)); //NOI18N - - // Get table name - String tableName = frontend.getTableName(); - - // Debug message - this.getLogger().debug(MessageFormat.format("Trying to initialize table {0} ...", tableName)); //NOI18N - - // Set table name here, too - this.setTableName(tableName); - - // Set frontend here - this.setFrontend(frontend); - - // Construct file name - this.fileName = String.format("%s/table_%s.b64", this.getProperty("database.backend.storagepath"), tableName); //NOI18N - - // Debug message - this.getLogger().debug(MessageFormat.format("Trying to open file {0} ...", this.fileName)); //NOI18N - - try { - // Try to initialize the storage (file instance) - this.storageFile = new DatabaseFile(this.fileName); //NOI18N - } catch (final FileNotFoundException ex) { - // Did not work - this.getLogger().error(MessageFormat.format("File {0} cannot be opened: {1}", this.fileName, ex.toString())); //NOI18N - throw ex; - } - - // Output message - this.getLogger().debug(MessageFormat.format("Database for {0} has been initialized.", tableName)); //NOI18N - } - - /** - * This database backend does not need to connect - */ - @Override - public void connectToDatabase () { - // Empty body - } - - @Override - public Result doInsertDataSet (final Map dataset) throws IOException { - // Trace message - this.getLogger().trace(MessageFormat.format("dataset={0} - CALLED!", dataset)); //NOI18N - - // dataset should not be null and not empty - if (null == dataset) { - // It is null, so abort here - throw new NullPointerException("dataset is null"); //NOI18N - } else if (dataset.isEmpty()) { - // It is empty, also abort here - throw new IllegalArgumentException("dataset is empty"); //NOI18N - } - - // Debug message - this.getLogger().debug(MessageFormat.format("Need to parse {0} values ...", dataset.size())); //NOI18N - - // Get iterator from it - Iterator> iterator = dataset.entrySet().iterator(); - - // Full output string - StringBuilder output = new StringBuilder(dataset.size() * 20); - - // Add index column - output.append(String.format("key=%s,value=\"%s\";", this.getFrontend().getIdName(), this.getTotalRows() + 1)); //NOI18N - - // "Walk" over all entries - while (iterator.hasNext()) { - // Get next entry - Map.Entry entry = iterator.next(); - - // Get value - Object value = entry.getValue(); - - // Validate value, should not contain " - if (value instanceof String) { - // Is String so cast ist - String str = (String) value; - - // Does it contain a " ? - if (str.contains("\"")) { //NOI18N - // Don't accept here - throw new IllegalArgumentException(MessageFormat.format("value {0} with double-quote not supported yet.", value)); //NOI18N - } - } - - // Generate key=value pair - String pair = String.format("key=%s,value=\"%s\";", entry.getKey(), String.valueOf(value)); //NOI18N - - // Debug message - this.getLogger().debug(MessageFormat.format("pair={0}", pair)); //NOI18N - - // Append to output - output.append(pair); - } - - // Then write it to file - this.writeData(output); - - // The result set needs to be transformed into Result, so initialize a result instance here - Result result = new DatabaseResult(); - - // Trace message - this.getLogger().trace(MessageFormat.format("result={0} - EXIT!", result)); //NOI18N - - // Return it - return result; - } - - @Override - public Result doSelectByCriteria (final SearchableCriteria criteria) throws IOException, BadTokenException, CorruptedDatabaseFileException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - // Trace message - this.getLogger().trace(MessageFormat.format("criteria={0} - CALLED!", criteria)); //NOI18N - - // Init result instance - Result result = new DatabaseResult(); - - // First rewind this backend - this.rewind(); - - // Then loop over all rows until the end has reached - while (!this.isEndOfFile()) { - // Read line - String line = this.readLine(); - - // Debug message - this.getLogger().debug(MessageFormat.format("line={0}", line)); //NOI18N - - // Parse it to a Map - Map map = this.getMapFromLine(line); - - // Convert it to a Storable instance - Storable storable = this.getFrontend().toStorable(map); - - // Debug message - this.getLogger().debug(MessageFormat.format("storable={0}", storable)); //NOI18N - - // Now matches the found instance - if (criteria.matches(storable)) { - // Then add it to result - result.add(storable); - } - } - - // Return the result - return result; - } - - /** - * Shuts down this backend - */ - @Override - public void doShutdown () throws IOException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Close file - this.getStorageFile().close(); - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - @Override - public final int getTotalRows () throws IOException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Init count - int count = 0; - - // First rewind - this.rewind(); - - // Walk through all rows - while (!this.isEndOfFile()) { - // Get next line - String line = this.readLine(); - - // Debug message - this.getLogger().debug(MessageFormat.format("line={0}", line)); //NOI18N - - // Count one up - count++; - } - - // Trace message - this.getLogger().trace(MessageFormat.format("count={0} - EXIT!", count)); //NOI18N - - // Return it - return count; - } - - /** - * Tries to interpret the given decoded line and puts its key/value pairs - * into a map. - * - * @param line Decoded line from database file - * @return A Map with keys and values from line - * @throws org.mxchange.jcore.exceptions.CorruptedDatabaseFileException If - * the file is believed damaged - * @throws org.mxchange.jcore.exceptions.BadTokenException If a bad token - * was found - */ - private Map getMapFromLine (final String line) throws CorruptedDatabaseFileException, BadTokenException { - // Trace message - this.getLogger().debug(MessageFormat.format("line={0} - CALLED!", line)); //NOI18N - - // "line" must not be null or empty - if (null == line) { - // Is null - throw new NullPointerException("line is null"); //NOI18N - } else if (line.isEmpty()) { - // Is empty - throw new IllegalArgumentException("line is empty, maybe isEndOfFile() was not called?"); //NOI18N - } else if (!line.endsWith(";")) { //NOI18N - // Bad line found - throw new CorruptedDatabaseFileException(this.fileName, "No semicolon at end of line"); //NOI18N - } else if (!line.contains("key=")) { //NOI18N - // Bad line found - throw new CorruptedDatabaseFileException(this.fileName, "No \"key=bla\" found."); //NOI18N - } else if (!line.contains("value=")) { //NOI18N - // Bad line found - throw new CorruptedDatabaseFileException(this.fileName, "No \"value=bla\" found."); //NOI18N - } - - Pattern pattern = Pattern.compile("(key=([a-zA-Z0-9_]{1,}),value=\"([^\"]*)\";){1,}"); //NOI18N - Matcher matcher = pattern.matcher(line); - - // Debug message - this.getLogger().debug(MessageFormat.format("matches={0}", matcher.matches())); //NOI18N - - // Matches? - if (!matcher.matches()) { - // Corrupted file found - throw new CorruptedDatabaseFileException(this.fileName, MessageFormat.format("line {0} does not match regular expression.", line)); //NOI18N - } - - // Instance map - Map map = new HashMap<>(line.length() / 40); - - pattern = Pattern.compile("(key=([a-zA-Z0-9_]{1,}),value=\"([^\"]*)\";)"); //NOI18N - matcher = pattern.matcher(line); - - // Init group count - int init = 0; - - // Then get all - while (matcher.find(init)) { - // Get group match - String match = matcher.group(1); - String key = matcher.group(2); - String value = matcher.group(3); - - // Debug log - this.getLogger().debug(MessageFormat.format("match={0},key={1},value={2}", match, key, value)); - - // key must noch be empty - assert ((key != null) && (!key.isEmpty())) : MessageFormat.format("key={0} is not valid", key); //NOI18N - - // Get start and end - int start = matcher.start(); - int end = matcher.end(); - - // Debug message - this.getLogger().debug(MessageFormat.format("init={0},start={1},end={2},match={3},key={4},value={5}", init, start, end, match, key, value)); //NOI18N - - // Add key/value to map - map.put(key, value); - - // Hop to next match - init = end; - } - - // Trace message - this.getLogger().trace(MessageFormat.format("map()={0} - EXIT!", map.size())); //NOI18N - - // Return finished map - return map; - } - - /** - * Returns storage file - * - * @return Storage file instance - */ - private SynchronizeableFile getStorageFile () { - return this.storageFile; - } - - /** - * Checks whether end of file has been reached - * - * @return Whether lines are left to read - */ - private boolean isEndOfFile () { - // Default is EOF - boolean isEof = true; - - try { - isEof = (this.getStorageFile().getFilePointer() >= this.length()); - } catch (final IOException ex) { - // Length cannot be determined - this.logException(ex); - } - - // Return status - this.getLogger().trace(MessageFormat.format("isEof={0} : EXIT!", isEof)); //NOI18N - return isEof; - } - - /** - * Get length of underlaying file - * - * @return Length of underlaying file - */ - private long length () throws IOException { - // Trace message - this.getLogger().trace("CALLED!"); - - // Try to get length from file - long length = this.getStorageFile().length(); - - // Trace message - this.getLogger().trace(MessageFormat.format("length={0} : EXIT!", length)); //NOI18N - - // Return it - return length; - } - - /** - * Reads a line from file base - * - * @return Read line from file - */ - private String readLine () { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Init input - String input = null; - - try { - // Read single line - String base64 = this.getStorageFile().readLine(); - - // Is the line null? - if (null == base64) { - // Then throw NPE here - throw new NullPointerException("base64 is null, maybe missed to call isEndOfFile() ?"); //NOI18N - } - - // Decode BASE-64 - byte[] decoded = Base64.decodeBase64(base64); - - // Convert to string - input = new String(decoded).trim(); - } catch (final IOException ex) { - this.logException(ex); - } - - // Trace message - this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N - - // Return read string or null - return input; - } - - /** - * Rewinds backend - */ - private void rewind () throws IOException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Rewind underlaying database file - this.getStorageFile().seek(0); - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Writes a line with BASE64 encoding to database file - * - * @param output Output string to write - */ - private void writeData (final StringBuilder output) throws IOException { - // Trace message - this.getLogger().trace(MessageFormat.format("output={0} - CALLED!", output)); //NOI18N - - // No null or empty strings - if (null == output) { - // Is null - throw new NullPointerException("output is null"); //NOI18N - } else if (output.length() == 0) { - // Is empty - throw new IllegalArgumentException("output is empty"); //NOI18N - } - - // Encode it to BASE64 - String rawOutput = Base64.encodeBase64String(output.toString().getBytes()); - - // Debug message - this.getLogger().debug(MessageFormat.format("rawOutput={0}", rawOutput)); //NOI18N - - // Write each line separately - this.getStorageFile().writeBytes(String.format("%s\n", rawOutput)); //NOI18N - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } -} diff --git a/src/org/mxchange/jcore/database/backend/datasource/DataSourceDatabaseBackend.java b/src/org/mxchange/jcore/database/backend/datasource/DataSourceDatabaseBackend.java deleted file mode 100644 index 7d7854e..0000000 --- a/src/org/mxchange/jcore/database/backend/datasource/DataSourceDatabaseBackend.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.backend.datasource; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.text.MessageFormat; -import java.util.Map; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import javax.sql.DataSource; -import org.mxchange.jcore.criteria.searchable.SearchableCriteria; -import org.mxchange.jcore.database.backend.BaseDatabaseBackend; -import org.mxchange.jcore.database.backend.DatabaseBackend; -import org.mxchange.jcore.database.frontend.DatabaseFrontend; -import org.mxchange.jcore.database.result.Result; -import org.mxchange.jcore.database.storage.Storable; -import org.mxchange.jcore.exceptions.BadTokenException; -import org.mxchange.jcore.exceptions.CorruptedDatabaseFileException; -import org.mxchange.jcore.exceptions.UnsupportedDatabaseDriverException; - -/** - * A backend class for MySQL connections - * - * @author Roland Haeder - */ -public class DataSourceDatabaseBackend extends BaseDatabaseBackend implements DatabaseBackend { - /** - * Connection instance - */ - private static Connection connection; - - /** - * Prepared statement for total row count - */ - private PreparedStatement totalRows; - - /** - * Constructor with table name - * - * @param frontend An instance of the frontend - * @throws org.mxchange.jcore.exceptions.UnsupportedDatabaseDriverException - * If the requested driver is not supported - */ - public DataSourceDatabaseBackend (final DatabaseFrontend frontend) throws UnsupportedDatabaseDriverException { - // Trace message - this.getLogger().trace(MessageFormat.format("frontend={0} - CALLED!", frontend)); //NOI18N - - // Get table name - String tableName = frontend.getTableName(); - - // Debug message - this.getLogger().debug(MessageFormat.format("tableName={0}", tableName)); //NOI18N - - // Now that the driver is there, set the table name - this.setTableName(tableName); - - // Set frontend - this.setFrontend(frontend); - } - - @Override - public void connectToDatabase () throws SQLException, NamingException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Is the connection given? - if (null == connection) { - // Initial context - Context context = new InitialContext(); - - // Get data source instance - DataSource source = (DataSource) context.lookup("jdbc/pizza-service"); //NOI18N - - // Debug message - this.getLogger().debug(MessageFormat.format("source={0}", source)); //NOI18N - - // Now as all access data is stored in data source, get a connection from it - connection = source.getConnection(); - - // Debug log - this.getLogger().debug(MessageFormat.format("connection={0}", connection)); //NOI18N - } - - // Debug message - this.getLogger().debug("Connection is up, preparing some statements ..."); //NOI18N - - // Set prepared statement - this.totalRows = connection.prepareStatement(String.format("SELECT COUNT(`%s`) AS `cnt` FROM `%s` LIMIT 1", this.getFrontend().getIdName(), this.getTableName())); //NOI18N - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - @Override - public Result doInsertDataSet (final Map dataset) throws SQLException, IOException { - throw new UnsupportedOperationException(MessageFormat.format("Not supported yet: dataset={0}", dataset)); - } - - @Override - public Result doSelectByCriteria (final SearchableCriteria criteria) throws IOException, BadTokenException, CorruptedDatabaseFileException, SQLException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - throw new UnsupportedOperationException(MessageFormat.format("Not supported yet: criteria={0}", criteria)); - } - - @Override - public void doShutdown () throws SQLException, IOException { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. - } - - @Override - public int getTotalRows () throws IOException, SQLException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Get long - int count = 0; - - // Trace message - this.getLogger().trace(MessageFormat.format("count={0} - EXIT!", count)); //NOI18N - - // Return it - return count; - } -} diff --git a/src/org/mxchange/jcore/database/backend/mysql/MySqlDatabaseBackend.java b/src/org/mxchange/jcore/database/backend/mysql/MySqlDatabaseBackend.java deleted file mode 100644 index 4bcf701..0000000 --- a/src/org/mxchange/jcore/database/backend/mysql/MySqlDatabaseBackend.java +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.backend.mysql; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.MessageFormat; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; -import org.mxchange.jcore.criteria.searchable.SearchableCriteria; -import org.mxchange.jcore.database.backend.BaseDatabaseBackend; -import org.mxchange.jcore.database.backend.DatabaseBackend; -import org.mxchange.jcore.database.frontend.DatabaseFrontend; -import org.mxchange.jcore.database.result.DatabaseResult; -import org.mxchange.jcore.database.result.Result; -import org.mxchange.jcore.database.storage.Storable; -import org.mxchange.jcore.exceptions.UnsupportedDatabaseDriverException; - -/** - * A backend class for MySQL connections - * - * @author Roland Haeder - */ -public class MySqlDatabaseBackend extends BaseDatabaseBackend implements DatabaseBackend { - /** - * An instance of a datbase connection - */ - private static Connection connection; - - /** - * Prepared statement for total row count - */ - private PreparedStatement totalRows; - - /** - * Constructor with table name - * - * @param frontend An instance of the frontend - * @throws org.mxchange.jcore.exceptions.UnsupportedDatabaseDriverException - * If the requested driver is not supported - */ - public MySqlDatabaseBackend (final DatabaseFrontend frontend) throws UnsupportedDatabaseDriverException { - // Trace message - this.getLogger().trace(MessageFormat.format("frontend={0} - CALLED!", frontend)); //NOI18N - - // Validate driver - this.validateDriver("mysql"); //NOI18N - - // Get table name - String tableName = frontend.getTableName(); - - // Debug message - this.getLogger().debug(MessageFormat.format("tableName={0}", tableName)); //NOI18N - - // Now that the driver is there, set the table name - this.setTableName(tableName); - - // Set frontend - this.setFrontend(frontend); - } - - @Override - public void connectToDatabase () throws SQLException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Is the connection already there? - if (connection instanceof Connection) { - // Is the connection really up? - if (connection.isClosed()) { - // Connection is closed again - throw new SQLException("Connection is closed."); //NOI18N - } - - // Already connected - this.getLogger().debug("Connection is already established."); //NOI18N - - // No need to connect - return; - } - - // Generate connection string - String connect = String.format("jdbc:mysql://%s/%s", //NOI18N - this.getProperty("database.mysql.host"), //NOI18N - this.getProperty("database.mysql.dbname") //NOI18N - ); - - // Debug message - this.getLogger().debug(MessageFormat.format("Attempting to connect to {0} ...", connect)); //NOI18N - - // Now get a connection instance back - connection = DriverManager.getConnection( - connect, - this.getProperty("database.mysql.login"), //NOI18N - this.getProperty("database.mysql.password") //NOI18N - ); - - // Debug message - this.getLogger().debug("Connection is up, preparing some statements ..."); //NOI18N - - // Set prepared statement - this.totalRows = connection.prepareStatement(String.format("SELECT COUNT(`%s`) AS `cnt` FROM `%s` LIMIT 1", this.getFrontend().getIdName(), this.getTableName())); //NOI18N - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Inserts given dataset instance and returns a Result instance on success. - * Please note that this method can insert only a single record into - * database. Multiple inserts are not yet supported. - * - * @param dataset A dataset instance - * @return An instance of Result - * TODO Support more than one record being inserted in a separate method - */ - @Override - public Result doInsertDataSet (final Map dataset) throws SQLException { - // Trace message - this.getLogger().trace(MessageFormat.format("dataset={0} - CALLED!", dataset)); //NOI18N - - // dataset should not be null and not empty - if (null == dataset) { - // It is null, so abort here - throw new NullPointerException("dataset is null"); //NOI18N - } else if (dataset.isEmpty()) { - // It is empty, also abort here - throw new IllegalArgumentException("dataset is empty"); //NOI18N - } - - // Debug message - this.getLogger().debug(MessageFormat.format("Need to parse {0} values ...", dataset.size())); //NOI18N - - // Init values - Set values = new LinkedHashSet<>(dataset.size()); - - // Start with INSERT INTO - StringBuilder query = new StringBuilder(String.format("INSERT INTO `%s` (", this.getTableName())); //NOI18N - StringBuilder valueQuery = new StringBuilder("("); //NOI18N - - // Get iterator from it - Iterator> iterator = dataset.entrySet().iterator(); - - // "Walk" over all entries - while (iterator.hasNext()) { - // Get next entry - Map.Entry entry = iterator.next(); - - // Add key as database column to query - query.append(String.format("`%s`,", entry.getKey())); //NOI18N - - // Get value - Object value = entry.getValue(); - - // Debug message - this.getLogger().debug(MessageFormat.format("value={0} - BEFORE!", value)); //NOI18N - - // Handle possible empty->null convertion - value = this.getFrontend().emptyStringToNull(entry.getKey(), value); - - // Debug message - this.getLogger().debug(MessageFormat.format("value={0} - AFTER!", value)); //NOI18N - - // Is the value null? - if (null == value) { - // Add null - valueQuery.append("NULL,"); //NOI18N - } else { - // Add value - valueQuery.append("?,"); //NOI18N - values.add(value); - } - } - - // Now put all together - query.replace(query.length() - 1, query.length(), ") VALUES "); //NOI18N - query.append(valueQuery.substring(0, valueQuery.length() - 1)); - query.append(")"); //NOI18N - - // Full statement is complete here, better log it - this.getLogger().debug(MessageFormat.format("query={0} is complete.", query)); //NOI18N - - // Prepare statement instance - PreparedStatement statement = this.getPreparedStatement(query, values); - - // Debug message - this.getLogger().debug(MessageFormat.format("statement={0}", statement)); - - // Run it - int status = statement.executeUpdate(); - - // Debug message - this.getLogger().debug(MessageFormat.format("status={0}", status)); //NOI18N - - // The result set needs to be transformed into Result, so initialize a result instance here - Result result = new DatabaseResult(status, statement); - - // Trace message - this.getLogger().trace(MessageFormat.format("result={0} - EXIT!", result)); //NOI18N - - // Return it - return result; - } - - @Override - public Result doSelectByCriteria (final SearchableCriteria criteria) throws SQLException { - // Trace message - this.getLogger().trace(MessageFormat.format("criteria={0} - CALLED!", criteria)); //NOI18N - - // criteria must not be null - if (null == criteria) { - // Abort here - throw new NullPointerException("criteria is null"); //NOI18N - } - - // Start SELECT query - StringBuilder query = new StringBuilder(String.format("SELECT * FROM `%s`", this.getTableName())); //NOI18N - - // Get entry set - Set> set = criteria.entrySet(); - - // Debug message - this.getLogger().debug(MessageFormat.format("set.isEmpty()={0}", set.isEmpty())); //NOI18N - - // Init values - Set values = new LinkedHashSet<>(set.size()); - - // Are there conditions? - if (!set.isEmpty()) { - // Continue with WHERE - query.append(" WHERE "); //NOI18N - - // No more than 1 value currently - if (set.size() > 1) { - // Not supported yet - throw new IllegalArgumentException("More than one criteria is not supported yet."); //NOI18N - } - - // Get iterator - Iterator> iterator = set.iterator(); - - // "Walk through all - while (iterator.hasNext()) { - // Get element - Map.Entry entry = iterator.next(); - - // Add key as column name - query.append(String.format("`%s`", entry.getKey())); //NOI18N - - // Get value - Object value = entry.getValue(); - - // Debug message - this.getLogger().debug(MessageFormat.format("value={0}", value)); //NOI18N - - // Add value - query.append("=?"); //NOI18N - values.add(value); - } - } - - // Is limit set? - if (criteria.getLimit() > 0) { - // Is skip set? - if (criteria.getSkip() > 0) { - // Limit with skip - query.append(String.format(" LIMIT %d,%d", criteria.getSkip(), criteria.getLimit())); //NOI18N - } else { - // Only limit - query.append(String.format(" LIMIT %d", criteria.getLimit())); //NOI18N - } - } - - // Full statement is complete here, better log it - this.getLogger().debug(MessageFormat.format("query={0} is complete.", query)); //NOI18N - - // Get a prepared instance - PreparedStatement statement = this.getPreparedStatement(query, values); - - // Debug message - this.getLogger().debug(MessageFormat.format("statement={0}", statement)); - - // Run it - ResultSet resultSet = statement.executeQuery(); - - // Debug message - this.getLogger().debug(MessageFormat.format("resultSet={0}", resultSet)); - - // The result set needs to be transformed into Result, so initialize a result instance here - Result result = this.getFrontend().getResultFromSet(resultSet); - - // Trace message - this.getLogger().trace(MessageFormat.format("result={0} - EXIT!", result)); //NOI18N - - // Return it - return result; - } - - @Override - public void doShutdown () throws SQLException, IOException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Is the connection still there? - if (!connection.isClosed()) { - // Close down database connection - connection.close(); - } - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - @Override - public int getTotalRows () throws IOException, SQLException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Execute query - ResultSet set = this.totalRows.executeQuery(); - - // Rewind to beginning - set.beforeFirst(); - - // Get long - int count = set.getInt("cnt"); //NOI18N - - // Trace message - this.getLogger().trace(MessageFormat.format("count={0} - EXIT!", count)); //NOI18N - - // Return it - return count; - } - - /** - * Some "getter" for a prepared statement with inserted values - * - * @param query SQL query string - * @param values Values set - * @return A fully prepared statement - */ - private PreparedStatement getPreparedStatement (final StringBuilder query, final Set values) throws SQLException { - // Trace message - this.getLogger().trace(MessageFormat.format("query={0},values={1} - CALLED!", query, values)); //NOI18N - - // Init prepared statement - PreparedStatement statement = connection.prepareStatement(query.toString()); - - // Debug message - this.getLogger().debug(MessageFormat.format("statement={0}", statement)); //NOI18N - - // Get iterator on values - Iterator valueIterator = values.iterator(); - - // Init index with 1 - int index = 1; - - // Set all values - while (valueIterator.hasNext()) { - // Get next value - Object value = valueIterator.next(); - - //Debug message - this.getLogger().debug(MessageFormat.format("index={1} has value={0}", value, index)); //NOI18N - - // Detect type again - if (value instanceof Boolean) { - // Debug log - this.getLogger().debug(MessageFormat.format("Setting boolean value={0} for index={1}", value, index)); //NOI18N - - // Found boolean - statement.setBoolean(index, (boolean) value); - } else if (value instanceof String) { - // Debug message - this.getLogger().debug(MessageFormat.format("Setting string value={0} for index={1}", value, index)); //NOI18N - - // Found string - statement.setString(index, (String) value); - } else if (value instanceof Integer) { - // Debug message - this.getLogger().debug(MessageFormat.format("Setting integer value={0} for index={1}", value, index)); //NOI18N - - // Found ineteger - statement.setInt(index, (int) value); - } else if (value instanceof Long) { - // Debug message - this.getLogger().debug(MessageFormat.format("Setting long value={0} for index={1}", value, index)); //NOI18N - - // Found ineteger - statement.setLong(index, (long) value); - } else if (value instanceof Float) { - // Debug message - this.getLogger().debug(MessageFormat.format("Setting float value={0} for index={1}", value, index)); //NOI18N - - // Found ineteger - statement.setFloat(index, (float) value); - } else if (null == value) { - // Debug message - this.getLogger().warn(MessageFormat.format("Null value in index={0} is not supported (yet)", index)); //NOI18N - } else { - // Not parseable type - throw new SQLException(MessageFormat.format("Cannot handle value({0})={1} for index={2} in table {3}", value.getClass().getSimpleName(), value, index, this.getTableName())); //NOI18N - } - - // Increment index - index++; - } - - // Trace message - this.getLogger().trace(MessageFormat.format("statement={0} - EXIT!", statement)); //NOI18N - - // Return it - return statement; - } -} diff --git a/src/org/mxchange/jcore/database/file/DatabaseFile.java b/src/org/mxchange/jcore/database/file/DatabaseFile.java deleted file mode 100644 index 153a167..0000000 --- a/src/org/mxchange/jcore/database/file/DatabaseFile.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.file; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import org.mxchange.jcore.BaseFrameworkSystem; - -/** - * This implementation of SynchronizeableFile provides synchronized access on the RandomAccessFile - instance. This implementation is thread-safe, therefor. - * - * @author Roland Haeder - */ -public class DatabaseFile extends BaseFrameworkSystem implements SynchronizeableFile { - /** - * The actual file instance - */ - private final RandomAccessFile file; - - /** - * A constructor accepting a full-qualified file name (FQFN). - * @param fqfn Full-qualified file name - * @throws FileNotFoundException - */ - public DatabaseFile (final String fqfn) throws FileNotFoundException { - // Init it here - this.file = new RandomAccessFile(fqfn, "rw"); //NOI18N - } - - @Override - public void close () throws IOException{ - synchronized (this.file) { - this.file.close(); - } - } - - @Override - public long getFilePointer () throws IOException { - synchronized (this.file) { - return this.file.getFilePointer(); - } - } - - @Override - public long length () throws IOException { - synchronized (this.file) { - return this.file.length(); - } - } - - @Override - public String readLine () throws IOException { - synchronized (this.file) { - return this.file.readLine(); - } - } - - @Override - public void seek (final long i) throws IOException { - synchronized (this.file) { - this.file.seek(i); - } - } - - @Override - public void writeBytes (final String string) throws IOException { - synchronized (this.file) { - this.file.writeBytes(string); - } - } -} diff --git a/src/org/mxchange/jcore/database/file/SynchronizeableFile.java b/src/org/mxchange/jcore/database/file/SynchronizeableFile.java deleted file mode 100644 index 98996d5..0000000 --- a/src/org/mxchange/jcore/database/file/SynchronizeableFile.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.file; - -import java.io.IOException; -import org.mxchange.jcore.FrameworkInterface; - -/** - * An interface for sy nchronized access on files, with auto-close support. - * - * @author Roland Haeder - */ -public interface SynchronizeableFile extends FrameworkInterface, AutoCloseable{ - - public void close () throws IOException; - - public long getFilePointer () throws IOException; - - public long length () throws IOException; - - public String readLine () throws IOException; - - public void seek (final long i) throws IOException; - - public void writeBytes (final String string) throws IOException; -} diff --git a/src/org/mxchange/jcore/database/frontend/BaseDatabaseFrontend.java b/src/org/mxchange/jcore/database/frontend/BaseDatabaseFrontend.java deleted file mode 100644 index 9d5fb65..0000000 --- a/src/org/mxchange/jcore/database/frontend/BaseDatabaseFrontend.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.frontend; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; -import javax.naming.NamingException; -import org.mxchange.jcore.BaseFrameworkSystem; -import org.mxchange.jcore.database.backend.DatabaseBackend; -import org.mxchange.jcore.database.result.DatabaseResult; -import org.mxchange.jcore.database.result.Result; -import org.mxchange.jcore.database.storage.Storable; -import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException; -import org.mxchange.jcore.factory.database.backend.BackendFactory; - -/** - * General database frontend class - * - * @author Roland Haeder - */ -public abstract class BaseDatabaseFrontend extends BaseFrameworkSystem implements DatabaseFrontend { - /** - * A map instance for data sets being inserted - */ - private final Map dataset; - - /** - * Last num rows - */ - private int lastNumRows = 0; - - /** - * No instances from this class - */ - protected BaseDatabaseFrontend () { - // Init dataset instance - this.dataset = new HashMap<>(); - } - - /** - * Gets a Result back from given ResultSet instance. You may wish to - * overwrite this method and call this with - * super.getResultFromSet(resultSet) as this method doesn't do anything but - * copy the SQLWarning instance to the Result instance. - * - * @param resultSet ResultSet instance from SQL driver - * @return A typorized Result instance - * @throws java.sql.SQLException If an SQL error occurs - */ - @Override - public Result getResultFromSet (final ResultSet resultSet) throws SQLException { - // Init result instance - Result result = new DatabaseResult(); - - // Attach all possible warnings - result.setWarnings(resultSet.getWarnings()); - - // And return it - return result; - } - - /** - * Adds given key-value pair to dataset instance. The key must not be null, - * but value can be null. - * - * @param key Key to set - * @param value Value to set or null - */ - protected void addToDataSet (final String key, final Object value) { - // Trace message - this.getLogger().trace(MessageFormat.format("key={0},value={1} - CALLED!", key, value)); //NOI18N - - // Is key null? - if (null == key) { - // Key is null - throw new NullPointerException("key is null"); //NOI18N - } else if (null == value) { - // Issue warning about null reference - this.getLogger().warn(MessageFormat.format("value for key={0} is null, this may cause problems.", key)); - } - - // Add it to map - this.dataset.put(key, value); - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Clears dataset instance. You should call this before you use it for - * inserting data into your database. - */ - protected void clearDataSet () { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Clear dataset - this.dataset.clear(); - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Inserts currently filled dataset and returns the result of the operation. - * This may return no rows, but the affectedRows field may have been - * updated. - * - * @return An instance of Result - * @throws java.sql.SQLException If any SQL error occurs - * @throws java.io.IOException If an IO error occurs - */ - protected Result doInsertDataSet () throws SQLException, IOException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Is the dataset instance empty? - if (this.dataset.isEmpty()) { - // Cannot insert an empty dataset - throw new IllegalStateException("The dataset instance is empty."); //NOI18N - } - - // Call backend method - Result result = this.getBackend().doInsertDataSet(this.dataset); - - // Trace message - this.getLogger().trace(MessageFormat.format("result={0} - EXIT!", result)); //NOI18N - - // Return it - return result; - } - - /** - * Initialize backend - * - * @throws org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException If the backend is not supported - * @throws java.sql.SQLException If a SQL database backend fails to connect - */ - protected void initBackend () throws UnsupportedDatabaseBackendException, SQLException { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Try it - try { - // Try to get get instance from factory - DatabaseBackend backend = BackendFactory.createInstance(this); - - // Debug message - this.getLogger().debug(MessageFormat.format("backend={0}", backend)); - - // Try to run a connect on it - backend.connectToDatabase(); - - // All fine so far, then set it here - this.setBackend(backend); - } catch (final ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NamingException ex) { - // Continue to throw - throw new UnsupportedDatabaseBackendException(ex); - } - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - - /** - * Setter for last num rows - * - * @param lastNumRows - */ - protected final void setLastNumRows (final int lastNumRows) { - // Set it here - this.lastNumRows = lastNumRows; - } - - /** - * Getter for last num rows - * - * @return Last num rows - */ - @Override - public final int getLastNumRows () { - return this.lastNumRows; - } -} diff --git a/src/org/mxchange/jcore/database/frontend/DatabaseFrontend.java b/src/org/mxchange/jcore/database/frontend/DatabaseFrontend.java deleted file mode 100644 index 0bf066b..0000000 --- a/src/org/mxchange/jcore/database/frontend/DatabaseFrontend.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.frontend; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Map; -import org.mxchange.jcore.FrameworkInterface; -import org.mxchange.jcore.database.result.Result; -import org.mxchange.jcore.database.storage.Storable; - -/** - * A generic interface for database frontends - * - * @author Roland Haeder - */ -public interface DatabaseFrontend extends FrameworkInterface { - /** - * Depending on column, an empty value may be converted to null - * - * @param key Key to check - * @param value Value to check - * @return Possible previous value or null - */ - public Object emptyStringToNull (final String key, final Object value); - - /** - * Gets a Result back from given ResultSet instance - * - * @param resultSet ResultSet instance from SQL driver - * @return A typorized Result instance - * @throws java.sql.SQLException If an SQL error occurs - */ - public Result getResultFromSet (final ResultSet resultSet) throws SQLException; - - /** - * Returns a Storable instance from given row index. Value 0 means first - * row and so on. Row index below zero results in an exception. - * - * @param rowIndex Row index too look for - * @return A Storable instance - */ - public Storable getStorableAtRow (final int rowIndex); - - /** - * Name of used database table, handled over to backend - * - * @return the tableName - */ - public String getTableName (); - - /** - * Shuts down the database layer - * @throws java.sql.SQLException If any SQL error occurs - * @throws java.io.IOException If any IO error occurs - */ - public void doShutdown () throws SQLException, IOException; - - /** - * Converts the given map into a Storable instance, depending on which class implements it. All - * keys are being interpreted as class fields/attributes and their respective setters are being searched for. As - * this method may fail to find one or access it, this method throws some exception. - * - * @param map Map instance to convert to Storable - * @return An instance of a Storable implementation - * @throws IllegalArgumentException Some implementations may throw this - * @throws java.lang.NoSuchMethodException If the invoked method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public Storable toStorable (final Map map) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException; - - /** - * Some getter for name of id column - * - * @return Name of id column - */ - public String getIdName (); - - /** - * Getter for last num rows - * - * @return Last num rows - */ - public int getLastNumRows (); -} diff --git a/src/org/mxchange/jcore/database/result/DatabaseResult.java b/src/org/mxchange/jcore/database/result/DatabaseResult.java deleted file mode 100644 index 549f23d..0000000 --- a/src/org/mxchange/jcore/database/result/DatabaseResult.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.result; - -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.text.MessageFormat; -import java.util.Collections; -import java.util.Iterator; -import java.util.SortedSet; -import java.util.TreeSet; -import org.mxchange.jcore.BaseFrameworkSystem; -import org.mxchange.jcore.database.storage.Storable; - -/** - * A database result - * @author Roland Haeder - */ -public class DatabaseResult extends BaseFrameworkSystem implements Result { - /** - * Set of all found Storable instances - */ - private final SortedSet result; - - /** - * Status value from previous executeUpdate() call - */ - private int status; - - /** - * SQLWarning instance - */ - private SQLWarning warnings; - - /** - * Default constructor - */ - public DatabaseResult () { - // Trace message - this.getLogger().trace("CALLED!"); //NOI18N - - // Init set here - this.result = new TreeSet<>(); - } - - /** - * A constructor that accepts a status integer from previous executeUpdate() - * call and a the prepared statement instance. - * - * @param status Status code - * @param statement A PreparedStatement instance - * @throws java.sql.SQLException If any SQL error occurs - */ - public DatabaseResult (final int status, final PreparedStatement statement) throws SQLException { - // Call parent constructor - this(); - - // Trace message - this.getLogger().trace(MessageFormat.format("status={0},statement={1} - CALLED!", status, statement)); //NOI18N - - // Set warnings - this.setWarnings(statement.getWarnings()); - - // Set status - this.status = status; - } - - /** - * Given Storable instance as a query result. - * - * @param storable An instance of a Storable class - */ - @Override - public final void add (final Storable storable) { - // Add to result - this.result.add(storable); - } - - /** - * Getter for warnings - * - * @return SQLQarning from ResultSet instance - */ - @Override - public final SQLWarning getWarnings () { - return this.warnings; - } - - /** - * Setter for warnings - * - * @param warnings SQLQarning from ResultSet instance - */ - @Override - public final void setWarnings (final SQLWarning warnings) { - this.warnings = warnings; - } - - @Override - public final boolean hasNext () { - // Call iterator's method - return this.iterator().hasNext(); - } - - @Override - public final Iterator iterator () { - // Return iterator from result set - return this.result.iterator(); - } - - @Override - public final Storable next () { - // Call iterator's method - return this.iterator().next(); - } - - @Override - public final void remove () { - // Call iterator's method - this.iterator().remove(); - } - - @Override - public final int size () { - return this.result.size(); - } - - @Override - public SortedSet resultSet () { - // Return it unmodifiable - return Collections.unmodifiableSortedSet(this.result); - } -} diff --git a/src/org/mxchange/jcore/database/result/Result.java b/src/org/mxchange/jcore/database/result/Result.java deleted file mode 100644 index 8d73b99..0000000 --- a/src/org/mxchange/jcore/database/result/Result.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.result; - -import java.sql.SQLWarning; -import java.util.Iterator; -import java.util.SortedSet; -import org.mxchange.jcore.FrameworkInterface; -import org.mxchange.jcore.database.storage.Storable; - -/** - * An interface for database results - * - * @author Roland Haeder - * @param Anything that is storable - */ -public interface Result extends FrameworkInterface, Iterator, Iterable { - - /** - * Given Storable instance as a query result. - * - * @param storable An instance of a Storable class - */ - public void add (final Storable storable); - - /** - * Setter for warnings - * - * @param warnings SQLQarning from ResultSet instance - */ - public void setWarnings (final SQLWarning warnings); - - /** - * Getter for warnings - * - * @return SQLQarning from ResultSet instance - */ - public SQLWarning getWarnings (); - - /** - * Returns size of result - * - * @return Size of result - */ - public int size (); - - /** - * Getter for a whole unmodifiable result set from this result. The id number is used as key - * - * @return A map from this result - */ - public SortedSet resultSet (); -} diff --git a/src/org/mxchange/jcore/database/storage/Storable.java b/src/org/mxchange/jcore/database/storage/Storable.java deleted file mode 100644 index 87b9ec9..0000000 --- a/src/org/mxchange/jcore/database/storage/Storable.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.database.storage; - -import java.lang.reflect.InvocationTargetException; -import org.mxchange.jcore.FrameworkInterface; - -/** - * An interface for objects being stored in databases - * - * @author Roland Haeder - */ -public interface Storable extends FrameworkInterface { - /** - * Some "getter for a value from given column name. This name will be - * translated into a method name and then this method is called. - * - * @param columnName Column name - * @return Value from field - * @throws IllegalArgumentException Some implementations may throw this - * @throws java.lang.NoSuchMethodException If the invoked method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public Object getValueFromColumn (final String columnName) throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; - - /** - * Some "setter" for a value from given column name. You may wish to overwrite this method in your - * own class. - * - * @param columnName Column name - * @param value Value to set in object's field - * @throws IllegalArgumentException Some implementations may throw this - * @throws java.lang.NoSuchMethodException If the invoked method was not found - * @throws java.lang.IllegalAccessException If the method cannot be accessed - * @throws java.lang.reflect.InvocationTargetException Any other problems? - */ - public void setValueFromColumn (final String columnName, final Object value) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException; -} diff --git a/src/org/mxchange/jcore/exceptions/BadTokenException.java b/src/org/mxchange/jcore/exceptions/BadTokenException.java deleted file mode 100644 index 8425c9b..0000000 --- a/src/org/mxchange/jcore/exceptions/BadTokenException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.exceptions; - -import java.text.MessageFormat; - -/** - * This exception is thrown when a token has been badly formated. This may - * happen when a CSV file is broken. - * - * @author Roland Haeder - */ -public class BadTokenException extends Exception { - - /** - * Constructor with token and count - * @param token Token that is not valid - * @param count Count - */ - public BadTokenException (final String token, final int count) { - super(MessageFormat.format("Token {0} at position {1} has not double-quotes on both ends.", token, count)); - } - -} diff --git a/src/org/mxchange/jcore/exceptions/CorruptedDatabaseFileException.java b/src/org/mxchange/jcore/exceptions/CorruptedDatabaseFileException.java deleted file mode 100644 index 4c54bd4..0000000 --- a/src/org/mxchange/jcore/exceptions/CorruptedDatabaseFileException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.exceptions; - -/** - * An exception thrown when the file is corrupted (damaged) - * - * @author Roland Haeder - */ -public class CorruptedDatabaseFileException extends Exception { - - /** - * Constructor with file name - * - * @param fileName File name - * @param message Debug message - */ - public CorruptedDatabaseFileException (final String fileName, final String message) { - super("Database file \"" + fileName + "\" is corrupted: " + message); - } - -} diff --git a/src/org/mxchange/jcore/exceptions/UnsupportedDatabaseBackendException.java b/src/org/mxchange/jcore/exceptions/UnsupportedDatabaseBackendException.java deleted file mode 100644 index 023baab..0000000 --- a/src/org/mxchange/jcore/exceptions/UnsupportedDatabaseBackendException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.exceptions; - -import java.text.MessageFormat; - -/** - * An exception thrown when the given backend type is not valid - * - * @author Roland Haeder - */ -public class UnsupportedDatabaseBackendException extends Exception { - - /** - * Constructor with only cause - * - * @param cause - */ - public UnsupportedDatabaseBackendException (final Throwable cause) { - // Call super constructor - super(MessageFormat.format("Backend is not supported: {0}", cause), cause); //NOI18N - } - -} diff --git a/src/org/mxchange/jcore/exceptions/UnsupportedDatabaseDriverException.java b/src/org/mxchange/jcore/exceptions/UnsupportedDatabaseDriverException.java deleted file mode 100644 index c97a26a..0000000 --- a/src/org/mxchange/jcore/exceptions/UnsupportedDatabaseDriverException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.exceptions; - -import java.text.MessageFormat; - -/** - * Thrown when the given driver is not found - * - * @author Roland Haeder - */ -public class UnsupportedDatabaseDriverException extends Exception { - - /** - * Default constructor with driver name - * @param driverName - */ - public UnsupportedDatabaseDriverException (final String driverName) { - // Call super method - super(MessageFormat.format("Database driver {0} is not found.", driverName)); //NOI18N - } - -} diff --git a/src/org/mxchange/jcore/factory/database/backend/BackendFactory.java b/src/org/mxchange/jcore/factory/database/backend/BackendFactory.java deleted file mode 100644 index 8e1f3a4..0000000 --- a/src/org/mxchange/jcore/factory/database/backend/BackendFactory.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2015 Roland Haeder - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.mxchange.jcore.factory.database.backend; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.text.MessageFormat; -import org.mxchange.jcore.BaseFrameworkSystem; -import org.mxchange.jcore.database.backend.DatabaseBackend; -import org.mxchange.jcore.database.frontend.DatabaseFrontend; - -/** - * A factory class for database backends - * - * @author Roland Haeder - */ -public class BackendFactory extends BaseFrameworkSystem { - - /** - * Creates instance of a database backend as configured in properties file - * - * @param frontend Frontend instance - * @return An instance of a DatabaseBackend class - * @throws java.lang.ClassNotFoundException If the configured class was not found - * @throws java.lang.NoSuchMethodException If the constructor with a frontend instance is not found - * @throws java.lang.InstantiationException - * @throws java.lang.IllegalAccessException - * @throws java.lang.reflect.InvocationTargetException - */ - public static final DatabaseBackend createInstance (final DatabaseFrontend frontend) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - // Get factory instance - BackendFactory factory = new BackendFactory(); - - // Trace message - factory.getLogger().trace(MessageFormat.format("frontend={0} - CALLED!", frontend)); //NOI18N - - // frontend must be set - if (null == frontend) { - // Is null - throw new NullPointerException("frontend is null"); - } - - // Get property - String className = factory.getProperty("database.backend.class"); //NOI18N - - // Debug message - factory.getLogger().debug(MessageFormat.format("className={0}", className)); //NOI18N - - // Is it null? - if (null == className) { - // Not valid - throw new NullPointerException("className is null"); //NOI18N - } - - // Try to get the instance - Class reflection = Class.forName(className); - - // Debug message - factory.getLogger().debug(MessageFormat.format("reflection={0}", reflection)); //NOI18N - - // Get constructor - Constructor constructor = reflection.getConstructor(DatabaseFrontend.class); - - // Debug message - factory.getLogger().debug(MessageFormat.format("constructor={0}", constructor)); //NOI18N - - // Now invoke it - DatabaseBackend backend = (DatabaseBackend) constructor.newInstance(frontend); - - // Trace message - factory.getLogger().trace(MessageFormat.format("backend={0} - EXIT!", backend)); //NOI18N - - // Return it - return backend; - } - -} -- 2.39.5