X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2Forg%2Fmxchange%2Fjcore%2FBaseFrameworkSystem.java;h=8bbf1ea3a177449c62551534f13d176cb1189929;hb=e0dbb3c7b440c5f005bb6874a235a93c73188f55;hp=7d96be82381006abe65d4df62bab3e66a226f681;hpb=08cf79beba2d1707717cd01d4cd396244841d019;p=jcore.git diff --git a/src/org/mxchange/jcore/BaseFrameworkSystem.java b/src/org/mxchange/jcore/BaseFrameworkSystem.java index 7d96be8..8bbf1ea 100644 --- a/src/org/mxchange/jcore/BaseFrameworkSystem.java +++ b/src/org/mxchange/jcore/BaseFrameworkSystem.java @@ -38,6 +38,7 @@ 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.manager.Manageable; @@ -47,6 +48,7 @@ import org.mxchange.jcore.manager.Manageable; * @author Roland Haeder */ public class BaseFrameworkSystem implements FrameworkInterface { + /** * Bundle instance */ @@ -72,6 +74,10 @@ public class BaseFrameworkSystem implements FrameworkInterface { */ private Application application; + /** + * Instance for database backend + */ + private DatabaseBackend backend; /** * Client instance @@ -98,7 +104,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { */ private DatabaseFrontend wrapper; - /** * Initialize object */ @@ -106,6 +111,14 @@ public class BaseFrameworkSystem implements FrameworkInterface { LOG = LogManager.getLogger(this); } + /** + * No instances can be created of this class + */ + protected BaseFrameworkSystem () { + // Set own instance + this.setSelfInstance(); + } + /** * Getter for this application * @@ -116,17 +129,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { return selfInstance; } - /** - * No instances can be created of this class - */ - protected BaseFrameworkSystem () { - // Init properties file - this.initProperties(); - - // Set own instance - this.setSelfInstance(); - } - /** * Application instance * @@ -175,10 +177,13 @@ public class BaseFrameworkSystem implements FrameworkInterface { * * @param columnName Column name * @return Value from field - * @throws IllegalArgumentException Some implementations may throw this. + * @throws IllegalArgumentException Some implementations may throw this. + * @throws NoSuchMethodException Some implementations may throw this. + * @throws java.lang.IllegalAccessException If the method cannot be accessed + * @throws java.lang.reflect.InvocationTargetException Any other problems? */ @Override - public Object getValueFromColumn (final String columnName) throws IllegalArgumentException { + public Object getValueFromColumn (final String columnName) throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0}", columnName)); //NOI18N } @@ -189,7 +194,7 @@ public class BaseFrameworkSystem implements FrameworkInterface { * @param targetClass Class name to look for * @return Class instance */ - @SuppressWarnings ("unchecked") + @SuppressWarnings("unchecked") private Class getClassFromTarget (final FrameworkInterface instance, final String targetClass) { // Trace message this.getLogger().debug(MessageFormat.format("instance={0},targetClass={1}", instance, targetClass)); //NOI18N @@ -221,7 +226,7 @@ public class BaseFrameworkSystem implements FrameworkInterface { * @param methodName Method name * @return A Method instance */ - private Method getMethodFromName (final FrameworkInterface instance, final String targetClass, final String methodName) { + private Method getMethodFromName (final FrameworkInterface instance, final String targetClass, final String methodName) throws NoSuchMethodException { // Trace messahe this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N @@ -232,15 +237,7 @@ public class BaseFrameworkSystem implements FrameworkInterface { Method method = null; // Use reflection to get all attributes - try { - method = c.getDeclaredMethod(methodName, new Class[0]); - } catch (final SecurityException ex) { - // Security problem - this.abortProgramWithException(ex); - } catch (final NoSuchMethodException ex) { - // Method not found - this.abortProgramWithException(ex); - } + method = c.getDeclaredMethod(methodName, new Class[0]); // Assert on field assert (method instanceof Method) : "method is not a Method instance"; //NOI18N @@ -263,7 +260,7 @@ public class BaseFrameworkSystem implements FrameworkInterface { /** * Aborts program with given exception * - * @param throwable Any type of Throwable + * @param throwable Any type of Throwable */ protected final void abortProgramWithException (final Throwable throwable) { // Log exception ... @@ -271,7 +268,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { // .. and exit System.exit(1); - } /** @@ -311,15 +307,27 @@ public class BaseFrameworkSystem implements FrameworkInterface { this.client = client; } + /** + * Name of used database table, handled over to backend + * + * @return the tableName + */ + public final String getTableName () { + return this.tableName; + } + /** * 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 + * @throws NoSuchMethodException May be thrown by some implementations + * @throws java.lang.IllegalAccessException If the method cannot be accessed + * @throws java.lang.reflect.InvocationTargetException Any other problems? */ @Override - public boolean isValueEqual (final String columnName, final boolean bool) { + public boolean isFieldValueEqual (final String columnName, final boolean bool) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { // Not implemented throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0},bool={1}", columnName, bool)); //NOI18N } @@ -335,49 +343,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { this.getLogger().catching(exception); } - /** - * Prepares all properties, the file is written if it is not found - */ - private void initProperties () { - // 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(); - } catch (final IOException ex) { - // Something else didn't work - this.abortProgramWithException(ex); - } - - // Trace message - this.getLogger().trace("EXIT!"); //NOI18N - } - /** * Initializes properties with default values */ @@ -387,7 +352,8 @@ public class BaseFrameworkSystem implements FrameworkInterface { // Init default values: // Default database backend - BaseFrameworkSystem.properties.put("org.mxchange.database.backendType", "base64csv"); //NOI18N + BaseFrameworkSystem.properties.put("org.mxchange.database.backend.class", "org.mxchange.jcore.database.backend.base64.Base64CsvDatabaseBackend"); //NOI18N + BaseFrameworkSystem.properties.put("database.backend.storagepath", "data/"); //NOI18N // For MySQL backend BaseFrameworkSystem.properties.put("org.mxchange.database.mysql.host", "localhost"); //NOI18N @@ -402,16 +368,12 @@ public class BaseFrameworkSystem implements FrameworkInterface { /** * Writes the properties file to disk */ - private void writePropertiesFile () { + private void writePropertiesFile () throws IOException { // Trace message this.getLogger().trace("CALLED!"); //NOI18N - try { - // Write it - BaseFrameworkSystem.properties.store(new PrintWriter(FrameworkInterface.PROPERTIES_CONFIG_FILE), "This file is automatically generated. You may wish to alter it."); //NOI18N - } catch (final IOException ex) { - this.abortProgramWithException(ex); - } + // 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 @@ -527,26 +489,26 @@ public class BaseFrameworkSystem implements FrameworkInterface { protected String[] getArrayFromString (final String str, final String delimiter, final int size) { // Trace message this.getLogger().trace(MessageFormat.format("str={0},delimiter={1},size={2} - CALLED!", str, delimiter, size)); //NOI18N - + // Get tokenizer StringTokenizer tokenizer = new StringTokenizer(str, delimiter); - + // Init array and index String[] tokens = new String[size]; int index = 0; - + // Run through all tokens while (tokenizer.hasMoreTokens()) { // Get current token and add it tokens[index] = tokenizer.nextToken(); - + // Debug message this.getLogger().debug(MessageFormat.format("Token at index{0}: {1}", index, tokens[1])); //NOI18N - + // Increment index index++; } - + // Trace message this.getLogger().trace(MessageFormat.format("tokens({0})={1} - EXIT!", tokens.length, Arrays.toString(tokens))); //NOI18N @@ -561,8 +523,11 @@ public class BaseFrameworkSystem implements FrameworkInterface { * @param targetClass Target class to look in * @param methodName Method name to look for * @return 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 boolean getBooleanField (final FrameworkInterface instance, final String targetClass, final String methodName) { + protected boolean getBooleanField (final FrameworkInterface instance, final String targetClass, final String methodName) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // Trace messahe this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N @@ -572,18 +537,8 @@ public class BaseFrameworkSystem implements FrameworkInterface { // Get value from field Boolean value = false; - try { - value = (Boolean) method.invoke(instance); - } catch (final IllegalArgumentException ex) { - // Other problem - this.abortProgramWithException(ex); - } catch (final IllegalAccessException ex) { - // Other problem - this.abortProgramWithException(ex); - } catch (final InvocationTargetException ex) { - // Other problem - this.abortProgramWithException(ex); - } + // Try to get the value by invoking the method + value = (Boolean) method.invoke(instance); // Return value return value; @@ -605,8 +560,11 @@ public class BaseFrameworkSystem implements FrameworkInterface { * @param targetClass Target class to look in * @param methodName Method name to look for * @return 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 Object getField (final FrameworkInterface instance, final String targetClass, final String methodName) { + protected Object getField (final FrameworkInterface instance, final String targetClass, final String methodName) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // Trace messahe this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N @@ -614,20 +572,7 @@ public class BaseFrameworkSystem implements FrameworkInterface { Method method = this.getMethodFromName(instance, targetClass, methodName); // Get value from field - Object object = null; - - try { - object = method.invoke(instance); - } catch (final IllegalArgumentException ex) { - // Other problem - this.abortProgramWithException(ex); - } catch (final IllegalAccessException ex) { - // Other problem - this.abortProgramWithException(ex); - } catch (final InvocationTargetException ex) { - // Other problem - this.abortProgramWithException(ex); - } + Object object = method.invoke(instance); // Return value return object; @@ -646,37 +591,108 @@ public class BaseFrameworkSystem implements FrameworkInterface { /** * Name of used database table, handled over to backend * - * @return the tableName + * @param tableName the tableName to set */ - protected final String getTableName () { - return this.tableName; + protected final void setTableName (final String tableName) { + this.tableName = tableName; } /** - * Name of used database table, handled over to backend + * Converts null to empty string or leaves original string. * - * @param tableName the tableName to set + * @param str Any string + * @return Empty string if null or original string */ - protected final void setTableName (final String tableName) { - this.tableName = tableName; + protected Object convertNullToEmpty (final Object str) { + // Trace message + this.getLogger().trace(MessageFormat.format("str={0}", str)); //NOI18N + + // Is it null? + if (str == null) { + // Return empty string + return ""; //NOI18N + } + + // Trace message + this.getLogger().trace(MessageFormat.format("str={0} - EXIT!", str)); //NOI18N + + // Return it + return str; } /** - * Getter for DatabaseFrontend instance + * Creates an iterator from given instance and class name. * - * @return DatabaseFrontend instance + * @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 final DatabaseFrontend getWrapper () { - return this.wrapper; + protected Iterator> fieldIterator (final FrameworkInterface 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(); } /** - * Setter for wrapper instance + * Instance for database backend * - * @param wrapper A DatabaseFrontend instance + * @return the backend */ - protected final void setWrapper (final DatabaseFrontend wrapper) { - this.wrapper = wrapper; + 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; } /** @@ -697,23 +713,89 @@ public class BaseFrameworkSystem implements FrameworkInterface { this.contact = contact; } + /** + * Getter for DatabaseFrontend instance + * + * @return DatabaseFrontend instance + */ + protected final DatabaseFrontend getFrontend () { + return this.wrapper; + } + + /** + * Setter for wrapper instance + * + * @param wrapper A DatabaseFrontend instance + */ + protected final void setFrontend (final DatabaseFrontend wrapper) { + this.wrapper = wrapper; + } + /** * Initializes i18n bundles */ protected void initBundle () { + // Trace message + this.getLogger().trace("CALLED!"); + // Is the bundle set? if (bundle instanceof ResourceBundle) { // Is already set - throw new IllegalStateException("called twice"); + throw new IllegalStateException("called twice"); //NOI18N } // Set instance bundle = ResourceBundle.getBundle(FrameworkInterface.I18N_BUNDLE_FILE); // NOI18N + + // Trace message + this.getLogger().trace("EXIT!"); + } + + /** + * 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 @@ -741,9 +823,6 @@ public class BaseFrameworkSystem implements FrameworkInterface { // Not found isBool = false; - } catch (final SecurityException ex) { - // Really bad? - this.abortProgramWithException(ex); } // Trace message @@ -754,50 +833,48 @@ public class BaseFrameworkSystem implements FrameworkInterface { } /** - * 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 + * Sets value in properties instance. + * + * @param key Property key (part) to set + * @param value Property value to set */ - protected Iterator> fieldIterator (final FrameworkInterface instance, final String className) { + protected void setProperty (final String key, final String value) { // Trace message - this.getLogger().trace(MessageFormat.format("instance={0},className={1} - CALLED!", instance, className)); - - // 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)); - - // 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())); - - // Does the field start with "$"? - if (field.getName().startsWith("$")) { - // Skip it silently - continue; - } - - // Get value from it - Object value = this.getValueFromColumn(field.getName()); + this.getLogger().trace(MessageFormat.format("key={0},value={1} - CALLED!", key, value)); //NOI18N + + // Both should not be null + if (key == null) { + // key is null + throw new NullPointerException("key is null"); + } else if (value == null) { + // value is null + throw new NullPointerException("value is null"); + } - // Debug message - this.getLogger().debug(MessageFormat.format("value={0}", value)); + // Set it + properties.setProperty(String.format("org.mxchange.%s", key), value); //NOI18N - // Add it to list - map.put(field, value); - } + // Trace message + this.getLogger().trace("EXIT!"); //NOI18N + } - // Debug message - this.getLogger().debug(MessageFormat.format("Returning iterator for {0} entries ...", map.size())); + /** + * 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 list iterator - return map.entrySet().iterator(); + // Return it + return names; } }