import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
+import java.util.Arrays;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import org.apache.logging.log4j.Logger;
import org.mxchange.addressbook.application.Application;
import org.mxchange.addressbook.client.Client;
-import org.mxchange.addressbook.database.frontend.DatabaseWrapper;
+import org.mxchange.addressbook.database.frontend.DatabaseFrontend;
import org.mxchange.addressbook.manager.contact.ManageableContact;
/**
* @author Roland Haeder
*/
public class BaseFrameworkSystem implements FrameworkInterface {
+
/**
* Instance for own properties
*/
*/
private ManageableContact contactManager;
-
/**
* Name of used database table, handled over to backend
*/
private String tableName;
/**
- * DatabaseWrapper instance
+ * DatabaseFrontend instance
*/
- private DatabaseWrapper wrapper;
+ private DatabaseFrontend wrapper;
/**
* Initialize object
*/
@Override
public Object getValueFromColumn (final String columnName) {
- throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0}", columnName));
+ throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0}", columnName)); //NOI18N
}
/**
- * Some "getter" for a Method instance from given method name
+ * Some "getter" for target class instance from given name.
*
- * @param instance Actual instance to call
- * @param targetClass Target class name
- * @param methodName Method name
- * @return A Method instance
+ * @param instance Instance to iterate on
+ * @param targetClass Class name to look for
+ * @return Class instance
*/
@SuppressWarnings ("unchecked")
- private Method getMethodFromName (final FrameworkInterface instance, final String targetClass, final String methodName) {
- // Trace messahe
- this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName));
+ private Class<? extends FrameworkInterface> getClassFromTarget (final FrameworkInterface instance, final String targetClass) {
+ // Trace message
+ this.getLogger().debug(MessageFormat.format("instance={0},targetClass={1}", instance, targetClass)); //NOI18N
// Instance reflaction of this class
Class<? extends FrameworkInterface> c = instance.getClass();
-
+
// Analyze class
while (!targetClass.equals(c.getSimpleName())) {
// Debug message
- this.getLogger().debug("c=" + c.getSimpleName());
+ this.getLogger().debug(MessageFormat.format("c={0}", c.getSimpleName())); //NOI18N
// Get super class (causes unchecked warning)
c = (Class<? extends FrameworkInterface>) c.getSuperclass();
}
+ // Trace message
+ this.getLogger().trace(MessageFormat.format("c={0} - EXIT!", c)); //NOI18N
+
+ // Return it
+ return c;
+ }
+
+ /**
+ * Some "getter" for a Method instance from given method name
+ *
+ * @param instance Actual instance to call
+ * @param targetClass Target class name
+ * @param methodName Method name
+ * @return A Method instance
+ */
+ private Method getMethodFromName (final FrameworkInterface instance, final String targetClass, final String methodName) {
+ // Trace messahe
+ this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N
+
+ // Get target class instance
+ Class<? extends FrameworkInterface> c = this.getClassFromTarget(instance, targetClass);
+
// Init field instance
Method method = null;
}
// Assert on field
- assert(method instanceof Method) : "method is not a Method instance";
+ assert (method instanceof Method) : "method is not a Method instance"; //NOI18N
// Trace message
- this.getLogger().trace(MessageFormat.format("method={0} - EXIT!", method));
+ this.getLogger().trace(MessageFormat.format("method={0} - EXIT!", method)); //NOI18N
// Return it
return method;
// .. and exit
System.exit(1);
-
+
}
/**
@Override
public boolean isValueEqual (final String columnName, final boolean bool) {
// Not implemented
- throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0},bool={1}", columnName, bool));
+ throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0},bool={1}", columnName, bool)); //NOI18N
}
/**
*/
protected String convertColumnNameToAttribute (final String columnName) {
// Trace message
- this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName));
+ this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName)); //NOI18N
// First all lower case
String lower = columnName.toLowerCase();
// Then split on "_"
- StringTokenizer tokenizer = new StringTokenizer(lower, "_");
+ StringTokenizer tokenizer = new StringTokenizer(lower, "_"); //NOI18N
// Resulting string
StringBuilder builder = new StringBuilder(tokenizer.countTokens());
// Increment counter
count++;
}
-
+
// Trace message
- this.getLogger().trace(MessageFormat.format("builder={0} - EXIT!", builder));
+ this.getLogger().trace(MessageFormat.format("builder={0} - EXIT!", builder)); //NOI18N
// Return result
return builder.toString();
*/
protected String convertColumnNameToGetterMethod (final String columnName, boolean isBool) {
// Trace message
- this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName));
-
- // First all lower case
- String lower = columnName.toLowerCase();
+ this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName)); //NOI18N
// Then split on "_"
- StringTokenizer tokenizer = new StringTokenizer(lower, "_");
+ StringTokenizer tokenizer = new StringTokenizer(columnName, "_"); //NOI18N
// Resulting string
StringBuilder builder = new StringBuilder(tokenizer.countTokens());
// Is it boolean?
if (isBool) {
// Append "is"
- builder.append("is");
+ builder.append("is"); //NOI18N
} else {
// Append "get"
- builder.append("get");
+ builder.append("get"); //NOI18N
}
// Walk through all
String token = tokenizer.nextToken();
// Debug message
- this.getLogger().debug(MessageFormat.format("token={0}", token));
+ this.getLogger().debug(MessageFormat.format("token={0}", token)); //NOI18N
// Make it upper-case
char c = token.charAt(0);
// Add token
builder.append(token);
}
-
+
// Trace message
- this.getLogger().trace(MessageFormat.format("builder={0} - EXIT!", builder));
+ this.getLogger().trace(MessageFormat.format("builder={0} - EXIT!", builder)); //NOI18N
// Return result
return builder.toString();
*/
protected boolean getBooleanField (final FrameworkInterface instance, final String targetClass, final String methodName) {
// Trace messahe
- this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName));
+ this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N
// Get method instance
Method method = this.getMethodFromName(instance, targetClass, methodName);
*/
protected Object getField (final FrameworkInterface instance, final String targetClass, final String methodName) {
// Trace messahe
- this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName));
+ this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N
// Get method to call
Method method = this.getMethodFromName(instance, targetClass, methodName);
// Return value
return object;
}
-
+
/**
* Getter for logger
*
}
/**
- * Getter for DatabaseWrapper instance
+ * Getter for DatabaseFrontend instance
*
- * @return DatabaseWrapper instance
+ * @return DatabaseFrontend instance
*/
- protected DatabaseWrapper getWrapper () {
+ protected DatabaseFrontend getWrapper () {
return this.wrapper;
}
/**
* Setter for wrapper instance
*
- * @param wrapper A DatabaseWrapper instance
+ * @param wrapper A DatabaseFrontend instance
*/
- protected void setWrapper (final DatabaseWrapper wrapper) {
+ protected void setWrapper (final DatabaseFrontend wrapper) {
this.wrapper = wrapper;
}
+
+ /**
+ * Some "getter" for an array from given string and tokenizer
+ *
+ * @param str String to tokenize and get array from
+ * @param delimiter Delimiter
+ * @param size Size of array
+ * @return Array from tokenized string
+ */
+ 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
+
+ // Return it
+ return tokens;
+ }
+
+ /**
+ * 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<? extends FrameworkInterface> 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;
+ } catch (final SecurityException ex) {
+ // Really bad?
+ this.abortProgramWithException(ex);
+ }
+
+ // Trace message
+ this.getLogger().trace(MessageFormat.format("isBool={0} - EXIT!", isBool)); //NOI18N
+
+ // Return result
+ return isBool;
+ }
}