As part of NTNU's increased focus on security, all users are now forced to enable and use Two-factor authentication.

Commit bb50feff authored by Arne Styve's avatar Arne Styve
Browse files

Some major cleanup to the code, moving responsibility from the JavaFX...

Some major cleanup to the code, moving responsibility from the JavaFX ContactsApp-class to the controller, like who is holding the instance of the Address book.
parent 14428d41
......@@ -11,3 +11,4 @@
/doc/
/contacts.log
/addressbook.dat
workspace (Arnes MacBook Pros kopi som er i konflikt 2020-05-04).xml
......@@ -7,6 +7,9 @@
<entry key="copy-libs" value="false" />
<entry key="location-0" value="BUNDLED:(bundled):Sun Checks" />
<entry key="location-1" value="BUNDLED:(bundled):Google Checks" />
<entry key="location-2" value="PROJECT_RELATIVE:$PROJECT_DIR$/idatx2001_checks.xml:IDATx2001 Checks" />
<entry key="property-2.org.checkstyle.google.suppressionfilter.config" value="" />
<entry key="property-2.org.checkstyle.google.suppressionxpathfilter.config" value="" />
<entry key="scan-before-checkin" value="false" />
<entry key="scanscope" value="JavaOnly" />
<entry key="suppress-errors" value="false" />
......
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default copy" />
<option name="PREFERRED_PROJECT_CODE_STYLE" value="IDATx2001 Checks" />
</state>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="junit:junit:4.13" type="repository">
<properties maven-id="junit:junit:4.13" />
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/junit-4.13.jar!/" />
<root url="jar://$PROJECT_DIR$/lib/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="libs">
<library name="lib">
<CLASSES>
<root url="file://$PROJECT_DIR$/libs" />
<root url="file://$PROJECT_DIR$/lib" />
</CLASSES>
<JAVADOC />
<SOURCES />
<jarDirectory url="file://$PROJECT_DIR$/libs" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib" recursive="false" />
</library>
</component>
\ No newline at end of file
......@@ -4,7 +4,7 @@
<component name="JavadocGenerationManager">
<option name="OUTPUT_DIRECTORY" value="$PROJECT_DIR$/doc" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8.0_201" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
......@@ -23,9 +23,11 @@
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="libs" level="project" />
<orderEntry type="library" name="junit:junit:4.13" level="project" />
<orderEntry type="library" name="lib" level="project" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration based on the Google coding convetions, but with some changes
for the IDATA2001 Programming 2 course at NTNU
Checkstyle configuration that checks the Google coding conventions from Google Java Style
that can be found at https://google.github.io/styleguide/javaguide.html
Checkstyle is very configurable. Be sure to read the documentation at
http://checkstyle.org (or in your downloaded distribution).
To completely disable a check, just comment it out or delete it from the file.
To suppress certain violations please review suppression filters.
Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
-->
<module name = "Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java, properties, xml"/>
<!-- Excludes all 'module-info.java' files -->
<!-- See https://checkstyle.org/config_filefilters.html -->
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="module\-info\.java$"/>
</module>
<!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
<module name="SuppressionFilter">
<property name="file" value="${org.checkstyle.google.suppressionfilter.config}"
default="checkstyle-suppressions.xml" />
<property name="optional" value="true"/>
</module>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.org/config_whitespace.html -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<module name="LineLength">
<property name="fileExtensions" value="java"/>
<property name="max" value="100"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="TreeWalker">
<module name="OuterTypeFilename"/>
<module name="IllegalTokenText">
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
<property name="format"
value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
<property name="message"
value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
</module>
<module name="AvoidEscapedUnicodeCharacters">
<property name="allowEscapesForControlCharacters" value="true"/>
<property name="allowByTailComment" value="true"/>
<property name="allowNonPrintableEscapes" value="true"/>
</module>
<module name="AvoidStarImport"/>
<module name="OneTopLevelClass"/>
<module name="NoLineWrap">
<property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
</module>
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
<property name="tokens"
value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
</module>
<module name="NeedBraces">
<property name="tokens"
value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
</module>
<module name="LeftCurly">
<property name="tokens"
value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
OBJBLOCK, STATIC_INIT"/>
</module>
<module name="RightCurly">
<property name="id" value="RightCurlySame"/>
<property name="tokens"
value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
LITERAL_DO"/>
</module>
<module name="RightCurly">
<property name="id" value="RightCurlyAlone"/>
<property name="option" value="alone"/>
<property name="tokens"
value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
INSTANCE_INIT, ANNOTATION_DEF, ENUM_DEF"/>
</module>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyLambdas" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<property name="tokens"
value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR,
BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND,
LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, LITERAL_SYNCHRONIZED,
LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN,
NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
<message key="ws.notFollowed"
value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
<message key="ws.notPreceded"
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
</module>
<module name="OneStatementPerLine"/>
<module name="MultipleVariableDeclarations"/>
<module name="ArrayTypeStyle"/>
<module name="MissingSwitchDefault"/>
<module name="FallThrough"/>
<module name="UpperEll"/>
<module name="ModifierOrder"/>
<module name="EmptyLineSeparator">
<property name="tokens"
value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="SeparatorWrap">
<property name="id" value="SeparatorWrapDot"/>
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="SeparatorWrap">
<property name="id" value="SeparatorWrapComma"/>
<property name="tokens" value="COMMA"/>
<property name="option" value="EOL"/>
</module>
<module name="SeparatorWrap">
<!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
<property name="id" value="SeparatorWrapEllipsis"/>
<property name="tokens" value="ELLIPSIS"/>
<property name="option" value="EOL"/>
</module>
<module name="SeparatorWrap">
<!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
<property name="id" value="SeparatorWrapArrayDeclarator"/>
<property name="tokens" value="ARRAY_DECLARATOR"/>
<property name="option" value="EOL"/>
</module>
<module name="SeparatorWrap">
<property name="id" value="SeparatorWrapMethodRef"/>
<property name="tokens" value="METHOD_REF"/>
<property name="option" value="nl"/>
</module>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern"
value="Package name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="TypeName">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF"/>
<message key="name.invalidPattern"
value="Type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="LambdaParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="CatchParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="LocalVariableName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ClassTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MethodTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Method type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="InterfaceTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Interface type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="NoFinalizer"/>
<module name="GenericWhitespace">
<message key="ws.followed"
value="GenericWhitespace ''{0}'' is followed by whitespace."/>
<message key="ws.preceded"
value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
<message key="ws.illegalFollow"
value="GenericWhitespace ''{0}'' should followed by whitespace."/>
<message key="ws.notPreceded"
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
</module>
<module name="Indentation">
<property name="basicOffset" value="2"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="2"/>
<property name="throwsIndent" value="4"/>
<property name="lineWrappingIndentation" value="4"/>
<property name="arrayInitIndent" value="2"/>
</module>
<module name="AbbreviationAsWordInName">
<property name="ignoreFinal" value="false"/>
<property name="allowedAbbreviationLength" value="1"/>
<property name="tokens"
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, ANNOTATION_FIELD_DEF,
PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF"/>
</module>
<module name="OverloadMethodsDeclarationOrder"/>
<module name="VariableDeclarationUsageDistance"/>
<module name="CustomImportOrder">
<property name="sortImportsInGroupAlphabetically" value="true"/>
<property name="separateLineBetweenGroups" value="true"/>
<property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
<property name="tokens" value="IMPORT, STATIC_IMPORT, PACKAGE_DEF"/>
</module>
<module name="MethodParamPad">
<property name="tokens"
value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF,
SUPER_CTOR_CALL, ENUM_CONSTANT_DEF"/>
</module>
<module name="NoWhitespaceBefore">
<property name="tokens"
value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
<property name="allowLineBreaks" value="true"/>
</module>
<module name="ParenPad">
<property name="tokens"
value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF,
EXPR, LITERAL_CATCH, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW,
LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE, METHOD_CALL,
METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA"/>
</module>
<module name="OperatorWrap">
<property name="option" value="NL"/>
<property name="tokens"
value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/>
</module>
<module name="AnnotationLocation">
<property name="id" value="AnnotationLocationMostCases"/>
<property name="tokens"
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
</module>
<module name="AnnotationLocation">
<property name="id" value="AnnotationLocationVariables"/>
<property name="tokens" value="VARIABLE_DEF"/>
<property name="allowSamelineMultipleAnnotations" value="true"/>
</module>
<module name="NonEmptyAtclauseDescription"/>
<module name="InvalidJavadocPosition"/>
<module name="JavadocTagContinuationIndentation"/>
<module name="SummaryJavadoc">
<property name="forbiddenSummaryFragments"
value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
</module>
<module name="JavadocParagraph"/>
<module name="AtclauseOrder">
<property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
<property name="target"
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
</module>
<module name="JavadocMethod">
<property name="scope" value="public"/>
<property name="allowMissingParamTags" value="false"/>
<property name="allowMissingReturnTag" value="false"/>
<property name="allowedAnnotations" value="Override, Test"/>
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
</module>
<module name="MissingJavadocMethod">
<property name="scope" value="public"/>
<!--property name="minLineCount" value="2"/-->
<property name="allowedAnnotations" value="Override, Test"/>
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
</module>
<module name="MethodName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
<message key="name.invalidPattern"
value="Method name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="SingleLineJavadoc">
<property name="ignoreInlineTags" value="false"/>
</module>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected"/>
</module>
<module name="CommentsIndentation">
<property name="tokens" value="SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN"/>
</module>
<!-- https://checkstyle.org/config_filters.html#SuppressionXpathFilter -->
<module name="SuppressionXpathFilter">
<property name="file" value="${org.checkstyle.google.suppressionxpathfilter.config}"
default="checkstyle-xpath-suppressions.xml" />
<property name="optional" value="true"/>
</module>
</module>
</module>
......@@ -10,21 +10,21 @@ import no.ntnu.idata2001.contacts.model.ContactDetails;
/**
* The controller class mapped to the FXML main class.
*
* A few words on the @FXML-annotation:
* <p>A few words on the @FXML-annotation:
* The @FXML annotation is used to enable initialization of fields performed
* by the FXML-loader. For example, in the code below, there is a field
* for the TableView. The instance to be created, will be created by the FXML loader,
* hence you should NEVER create this instance here in the controller.
*
* Now, if the field (like contactDetailsTableView) is public, you do not need to
* <p>Now, if the field (like contactDetailsTableView) is public, you do not need to
* use the annotation @FXML on the field for it to be initialized. BUT if you set it
* to private (which you should, according to good practice), you MUST add the @FXML
* annotation for the field to be initialized by the FXML loader.
* See: https://stackoverflow.com/questions/30210170/is-fxml-needed-for-every-declaration
*/
public class ContactsMain {
public class ContactsAppFXMLController {
@FXML
private TableView contactDetailsTableView;
private TableView<ContactDetails> contactDetailsTableView;
/**
* This method will be called by the FXML-loader after having loaded
......
......@@ -6,6 +6,7 @@ import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.control.Alert;
......@@ -38,6 +39,8 @@ import no.ntnu.idata2001.contacts.views.ContactsApp;
*/
public class MainController {
private final Logger logger;
private AddressBook addressBook;
private ContactsApp parentView; // The parent View (GUI) class using this controller
// File used for object serialization. Used by the methods
// saveAddressBookToFile() and loadAddressBookFromFile()
......@@ -46,22 +49,40 @@ public class MainController {
/**
* Creates an instance of the MainController class, initialising
* the logger.
*
* @param parentView the view object using this instance as the controller
* in the MVC-pattern.
*/
public MainController() {
public MainController(ContactsApp parentView) {
this.logger = Logger.getLogger(getClass().toString());
this.parentView = parentView;
}
/**
* Initializes the controller. Called by the GUI-component after the GUI
* has been created.
*/
public void initialize() {
// Use the AddressBookDBHandler as AddressBook implementation
this.addressBook = new AddressBookDBHandler();
}
/**
* Returns the address book.
* @return the address book.
*/
public AddressBook getAddressBook() {
return this.addressBook;
}
/**
* Display the input dialog to get input to create a new Contact.
* If the user confirms creating a new contact, a new instance
* of ContactDetails is created and added to the AddressBook provided.
*
* @param addressBook the address book to add the new contact to.
* @param parent the parent calling this method. Use this parameter to access public methods
* in the parent, like updateObservableList().
* @param actionEvent the actionevent triggering this call
*/
public void addContact(AddressBook addressBook, ContactsApp parent) {
public void addContact(ActionEvent actionEvent) {
ContactDetailsDialog contactsDialog = new ContactDetailsDialog();
......@@ -69,8 +90,8 @@ public class MainController {
if (result.isPresent()) {
ContactDetails newContactDetails = result.get();
addressBook.addContact(newContactDetails);
parent.updateObservableList();
this.addressBook.addContact(newContactDetails);
this.parentView.updateObservableList(this.addressBook);
}
}
......@@ -88,7 +109,7 @@ public class MainController {
ContactDetailsDialog contactDialog = new ContactDetailsDialog(selectedContact, true);
contactDialog.showAndWait();
parent.updateObservableList();
parent.updateObservableList(this.addressBook);
}
}
......@@ -99,31 +120,22 @@ public class MainController {
*
* @param selectedContact the Contact to delete. If no Contact has been selected,
* this parameter will be <code>null</code>
* @param addressBook the contact register to delete the selectedContact from
* @param parent the parent view making the call.
*/
public void deleteContact(ContactDetails selectedContact,
AddressBook addressBook,
ContactsApp parent) {
public void deleteContact(ContactDetails selectedContact) {
if (selectedContact == null) {
showPleaseSelectItemDialog();
} else {
if (showDeleteConfirmationDialog()) {
addressBook.removeContact(selectedContact.getPhone());
parent.updateObservableList();
this.addressBook.removeContact(selectedContact.getPhone());
this.parentView.updateObservableList(this.addressBook);
}
}
}
/**
* Import contacts from a .CSV-file chosen by the user.
*
* @param addressBook the address book to import the read contacts into
* @param parent the parent making the call to this method. Used for refreshing the
* Observable list used by the TableView.
*/
public void importFromCsv(AddressBook addressBook, ContactsApp parent) {
public void importFromCsv() {
FileChooser fileChooser = new FileChooser();
// Set extension filter for .csv-file
......@@ -135,8 +147,8 @@ public class MainController {
File file = fileChooser.showOpenDialog(null);
if (file != null) {
try {
AddressBookFileHandler.importFromCsv(addressBook, file);
parent.updateObservableList();
AddressBookFileHandler.importFromCsv(this.addressBook, file);
this.parentView.updateObservableList(this.addressBook);
} catch (IOException ioe) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("File Import Error");
......@@ -149,10 +161,8 @@ public class MainController {
/**
* Export all contacts in the address book to a CSV-file specified by the user.
*
* @param addressBook the address book to export contacts from.
*/
public void exportToCsv(AddressBook addressBook) {
public void exportToCsv() {
FileChooser fileChooser = new FileChooser();
// Set extension filter for .csv-file
......@@ -164,7 +174,7 @@ public class MainController {
File file = fileChooser.showSaveDialog(null);
if (file != null) {
try {
AddressBookFileHandler.exportToCsv(addressBook, file);
AddressBookFileHandler.exportToCsv(this.addressBook, file);
} catch (IOException ioe) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("File Export Error");
......@@ -206,15 +216,6 @@ public class MainController {
return AddressBookFileHandler.loadFromFile(inFile);
}
/**
* Loads an entire AddressBook from a database.
*
* @return an address book populated by contact details loaded from the database.
*/
public AddressBook loadAddressBookFromDB() {
return new AddressBookDBHandler();
}
/**
* Exit the application. Displays a confirmation dialog.
*/
......@@ -306,7 +307,7 @@ public class MainController {
Optional<Pair<String, String>> result = dialog.showAndWait();
result.ifPresent(
usernamePassword -> logger.log(Level.INFO, "Username=" + usernamePassword.getKey()
usernamePassword -> logger.log(Level.INFO, () -> "Username=" + usernamePassword.getKey()
+ ", Password=" + usernamePassword.getValue()));
}