From 16624bae7209070f842d14159924d85a320c362d Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Tue, 29 Sep 2015 15:34:54 +0200 Subject: [PATCH] =?utf8?q?Prepared=20for=20upcoming=20rewrite:=20-=20added?= =?utf8?q?=20BaseAddressbookSystem=20class=20-=20rewrote=20all=20logger=20?= =?utf8?q?to=20bean=20(why=20not=20working=3F)=20-=20added=20JPA=20jar=20S?= =?utf8?q?igned-off-by:Roland=20H=C3=A4der=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- lib/jcore-logger-lib.jar | Bin 2469 -> 2496 bytes lib/jcore.jar | Bin 32286 -> 29685 bytes .../javax.persistence_2.1.0.v201304241213.jar | Bin 0 -> 164637 bytes lib/nblibraries.properties | 6 + nbproject/project.properties | 3 +- .../addressbook/BaseAddressbookSystem.java | 83 +++++++++++ .../application/AddressbookApplication.java | 98 +++++++++---- .../client/BaseAddressbookClient.java | 65 ++++++++- .../client/console/ConsoleClient.java | 78 +++++----- .../client/gui/AddressbookFrame.java | 124 +++++++++------- .../addressbook/client/gui/SwingClient.java | 23 +-- .../contact/AddressbookContactManager.java | 133 +++++++++++------- .../addressbook/menu/AddressbookMenu.java | 12 +- .../mxchange/addressbook/menu/BaseMenu.java | 17 ++- .../mxchange/addressbook/menu/MenuTools.java | 16 +-- .../addressbook/menu/console/ConsoleMenu.java | 2 +- .../addressbook/menu/item/BaseMenuItem.java | 5 +- .../menu/item/SelectableMenuItem.java | 3 +- .../menu/item/console/ConsoleMenuItem.java | 4 +- 19 files changed, 449 insertions(+), 223 deletions(-) create mode 100644 lib/jpa20-persistence/javax.persistence_2.1.0.v201304241213.jar create mode 100644 src/org/mxchange/addressbook/BaseAddressbookSystem.java diff --git a/lib/jcore-logger-lib.jar b/lib/jcore-logger-lib.jar index b95c18db6f3712483bd0000ec47c50b8ac227757..4dedcc6562e8bf1dbf9740143bd86ec1b273ee67 100644 GIT binary patch delta 274 zcmZ1~d_b5dz?+$ci-CcIfnj;|L>^71Wz`eSr!xWB7ZgC`CruzZS(ecpM1?Whf~cvC z&LHX*qZg3ctj1)>B)GiV)}66O?*3;+1_lszo~*+tH#wbCWAZu{PIh5-20?ZPp~?GL z+BrFL^3z?5it>vlJF{M477$Bp(AmkY;0GWDsCr z2=HcP5@Ck9b@CK8OQ2&XpJ#IbIYyA(07N;nTY{)Mc6ShUoZS~hiE#vjsBDfXupmb= SFN$*~n{#HcEo1{)!~g(<+(;S# delta 244 zcmX>gyi}Mcz?+$ci-CcIfuSp8B9A6hXUIhJ=}bWO1qBfKNfSs;mSr>tQDKa>AZjY3 zGl;sy=mn%Ut1%fe33Y|ox3=BY$mw^vRvoSC-@G~$3cr!AIFvDCkc|DsY&^eP|u{nUO(_uFN tQE}{+AZjMNJBWJ3?hB#}If6k{8%GpakRzEF#X*yUI5XJV*nk!>003hlKi~iW diff --git a/lib/jcore.jar b/lib/jcore.jar index bff5c73b4f02f01a1d004c465d1c99a0d024e32c..2179b37e40284525a5cb25cce157f22bfc9b782e 100644 GIT binary patch delta 9462 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 literal 32286 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

d&Ft% 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 Sr3`8w{{KE!0dCIm)Bgu8T?9n{ diff --git a/lib/jpa20-persistence/javax.persistence_2.1.0.v201304241213.jar b/lib/jpa20-persistence/javax.persistence_2.1.0.v201304241213.jar new file mode 100644 index 0000000000000000000000000000000000000000..841d2e19b03423ad822c0a19b8838338559105bf GIT binary patch literal 164637 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. + */ +package org.mxchange.addressbook; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import org.mxchange.jcore.BaseFrameworkSystem; +import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal; + +/** + * A general addressbook class + * + * @author Roland Haeder + */ +public abstract class BaseAddressbookSystem extends BaseFrameworkSystem { + + /** + * Logger instance + */ + private LoggerBeanLocal logger; + + /** + * Protected constructor + */ + protected BaseAddressbookSystem () { + try { + // Get initial context + Context context = new InitialContext(); + + // Lookup logger + this.logger = (LoggerBeanLocal) context.lookup("java:global/jcore-logger-ejb/logger!org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal"); + } catch (final NamingException ex) { + // Continue to throw + throw new RuntimeException(ex); + } + } + + /** + * Getter for logger instance + * + * @return Logger instance + */ + protected LoggerBeanLocal getLogger () { + return this.logger; + } + + /** + * Logs given exception + * + * @param exception Throwable + */ + protected void logException (final Throwable exception) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + /** + * Log exception and abort program. + * + * @param throwable Throwable + */ + protected void abortProgramWithException (final Throwable throwable) { + // Log exception + this.logException(throwable); + + // Abort here + System.exit(1); + } +} diff --git a/src/org/mxchange/addressbook/application/AddressbookApplication.java b/src/org/mxchange/addressbook/application/AddressbookApplication.java index dca6fe20..2859e5ca 100644 --- a/src/org/mxchange/addressbook/application/AddressbookApplication.java +++ b/src/org/mxchange/addressbook/application/AddressbookApplication.java @@ -22,12 +22,12 @@ import java.text.MessageFormat; import org.mxchange.addressbook.client.AddressbookClient; import org.mxchange.addressbook.client.console.ConsoleClient; import org.mxchange.addressbook.client.gui.SwingClient; -import org.mxchange.jcore.BaseFrameworkSystem; import org.mxchange.jcore.application.Application; import org.mxchange.jcore.application.BaseApplication; import org.mxchange.jcore.client.Client; import org.mxchange.jcore.exceptions.UnhandledUserChoiceException; import org.mxchange.jcore.manager.application.ApplicationManager; +import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal; /** * Address book application class. Please see ROADMAP.txt for details. @@ -57,12 +57,15 @@ public class AddressbookApplication extends BaseApplication implements Applicati */ private boolean guiClient = false; + /** + * Logger instance + */ + private LoggerBeanLocal logger; + /** * Protected constructor - *

- * @throws java.io.IOException If any IO error occurs */ - protected AddressbookApplication () throws IOException { + protected AddressbookApplication () { // Init properties file this.initProperties(); @@ -79,7 +82,7 @@ public class AddressbookApplication extends BaseApplication implements Applicati */ @Override public void doBootstrap () { - this.getLogger().debug("Initializing application ..."); //NOI18N + this.getLogger().logDebug("Initializing application ..."); //NOI18N // Init client variable Client client = null; @@ -87,19 +90,19 @@ public class AddressbookApplication extends BaseApplication implements Applicati // Is console or Swing choosen? if (this.isConsole()) { // Debug message - this.getLogger().debug("Initializing console client ..."); //NOI18N + this.getLogger().logDebug("Initializing console client ..."); //NOI18N // Init console client instance client = new ConsoleClient(this); } else if (this.isGui()) { // Debug message - this.getLogger().debug("Initializing GUI (Swing) client ..."); //NOI18N + this.getLogger().logDebug("Initializing GUI (Swing) client ..."); //NOI18N // Init console instance client = new SwingClient(this); } else { // Not client choosen - this.getLogger().error("No client choosen. Cannot launch."); //NOI18N + this.getLogger().logError("No client choosen. Cannot launch."); //NOI18N try { this.doShutdown(); @@ -122,7 +125,7 @@ public class AddressbookApplication extends BaseApplication implements Applicati this.getClient().enableIsRunning(); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -134,7 +137,7 @@ public class AddressbookApplication extends BaseApplication implements Applicati AddressbookClient client = (AddressbookClient) this.getClient(); // Debug message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // TODO The application should be running now // Output introduction @@ -152,7 +155,7 @@ public class AddressbookApplication extends BaseApplication implements Applicati // Ask for user input and run proper method client.doUserMenuChoice(); } catch (final UnhandledUserChoiceException ex) { - this.getLogger().catching(ex); + this.getLogger().logException(ex); } try { @@ -165,7 +168,7 @@ public class AddressbookApplication extends BaseApplication implements Applicati // --- Main loop ends here --- // Debug message - this.getLogger().debug("Main loop exit - shutting down ..."); //NOI18N + this.getLogger().logDebug("Main loop exit - shutting down ..."); //NOI18N } /** @@ -174,20 +177,49 @@ public class AddressbookApplication extends BaseApplication implements Applicati @Override public void doShutdown () throws SQLException, IOException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Shutdown client this.getClient().doShutdown(); - this.getLogger().info("End of program (last line)"); //NOI18N + this.getLogger().logInfo("End of program (last line)"); //NOI18N System.exit(0); } + /** + * Logs given exception + * + * @param exception Throwable + */ + protected void logException (final Throwable exception) { + this.getLogger().logException(exception); + } + + /** + * Initializes properties + */ + private void initProperties () throws IOException { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + /** + * Log exception and abort program. + * + * @param throwable Throwable + */ + protected void abortProgramWithException (final Throwable throwable) { + // Log exception + this.logException(throwable); + + // Abort here + System.exit(1); + } + /** * Enables console client by setting propper flag */ private void enableConsoleClient () { - this.getLogger().debug("Enabling console client (may become optional client) ..."); //NOI18N + this.getLogger().logDebug("Enabling console client (may become optional client) ..."); //NOI18N this.consoleClient = true; this.guiClient = false; } @@ -196,7 +228,7 @@ public class AddressbookApplication extends BaseApplication implements Applicati * Enables GUI client by setting propper flag */ private void enableGuiClient () { - this.getLogger().debug("Enabling GUI client (may become new default client) ..."); //NOI18N + this.getLogger().logDebug("Enabling GUI client (may become new default client) ..."); //NOI18N this.consoleClient = false; this.guiClient = true; } @@ -228,10 +260,10 @@ public class AddressbookApplication extends BaseApplication implements Applicati */ private void parseArguments (final String[] args) { // Trace message - this.getLogger().trace(MessageFormat.format("args()={0} - CALLED!", args.length)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("args()={0} - CALLED!", args.length)); //NOI18N // Debug message - this.getLogger().debug(MessageFormat.format("Parsing {0} arguments ...", args.length)); //NOI18N + this.getLogger().logDebug(MessageFormat.format("Parsing {0} arguments ...", args.length)); //NOI18N for (final String arg : args) { // Switch on it @@ -252,13 +284,13 @@ public class AddressbookApplication extends BaseApplication implements Applicati */ private void showIntro () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Let the client show it this.getClient().showWelcome(); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -267,7 +299,8 @@ public class AddressbookApplication extends BaseApplication implements Applicati * @param args Arguments handled to program */ private void start (final String args[]) { - this.getLogger().info("Program is started."); //NOI18N + this.getLogger().logInfo("Program is started."); //NOI18N + try { // Init properties file this.initProperties(); @@ -283,10 +316,12 @@ public class AddressbookApplication extends BaseApplication implements Applicati ApplicationManager.getSingeltonManager(this).start(); // Good bye, but this should not be reached ... - this.getLogger().warn("Unusual exit reached."); //NOI18N + this.getLogger().logWarning("Unusual exit reached."); //NOI18N + try { this.doShutdown(); } catch (final SQLException | IOException ex) { + // Something bad happened this.abortProgramWithException(ex); } } @@ -297,14 +332,8 @@ public class AddressbookApplication extends BaseApplication implements Applicati * @param args the command line arguments */ public static void main (String[] args) { - try { - // Start application - new AddressbookApplication().start(args); - } catch (final IOException ex) { - // Get instance - BaseFrameworkSystem.getInstance().getLogger().catching(ex); - System.exit(1); - } + // Start application + new AddressbookApplication().start(args); } /** @@ -315,4 +344,13 @@ public class AddressbookApplication extends BaseApplication implements Applicati public static String printableTitle () { return MessageFormat.format("{0} v{1}", APP_TITLE, APP_VERSION); //NOI18N } + + /** + * Getter for logger instance + * + * @return Logger instance + */ + protected LoggerBeanLocal getLogger () { + return this.logger; + } } diff --git a/src/org/mxchange/addressbook/client/BaseAddressbookClient.java b/src/org/mxchange/addressbook/client/BaseAddressbookClient.java index 4b42d53d..094d0ece 100644 --- a/src/org/mxchange/addressbook/client/BaseAddressbookClient.java +++ b/src/org/mxchange/addressbook/client/BaseAddressbookClient.java @@ -20,11 +20,15 @@ import java.sql.SQLException; import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; import org.mxchange.addressbook.manager.contact.AddressbookContactManager; import org.mxchange.addressbook.manager.contact.ManageableContactAddressbook; import org.mxchange.addressbook.menu.Menu; import org.mxchange.jcore.client.BaseClient; import org.mxchange.jcore.client.Client; +import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal; /** * A general addressbook client @@ -43,12 +47,29 @@ public abstract class BaseAddressbookClient extends BaseClient implements Addres */ private final Map menus; + /** + * Logger instance + */ + private LoggerBeanLocal logger; + /** * No instances can be created of this class */ protected BaseAddressbookClient () { // Init menu map this.menus = new HashMap<>(10); + + // Try it + try { + // Get context + Context context = new InitialContext(); + + // Lookup logger + this.logger = (LoggerBeanLocal) context.lookup("java:global/jcore-logger-ejb/logger!org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal"); + } catch (final NamingException ex) { + // Continue to throw + throw new RuntimeException(ex); + } } /** @@ -106,10 +127,10 @@ public abstract class BaseAddressbookClient extends BaseClient implements Addres */ protected void initContactManager () throws SQLException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Debug message - this.getLogger().debug("Initializing contact manager ..."); //NOI18N + this.getLogger().logDebug("Initializing contact manager ..."); //NOI18N // Init contact manager with console client // TODO Static initial amount of contacts @@ -119,10 +140,10 @@ public abstract class BaseAddressbookClient extends BaseClient implements Addres this.setManager(manager); // Debug message - this.getLogger().debug("Contact manager has been initialized."); //NOI18N + this.getLogger().logDebug("Contact manager has been initialized."); //NOI18N // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -132,7 +153,7 @@ public abstract class BaseAddressbookClient extends BaseClient implements Addres */ protected void showMenu (final String menuType) { // Trace message - this.getLogger().trace(MessageFormat.format("menuType={0} - CALLED!", menuType)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("menuType={0} - CALLED!", menuType)); //NOI18N // Get menu from type Menu menu = this.getMenu(menuType); @@ -148,6 +169,38 @@ public abstract class BaseAddressbookClient extends BaseClient implements Addres menu.show(this); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N + } + + /** + * Getter for logger instance + * + * @return Logger instance + */ + protected LoggerBeanLocal getLogger () { + return this.logger; + } + + /** + * Logs an exception + * + * @param throwable Throwable + */ + protected void logException (final Throwable throwable) { + // Deligate to logger + this.getLogger().logException(throwable); + } + + /** + * Logs exception and exits program + * + * @param throwable Throwable + */ + protected void abortProgramWithException (final Throwable throwable) { + // Log exception + this.logException(throwable); + + // Abort here + System.exit(1); } } diff --git a/src/org/mxchange/addressbook/client/console/ConsoleClient.java b/src/org/mxchange/addressbook/client/console/ConsoleClient.java index 408ebf01..5deface1 100644 --- a/src/org/mxchange/addressbook/client/console/ConsoleClient.java +++ b/src/org/mxchange/addressbook/client/console/ConsoleClient.java @@ -58,7 +58,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC */ public ConsoleClient (final Application application) { // Trace message - this.getLogger().trace(MessageFormat.format("application={0} - CALLED!", application)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("application={0} - CALLED!", application)); //NOI18N // Set application instance this.setApplication(application); @@ -67,13 +67,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC this.scanner = new Scanner(System.in, "UTF-8"); //NOI18N // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void displayAddressBox (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N // Is it null? if (null == contact) { @@ -85,13 +85,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC this.outputMessage(MessageFormat.format("Strasse, PLZ Ort, Land: {0}\n{1} {2}\n{3}", contact.getStreet(), contact.getZipCode(), contact.getCity(), contact.getCountryCode())); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void displayNameBox (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N // Is it null? if (null == contact) { @@ -116,13 +116,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void displayOtherDataBox (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N // Is it null? if (null == contact) { @@ -134,13 +134,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC this.outputMessage(MessageFormat.format("Telefonnumer: {0}\nFaxnummer: {1}\nHandy: {2}\nKommentar:\n{3}", contact.getPhoneNumber(), contact.getFaxNumber(), contact.getCellphoneNumber(), contact.getComment())); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void doChangeOwnAddressData (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N // Is it null? if (null == contact) { @@ -176,13 +176,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC contact.setCountryCode(countryCode); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void doChangeOwnNameData (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N // Is it null? if (null == contact) { @@ -218,13 +218,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC contact.setCompanyName(companyName); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void doChangeOwnOtherData (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N // Is it null? if (null == contact) { @@ -264,13 +264,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC contact.setComment(comment); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public Contact doEnterOwnData () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get manager and cast it ManageableContactAddressbook manager = (ManageableContactAddressbook) this.getManager(); @@ -291,7 +291,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC Contact contact = new UserContact(gender, firstName, familyName, companyName); // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - EXIT!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - EXIT!", contact)); //NOI18N // And return object return contact; @@ -300,20 +300,20 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC @Override public void doShutdown () throws SQLException, IOException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Parent call super.doShutdown(); // TODO Add other shutdown stuff // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void doUserMenuChoice () throws UnhandledUserChoiceException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get all access keys from menu char[] accessKeys = MenuTools.getAccessKeysFromMenuMap(this.getMenus(), this.getCurrentMenu()); @@ -381,13 +381,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public char enterChar (final char[] validChars, final String message) { // Trace message - this.getLogger().trace(MessageFormat.format("validChars={0},message={1} - CALLED!", Arrays.toString(validChars), message)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("validChars={0},message={1} - CALLED!", Arrays.toString(validChars), message)); //NOI18N // The validChars must not null be null and filled with at least one char if (null == validChars) { @@ -413,7 +413,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC } // Trace message - this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N // Return read char return input; @@ -422,7 +422,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC @Override public Gender enterGender (final String message) { // Trace message - this.getLogger().trace(MessageFormat.format("message={0} - CALLED!", message)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("message={0} - CALLED!", message)); //NOI18N // Get valid chars char[] validChars = Gender.validChars(); @@ -439,7 +439,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC assert (g instanceof Gender) : "g is not set."; //NOI18N // Trace message - this.getLogger().trace(MessageFormat.format("g={0} - EXIT!", g)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("g={0} - EXIT!", g)); //NOI18N // Return it return g; @@ -448,7 +448,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC @Override public int enterInt (final int minimum, final int maximum, final String message) { // Trace message - this.getLogger().trace(MessageFormat.format("minimum={0},maximum={1},message={2} - CALLED!", minimum, maximum, message)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("minimum={0},maximum={1},message={2} - CALLED!", minimum, maximum, message)); //NOI18N // Minimum should not be below zero assert (minimum >= 0) : MessageFormat.format("minimum={0} is below zero", minimum); //NOI18N @@ -466,7 +466,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC } // Trace message - this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N // Return it return input; @@ -475,7 +475,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC @Override public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty) { // Trace message - this.getLogger().trace(MessageFormat.format("minLength={0},maxLength={1},message={2}allowEmpty={3} - CALLED!", minLength, maxLength, message, allowEmpty)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("minLength={0},maxLength={1},message={2}allowEmpty={3} - CALLED!", minLength, maxLength, message, allowEmpty)); //NOI18N // Check on length, e.g. country codes are excactly 2 chars long assert (maxLength >= minLength); @@ -493,7 +493,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC } // Trace message - this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N // Return it return input; @@ -508,7 +508,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC @Override public void init () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Init contact manager here try { @@ -522,7 +522,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC this.fillMenuMap(); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override @@ -548,13 +548,13 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC this.outputMessage("Copyright(c) 2015 by Roland Haeder, this is free software"); //NOI18N // Debug message - this.getLogger().debug("Intro shown to user"); //NOI18N + this.getLogger().logDebug("Intro shown to user"); //NOI18N } @Override public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N // Contact must not be null if (null == contact) { @@ -592,7 +592,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -605,7 +605,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC String input = this.readString(); // Debug message - this.getLogger().debug(MessageFormat.format("input={0}", input)); //NOI18N + this.getLogger().logDebug(MessageFormat.format("input={0}", input)); //NOI18N // This must be only one character if (input.length() != 1) { @@ -627,7 +627,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC String input = this.readString(); // Debug message - this.getLogger().debug(MessageFormat.format("input={0}", input)); //NOI18N + this.getLogger().logDebug(MessageFormat.format("input={0}", input)); //NOI18N // Init number with invalid value int num = -1; @@ -637,11 +637,11 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC num = Integer.parseInt(input); } catch (final NumberFormatException e) { this.outputMessage("Bitte geben Sie nur Zahlen ein!"); - this.getLogger().warn(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage())); //NOI18N + this.getLogger().logWarning(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage())); //NOI18N } // Trace message - this.getLogger().trace(MessageFormat.format("num={0} - EXIT!", num)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("num={0} - EXIT!", num)); //NOI18N // Return read number return num; @@ -659,7 +659,7 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC @Override protected final void fillMenuMap () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Initialize first (main) menu Menu menu = new ConsoleMenu("main", this); //NOI18N @@ -668,6 +668,6 @@ public class ConsoleClient extends BaseAddressbookClient implements AddressbookC this.getMenus().put("main", menu); //NOI18N // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } } diff --git a/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java b/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java index 05e12398..bc096447 100644 --- a/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java +++ b/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java @@ -47,22 +47,25 @@ import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import javax.swing.table.TableModel; +import org.mxchange.addressbook.BaseAddressbookSystem; import org.mxchange.addressbook.application.AddressbookApplication; import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException; import org.mxchange.addressbook.manager.contact.ManageableContactAddressbook; -import org.mxchange.jcore.BaseFrameworkSystem; +import org.mxchange.jcore.application.Application; import org.mxchange.jcore.client.Client; import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException; +import org.mxchange.jcore.manager.Manageable; import org.mxchange.jcore.model.contact.Contact; import org.mxchange.jcore.model.contact.gender.Gender; import org.mxchange.jcoreswing.client.gui.ClientFrame; import org.mxchange.jcoreswing.model.swing.contact.ContactTableModel; /** + * A Swing frame for addressbook. * * @author Roland Haeder */ -public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame { +public class AddressbookFrame extends BaseAddressbookSystem implements ClientFrame { /** * Own instance @@ -133,7 +136,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private AddressbookFrame (final Client client) { // Debug line - this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N // Set frame instance this.frame = new JFrame(); @@ -143,13 +146,13 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.setClient(client); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public Contact doEnterOwnData () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Is the "add contact" window visible? if (this.addContact.isVisible()) { @@ -164,7 +167,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.addContact.setVisible(true); // Trace message - this.getLogger().trace("Returning null : EXIT!"); //NOI18N + this.getLogger().logTrace("Returning null : EXIT!"); //NOI18N // Return value is not supported return null; @@ -176,13 +179,13 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame @Override public void doShutdown () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // First only show shutdown status this.updateStatus("shutdown"); //NOI18N // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -191,7 +194,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame @Override public void enableMainWindow () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Enable it again this.frame.setEnabled(true); @@ -200,7 +203,27 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.frame.requestFocus(); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N + } + + @Override + public Application getApplication () { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Client getClient () { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Manageable getManager () { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public String getMessageStringFromKey (String key) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } /** @@ -211,12 +234,12 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame @Override public void setupFrame (final Client client) throws IOException { // Debug line - this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N // Has the user entered own data? if (((ManageableContactAddressbook) this.getClient().getManager()).isOwnContactAdded()) { // Debug message - this.getLogger().debug("Disabling menus: isOwnContactAdded()=false"); //NOI18N + this.getLogger().logDebug("Disabling menus: isOwnContactAdded()=false"); //NOI18N // Not entered yet, so disable "add" menu this.addOwnItem.setEnabled(false); @@ -232,7 +255,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.updateStatus("done"); //NOI18N // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -246,7 +269,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame @Override public void init () throws FrameAlreadyInitializedException { // Debug line - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Has this frame been initialized? if (this.isInitialized()) { @@ -261,7 +284,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.initialized = true; // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -275,18 +298,23 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame return this.initialized; } + @Override + public void logException (Throwable exception) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + /** * Shuts down the application. */ @Override public void shutdownApplication () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // To do this, the frame must be initialized if (!this.isInitialized()) { // Not initalized, so bad call - this.getLogger().fatal("Bad call of shutdownApplication(). Please report this."); //NOI18N + this.getLogger().logFatal("Bad call of shutdownApplication(). Please report this."); //NOI18N return; } @@ -299,7 +327,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -311,7 +339,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void addMenuItem (final JMenu menu, final String key, final ActionListener listener) { // Trace message - this.getLogger().trace(MessageFormat.format("menu={0},key={1},listener={2} - CALLED!", menu, key, listener)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("menu={0},key={1},listener={2} - CALLED!", menu, key, listener)); //NOI18N // New instance JMenuItem item = this.initMenuItemWithTooltip(key); @@ -323,7 +351,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame menu.add(item); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -335,7 +363,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void addTextFieldWithLabelToPanel (final JPanel panel, final String key, final int fieldLength) { // Trace message - this.getLogger().trace(MessageFormat.format("panel={0},key={1},fieldLength={2} - CALLED!", panel, key, fieldLength)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("panel={0},key={1},fieldLength={2} - CALLED!", panel, key, fieldLength)); //NOI18N // Init label for given key JLabel label = new JLabel(this.getBundle().getString(String.format("AddressbookFrame.%s.text", key))); //NOI18N @@ -349,7 +377,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame panel.add(field); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -389,7 +417,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initAddCancelButtons () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Init panel JPanel panel = new JPanel(); @@ -417,7 +445,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.addContact.add(panel); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -425,7 +453,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initAddContactDialog () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Instance dialog and set title this.addContact = new JDialog(); @@ -493,7 +521,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ this.addContact.setVisible(true); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -503,7 +531,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initAddressDataPanel (final JDialog dialog) { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Panel "address" input boxes JPanel addressPanel = new JPanel(); @@ -544,7 +572,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame dialog.add(addressPanel); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -552,7 +580,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initComponents () { // Debug line - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Set default close operation this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -601,7 +629,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.initOtherDialogs(); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -612,13 +640,13 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private JMenuItem initMenuItemWithTooltip (final String key) { // Debug line - this.getLogger().trace(MessageFormat.format("key={0} - CALLED!", key)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("key={0} - CALLED!", key)); //NOI18N JMenuItem item = new JMenuItem(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.text", key))); //NOI18N item.setToolTipText(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.toolTipText", key))); //NOI18N // Trace message - this.getLogger().trace(MessageFormat.format("item={0} - EXIT!", item)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("item={0} - EXIT!", item)); //NOI18N // Return it return item; @@ -629,7 +657,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initMenuSystem () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Init menu bar, menu and item instances JMenuBar menuBar = new JMenuBar(); @@ -733,7 +761,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.frame.add(menuBar, BorderLayout.NORTH); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -743,7 +771,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initNameDataPanel (final JDialog dialog) { // Trace message - this.getLogger().trace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N // Panel "name" input boxes JPanel namePanel = new JPanel(); @@ -776,7 +804,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame dialog.add(namePanel); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -787,7 +815,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initOtherDataPanel (final JDialog dialog) { // Trace message - this.getLogger().trace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N // Panel "other" input boxes JPanel otherPanel = new JPanel(); @@ -821,7 +849,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame dialog.add(otherPanel); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -829,14 +857,14 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initOtherDialogs () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Init other windows: // 1) Add contact initAddContactDialog(); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -844,7 +872,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initStatusPanel () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Init status label (which needs to be updated this.statusLabel = new JLabel(); @@ -860,7 +888,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.frame.add(panel, BorderLayout.SOUTH); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -868,7 +896,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void initTable () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Instance table model this.dataModel = new ContactTableModel(this.getClient().getManager()); @@ -901,7 +929,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame this.frame.add(scroller, BorderLayout.CENTER); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -911,19 +939,19 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame */ private void updateStatus (final String type) { // Trace message - this.getLogger().trace(MessageFormat.format("type={0} - CALLED!", type)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("type={0} - CALLED!", type)); //NOI18N // Set status message this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type))); //NOI18N // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** * Class for "add address" button */ - private static class AddActionListener extends BaseFrameworkSystem implements ActionListener { + private static class AddActionListener extends BaseAddressbookSystem implements ActionListener { /** * Dialog instance @@ -961,7 +989,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame /** * Class for "cancel address" button */ - private static class CancelActionListener extends BaseFrameworkSystem implements ActionListener { + private static class CancelActionListener extends BaseAddressbookSystem implements ActionListener { /** * Dialog instance diff --git a/src/org/mxchange/addressbook/client/gui/SwingClient.java b/src/org/mxchange/addressbook/client/gui/SwingClient.java index 13d05ca1..d2316ce8 100644 --- a/src/org/mxchange/addressbook/client/gui/SwingClient.java +++ b/src/org/mxchange/addressbook/client/gui/SwingClient.java @@ -29,6 +29,7 @@ import org.mxchange.jcore.model.contact.gender.Gender; import org.mxchange.jcoreswing.client.gui.ClientFrame; /** + * A swing client * * @author Roland Haeder */ @@ -46,7 +47,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli */ public SwingClient (final Application application) { // Debug message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Set application instance this.setApplication(application); @@ -55,7 +56,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli this.frame = AddressbookFrame.getSelfInstance(this); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override @@ -96,7 +97,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli @Override public Contact doEnterOwnData () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Deligate this call to the frame return this.frame.doEnterOwnData(); @@ -108,7 +109,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli @Override public void doShutdown () throws SQLException, IOException { // Debug message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Parent call super.doShutdown(); @@ -118,13 +119,13 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli // TODO Add other shutdown stuff // Debug message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override public void doUserMenuChoice () throws UnhandledUserChoiceException { // Debug message - //* NOISY-DEBUG: */ this.getLogger().trace("CALLED!"); + //* NOISY-DEBUG: */ this.getLogger().logTrace("CALLED!"); // Not implemented here } @@ -159,7 +160,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli @Override public SelectableMenuItem getMenuItem (final char accessKey, final String text) { // Debug message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Returns null as the menu is now no longer controlled here. return null; @@ -171,7 +172,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli @Override public void init () { // Debug message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N try { // Init contact manager here @@ -188,7 +189,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli } // Debug message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override @@ -199,7 +200,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli @Override public void showCurrentMenu () { // Debug message - //* NOISY-DEBUG: */ this.getLogger().trace("CALLED!"); + //* NOISY-DEBUG: */ this.getLogger().logTrace("CALLED!"); // Not implemented here } @@ -212,7 +213,7 @@ public class SwingClient extends BaseAddressbookClient implements AddressbookCli @Override public void showWelcome () { // Debug message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Not implemented here } diff --git a/src/org/mxchange/addressbook/manager/contact/AddressbookContactManager.java b/src/org/mxchange/addressbook/manager/contact/AddressbookContactManager.java index 805c3a41..beafc29e 100644 --- a/src/org/mxchange/addressbook/manager/contact/AddressbookContactManager.java +++ b/src/org/mxchange/addressbook/manager/contact/AddressbookContactManager.java @@ -31,6 +31,7 @@ import org.mxchange.jcore.exceptions.UnhandledUserChoiceException; import org.mxchange.jcore.manager.BaseManager; import org.mxchange.jcore.model.contact.Contact; import org.mxchange.jcore.model.contact.gender.Gender; +import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal; /** * A manager for contacts. @@ -50,6 +51,11 @@ public class AddressbookContactManager extends BaseManager implements Manageable */ private final List translatedColumnNames; + /** + * Logger instance + */ + private LoggerBeanLocal logger; + /** * Constructor which accepts maxContacts for maximum (initial) contacts and * a client instance. @@ -59,7 +65,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable */ public AddressbookContactManager (final Client client) throws SQLException { // Trace message - this.getLogger().trace(MessageFormat.format("client={1} - CALLED!", client)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("client={1} - CALLED!", client)); //NOI18N // Make sure all parameters are set correctly if (null == client) { @@ -82,7 +88,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable this.fillColumnNamesFromBundle(); // Debug message - //* NOISY-DEBUG: */ this.getLogger().debug("client=" + client); + //* NOISY-DEBUG: */ this.getLogger().logDebug("client=" + client); } /** @@ -93,7 +99,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void addContact (final Contact contact) throws ContactAlreadyAddedException { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N // Contact instance must not be null if (null == contact) { @@ -105,7 +111,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable ((AddressbookContactFrontend) this.getFrontend()).addContact(contact); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -124,7 +130,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void doChangeAddressData (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N // Contact must not be null if (null == contact) { @@ -152,7 +158,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -163,7 +169,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void doChangeNameData (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N // Contact must not be null if (null == contact) { @@ -187,7 +193,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -206,7 +212,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void doChangeOtherData (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N // Contact must not be null if (null == contact) { @@ -230,7 +236,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -239,7 +245,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void doChangeOwnData () throws IOException, SQLException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N /* * First check if the user has registered own contact, before that @@ -257,10 +263,10 @@ public class AddressbookContactManager extends BaseManager implements Manageable Contact contact = this.getOwnContact(); // It must be found - assert (contact instanceof Contact); + assert (contact instanceof Contact) : ": contact is not implementing Contact: " + contact; // Display contact - contact.show(this.getClient()); + this.getClient().show(contact); // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -269,11 +275,11 @@ public class AddressbookContactManager extends BaseManager implements Manageable // Ask user what to change client.userChooseChangeContactData(contact); } catch (final UnhandledUserChoiceException ex) { - this.getLogger().catching(ex); + this.getLogger().logException(ex); } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -290,7 +296,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void doEnterOwnData () throws ContactAlreadyAddedException, IOException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Is own contact already added? if (this.isOwnContactAdded()) { @@ -311,7 +317,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } @Override @@ -333,13 +339,13 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void doShutdown () throws SQLException, IOException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Shut down the database layer ((AddressbookContactFrontend) this.getFrontend()).doShutdown(); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -350,7 +356,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnCellNumber () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -366,7 +372,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnCity () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -382,7 +388,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnComment () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -398,7 +404,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnCompanyName () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -414,7 +420,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnCountryCode () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -430,7 +436,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnEmailAddress () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -446,7 +452,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnFamilyName () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -462,7 +468,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnFaxNumber () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -478,7 +484,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnFirstName () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -494,7 +500,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public Gender enterOwnGender () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -510,7 +516,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnPhoneNumber () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -526,7 +532,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public String enterOwnStreet () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -542,7 +548,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public int enterOwnZipCode () { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Get and cast client instance AddressbookClient client = (AddressbookClient) this.getClient(); @@ -576,18 +582,18 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public Object getValueFromRowColumn (final int rowIndex, final int columnIndex) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { // Trace message - this.getLogger().trace(MessageFormat.format("rowIndex={0},columnIndex={1} CALLED!", rowIndex, columnIndex)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("rowIndex={0},columnIndex={1} CALLED!", rowIndex, columnIndex)); //NOI18N // Then get specific row from database which is a Contact instance Storable storable = this.getFrontend().getStorableAtRow(rowIndex); // Debug message - this.getLogger().debug(MessageFormat.format("storable={0}", storable)); //NOI18N + this.getLogger().logDebug(MessageFormat.format("storable={0}", storable)); //NOI18N // It may return null if (null == storable) { // Nothing found - this.getLogger().warn("contact is null - returning null ..."); //NOI18N + this.getLogger().logWarning("contact is null - returning null ..."); //NOI18N return null; } @@ -595,7 +601,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable String columnName = this.getColumnName(columnIndex); // Debug message - this.getLogger().debug(MessageFormat.format("columnName={0}", columnName)); //NOI18N + this.getLogger().logDebug(MessageFormat.format("columnName={0}", columnName)); //NOI18N // Now get that column Object value = null; @@ -606,7 +612,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Trace message - this.getLogger().trace(MessageFormat.format("value={0} - EXIT!", value)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("value={0} - EXIT!", value)); //NOI18N // Return it return value; @@ -621,7 +627,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public boolean isOwnContactAdded () throws IOException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Init variable boolean isAdded = false; @@ -635,12 +641,17 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Trace message - this.getLogger().trace(MessageFormat.format("isAdded={0} : EXIT!", isAdded)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("isAdded={0} : EXIT!", isAdded)); //NOI18N // Return result return isAdded; } + @Override + public void logException (final Throwable exception) { + this.getLogger().logException(exception); + } + /** * Adds given contact to address book and flushes all entries to database *

@@ -649,7 +660,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable @Override public void registerContact (final Contact contact) { // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N // Sanity check if (null == contact) { @@ -657,12 +668,6 @@ public class AddressbookContactManager extends BaseManager implements Manageable throw new NullPointerException("contact is null"); //NOI18N } try { - - // Debug message - /* - * NOISY-DEBUG: - */ this.getLogger().debug(MessageFormat.format("Adding '{0}' '{1}' at pos '{2}' ...", contact.getFirstName(), contact.getFamilyName(), this.size())); //NOI18N - // Check if contact is found if (((AddressbookContactFrontend) this.getFrontend()).isContactFound(contact)) { // Contact already added @@ -680,7 +685,20 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N + } + + /** + * Logs given exception and exits program + * + * @param throwable Throwable + */ + private void abortProgramWithException (Throwable throwable) { + // Log exception + this.logException(throwable); + + // Abort here + System.exit(1); } /** @@ -691,7 +709,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable assert (this.translatedColumnNames instanceof List) : "this.translatedColumnNames is not initialized"; //NOI18N // Debug message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // First get an iterator from key set to iterate over Iterator iterator = this.getBundle().keySet().iterator(); @@ -704,7 +722,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable // Does the key start with AddressbookContactManager.columnName ? if (key.startsWith("ContactManager.columnName")) { //NOI18N // This is the wanted entry. - this.getLogger().debug(MessageFormat.format("key={0}", key)); //NOI18N + this.getLogger().logDebug(MessageFormat.format("key={0}", key)); //NOI18N // Convert string to array based on delimiter '.' String[] tokens = this.getArrayFromString(key, "."); //NOI18N @@ -716,7 +734,7 @@ public class AddressbookContactManager extends BaseManager implements Manageable String columnName = tokens[tokens.length - 2]; // Debug message - this.getLogger().debug(MessageFormat.format("columnName={0} - adding ...", columnName)); //NOI18N + this.getLogger().logDebug(MessageFormat.format("columnName={0} - adding ...", columnName)); //NOI18N // So add it this.columnNames.add(columnName); @@ -725,7 +743,16 @@ public class AddressbookContactManager extends BaseManager implements Manageable } // Debug message - this.getLogger().trace(MessageFormat.format("getColumnCount()={0}: EXIT!", this.getColumnCount())); //NOI18N + this.getLogger().logTrace(MessageFormat.format("getColumnCount()={0}: EXIT!", this.getColumnCount())); //NOI18N + } + + /** + * Getter for logger instance + * + * @return Logger instance + */ + private LoggerBeanLocal getLogger () { + return this.logger; } /** @@ -740,13 +767,13 @@ public class AddressbookContactManager extends BaseManager implements Manageable */ private Contact getOwnContact () throws IOException, SQLException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { // Trace message - this.getLogger().trace("CALLED!"); //NOI18N + this.getLogger().logTrace("CALLED!"); //NOI18N // Deligate this call to database frontend Contact contact = ((AddressbookContactFrontend) this.getFrontend()).getOwnContact(); // Trace message - this.getLogger().trace(MessageFormat.format("contact={0} - EXIT!", contact)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("contact={0} - EXIT!", contact)); //NOI18N // Return instance or null return contact; diff --git a/src/org/mxchange/addressbook/menu/AddressbookMenu.java b/src/org/mxchange/addressbook/menu/AddressbookMenu.java index c939abd3..8ef43f4c 100644 --- a/src/org/mxchange/addressbook/menu/AddressbookMenu.java +++ b/src/org/mxchange/addressbook/menu/AddressbookMenu.java @@ -18,7 +18,6 @@ package org.mxchange.addressbook.menu; import java.text.MessageFormat; import java.util.List; -import org.apache.logging.log4j.Logger; import org.mxchange.addressbook.client.AddressbookClient; import org.mxchange.addressbook.menu.item.SelectableMenuItem; import org.mxchange.jcore.client.Client; @@ -38,12 +37,6 @@ public class AddressbookMenu extends BaseMenu { * @param client Client instance to call back */ public static void addItemsToList (final List menuList, final String menuType, final Client client) { - // Get logger - Logger log = new AddressbookMenu().getLogger(); - - // Trace call - log.trace(MessageFormat.format("menuList={0},menuType={1},client={2} - CALLED!", menuList, menuType, client)); //NOI18N - // Some instances must be set if (null == menuList) { // Abort here @@ -62,9 +55,6 @@ public class AddressbookMenu extends BaseMenu { // Get list size int size = menuList.size(); - // Debug message - log.debug(MessageFormat.format("Adding menu for '{0}' (old size: '{1}') ...", menuType, size)); //NOI18N - // Depends on type switch (menuType) { case "main": // Main menu //NOI18N @@ -94,7 +84,7 @@ public class AddressbookMenu extends BaseMenu { break; default: // Not supported - log.error(MessageFormat.format("Menu type '{0}' ont supported", menuType)); //NOI18N + System.err.println(MessageFormat.format("Menu type '{0}' ont supported", menuType)); //NOI18N System.exit(1); } diff --git a/src/org/mxchange/addressbook/menu/BaseMenu.java b/src/org/mxchange/addressbook/menu/BaseMenu.java index a02c8851..ad8c2e59 100644 --- a/src/org/mxchange/addressbook/menu/BaseMenu.java +++ b/src/org/mxchange/addressbook/menu/BaseMenu.java @@ -20,16 +20,15 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.mxchange.addressbook.client.AddressbookClient; +import org.mxchange.addressbook.BaseAddressbookSystem; import org.mxchange.addressbook.menu.item.SelectableMenuItem; -import org.mxchange.jcore.BaseFrameworkSystem; import org.mxchange.jcore.client.Client; /** * * @author Roland Haeder */ -public class BaseMenu extends BaseFrameworkSystem { +public class BaseMenu extends BaseAddressbookSystem { /** * Menu list @@ -67,7 +66,7 @@ public class BaseMenu extends BaseFrameworkSystem { */ public void show (final Client client) { // Trace message - this.getLogger().trace(MessageFormat.format("client={0} CALLED!", client)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("client={0} CALLED!", client)); //NOI18N // Client must not be null if (null == client) { @@ -79,7 +78,7 @@ public class BaseMenu extends BaseFrameworkSystem { Iterator iterator = this.menuList.iterator(); // Debug message - this.getLogger().debug("Showing menu with '" + this.menuList.size() + "' entries."); + this.getLogger().logDebug("Showing menu with '" + this.menuList.size() + "' entries."); // Output all menus while (iterator.hasNext()) { @@ -87,11 +86,11 @@ public class BaseMenu extends BaseFrameworkSystem { SelectableMenuItem item = iterator.next(); // Show this item - item.show((AddressbookClient) client); + item.show(client); } // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } /** @@ -111,12 +110,12 @@ public class BaseMenu extends BaseFrameworkSystem { */ protected void initMenu (final String menuType, final Client client) { // Trace message - this.getLogger().trace(MessageFormat.format("menuType={0},client={1} - CALLED!", menuType, client)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("menuType={0},client={1} - CALLED!", menuType, client)); //NOI18N // Init menu list this.menuList = new ArrayList<>(5); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } } diff --git a/src/org/mxchange/addressbook/menu/MenuTools.java b/src/org/mxchange/addressbook/menu/MenuTools.java index 943962d0..54d7c968 100644 --- a/src/org/mxchange/addressbook/menu/MenuTools.java +++ b/src/org/mxchange/addressbook/menu/MenuTools.java @@ -16,17 +16,18 @@ */ package org.mxchange.addressbook.menu; +import java.text.MessageFormat; import java.util.Iterator; import java.util.Map; -import org.apache.logging.log4j.Logger; +import org.mxchange.addressbook.BaseAddressbookSystem; import org.mxchange.addressbook.menu.item.SelectableMenuItem; -import org.mxchange.jcore.BaseFrameworkSystem; /** + * Menu utilities * * @author Roland Haeder */ -public class MenuTools extends BaseFrameworkSystem { +public class MenuTools extends BaseAddressbookSystem { /** * Gets an array with all available access keys back from given menu map. @@ -37,9 +38,6 @@ public class MenuTools extends BaseFrameworkSystem { * @return An array with available access chars */ public static char[] getAccessKeysFromMenuMap (final Map menus, final String menuType) { - // Get logger - Logger logger = new MenuTools().getLogger(); - // First search for the proper menu class Menu menu = menus.get(menuType); @@ -47,7 +45,7 @@ public class MenuTools extends BaseFrameworkSystem { if (!(menu instanceof Menu)) { // Not found // TODO Rewrite to exception - logger.error("Menu '" + menuType + "' not found."); + System.err.println(MessageFormat.format("menu is not implementing Menu: {0}", menu)); //NOI18N System.exit(1); } @@ -62,11 +60,11 @@ public class MenuTools extends BaseFrameworkSystem { while (iterator.hasNext()) { // Get item SelectableMenuItem item = iterator.next(); - //* NOISY-DEBUG: */ logger.debug("item=" + item); + //* NOISY-DEBUG: */ logger.logDebug("item=" + item); // Get access key from item and add it to the array accessKeys[i] = item.getAccessKey(); - //* NOISY-DEBUG: */ logger.debug("accessKeys[" + i + "]=" + accessKeys[i]); + //* NOISY-DEBUG: */ logger.logDebug("accessKeys[" + i + "]=" + accessKeys[i]); // Increment counter i++; diff --git a/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java b/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java index e2b840cc..ad325cb7 100644 --- a/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java +++ b/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java @@ -36,7 +36,7 @@ public class ConsoleMenu extends BaseMenu implements Menu { */ public ConsoleMenu (final String menuType, final Client client) { // Trace message - this.getLogger().trace(MessageFormat.format("menuType={0},client={1} - CALLED!", menuType, client)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("menuType={0},client={1} - CALLED!", menuType, client)); //NOI18N // Client must not be null if (null == client) { diff --git a/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java b/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java index a750aaf7..665923ef 100644 --- a/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java +++ b/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java @@ -16,12 +16,13 @@ */ package org.mxchange.addressbook.menu.item; -import org.mxchange.jcore.BaseFrameworkSystem; +import org.mxchange.addressbook.BaseAddressbookSystem; /** + * A general menu item class * * @author Roland Haeder */ -public class BaseMenuItem extends BaseFrameworkSystem { +public class BaseMenuItem extends BaseAddressbookSystem { } diff --git a/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java b/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java index f3cf4cc7..28fa76bb 100644 --- a/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java +++ b/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java @@ -16,13 +16,14 @@ */ package org.mxchange.addressbook.menu.item; +import org.mxchange.jcore.FrameworkInterface; import org.mxchange.jcore.client.Client; /** * * @author Roland Haeder */ -public interface SelectableMenuItem { +public interface SelectableMenuItem extends FrameworkInterface { /** * Shows this menu item diff --git a/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java b/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java index 50f8500c..fd008a9b 100644 --- a/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java +++ b/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java @@ -90,7 +90,7 @@ public class ConsoleMenuItem extends BaseMenuItem implements SelectableMenuItem @Override public void show (final Client client) { // Trace message - this.getLogger().trace(MessageFormat.format("client={0} - CALLED!", client)); //NOI18N + this.getLogger().logTrace(MessageFormat.format("client={0} - CALLED!", client)); //NOI18N // Client must not be null if (null == client) { @@ -108,7 +108,7 @@ public class ConsoleMenuItem extends BaseMenuItem implements SelectableMenuItem c.showEntry(this); // Trace message - this.getLogger().trace("EXIT!"); //NOI18N + this.getLogger().logTrace("EXIT!"); //NOI18N } } -- 2.39.5