From b4f6fbb189d5a2ad892f5d8164702fad67fcd68b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bart=C5=82omiej=20Graczyk?= <224301@edu.p.lodz.pl>
Date: Thu, 15 Apr 2021 21:06:51 +0200
Subject: [PATCH] Final version added.
---
.idea/.gitignore | 8 +
.idea/.name | 1 +
.idea/compiler.xml | 19 +
.idea/encodings.xml | 8 +
.idea/jarRepositories.xml | 20 +
.idea/libraries/Maven__antlr_antlr_2_7_2.xml | 13 +
..._ch_ethz_ganymed_ganymed_ssh2_build210.xml | 13 +
...n__classworlds_classworlds_1_1_alpha_2.xml | 13 +
.../Maven__com_fasterxml_classmate_1_5_1.xml | 13 +
.../Maven__com_ibm_icu_icu4j_61_1.xml | 13 +
...un_istack_istack_commons_runtime_3_0_7.xml | 13 +
...sun_xml_fastinfoset_FastInfoset_1_2_15.xml | 13 +
...mons_beanutils_commons_beanutils_1_9_2.xml | 13 +
...Maven__commons_chain_commons_chain_1_1.xml | 13 +
...Maven__commons_codec_commons_codec_1_6.xml | 13 +
...ns_collections_commons_collections_3_1.xml | 13 +
...ommons_digester_commons_digester_1_8_1.xml | 13 +
.../Maven__commons_io_commons_io_2_2.xml | 13 +
.../Maven__commons_lang_commons_lang_2_6.xml | 13 +
...n__commons_logging_commons_logging_1_2.xml | 13 +
...ommons_validator_commons_validator_1_6.xml | 13 +
.idea/libraries/Maven__dom4j_dom4j_1_1.xml | 13 +
..._activation_javax_activation_api_1_2_0.xml | 13 +
..._persistence_javax_persistence_api_2_2.xml | 13 +
.../Maven__javax_xml_bind_jaxb_api_2_3_1.xml | 13 +
.idea/libraries/Maven__junit_junit_3_8_1.xml | 13 +
...Maven__net_bytebuddy_byte_buddy_1_10_7.xml | 13 +
...layout_org_abego_treelayout_core_1_0_3.xml | 13 +
.idea/libraries/Maven__org_antlr_ST4_4_3.xml | 13 +
.../Maven__org_antlr_antlr4_4_8_1.xml | 13 +
.../Maven__org_antlr_antlr4_runtime_4_8_1.xml | 13 +
.../Maven__org_antlr_antlr_runtime_3_5_2.xml | 13 +
.../Maven__org_apache_bcel_bcel_6_2.xml | 13 +
...__org_apache_commons_commons_lang3_3_5.xml | 13 +
...apache_httpcomponents_httpclient_4_0_2.xml | 13 +
...g_apache_httpcomponents_httpcore_4_0_1.xml | 13 +
..._apache_logging_log4j_log4j_api_2_13_3.xml | 13 +
...apache_logging_log4j_log4j_core_2_13_3.xml | 13 +
..._org_apache_maven_doxia_doxia_core_1_8.xml | 13 +
...ven_doxia_doxia_decoration_model_1_8_1.xml | 13 +
...en_doxia_doxia_integration_tools_1_8_1.xml | 13 +
...ache_maven_doxia_doxia_logging_api_1_8.xml | 13 +
...che_maven_doxia_doxia_module_xhtml_1_8.xml | 13 +
..._apache_maven_doxia_doxia_sink_api_1_8.xml | 13 +
..._maven_doxia_doxia_site_renderer_1_8_1.xml | 13 +
...che_maven_doxia_doxia_skin_model_1_8_1.xml | 13 +
...apache_maven_maven_aether_provider_3_0.xml | 13 +
...n__org_apache_maven_maven_artifact_3_0.xml | 13 +
...Maven__org_apache_maven_maven_core_3_0.xml | 13 +
...aven__org_apache_maven_maven_model_3_0.xml | 13 +
...g_apache_maven_maven_model_builder_3_0.xml | 13 +
..._org_apache_maven_maven_plugin_api_3_0.xml | 13 +
...he_maven_maven_repository_metadata_3_0.xml | 13 +
...n__org_apache_maven_maven_settings_3_0.xml | 13 +
...pache_maven_maven_settings_builder_3_0.xml | 13 +
...aven_project_info_reports_plugin_3_0_0.xml | 13 +
...aven_reporting_maven_reporting_api_3_0.xml | 13 +
...n_reporting_maven_reporting_impl_3_0_0.xml | 13 +
..._apache_maven_scm_maven_scm_api_1_10_0.xml | 13 +
...en_scm_maven_scm_manager_plexus_1_10_0.xml | 13 +
..._maven_scm_provider_cvs_commons_1_10_0.xml | 13 +
...n_scm_maven_scm_provider_cvsexe_1_10_0.xml | 13 +
..._scm_maven_scm_provider_cvsjava_1_10_0.xml | 13 +
..._maven_scm_provider_git_commons_1_10_0.xml | 13 +
...n_scm_maven_scm_provider_gitexe_1_10_0.xml | 13 +
...maven_scm_maven_scm_provider_hg_1_10_0.xml | 13 +
...scm_maven_scm_provider_perforce_1_10_0.xml | 13 +
...scm_maven_scm_provider_starteam_1_10_0.xml | 13 +
..._maven_scm_provider_svn_commons_1_10_0.xml | 13 +
...n_scm_maven_scm_provider_svnexe_1_10_0.xml | 13 +
...n_shared_maven_artifact_transfer_0_9_1.xml | 13 +
...ed_maven_common_artifact_filters_3_0_1.xml | 13 +
...maven_shared_maven_dependency_tree_2_2.xml | 13 +
...ache_maven_shared_maven_shared_jar_1_2.xml | 13 +
..._maven_shared_maven_shared_utils_3_2_0.xml | 13 +
...ven_wagon_wagon_http_lightweight_3_1_0.xml | 13 +
...he_maven_wagon_wagon_http_shared_3_1_0.xml | 13 +
...e_maven_wagon_wagon_provider_api_3_1_0.xml | 13 +
...n__org_apache_struts_struts_core_1_3_8.xml | 13 +
..._org_apache_struts_struts_taglib_1_3_8.xml | 13 +
...__org_apache_struts_struts_tiles_1_3_8.xml | 13 +
...aven__org_apache_velocity_velocity_1_7.xml | 13 +
...org_apache_velocity_velocity_tools_2_0.xml | 13 +
..._org_apiguardian_apiguardian_api_1_1_0.xml | 13 +
...dehaus_plexus_plexus_classworlds_2_2_3.xml | 13 +
...xus_plexus_component_annotations_1_5_5.xml | 13 +
...s_plexus_container_default_1_0_alpha_8.xml | 13 +
..._org_codehaus_plexus_plexus_digest_1_0.xml | 13 +
...odehaus_plexus_plexus_i18n_1_0_beta_10.xml | 13 +
...ehaus_plexus_plexus_interpolation_1_25.xml | 13 +
...org_codehaus_plexus_plexus_utils_3_1_0.xml | 13 +
...rg_codehaus_plexus_plexus_velocity_1_2.xml | 13 +
.../Maven__org_dom4j_dom4j_2_1_3.xml | 13 +
...rg_eclipse_aether_aether_util_0_9_0_M2.xml | 13 +
.../Maven__org_glassfish_javax_json_1_0_4.xml | 13 +
..._org_glassfish_jaxb_jaxb_runtime_2_3_1.xml | 13 +
.../Maven__org_glassfish_jaxb_txw2_2_3_1.xml | 13 +
...ernate_commons_annotations_5_1_0_Final.xml | 13 +
...ernate_orm_hibernate_core_6_0_0_Alpha5.xml | 13 +
...ven__org_javassist_javassist_3_24_0_GA.xml | 13 +
.../Maven__org_jboss_jandex_2_1_1_Final.xml | 13 +
...boss_logging_jboss_logging_3_3_2_Final.xml | 13 +
...s_transaction_api_1_2_spec_1_1_1_Final.xml | 13 +
.../Maven__org_jsoup_jsoup_1_11_2.xml | 13 +
..._junit_jupiter_junit_jupiter_api_5_6_0.xml | 13 +
...nit_jupiter_junit_jupiter_api_5_7_0_M1.xml | 13 +
...nit_jupiter_junit_jupiter_engine_5_6_0.xml | 13 +
..._platform_junit_platform_commons_1_6_0.xml | 13 +
...atform_junit_platform_commons_1_7_0_M1.xml | 13 +
...t_platform_junit_platform_engine_1_6_0.xml | 13 +
.../Maven__org_jvnet_staxex_stax_ex_1_8.xml | 13 +
...n__org_netbeans_lib_cvsclient_20060125.xml | 13 +
...Maven__org_openjfx_javafx_base_15_ea_3.xml | 13 +
...n__org_openjfx_javafx_base_win_15_ea_3.xml | 13 +
...n__org_openjfx_javafx_controls_15_ea_3.xml | 13 +
...rg_openjfx_javafx_controls_win_15_ea_3.xml | 13 +
...Maven__org_openjfx_javafx_fxml_15_ea_3.xml | 13 +
...n__org_openjfx_javafx_fxml_win_15_ea_3.xml | 13 +
...n__org_openjfx_javafx_graphics_15_ea_3.xml | 13 +
...rg_openjfx_javafx_graphics_win_15_ea_3.xml | 13 +
...Maven__org_opentest4j_opentest4j_1_2_0.xml | 13 +
...org_postgresql_postgresql_42_2_12_jre7.xml | 13 +
.../Maven__org_slf4j_slf4j_api_1_7_5.xml | 13 +
...en__org_sonatype_aether_aether_api_1_7.xml | 13 +
...n__org_sonatype_aether_aether_impl_1_7.xml | 13 +
...en__org_sonatype_aether_aether_spi_1_7.xml | 13 +
...n__org_sonatype_aether_aether_util_1_7.xml | 13 +
..._org_sonatype_plexus_plexus_cipher_1_4.xml | 13 +
...atype_plexus_plexus_sec_dispatcher_1_3.xml | 13 +
...g_sonatype_sisu_sisu_guice_noaop_2_1_7.xml | 13 +
...g_sonatype_sisu_sisu_inject_bean_1_4_2.xml | 13 +
...sonatype_sisu_sisu_inject_plexus_1_4_2.xml | 13 +
.idea/libraries/Maven__oro_oro_2_0_8.xml | 13 +
.../libraries/Maven__sslext_sslext_1_2_0.xml | 13 +
.idea/misc.xml | 11 +
.idea/modules.xml | 10 +
.idea/vcs.xml | 6 +
Model/ModelProject.iml | 143 ++++
Model/checkstyle2020.xml | 254 +++++++
Model/pom.xml | 190 +++++
Model/src/main/java/module-info.java | 22 +
Model/src/main/java/sudoku/consts/Consts.java | 20 +
Model/src/main/java/sudoku/dao/Dao.java | 10 +
.../java/sudoku/dao/FileSudokuBoardDao.java | 56 ++
.../java/sudoku/dao/JpaSudokuBoardDao.java | 95 +++
.../sudoku/dao/SudokuBoardDaoFactory.java | 17 +
.../src/main/java/sudoku/database/Board.java | 80 ++
.../java/sudoku/database/DatabaseManager.java | 77 ++
.../ContainerOutOfBoundsException.java | 11 +
.../exceptions/FieldOutOfBoundsException.java | 11 +
.../InvalidContainerLengthException.java | 11 +
.../InvalidFieldValueException.java | 11 +
.../exceptions/NullContainerException.java | 11 +
.../sudoku/exceptions/ReadBoardException.java | 11 +
.../exceptions/SudokuBoardDaoException.java | 11 +
.../exceptions/SudokuBoardException.java | 11 +
.../exceptions/SudokuContainerException.java | 11 +
.../exceptions/WriteBoardException.java | 11 +
.../main/java/sudoku/gamestate/BoardType.java | 6 +
.../sudoku/gamestate/CoordinatesWrapper.java | 27 +
.../java/sudoku/gamestate/Difficulty.java | 17 +
.../main/java/sudoku/gamestate/GameState.java | 129 ++++
.../main/java/sudoku/model/SudokuBoard.java | 240 ++++++
.../src/main/java/sudoku/model/SudokuBox.java | 16 +
.../main/java/sudoku/model/SudokuColumn.java | 15 +
.../java/sudoku/model/SudokuContainer.java | 86 +++
.../main/java/sudoku/model/SudokuField.java | 68 ++
.../src/main/java/sudoku/model/SudokuRow.java | 16 +
.../solver/BacktrackingSudokuSolver.java | 84 +++
.../main/java/sudoku/solver/SudokuSolver.java | 10 +
.../sudoku/dao/FileSudokuBoardDaoTest.java | 56 ++
.../java/sudoku/gamestate/GameStateTest.java | 25 +
.../java/sudoku/model/SudokuBoardTest.java | 165 +++++
.../sudoku/model/SudokuContainerTest.java | 113 +++
.../java/sudoku/model/SudokuFieldTest.java | 84 +++
.../solver/BacktrackingSudokuSolverTest.java | 74 ++
SudokuGameProject.iml | 12 +
View/SudokuView.iml | 153 ++++
View/pom.xml | 73 ++
View/src/main/java/module-info.java | 13 +
View/src/main/java/view/Authors_en.java | 16 +
View/src/main/java/view/Authors_pl.java | 16 +
View/src/main/java/view/GameController.java | 274 +++++++
View/src/main/java/view/Launcher.java | 7 +
View/src/main/java/view/LoadController.java | 168 +++++
View/src/main/java/view/Main.java | 46 ++
View/src/main/java/view/MenuController.java | 93 +++
View/src/main/java/view/SaveController.java | 125 ++++
.../exceptions/IOLanguageFileException.java | 11 +
.../IllegalDifficultyException.java | 11 +
.../main/resources/META-INF/persistence.xml | 18 +
View/src/main/resources/Scenes/game.fxml | 682 ++++++++++++++++++
View/src/main/resources/Scenes/load_menu.fxml | 128 ++++
View/src/main/resources/Scenes/main_menu.fxml | 155 ++++
View/src/main/resources/Scenes/save_menu.fxml | 117 +++
View/src/main/resources/Styles/game_style.css | 43 ++
.../main/resources/Styles/load_save_style.css | 15 +
.../main/resources/Styles/main_menu_style.css | 60 ++
View/src/main/resources/log4j2.xml | 19 +
.../src/main/resources/textGame_en.properties | 13 +
.../src/main/resources/textGame_pl.properties | 13 +
.../src/main/resources/textLoad_en.properties | 19 +
.../src/main/resources/textLoad_pl.properties | 19 +
.../src/main/resources/textMenu_en.properties | 6 +
.../src/main/resources/textMenu_pl.properties | 6 +
.../src/main/resources/textSave_en.properties | 15 +
.../src/main/resources/textSave_pl.properties | 15 +
pom.xml | 20 +
208 files changed, 6446 insertions(+)
create mode 100644 .idea/.gitignore
create mode 100644 .idea/.name
create mode 100644 .idea/compiler.xml
create mode 100644 .idea/encodings.xml
create mode 100644 .idea/jarRepositories.xml
create mode 100644 .idea/libraries/Maven__antlr_antlr_2_7_2.xml
create mode 100644 .idea/libraries/Maven__ch_ethz_ganymed_ganymed_ssh2_build210.xml
create mode 100644 .idea/libraries/Maven__classworlds_classworlds_1_1_alpha_2.xml
create mode 100644 .idea/libraries/Maven__com_fasterxml_classmate_1_5_1.xml
create mode 100644 .idea/libraries/Maven__com_ibm_icu_icu4j_61_1.xml
create mode 100644 .idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml
create mode 100644 .idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml
create mode 100644 .idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_2.xml
create mode 100644 .idea/libraries/Maven__commons_chain_commons_chain_1_1.xml
create mode 100644 .idea/libraries/Maven__commons_codec_commons_codec_1_6.xml
create mode 100644 .idea/libraries/Maven__commons_collections_commons_collections_3_1.xml
create mode 100644 .idea/libraries/Maven__commons_digester_commons_digester_1_8_1.xml
create mode 100644 .idea/libraries/Maven__commons_io_commons_io_2_2.xml
create mode 100644 .idea/libraries/Maven__commons_lang_commons_lang_2_6.xml
create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_2.xml
create mode 100644 .idea/libraries/Maven__commons_validator_commons_validator_1_6.xml
create mode 100644 .idea/libraries/Maven__dom4j_dom4j_1_1.xml
create mode 100644 .idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml
create mode 100644 .idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml
create mode 100644 .idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml
create mode 100644 .idea/libraries/Maven__junit_junit_3_8_1.xml
create mode 100644 .idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml
create mode 100644 .idea/libraries/Maven__org_abego_treelayout_org_abego_treelayout_core_1_0_3.xml
create mode 100644 .idea/libraries/Maven__org_antlr_ST4_4_3.xml
create mode 100644 .idea/libraries/Maven__org_antlr_antlr4_4_8_1.xml
create mode 100644 .idea/libraries/Maven__org_antlr_antlr4_runtime_4_8_1.xml
create mode 100644 .idea/libraries/Maven__org_antlr_antlr_runtime_3_5_2.xml
create mode 100644 .idea/libraries/Maven__org_apache_bcel_bcel_6_2.xml
create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_lang3_3_5.xml
create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_2.xml
create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml
create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_13_3.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_core_1_8.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_decoration_model_1_8_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_integration_tools_1_8_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_logging_api_1_8.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_module_xhtml_1_8.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_sink_api_1_8.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_site_renderer_1_8_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_doxia_doxia_skin_model_1_8_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_aether_provider_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_artifact_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_core_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_model_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_model_builder_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_plugin_api_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_repository_metadata_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_settings_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_maven_settings_builder_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_plugins_maven_project_info_reports_plugin_3_0_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_api_3_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_impl_3_0_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_api_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_manager_plexus_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvs_commons_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsexe_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsjava_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_git_commons_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_gitexe_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_hg_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_perforce_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_starteam_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svn_commons_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svnexe_1_10_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_shared_maven_artifact_transfer_0_9_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_shared_maven_common_artifact_filters_3_0_1.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_shared_maven_dependency_tree_2_2.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_shared_maven_shared_jar_1_2.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_shared_maven_shared_utils_3_2_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_wagon_wagon_http_lightweight_3_1_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_wagon_wagon_http_shared_3_1_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_maven_wagon_wagon_provider_api_3_1_0.xml
create mode 100644 .idea/libraries/Maven__org_apache_struts_struts_core_1_3_8.xml
create mode 100644 .idea/libraries/Maven__org_apache_struts_struts_taglib_1_3_8.xml
create mode 100644 .idea/libraries/Maven__org_apache_struts_struts_tiles_1_3_8.xml
create mode 100644 .idea/libraries/Maven__org_apache_velocity_velocity_1_7.xml
create mode 100644 .idea/libraries/Maven__org_apache_velocity_velocity_tools_2_0.xml
create mode 100644 .idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_classworlds_2_2_3.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_component_annotations_1_5_5.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_container_default_1_0_alpha_8.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_digest_1_0.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_i18n_1_0_beta_10.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_interpolation_1_25.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_utils_3_1_0.xml
create mode 100644 .idea/libraries/Maven__org_codehaus_plexus_plexus_velocity_1_2.xml
create mode 100644 .idea/libraries/Maven__org_dom4j_dom4j_2_1_3.xml
create mode 100644 .idea/libraries/Maven__org_eclipse_aether_aether_util_0_9_0_M2.xml
create mode 100644 .idea/libraries/Maven__org_glassfish_javax_json_1_0_4.xml
create mode 100644 .idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml
create mode 100644 .idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml
create mode 100644 .idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml
create mode 100644 .idea/libraries/Maven__org_hibernate_orm_hibernate_core_6_0_0_Alpha5.xml
create mode 100644 .idea/libraries/Maven__org_javassist_javassist_3_24_0_GA.xml
create mode 100644 .idea/libraries/Maven__org_jboss_jandex_2_1_1_Final.xml
create mode 100644 .idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
create mode 100644 .idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml
create mode 100644 .idea/libraries/Maven__org_jsoup_jsoup_1_11_2.xml
create mode 100644 .idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_0.xml
create mode 100644 .idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_7_0_M1.xml
create mode 100644 .idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_6_0.xml
create mode 100644 .idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_0.xml
create mode 100644 .idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_7_0_M1.xml
create mode 100644 .idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_6_0.xml
create mode 100644 .idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml
create mode 100644 .idea/libraries/Maven__org_netbeans_lib_cvsclient_20060125.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_base_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_base_win_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_controls_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_controls_win_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_fxml_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_fxml_win_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_graphics_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_openjfx_javafx_graphics_win_15_ea_3.xml
create mode 100644 .idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml
create mode 100644 .idea/libraries/Maven__org_postgresql_postgresql_42_2_12_jre7.xml
create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_5.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_aether_aether_api_1_7.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_aether_aether_impl_1_7.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_aether_aether_spi_1_7.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_aether_aether_util_1_7.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_plexus_plexus_cipher_1_4.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_plexus_plexus_sec_dispatcher_1_3.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_sisu_sisu_guice_noaop_2_1_7.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_sisu_sisu_inject_bean_1_4_2.xml
create mode 100644 .idea/libraries/Maven__org_sonatype_sisu_sisu_inject_plexus_1_4_2.xml
create mode 100644 .idea/libraries/Maven__oro_oro_2_0_8.xml
create mode 100644 .idea/libraries/Maven__sslext_sslext_1_2_0.xml
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 .idea/vcs.xml
create mode 100644 Model/ModelProject.iml
create mode 100644 Model/checkstyle2020.xml
create mode 100644 Model/pom.xml
create mode 100644 Model/src/main/java/module-info.java
create mode 100644 Model/src/main/java/sudoku/consts/Consts.java
create mode 100644 Model/src/main/java/sudoku/dao/Dao.java
create mode 100644 Model/src/main/java/sudoku/dao/FileSudokuBoardDao.java
create mode 100644 Model/src/main/java/sudoku/dao/JpaSudokuBoardDao.java
create mode 100644 Model/src/main/java/sudoku/dao/SudokuBoardDaoFactory.java
create mode 100644 Model/src/main/java/sudoku/database/Board.java
create mode 100644 Model/src/main/java/sudoku/database/DatabaseManager.java
create mode 100644 Model/src/main/java/sudoku/exceptions/ContainerOutOfBoundsException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/FieldOutOfBoundsException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/InvalidContainerLengthException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/InvalidFieldValueException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/NullContainerException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/ReadBoardException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/SudokuBoardDaoException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/SudokuBoardException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/SudokuContainerException.java
create mode 100644 Model/src/main/java/sudoku/exceptions/WriteBoardException.java
create mode 100644 Model/src/main/java/sudoku/gamestate/BoardType.java
create mode 100644 Model/src/main/java/sudoku/gamestate/CoordinatesWrapper.java
create mode 100644 Model/src/main/java/sudoku/gamestate/Difficulty.java
create mode 100644 Model/src/main/java/sudoku/gamestate/GameState.java
create mode 100644 Model/src/main/java/sudoku/model/SudokuBoard.java
create mode 100644 Model/src/main/java/sudoku/model/SudokuBox.java
create mode 100644 Model/src/main/java/sudoku/model/SudokuColumn.java
create mode 100644 Model/src/main/java/sudoku/model/SudokuContainer.java
create mode 100644 Model/src/main/java/sudoku/model/SudokuField.java
create mode 100644 Model/src/main/java/sudoku/model/SudokuRow.java
create mode 100644 Model/src/main/java/sudoku/solver/BacktrackingSudokuSolver.java
create mode 100644 Model/src/main/java/sudoku/solver/SudokuSolver.java
create mode 100644 Model/src/test/java/sudoku/dao/FileSudokuBoardDaoTest.java
create mode 100644 Model/src/test/java/sudoku/gamestate/GameStateTest.java
create mode 100644 Model/src/test/java/sudoku/model/SudokuBoardTest.java
create mode 100644 Model/src/test/java/sudoku/model/SudokuContainerTest.java
create mode 100644 Model/src/test/java/sudoku/model/SudokuFieldTest.java
create mode 100644 Model/src/test/java/sudoku/solver/BacktrackingSudokuSolverTest.java
create mode 100644 SudokuGameProject.iml
create mode 100644 View/SudokuView.iml
create mode 100644 View/pom.xml
create mode 100644 View/src/main/java/module-info.java
create mode 100644 View/src/main/java/view/Authors_en.java
create mode 100644 View/src/main/java/view/Authors_pl.java
create mode 100644 View/src/main/java/view/GameController.java
create mode 100644 View/src/main/java/view/Launcher.java
create mode 100644 View/src/main/java/view/LoadController.java
create mode 100644 View/src/main/java/view/Main.java
create mode 100644 View/src/main/java/view/MenuController.java
create mode 100644 View/src/main/java/view/SaveController.java
create mode 100644 View/src/main/java/view/exceptions/IOLanguageFileException.java
create mode 100644 View/src/main/java/view/exceptions/IllegalDifficultyException.java
create mode 100644 View/src/main/resources/META-INF/persistence.xml
create mode 100644 View/src/main/resources/Scenes/game.fxml
create mode 100644 View/src/main/resources/Scenes/load_menu.fxml
create mode 100644 View/src/main/resources/Scenes/main_menu.fxml
create mode 100644 View/src/main/resources/Scenes/save_menu.fxml
create mode 100644 View/src/main/resources/Styles/game_style.css
create mode 100644 View/src/main/resources/Styles/load_save_style.css
create mode 100644 View/src/main/resources/Styles/main_menu_style.css
create mode 100644 View/src/main/resources/log4j2.xml
create mode 100644 View/src/main/resources/textGame_en.properties
create mode 100644 View/src/main/resources/textGame_pl.properties
create mode 100644 View/src/main/resources/textLoad_en.properties
create mode 100644 View/src/main/resources/textLoad_pl.properties
create mode 100644 View/src/main/resources/textMenu_en.properties
create mode 100644 View/src/main/resources/textMenu_pl.properties
create mode 100644 View/src/main/resources/textSave_en.properties
create mode 100644 View/src/main/resources/textSave_pl.properties
create mode 100644 pom.xml
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..8eb324a
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/../../../../../../../../:\Users\Bartek\Desktop\BitBucket\programowanie-komponentowe\Sudoku\.idea/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..13793f7
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+SudokuGameProject
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..cb26965
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..0850a91
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..712ab9d
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__antlr_antlr_2_7_2.xml b/.idea/libraries/Maven__antlr_antlr_2_7_2.xml
new file mode 100644
index 0000000..76a587b
--- /dev/null
+++ b/.idea/libraries/Maven__antlr_antlr_2_7_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__ch_ethz_ganymed_ganymed_ssh2_build210.xml b/.idea/libraries/Maven__ch_ethz_ganymed_ganymed_ssh2_build210.xml
new file mode 100644
index 0000000..1c86a46
--- /dev/null
+++ b/.idea/libraries/Maven__ch_ethz_ganymed_ganymed_ssh2_build210.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__classworlds_classworlds_1_1_alpha_2.xml b/.idea/libraries/Maven__classworlds_classworlds_1_1_alpha_2.xml
new file mode 100644
index 0000000..c99448d
--- /dev/null
+++ b/.idea/libraries/Maven__classworlds_classworlds_1_1_alpha_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_5_1.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_5_1.xml
new file mode 100644
index 0000000..bc7d7fd
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_classmate_1_5_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_ibm_icu_icu4j_61_1.xml b/.idea/libraries/Maven__com_ibm_icu_icu4j_61_1.xml
new file mode 100644
index 0000000..425700e
--- /dev/null
+++ b/.idea/libraries/Maven__com_ibm_icu_icu4j_61_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml b/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml
new file mode 100644
index 0000000..4d7e82e
--- /dev/null
+++ b/.idea/libraries/Maven__com_sun_istack_istack_commons_runtime_3_0_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml b/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml
new file mode 100644
index 0000000..de27a39
--- /dev/null
+++ b/.idea/libraries/Maven__com_sun_xml_fastinfoset_FastInfoset_1_2_15.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_2.xml b/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_2.xml
new file mode 100644
index 0000000..9c245b9
--- /dev/null
+++ b/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_chain_commons_chain_1_1.xml b/.idea/libraries/Maven__commons_chain_commons_chain_1_1.xml
new file mode 100644
index 0000000..38653c2
--- /dev/null
+++ b/.idea/libraries/Maven__commons_chain_commons_chain_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_6.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_6.xml
new file mode 100644
index 0000000..e8a6a9f
--- /dev/null
+++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_collections_commons_collections_3_1.xml b/.idea/libraries/Maven__commons_collections_commons_collections_3_1.xml
new file mode 100644
index 0000000..01dd005
--- /dev/null
+++ b/.idea/libraries/Maven__commons_collections_commons_collections_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_digester_commons_digester_1_8_1.xml b/.idea/libraries/Maven__commons_digester_commons_digester_1_8_1.xml
new file mode 100644
index 0000000..0716b7f
--- /dev/null
+++ b/.idea/libraries/Maven__commons_digester_commons_digester_1_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_io_commons_io_2_2.xml b/.idea/libraries/Maven__commons_io_commons_io_2_2.xml
new file mode 100644
index 0000000..f8084ec
--- /dev/null
+++ b/.idea/libraries/Maven__commons_io_commons_io_2_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml
new file mode 100644
index 0000000..2ec8376
--- /dev/null
+++ b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml
new file mode 100644
index 0000000..eab40b3
--- /dev/null
+++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_validator_commons_validator_1_6.xml b/.idea/libraries/Maven__commons_validator_commons_validator_1_6.xml
new file mode 100644
index 0000000..80e2bb5
--- /dev/null
+++ b/.idea/libraries/Maven__commons_validator_commons_validator_1_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__dom4j_dom4j_1_1.xml b/.idea/libraries/Maven__dom4j_dom4j_1_1.xml
new file mode 100644
index 0000000..4968206
--- /dev/null
+++ b/.idea/libraries/Maven__dom4j_dom4j_1_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml b/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml
new file mode 100644
index 0000000..ff49512
--- /dev/null
+++ b/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml b/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml
new file mode 100644
index 0000000..b7d39c6
--- /dev/null
+++ b/.idea/libraries/Maven__javax_persistence_javax_persistence_api_2_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml b/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml
new file mode 100644
index 0000000..059f88f
--- /dev/null
+++ b/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__junit_junit_3_8_1.xml b/.idea/libraries/Maven__junit_junit_3_8_1.xml
new file mode 100644
index 0000000..71b2993
--- /dev/null
+++ b/.idea/libraries/Maven__junit_junit_3_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml
new file mode 100644
index 0000000..5589596
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_abego_treelayout_org_abego_treelayout_core_1_0_3.xml b/.idea/libraries/Maven__org_abego_treelayout_org_abego_treelayout_core_1_0_3.xml
new file mode 100644
index 0000000..7add102
--- /dev/null
+++ b/.idea/libraries/Maven__org_abego_treelayout_org_abego_treelayout_core_1_0_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_antlr_ST4_4_3.xml b/.idea/libraries/Maven__org_antlr_ST4_4_3.xml
new file mode 100644
index 0000000..7cc44a6
--- /dev/null
+++ b/.idea/libraries/Maven__org_antlr_ST4_4_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_antlr_antlr4_4_8_1.xml b/.idea/libraries/Maven__org_antlr_antlr4_4_8_1.xml
new file mode 100644
index 0000000..4d1ad8e
--- /dev/null
+++ b/.idea/libraries/Maven__org_antlr_antlr4_4_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_antlr_antlr4_runtime_4_8_1.xml b/.idea/libraries/Maven__org_antlr_antlr4_runtime_4_8_1.xml
new file mode 100644
index 0000000..1e79170
--- /dev/null
+++ b/.idea/libraries/Maven__org_antlr_antlr4_runtime_4_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_antlr_antlr_runtime_3_5_2.xml b/.idea/libraries/Maven__org_antlr_antlr_runtime_3_5_2.xml
new file mode 100644
index 0000000..4fc5cbb
--- /dev/null
+++ b/.idea/libraries/Maven__org_antlr_antlr_runtime_3_5_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_bcel_bcel_6_2.xml b/.idea/libraries/Maven__org_apache_bcel_bcel_6_2.xml
new file mode 100644
index 0000000..ce96b73
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_bcel_bcel_6_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_5.xml b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_5.xml
new file mode 100644
index 0000000..666266c
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_5.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_2.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_2.xml
new file mode 100644
index 0000000..3d4c6f3
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml
new file mode 100644
index 0000000..eee5c06
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml
new file mode 100644
index 0000000..8ad4996
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_13_3.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_13_3.xml
new file mode 100644
index 0000000..1bd11c6
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_13_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_core_1_8.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_core_1_8.xml
new file mode 100644
index 0000000..f0c2850
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_core_1_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_decoration_model_1_8_1.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_decoration_model_1_8_1.xml
new file mode 100644
index 0000000..d7591e4
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_decoration_model_1_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_integration_tools_1_8_1.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_integration_tools_1_8_1.xml
new file mode 100644
index 0000000..e64dd42
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_integration_tools_1_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_logging_api_1_8.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_logging_api_1_8.xml
new file mode 100644
index 0000000..fc4d632
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_logging_api_1_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_module_xhtml_1_8.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_module_xhtml_1_8.xml
new file mode 100644
index 0000000..e7efe21
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_module_xhtml_1_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_sink_api_1_8.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_sink_api_1_8.xml
new file mode 100644
index 0000000..7d06ded
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_sink_api_1_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_site_renderer_1_8_1.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_site_renderer_1_8_1.xml
new file mode 100644
index 0000000..4d4d0a8
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_site_renderer_1_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_doxia_doxia_skin_model_1_8_1.xml b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_skin_model_1_8_1.xml
new file mode 100644
index 0000000..7c0e3c9
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_doxia_doxia_skin_model_1_8_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_aether_provider_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_aether_provider_3_0.xml
new file mode 100644
index 0000000..c567901
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_aether_provider_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_artifact_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_artifact_3_0.xml
new file mode 100644
index 0000000..4afa3ba
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_artifact_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_core_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_core_3_0.xml
new file mode 100644
index 0000000..6dea887
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_core_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_model_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_model_3_0.xml
new file mode 100644
index 0000000..9235b64
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_model_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_model_builder_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_model_builder_3_0.xml
new file mode 100644
index 0000000..39c8f37
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_model_builder_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_plugin_api_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_plugin_api_3_0.xml
new file mode 100644
index 0000000..91f8ba2
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_plugin_api_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_repository_metadata_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_repository_metadata_3_0.xml
new file mode 100644
index 0000000..c8cc3a0
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_repository_metadata_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_settings_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_settings_3_0.xml
new file mode 100644
index 0000000..33b8760
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_settings_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_maven_settings_builder_3_0.xml b/.idea/libraries/Maven__org_apache_maven_maven_settings_builder_3_0.xml
new file mode 100644
index 0000000..9637cf3
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_maven_settings_builder_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_plugins_maven_project_info_reports_plugin_3_0_0.xml b/.idea/libraries/Maven__org_apache_maven_plugins_maven_project_info_reports_plugin_3_0_0.xml
new file mode 100644
index 0000000..c70d62e
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_plugins_maven_project_info_reports_plugin_3_0_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_api_3_0.xml b/.idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_api_3_0.xml
new file mode 100644
index 0000000..a654238
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_api_3_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_impl_3_0_0.xml b/.idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_impl_3_0_0.xml
new file mode 100644
index 0000000..56d073d
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_reporting_maven_reporting_impl_3_0_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_api_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_api_1_10_0.xml
new file mode 100644
index 0000000..5c66cf1
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_api_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_manager_plexus_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_manager_plexus_1_10_0.xml
new file mode 100644
index 0000000..5eba73f
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_manager_plexus_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvs_commons_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvs_commons_1_10_0.xml
new file mode 100644
index 0000000..b3482ed
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvs_commons_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsexe_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsexe_1_10_0.xml
new file mode 100644
index 0000000..7b09931
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsexe_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsjava_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsjava_1_10_0.xml
new file mode 100644
index 0000000..a922021
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_cvsjava_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_git_commons_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_git_commons_1_10_0.xml
new file mode 100644
index 0000000..3c2ec94
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_git_commons_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_gitexe_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_gitexe_1_10_0.xml
new file mode 100644
index 0000000..d8d5c7f
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_gitexe_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_hg_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_hg_1_10_0.xml
new file mode 100644
index 0000000..32ab75a
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_hg_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_perforce_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_perforce_1_10_0.xml
new file mode 100644
index 0000000..f688fb6
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_perforce_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_starteam_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_starteam_1_10_0.xml
new file mode 100644
index 0000000..6c9ed52
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_starteam_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svn_commons_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svn_commons_1_10_0.xml
new file mode 100644
index 0000000..ecc0078
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svn_commons_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svnexe_1_10_0.xml b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svnexe_1_10_0.xml
new file mode 100644
index 0000000..74bb696
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_scm_maven_scm_provider_svnexe_1_10_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_shared_maven_artifact_transfer_0_9_1.xml b/.idea/libraries/Maven__org_apache_maven_shared_maven_artifact_transfer_0_9_1.xml
new file mode 100644
index 0000000..d75821b
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_shared_maven_artifact_transfer_0_9_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_shared_maven_common_artifact_filters_3_0_1.xml b/.idea/libraries/Maven__org_apache_maven_shared_maven_common_artifact_filters_3_0_1.xml
new file mode 100644
index 0000000..086ccf2
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_shared_maven_common_artifact_filters_3_0_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_shared_maven_dependency_tree_2_2.xml b/.idea/libraries/Maven__org_apache_maven_shared_maven_dependency_tree_2_2.xml
new file mode 100644
index 0000000..e3be745
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_shared_maven_dependency_tree_2_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_shared_maven_shared_jar_1_2.xml b/.idea/libraries/Maven__org_apache_maven_shared_maven_shared_jar_1_2.xml
new file mode 100644
index 0000000..5e5dfac
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_shared_maven_shared_jar_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_shared_maven_shared_utils_3_2_0.xml b/.idea/libraries/Maven__org_apache_maven_shared_maven_shared_utils_3_2_0.xml
new file mode 100644
index 0000000..3b8af59
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_shared_maven_shared_utils_3_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_wagon_wagon_http_lightweight_3_1_0.xml b/.idea/libraries/Maven__org_apache_maven_wagon_wagon_http_lightweight_3_1_0.xml
new file mode 100644
index 0000000..dfd9682
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_wagon_wagon_http_lightweight_3_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_wagon_wagon_http_shared_3_1_0.xml b/.idea/libraries/Maven__org_apache_maven_wagon_wagon_http_shared_3_1_0.xml
new file mode 100644
index 0000000..a44a6b8
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_wagon_wagon_http_shared_3_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_wagon_wagon_provider_api_3_1_0.xml b/.idea/libraries/Maven__org_apache_maven_wagon_wagon_provider_api_3_1_0.xml
new file mode 100644
index 0000000..aec6b68
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_wagon_wagon_provider_api_3_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_struts_struts_core_1_3_8.xml b/.idea/libraries/Maven__org_apache_struts_struts_core_1_3_8.xml
new file mode 100644
index 0000000..072320e
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_struts_struts_core_1_3_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_struts_struts_taglib_1_3_8.xml b/.idea/libraries/Maven__org_apache_struts_struts_taglib_1_3_8.xml
new file mode 100644
index 0000000..9674c05
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_struts_struts_taglib_1_3_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_struts_struts_tiles_1_3_8.xml b/.idea/libraries/Maven__org_apache_struts_struts_tiles_1_3_8.xml
new file mode 100644
index 0000000..e4c6c81
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_struts_struts_tiles_1_3_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_velocity_velocity_1_7.xml b/.idea/libraries/Maven__org_apache_velocity_velocity_1_7.xml
new file mode 100644
index 0000000..7a2914a
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_velocity_velocity_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_velocity_velocity_tools_2_0.xml b/.idea/libraries/Maven__org_apache_velocity_velocity_tools_2_0.xml
new file mode 100644
index 0000000..2e6b0aa
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_velocity_velocity_tools_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml
new file mode 100644
index 0000000..f854ab0
--- /dev/null
+++ b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_classworlds_2_2_3.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_classworlds_2_2_3.xml
new file mode 100644
index 0000000..6990532
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_classworlds_2_2_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_component_annotations_1_5_5.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_component_annotations_1_5_5.xml
new file mode 100644
index 0000000..9292317
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_component_annotations_1_5_5.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_container_default_1_0_alpha_8.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_container_default_1_0_alpha_8.xml
new file mode 100644
index 0000000..79f0b67
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_container_default_1_0_alpha_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_digest_1_0.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_digest_1_0.xml
new file mode 100644
index 0000000..8a32cec
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_digest_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_i18n_1_0_beta_10.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_i18n_1_0_beta_10.xml
new file mode 100644
index 0000000..1e9e5fb
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_i18n_1_0_beta_10.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_interpolation_1_25.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_interpolation_1_25.xml
new file mode 100644
index 0000000..1dfea54
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_interpolation_1_25.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_utils_3_1_0.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_utils_3_1_0.xml
new file mode 100644
index 0000000..fde1e03
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_utils_3_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_codehaus_plexus_plexus_velocity_1_2.xml b/.idea/libraries/Maven__org_codehaus_plexus_plexus_velocity_1_2.xml
new file mode 100644
index 0000000..5540313
--- /dev/null
+++ b/.idea/libraries/Maven__org_codehaus_plexus_plexus_velocity_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_dom4j_dom4j_2_1_3.xml b/.idea/libraries/Maven__org_dom4j_dom4j_2_1_3.xml
new file mode 100644
index 0000000..10fb46a
--- /dev/null
+++ b/.idea/libraries/Maven__org_dom4j_dom4j_2_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_eclipse_aether_aether_util_0_9_0_M2.xml b/.idea/libraries/Maven__org_eclipse_aether_aether_util_0_9_0_M2.xml
new file mode 100644
index 0000000..459a75f
--- /dev/null
+++ b/.idea/libraries/Maven__org_eclipse_aether_aether_util_0_9_0_M2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_glassfish_javax_json_1_0_4.xml b/.idea/libraries/Maven__org_glassfish_javax_json_1_0_4.xml
new file mode 100644
index 0000000..7fbea5f
--- /dev/null
+++ b/.idea/libraries/Maven__org_glassfish_javax_json_1_0_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml b/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml
new file mode 100644
index 0000000..0c7a80a
--- /dev/null
+++ b/.idea/libraries/Maven__org_glassfish_jaxb_jaxb_runtime_2_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml b/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml
new file mode 100644
index 0000000..638d937
--- /dev/null
+++ b/.idea/libraries/Maven__org_glassfish_jaxb_txw2_2_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml b/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml
new file mode 100644
index 0000000..1fd775b
--- /dev/null
+++ b/.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_1_0_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hibernate_orm_hibernate_core_6_0_0_Alpha5.xml b/.idea/libraries/Maven__org_hibernate_orm_hibernate_core_6_0_0_Alpha5.xml
new file mode 100644
index 0000000..18100f6
--- /dev/null
+++ b/.idea/libraries/Maven__org_hibernate_orm_hibernate_core_6_0_0_Alpha5.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_javassist_javassist_3_24_0_GA.xml b/.idea/libraries/Maven__org_javassist_javassist_3_24_0_GA.xml
new file mode 100644
index 0000000..a9de551
--- /dev/null
+++ b/.idea/libraries/Maven__org_javassist_javassist_3_24_0_GA.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jboss_jandex_2_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_jandex_2_1_1_Final.xml
new file mode 100644
index 0000000..a8bf358
--- /dev/null
+++ b/.idea/libraries/Maven__org_jboss_jandex_2_1_1_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
new file mode 100644
index 0000000..5f7dd01
--- /dev/null
+++ b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml b/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml
new file mode 100644
index 0000000..ec03510
--- /dev/null
+++ b/.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_2_spec_1_1_1_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jsoup_jsoup_1_11_2.xml b/.idea/libraries/Maven__org_jsoup_jsoup_1_11_2.xml
new file mode 100644
index 0000000..b65481f
--- /dev/null
+++ b/.idea/libraries/Maven__org_jsoup_jsoup_1_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_0.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_0.xml
new file mode 100644
index 0000000..be380a5
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_6_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_7_0_M1.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_7_0_M1.xml
new file mode 100644
index 0000000..356bfd3
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_7_0_M1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_6_0.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_6_0.xml
new file mode 100644
index 0000000..227bc44
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_6_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_0.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_0.xml
new file mode 100644
index 0000000..8e5d3f2
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_6_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_7_0_M1.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_7_0_M1.xml
new file mode 100644
index 0000000..cea43ce
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_7_0_M1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_6_0.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_6_0.xml
new file mode 100644
index 0000000..2f36d10
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_6_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml b/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml
new file mode 100644
index 0000000..ee8e8ef
--- /dev/null
+++ b/.idea/libraries/Maven__org_jvnet_staxex_stax_ex_1_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_netbeans_lib_cvsclient_20060125.xml b/.idea/libraries/Maven__org_netbeans_lib_cvsclient_20060125.xml
new file mode 100644
index 0000000..ec7897a
--- /dev/null
+++ b/.idea/libraries/Maven__org_netbeans_lib_cvsclient_20060125.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_base_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_base_15_ea_3.xml
new file mode 100644
index 0000000..4e71137
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_base_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_base_win_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_base_win_15_ea_3.xml
new file mode 100644
index 0000000..d788134
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_base_win_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_controls_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_controls_15_ea_3.xml
new file mode 100644
index 0000000..f83ac91
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_controls_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_controls_win_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_controls_win_15_ea_3.xml
new file mode 100644
index 0000000..d881ee9
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_controls_win_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_fxml_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_fxml_15_ea_3.xml
new file mode 100644
index 0000000..44c975e
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_fxml_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_fxml_win_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_fxml_win_15_ea_3.xml
new file mode 100644
index 0000000..70d6f14
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_fxml_win_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_graphics_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_graphics_15_ea_3.xml
new file mode 100644
index 0000000..9770cb9
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_graphics_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_openjfx_javafx_graphics_win_15_ea_3.xml b/.idea/libraries/Maven__org_openjfx_javafx_graphics_win_15_ea_3.xml
new file mode 100644
index 0000000..ba000b0
--- /dev/null
+++ b/.idea/libraries/Maven__org_openjfx_javafx_graphics_win_15_ea_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml
new file mode 100644
index 0000000..fbc1b16
--- /dev/null
+++ b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_postgresql_postgresql_42_2_12_jre7.xml b/.idea/libraries/Maven__org_postgresql_postgresql_42_2_12_jre7.xml
new file mode 100644
index 0000000..772d169
--- /dev/null
+++ b/.idea/libraries/Maven__org_postgresql_postgresql_42_2_12_jre7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_5.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_5.xml
new file mode 100644
index 0000000..6f808f1
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_5.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_aether_aether_api_1_7.xml b/.idea/libraries/Maven__org_sonatype_aether_aether_api_1_7.xml
new file mode 100644
index 0000000..1388816
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_aether_aether_api_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_aether_aether_impl_1_7.xml b/.idea/libraries/Maven__org_sonatype_aether_aether_impl_1_7.xml
new file mode 100644
index 0000000..508e3f4
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_aether_aether_impl_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_aether_aether_spi_1_7.xml b/.idea/libraries/Maven__org_sonatype_aether_aether_spi_1_7.xml
new file mode 100644
index 0000000..d75c837
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_aether_aether_spi_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_aether_aether_util_1_7.xml b/.idea/libraries/Maven__org_sonatype_aether_aether_util_1_7.xml
new file mode 100644
index 0000000..47b2dc9
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_aether_aether_util_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_plexus_plexus_cipher_1_4.xml b/.idea/libraries/Maven__org_sonatype_plexus_plexus_cipher_1_4.xml
new file mode 100644
index 0000000..7316193
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_plexus_plexus_cipher_1_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_plexus_plexus_sec_dispatcher_1_3.xml b/.idea/libraries/Maven__org_sonatype_plexus_plexus_sec_dispatcher_1_3.xml
new file mode 100644
index 0000000..bb61d0e
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_plexus_plexus_sec_dispatcher_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_sisu_sisu_guice_noaop_2_1_7.xml b/.idea/libraries/Maven__org_sonatype_sisu_sisu_guice_noaop_2_1_7.xml
new file mode 100644
index 0000000..b722b5a
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_sisu_sisu_guice_noaop_2_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_sisu_sisu_inject_bean_1_4_2.xml b/.idea/libraries/Maven__org_sonatype_sisu_sisu_inject_bean_1_4_2.xml
new file mode 100644
index 0000000..67fb880
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_sisu_sisu_inject_bean_1_4_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_sonatype_sisu_sisu_inject_plexus_1_4_2.xml b/.idea/libraries/Maven__org_sonatype_sisu_sisu_inject_plexus_1_4_2.xml
new file mode 100644
index 0000000..714626a
--- /dev/null
+++ b/.idea/libraries/Maven__org_sonatype_sisu_sisu_inject_plexus_1_4_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__oro_oro_2_0_8.xml b/.idea/libraries/Maven__oro_oro_2_0_8.xml
new file mode 100644
index 0000000..25203a0
--- /dev/null
+++ b/.idea/libraries/Maven__oro_oro_2_0_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__sslext_sslext_1_2_0.xml b/.idea/libraries/Maven__sslext_sslext_1_2_0.xml
new file mode 100644
index 0000000..e8c7831
--- /dev/null
+++ b/.idea/libraries/Maven__sslext_sslext_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..972ec8d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..af49dbc
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Model/ModelProject.iml b/Model/ModelProject.iml
new file mode 100644
index 0000000..bb89d2d
--- /dev/null
+++ b/Model/ModelProject.iml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Model/checkstyle2020.xml b/Model/checkstyle2020.xml
new file mode 100644
index 0000000..c8a7a7b
--- /dev/null
+++ b/Model/checkstyle2020.xml
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Model/pom.xml b/Model/pom.xml
new file mode 100644
index 0000000..8bb5dc0
--- /dev/null
+++ b/Model/pom.xml
@@ -0,0 +1,190 @@
+
+
+ 4.0.0
+
+
+ 3107
+ SudokuGameProject
+ 2.0
+
+ ModelProject
+ jar
+ SudokuModel
+
+
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ 3.1.1
+
+ checkstyle2020.xml
+ UTF-8
+ true
+ false
+
+
+
+
+ checkstyle
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.5
+
+
+
+ report
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.0.0-M4
+
+ 0
+ false
+ false
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ 3.1.1
+
+ **/module-info.java
+ checkstyle2020.xml
+ UTF-8
+ true
+ true
+ false
+
+
+
+ checkstyle
+ verify
+
+ check
+
+
+
+
+
+ com.puppycrawl.tools
+ checkstyle
+ 8.30
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.5
+
+
+ default-prepare-agent
+
+ prepare-agent
+
+
+
+ default-report
+
+ report
+
+
+
+ default-check
+
+ check
+
+
+
+
+ BUNDLE
+
+
+ COMPLEXITY
+ COVEREDRATIO
+ 0.60
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-site-plugin
+ 3.8.2
+
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.6.0
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.6.0
+ test
+
+
+ org.apache.maven.plugins
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+ javax.persistence
+ javax.persistence-api
+ 2.2
+
+
+ org.hibernate.orm
+ hibernate-core
+ 6.0.0.Alpha5
+
+
+ org.postgresql
+ postgresql
+ 42.2.12.jre7
+
+
+
+
+ UTF-8
+ 11
+ 11
+
+
+
\ No newline at end of file
diff --git a/Model/src/main/java/module-info.java b/Model/src/main/java/module-info.java
new file mode 100644
index 0000000..8a197b6
--- /dev/null
+++ b/Model/src/main/java/module-info.java
@@ -0,0 +1,22 @@
+module Model {
+ requires java.persistence;
+ requires java.sql;
+ requires commons.lang3;
+ requires org.hibernate.orm.core;
+
+ opens sudoku.consts;
+ opens sudoku.dao;
+ opens sudoku.database;
+ opens sudoku.exceptions;
+ opens sudoku.gamestate;
+ opens sudoku.model;
+ opens sudoku.solver;
+
+ exports sudoku.consts;
+ exports sudoku.dao;
+ exports sudoku.database;
+ exports sudoku.exceptions;
+ exports sudoku.gamestate;
+ exports sudoku.model;
+ exports sudoku.solver;
+}
\ No newline at end of file
diff --git a/Model/src/main/java/sudoku/consts/Consts.java b/Model/src/main/java/sudoku/consts/Consts.java
new file mode 100644
index 0000000..ee752af
--- /dev/null
+++ b/Model/src/main/java/sudoku/consts/Consts.java
@@ -0,0 +1,20 @@
+package sudoku.consts;
+
+public class Consts {
+
+ private Consts() {
+ }
+
+ public static final int UNINITIALIZED = 0;
+ public static final int MAX_VALUE = 9;
+ public static final int BOX_SIZE = 3;
+ public static final int SIZE = 9;
+
+ public static final String ROW_OUT_OF_BOUNDS = "Array row index out of range (0-8) - ";
+ public static final String COL_OUT_OF_BOUNDS = "Array column index out of range (0-8) - ";
+ public static final String INVALID_LENGTH = "Array doesn't have required number of elements";
+ public static final String INVALID_VALUE = "Value can't be less than 0 and more than 9";
+ public static final String OUT_OF_BOUNDS = "One of provided indexes (x or y) is invalid";
+ public static final String NULL_ELEMENT = "Array element cannot be null";
+ public static final String NULL_ARRAY = "Provided array is null";
+}
diff --git a/Model/src/main/java/sudoku/dao/Dao.java b/Model/src/main/java/sudoku/dao/Dao.java
new file mode 100644
index 0000000..8507bf1
--- /dev/null
+++ b/Model/src/main/java/sudoku/dao/Dao.java
@@ -0,0 +1,10 @@
+package sudoku.dao;
+
+import sudoku.exceptions.ReadBoardException;
+import sudoku.exceptions.WriteBoardException;
+
+public interface Dao {
+ T read() throws ReadBoardException;
+
+ void write(T obj) throws WriteBoardException;
+}
diff --git a/Model/src/main/java/sudoku/dao/FileSudokuBoardDao.java b/Model/src/main/java/sudoku/dao/FileSudokuBoardDao.java
new file mode 100644
index 0000000..c404a46
--- /dev/null
+++ b/Model/src/main/java/sudoku/dao/FileSudokuBoardDao.java
@@ -0,0 +1,56 @@
+package sudoku.dao;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import sudoku.exceptions.ReadBoardException;
+import sudoku.exceptions.WriteBoardException;
+import sudoku.model.SudokuBoard;
+
+
+public class FileSudokuBoardDao implements Dao, AutoCloseable {
+
+ private final String fileName;
+
+ public FileSudokuBoardDao(String fileName) {
+ this.fileName = fileName;
+ }
+
+ @Override
+ public SudokuBoard read() throws ReadBoardException {
+ SudokuBoard sudokuBoard;
+ try (FileInputStream fileInputStream = new FileInputStream(fileName)) {
+ ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
+ sudokuBoard = (SudokuBoard) objectInputStream.readObject();
+ } catch (IOException | ClassNotFoundException exception) {
+ throw new ReadBoardException("PLACEHOLDER", exception);
+ }
+ return sudokuBoard;
+ }
+
+ @Override
+ public void write(SudokuBoard obj) throws WriteBoardException {
+ try (FileOutputStream fileOutputStream = new FileOutputStream(fileName)) {
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
+ objectOutputStream.writeObject(obj);
+ } catch (IOException exception) {
+ throw new WriteBoardException("PLACEHOLDER", exception);
+ }
+ }
+
+
+ @Override
+ public void close() {
+ //There is nothing to be released in this class
+ }
+
+ //Uncommenting causes checkstyle error
+ /*@Override
+ public void finalize() throws Throwable {
+ //Deprecated since Java 9
+ //There is nothing to be released in this class
+ super.finalize();
+ }*/
+}
diff --git a/Model/src/main/java/sudoku/dao/JpaSudokuBoardDao.java b/Model/src/main/java/sudoku/dao/JpaSudokuBoardDao.java
new file mode 100644
index 0000000..943ca0d
--- /dev/null
+++ b/Model/src/main/java/sudoku/dao/JpaSudokuBoardDao.java
@@ -0,0 +1,95 @@
+package sudoku.dao;
+
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import sudoku.database.Board;
+import sudoku.exceptions.ReadBoardException;
+import sudoku.exceptions.WriteBoardException;
+import sudoku.model.SudokuBoard;
+
+public class JpaSudokuBoardDao implements Dao, AutoCloseable {
+ private final EntityManager entityManager;
+ private String name;
+ private Long id;
+
+ private JpaSudokuBoardDao() {
+ EntityManagerFactory factory = Persistence.createEntityManagerFactory("unit");
+ entityManager = factory.createEntityManager();
+ }
+
+ public JpaSudokuBoardDao(Long id) {
+ this();
+ this.id = id;
+ }
+
+ public JpaSudokuBoardDao(String name) {
+ this();
+ this.name = name;
+ }
+
+ @Override
+ public SudokuBoard read() throws ReadBoardException {
+ if (id != null) {
+ return getById();
+ } else if (name != null) {
+ return getByName();
+ } else {
+ throw new ReadBoardException("PLACEHOLDER", new IllegalArgumentException());
+ }
+ }
+
+ @Override
+ public void write(SudokuBoard obj) throws WriteBoardException {
+ if (name == null) {
+ throw new WriteBoardException();
+ }
+ entityManager.getTransaction().begin();
+ entityManager.persist(wrapSudokuBoard(obj));
+ entityManager.getTransaction().commit();
+ }
+
+ private Board wrapSudokuBoard(SudokuBoard sudokuBoard) {
+ return new Board(sudokuBoard, name);
+ }
+
+ private SudokuBoard getById() throws ReadBoardException {
+ try {
+ entityManager.getTransaction().begin();
+ Board board = entityManager.find(Board.class, id);
+ entityManager.getTransaction().commit();
+ if (board == null) {
+ return null;
+ }
+ return board.deserialize();
+
+ } catch (Exception exception) {
+ throw new ReadBoardException("PLACEHOLDER", exception);
+ }
+ }
+
+ private SudokuBoard getByName() throws ReadBoardException {
+ try {
+ entityManager.getTransaction().begin();
+ @SuppressWarnings("rawtypes")
+ List list = entityManager.createQuery(
+ "SELECT board FROM Board board WHERE board.name = :n"
+ ).setParameter("n", name).getResultList();
+
+ entityManager.getTransaction().commit();
+ if (!list.isEmpty()) {
+ Board board = (Board) list.get(0);
+ return board.deserialize();
+ }
+ return null;
+ } catch (Exception exception) {
+ throw new ReadBoardException("PLACEHOLDER", exception);
+ }
+ }
+
+ @Override
+ public void close() {
+ entityManager.close();
+ }
+}
diff --git a/Model/src/main/java/sudoku/dao/SudokuBoardDaoFactory.java b/Model/src/main/java/sudoku/dao/SudokuBoardDaoFactory.java
new file mode 100644
index 0000000..e5f1207
--- /dev/null
+++ b/Model/src/main/java/sudoku/dao/SudokuBoardDaoFactory.java
@@ -0,0 +1,17 @@
+package sudoku.dao;
+
+import sudoku.model.SudokuBoard;
+
+public class SudokuBoardDaoFactory {
+ public Dao getFileDao(String fileName) {
+ return new FileSudokuBoardDao(fileName);
+ }
+
+ public Dao getJpaDao(Long id) {
+ return new JpaSudokuBoardDao(id);
+ }
+
+ public Dao getJpaDao(String name) {
+ return new JpaSudokuBoardDao(name);
+ }
+}
diff --git a/Model/src/main/java/sudoku/database/Board.java b/Model/src/main/java/sudoku/database/Board.java
new file mode 100644
index 0000000..c714db6
--- /dev/null
+++ b/Model/src/main/java/sudoku/database/Board.java
@@ -0,0 +1,80 @@
+package sudoku.database;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+import sudoku.model.SudokuBoard;
+
+// Pisząc kwerendy istotne jest by NIE odwoływać się do nazwy tabeli, lecz nazwy encji (Board).
+
+@Entity
+@Table(name = "board")
+public class Board {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "difficulty")
+ private String difficulty;
+
+ @Lob
+ @Column(name = "board")
+ private byte[] board;
+
+ public Board() {
+ }
+
+ public Board(SudokuBoard sudokuBoard, String name) {
+ this.name = name;
+ this.difficulty = sudokuBoard.getDifficulty().name();
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ try {
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+ objectOutputStream.writeObject(Objects.requireNonNull(sudokuBoard));
+ objectOutputStream.flush();
+ board = byteArrayOutputStream.toByteArray();
+ } catch (IOException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ public SudokuBoard deserialize() {
+ SudokuBoard sudokuBoard = null;
+ ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(board);
+ try {
+ ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
+ sudokuBoard = (SudokuBoard) objectInputStream.readObject();
+ } catch (IOException | ClassNotFoundException exception) {
+ exception.printStackTrace();
+ }
+ return sudokuBoard;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDifficulty() {
+ return difficulty;
+ }
+
+ public byte[] getBoard() {
+ return board;
+ }
+}
diff --git a/Model/src/main/java/sudoku/database/DatabaseManager.java b/Model/src/main/java/sudoku/database/DatabaseManager.java
new file mode 100644
index 0000000..833632a
--- /dev/null
+++ b/Model/src/main/java/sudoku/database/DatabaseManager.java
@@ -0,0 +1,77 @@
+package sudoku.database;
+
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+public class DatabaseManager implements AutoCloseable {
+ private final EntityManager entityManager;
+
+ public DatabaseManager() {
+ EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("unit");
+ entityManager = entityManagerFactory.createEntityManager();
+ }
+
+ public String getNameFromId(long id) {
+ entityManager.getTransaction().begin();
+ @SuppressWarnings("unchecked")
+ List results = entityManager.createQuery(
+ "SELECT name FROM Board board WHERE board.id = :i"
+ ).setParameter("i", id).getResultList();
+ if (!results.isEmpty()) {
+ String name = results.get(0);
+ entityManager.getTransaction().commit();
+ return name;
+ }
+ return "";
+ }
+
+ public boolean checkIfNameExists(String name) {
+ entityManager.getTransaction().begin();
+ boolean empty = entityManager.createQuery(
+ "SELECT board FROM Board board WHERE board.name = :n"
+ ).setParameter("n", name).getResultList().isEmpty();
+ entityManager.getTransaction().commit();
+ return !empty;
+ }
+
+ public List getAllEntries() {
+ entityManager.getTransaction().begin();
+ @SuppressWarnings("unchecked")
+ List boards = entityManager.createQuery(
+ "SELECT board FROM Board board"
+ ).getResultList();
+ entityManager.getTransaction().commit();
+ return boards;
+ }
+
+ public void removeData(String name) {
+ entityManager.getTransaction().begin();
+ entityManager.createQuery("DELETE FROM Board WHERE name = :n")
+ .setParameter("n", name).executeUpdate();
+ entityManager.getTransaction().commit();
+ }
+
+ public void removeAll() {
+ entityManager.getTransaction().begin();
+ entityManager.createQuery("DELETE FROM Board").executeUpdate();
+ entityManager.getTransaction().commit();
+ }
+
+ @Deprecated
+ public void addObject(Board board) {
+ entityManager.getTransaction().begin();
+ entityManager.persist(board);
+ entityManager.getTransaction().commit();
+ }
+
+ public void releaseResources() {
+ entityManager.close();
+ }
+
+ @Override
+ public void close() {
+ releaseResources();
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/ContainerOutOfBoundsException.java b/Model/src/main/java/sudoku/exceptions/ContainerOutOfBoundsException.java
new file mode 100644
index 0000000..ed43d09
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/ContainerOutOfBoundsException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class ContainerOutOfBoundsException extends SudokuBoardException {
+ public ContainerOutOfBoundsException() {
+ super();
+ }
+
+ public ContainerOutOfBoundsException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/FieldOutOfBoundsException.java b/Model/src/main/java/sudoku/exceptions/FieldOutOfBoundsException.java
new file mode 100644
index 0000000..1dac078
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/FieldOutOfBoundsException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class FieldOutOfBoundsException extends SudokuBoardException {
+ public FieldOutOfBoundsException() {
+ super();
+ }
+
+ public FieldOutOfBoundsException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/InvalidContainerLengthException.java b/Model/src/main/java/sudoku/exceptions/InvalidContainerLengthException.java
new file mode 100644
index 0000000..e0de3a6
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/InvalidContainerLengthException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class InvalidContainerLengthException extends SudokuContainerException {
+ public InvalidContainerLengthException() {
+ super();
+ }
+
+ public InvalidContainerLengthException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/InvalidFieldValueException.java b/Model/src/main/java/sudoku/exceptions/InvalidFieldValueException.java
new file mode 100644
index 0000000..768c0dc
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/InvalidFieldValueException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class InvalidFieldValueException extends Exception {
+ public InvalidFieldValueException() {
+ super();
+ }
+
+ public InvalidFieldValueException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/NullContainerException.java b/Model/src/main/java/sudoku/exceptions/NullContainerException.java
new file mode 100644
index 0000000..5b7dad1
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/NullContainerException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class NullContainerException extends SudokuContainerException {
+ public NullContainerException() {
+ super();
+ }
+
+ public NullContainerException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/ReadBoardException.java b/Model/src/main/java/sudoku/exceptions/ReadBoardException.java
new file mode 100644
index 0000000..f1e1b24
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/ReadBoardException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class ReadBoardException extends SudokuBoardDaoException {
+ public ReadBoardException() {
+ super();
+ }
+
+ public ReadBoardException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/SudokuBoardDaoException.java b/Model/src/main/java/sudoku/exceptions/SudokuBoardDaoException.java
new file mode 100644
index 0000000..d51048a
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/SudokuBoardDaoException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class SudokuBoardDaoException extends Exception {
+ public SudokuBoardDaoException() {
+ super();
+ }
+
+ public SudokuBoardDaoException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/SudokuBoardException.java b/Model/src/main/java/sudoku/exceptions/SudokuBoardException.java
new file mode 100644
index 0000000..122d61d
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/SudokuBoardException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class SudokuBoardException extends Exception {
+ public SudokuBoardException() {
+ super();
+ }
+
+ public SudokuBoardException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/SudokuContainerException.java b/Model/src/main/java/sudoku/exceptions/SudokuContainerException.java
new file mode 100644
index 0000000..03e6161
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/SudokuContainerException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class SudokuContainerException extends Exception {
+ public SudokuContainerException() {
+ super();
+ }
+
+ public SudokuContainerException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/exceptions/WriteBoardException.java b/Model/src/main/java/sudoku/exceptions/WriteBoardException.java
new file mode 100644
index 0000000..81dfeca
--- /dev/null
+++ b/Model/src/main/java/sudoku/exceptions/WriteBoardException.java
@@ -0,0 +1,11 @@
+package sudoku.exceptions;
+
+public class WriteBoardException extends SudokuBoardDaoException {
+ public WriteBoardException() {
+ super();
+ }
+
+ public WriteBoardException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/Model/src/main/java/sudoku/gamestate/BoardType.java b/Model/src/main/java/sudoku/gamestate/BoardType.java
new file mode 100644
index 0000000..81bec98
--- /dev/null
+++ b/Model/src/main/java/sudoku/gamestate/BoardType.java
@@ -0,0 +1,6 @@
+package sudoku.gamestate;
+
+public enum BoardType {
+ ORIGINAL,
+ USER
+}
diff --git a/Model/src/main/java/sudoku/gamestate/CoordinatesWrapper.java b/Model/src/main/java/sudoku/gamestate/CoordinatesWrapper.java
new file mode 100644
index 0000000..eb2d896
--- /dev/null
+++ b/Model/src/main/java/sudoku/gamestate/CoordinatesWrapper.java
@@ -0,0 +1,27 @@
+package sudoku.gamestate;
+
+import java.io.Serializable;
+
+public class CoordinatesWrapper implements Serializable {
+ private final int crX;
+ private final int crY;
+ private final T obj;
+
+ CoordinatesWrapper(int crX, int crY, T obj) {
+ this.crX = crX;
+ this.crY = crY;
+ this.obj = obj;
+ }
+
+ public int getCrX() {
+ return crX;
+ }
+
+ public int getCrY() {
+ return crY;
+ }
+
+ public T getObj() {
+ return obj;
+ }
+}
diff --git a/Model/src/main/java/sudoku/gamestate/Difficulty.java b/Model/src/main/java/sudoku/gamestate/Difficulty.java
new file mode 100644
index 0000000..025c9a7
--- /dev/null
+++ b/Model/src/main/java/sudoku/gamestate/Difficulty.java
@@ -0,0 +1,17 @@
+package sudoku.gamestate;
+
+public enum Difficulty {
+ EASY(60),
+ NORMAL(70),
+ HARD(75);
+
+ private final int value;
+
+ Difficulty(final int newValue) {
+ value = newValue;
+ }
+
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/Model/src/main/java/sudoku/gamestate/GameState.java b/Model/src/main/java/sudoku/gamestate/GameState.java
new file mode 100644
index 0000000..71440b6
--- /dev/null
+++ b/Model/src/main/java/sudoku/gamestate/GameState.java
@@ -0,0 +1,129 @@
+package sudoku.gamestate;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import sudoku.consts.Consts;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.model.SudokuBoard;
+import sudoku.model.SudokuField;
+import sudoku.solver.BacktrackingSudokuSolver;
+
+public class GameState {
+
+ private final SudokuBoard board;
+ private final String gameName;
+
+ public GameState(Difficulty difficulty) throws
+ FieldOutOfBoundsException, InvalidFieldValueException {
+ this(difficulty, "Generic Game");
+ }
+
+ public GameState(SudokuBoard board, String gameName) {
+ this.board = board;
+ this.gameName = gameName;
+ if (board.getInitialValues() == null) {
+ prepareTable();
+ }
+ }
+
+ public GameState(Difficulty difficulty, String gameName) throws
+ FieldOutOfBoundsException, InvalidFieldValueException {
+ board = new SudokuBoard(new BacktrackingSudokuSolver(), difficulty);
+ board.solveGame();
+ this.gameName = gameName;
+ prepareTable();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void prepareTable() {
+ List[] userValues = new List[Consts.SIZE];
+ SudokuField[] userFields;
+ for (int i = 0; i < Consts.SIZE; i++) {
+ userFields = new SudokuField[Consts.SIZE];
+ for (int j = 0; j < Consts.SIZE; j++) {
+ userFields[j] = new SudokuField();
+ try {
+ userFields[j].setFieldValue(board.getField(j, i, BoardType.ORIGINAL));
+ } catch (InvalidFieldValueException | FieldOutOfBoundsException e) {
+ e.printStackTrace();
+ }
+ }
+ userValues[i] = Arrays.asList(userFields);
+ }
+ randomize(Arrays.asList(userValues));
+ }
+
+ private void randomize(List> list) {
+ Random random = new Random();
+ int indexX = random.nextInt(9);
+ int indexY = random.nextInt(9);
+
+ for (byte i = 0; i < board.getDifficulty().getValue(); i++) {
+ try {
+ while (list.get(indexY).get(indexX).getFieldValue() == 0) {
+ indexX = random.nextInt(9);
+ indexY = random.nextInt(9);
+ }
+ list.get(indexY).get(indexX).setFieldValue(0);
+
+ } catch (InvalidFieldValueException exception) {
+ exception.printStackTrace();
+ }
+ }
+ board.setUserBoard(list);
+ generateInitialList(list);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void generateInitialList(List> list) {
+ int fieldCount = 81 - board.getDifficulty().getValue();
+ CoordinatesWrapper[] wrappers = new CoordinatesWrapper[fieldCount];
+
+ int index = 0;
+ int value;
+
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ value = list.get(i).get(j).getFieldValue();
+ if (value != 0) {
+ wrappers[index] = new CoordinatesWrapper<>(j, i, value);
+ index++;
+ }
+ }
+ }
+ board.setInitialValues(Arrays.asList(wrappers));
+ }
+
+ public void reset() {
+ try {
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ board.setField(j, i, 0, BoardType.USER);
+ }
+ }
+ for (CoordinatesWrapper cw : board.getInitialValues()) {
+ board.setField(cw.getCrX(), cw.getCrY(), cw.getObj(), BoardType.USER);
+ }
+ } catch (FieldOutOfBoundsException | InvalidFieldValueException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ public boolean compareFields(int x, int y) throws FieldOutOfBoundsException {
+ return board.getField(x, y, BoardType.ORIGINAL) == board.getField(x, y, BoardType.USER);
+ }
+
+ public SudokuBoard getBoard() {
+ return board;
+ }
+
+ public Difficulty getDifficulty() {
+ return board.getDifficulty();
+ }
+
+ public String getGameName() {
+ return gameName;
+ }
+}
diff --git a/Model/src/main/java/sudoku/model/SudokuBoard.java b/Model/src/main/java/sudoku/model/SudokuBoard.java
new file mode 100644
index 0000000..7b46dc0
--- /dev/null
+++ b/Model/src/main/java/sudoku/model/SudokuBoard.java
@@ -0,0 +1,240 @@
+package sudoku.model;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import sudoku.consts.Consts;
+import sudoku.exceptions.ContainerOutOfBoundsException;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.exceptions.SudokuBoardException;
+import sudoku.exceptions.SudokuContainerException;
+import sudoku.gamestate.BoardType;
+import sudoku.gamestate.CoordinatesWrapper;
+import sudoku.gamestate.Difficulty;
+import sudoku.solver.SudokuSolver;
+
+public class SudokuBoard implements Serializable, Cloneable {
+
+ private final SudokuSolver sudokuSolver;
+ private final List> board;
+ private List> userBoard;
+ private List> initialValues;
+ private Difficulty difficulty;
+
+ public SudokuBoard(SudokuSolver solver) {
+ @SuppressWarnings("unchecked")
+ List[] array = new List[Consts.SIZE];
+ SudokuField[] fields;
+ for (int i = 0; i < Consts.SIZE; i++) {
+ fields = new SudokuField[Consts.SIZE];
+ for (int j = 0; j < Consts.SIZE; j++) {
+ fields[j] = new SudokuField();
+ }
+ array[i] = Arrays.asList(fields);
+ }
+ board = Arrays.asList(array);
+ sudokuSolver = Objects.requireNonNull(solver);
+ }
+
+ public SudokuBoard(SudokuSolver solver, Difficulty difficulty) {
+ this(solver);
+ this.difficulty = difficulty;
+ prepare();
+ }
+
+ public void prepare() {
+ try {
+ solveGame();
+
+ } catch (FieldOutOfBoundsException | InvalidFieldValueException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void solveGame() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ sudokuSolver.solve(this);
+ }
+
+ public List> getInitialValues() {
+ return initialValues;
+ }
+
+ public int getField(int x, int y, BoardType boardType) throws FieldOutOfBoundsException {
+ if (x < 0 || y < 0 || x >= Consts.SIZE || y >= Consts.SIZE) {
+ throw new FieldOutOfBoundsException(
+ Consts.OUT_OF_BOUNDS,
+ new ArrayIndexOutOfBoundsException()
+ );
+ }
+ if (boardType == BoardType.ORIGINAL) {
+ return board.get(y).get(x).getFieldValue();
+ } else {
+ return userBoard.get(y).get(x).getFieldValue();
+ }
+ }
+
+ public void setField(int x, int y, int value, BoardType boardType) throws
+ FieldOutOfBoundsException, InvalidFieldValueException {
+ if (x < 0 || y < 0 || x >= Consts.SIZE || y >= Consts.SIZE) {
+ throw new FieldOutOfBoundsException(
+ Consts.OUT_OF_BOUNDS,
+ new ArrayIndexOutOfBoundsException()
+ );
+ }
+ if (boardType == BoardType.ORIGINAL) {
+ board.get(y).get(x).setFieldValue(value);
+ } else {
+ userBoard.get(y).get(x).setFieldValue(value);
+ }
+ }
+
+ @SuppressWarnings("unused")
+ private boolean checkBoard() throws SudokuBoardException, SudokuContainerException {
+ for (int i = 0; i < Consts.SIZE; i++) {
+ if (!(getRow(i).verify() || getColumn(i).verify())) {
+ return false;
+ }
+ }
+ for (int i = 0; i < Consts.SIZE; i += Consts.BOX_SIZE) {
+ for (int j = 0; j < Consts.SIZE; j += Consts.BOX_SIZE) {
+ if (!getBox(i, j).verify()) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public SudokuRow getRow(int y) throws ContainerOutOfBoundsException, SudokuContainerException {
+ if (y < 0 || y > 8) {
+ throw new ContainerOutOfBoundsException(
+ Consts.ROW_OUT_OF_BOUNDS + " " + y,
+ new IllegalArgumentException()
+ );
+ }
+ return new SudokuRow(board.get(y));
+ }
+
+ public SudokuColumn getColumn(int x) throws
+ ContainerOutOfBoundsException, SudokuContainerException {
+ if (x < 0 || x > 8) {
+ throw new ContainerOutOfBoundsException(
+ Consts.COL_OUT_OF_BOUNDS + " " + x,
+ new IllegalArgumentException()
+ );
+ }
+ List column = Arrays.asList(new SudokuField[Consts.SIZE]);
+ for (int i = 0; i < Consts.SIZE; i++) {
+ column.set(i, board.get(i).get(x));
+ }
+ return new SudokuColumn(column);
+ }
+
+ public SudokuBox getBox(int x, int y) throws SudokuBoardException, SudokuContainerException {
+ if (x < 0 || x >= Consts.SIZE) {
+ throw new ContainerOutOfBoundsException(
+ Consts.COL_OUT_OF_BOUNDS + " " + x,
+ new IllegalArgumentException()
+ );
+ }
+ if (y < 0 || y >= Consts.SIZE) {
+ throw new ContainerOutOfBoundsException(
+ Consts.ROW_OUT_OF_BOUNDS + " " + y,
+ new IllegalArgumentException()
+ );
+ }
+
+ List box = Arrays.asList(new SudokuField[Consts.SIZE]);
+ int k = 0;
+ //Get first indexes of box
+ int boxY = (y % Consts.BOX_SIZE) * Consts.BOX_SIZE;
+ int boxX = (x % Consts.BOX_SIZE) * Consts.BOX_SIZE;
+ for (int i = boxY; i < boxY + Consts.BOX_SIZE; i++) {
+ for (int j = boxX; j < boxX + Consts.BOX_SIZE; j++) {
+ box.set(k++, board.get(i).get(j));
+ }
+ }
+ return new SudokuBox(box);
+ }
+
+ public void setInitialValues(List> initialValues) {
+ this.initialValues = Objects.requireNonNull(initialValues);
+ }
+
+ public void setUserBoard(List> userBoard) {
+ this.userBoard = Objects.requireNonNull(userBoard);
+ }
+
+ public Difficulty getDifficulty() {
+ return difficulty;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ SudokuBoard that = (SudokuBoard) o;
+
+ return new EqualsBuilder()
+ .append(board, that.board)
+ .isEquals();
+ }
+
+ @Override
+ public final int hashCode() {
+ return new HashCodeBuilder(17, 37)
+ .append(board)
+ .toHashCode();
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .append("sudokuSolver", sudokuSolver)
+ .append("board", board)
+ .toString();
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ public SudokuBoard clone() {
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ try {
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+ objectOutputStream.writeObject(this);
+
+ ByteArrayInputStream byteArrayInputStream =
+ new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+ ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
+ try {
+ return (SudokuBoard) objectInputStream.readObject();
+ } catch (ClassNotFoundException exception) {
+ return null;
+ }
+ } catch (IOException exception) {
+ return null;
+ }
+
+ }
+
+ public void setDifficulty(Difficulty difficulty) {
+ this.difficulty = difficulty;
+ }
+}
\ No newline at end of file
diff --git a/Model/src/main/java/sudoku/model/SudokuBox.java b/Model/src/main/java/sudoku/model/SudokuBox.java
new file mode 100644
index 0000000..ae8e986
--- /dev/null
+++ b/Model/src/main/java/sudoku/model/SudokuBox.java
@@ -0,0 +1,16 @@
+package sudoku.model;
+
+import java.util.List;
+import sudoku.exceptions.SudokuContainerException;
+
+public class SudokuBox extends SudokuContainer {
+
+ public SudokuBox(List values) throws SudokuContainerException {
+ super(values);
+ }
+
+ @Override
+ protected SudokuBox clone() throws CloneNotSupportedException {
+ return (SudokuBox) super.clone();
+ }
+}
diff --git a/Model/src/main/java/sudoku/model/SudokuColumn.java b/Model/src/main/java/sudoku/model/SudokuColumn.java
new file mode 100644
index 0000000..f6cd73d
--- /dev/null
+++ b/Model/src/main/java/sudoku/model/SudokuColumn.java
@@ -0,0 +1,15 @@
+package sudoku.model;
+
+import java.util.List;
+import sudoku.exceptions.SudokuContainerException;
+
+public class SudokuColumn extends SudokuContainer {
+ public SudokuColumn(List values) throws SudokuContainerException {
+ super(values);
+ }
+
+ @Override
+ protected SudokuColumn clone() throws CloneNotSupportedException {
+ return (SudokuColumn) super.clone();
+ }
+}
diff --git a/Model/src/main/java/sudoku/model/SudokuContainer.java b/Model/src/main/java/sudoku/model/SudokuContainer.java
new file mode 100644
index 0000000..c65814b
--- /dev/null
+++ b/Model/src/main/java/sudoku/model/SudokuContainer.java
@@ -0,0 +1,86 @@
+package sudoku.model;
+
+import java.io.Serializable;
+import java.security.InvalidParameterException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import sudoku.consts.Consts;
+import sudoku.exceptions.InvalidContainerLengthException;
+import sudoku.exceptions.NullContainerException;
+import sudoku.exceptions.SudokuContainerException;
+
+public abstract class SudokuContainer implements Serializable, Cloneable {
+
+ protected final List values;
+ private final HashSet set = new HashSet<>();
+
+ public SudokuContainer(List values) throws SudokuContainerException {
+ try {
+ this.values = Objects.requireNonNull(values, Consts.NULL_ARRAY);
+ } catch (NullPointerException exception) {
+ throw new NullContainerException(
+ Consts.NULL_ARRAY,
+ exception
+ );
+ }
+ if (values.size() != Consts.SIZE) {
+ throw new InvalidContainerLengthException(
+ Consts.INVALID_LENGTH,
+ new InvalidParameterException()
+ );
+ }
+ for (SudokuField field : values) {
+ try {
+ Objects.requireNonNull(field, Consts.NULL_ELEMENT);
+ } catch (NullPointerException exception) {
+ throw new NullContainerException(Consts.NULL_ARRAY, exception);
+ }
+ }
+ }
+
+ public boolean verify() {
+ set.clear();
+ set.addAll(values);
+ return set.size() == Consts.SIZE;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ SudokuContainer that = (SudokuContainer) o;
+
+ return new EqualsBuilder()
+ .append(values, that.values)
+ .isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(19, 41)
+ .append(values)
+ .toHashCode();
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .append("values", values)
+ .toString();
+ }
+
+ @Override
+ protected SudokuContainer clone() throws CloneNotSupportedException {
+ return (SudokuContainer) super.clone();
+ }
+}
diff --git a/Model/src/main/java/sudoku/model/SudokuField.java b/Model/src/main/java/sudoku/model/SudokuField.java
new file mode 100644
index 0000000..dcfc0da
--- /dev/null
+++ b/Model/src/main/java/sudoku/model/SudokuField.java
@@ -0,0 +1,68 @@
+package sudoku.model;
+
+import java.io.Serializable;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import sudoku.consts.Consts;
+import sudoku.exceptions.InvalidFieldValueException;
+
+public class SudokuField implements Serializable, Cloneable, Comparable {
+
+ private int value;
+
+ public int getFieldValue() {
+ return value;
+ }
+
+ public void setFieldValue(int value) throws InvalidFieldValueException {
+ if (value < 0 || value > Consts.MAX_VALUE) {
+ throw new InvalidFieldValueException(
+ Consts.INVALID_VALUE,
+ new IllegalArgumentException()
+ );
+ }
+ this.value = value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ SudokuField that = (SudokuField) o;
+
+ return new EqualsBuilder()
+ .append(value, that.value)
+ .isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(13, 31)
+ .append(value)
+ .toHashCode();
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .append("value", value)
+ .toString();
+ }
+
+ @Override
+ protected SudokuField clone() throws CloneNotSupportedException {
+ return (SudokuField) super.clone();
+ }
+
+ @Override
+ public int compareTo(SudokuField o) {
+ return Integer.compare(this.getFieldValue(), o.getFieldValue());
+ }
+}
\ No newline at end of file
diff --git a/Model/src/main/java/sudoku/model/SudokuRow.java b/Model/src/main/java/sudoku/model/SudokuRow.java
new file mode 100644
index 0000000..11ee6ba
--- /dev/null
+++ b/Model/src/main/java/sudoku/model/SudokuRow.java
@@ -0,0 +1,16 @@
+package sudoku.model;
+
+import java.util.List;
+import sudoku.exceptions.SudokuContainerException;
+
+public class SudokuRow extends SudokuContainer {
+
+ public SudokuRow(List values) throws SudokuContainerException {
+ super(values);
+ }
+
+ @Override
+ protected SudokuRow clone() throws CloneNotSupportedException {
+ return (SudokuRow) super.clone();
+ }
+}
diff --git a/Model/src/main/java/sudoku/solver/BacktrackingSudokuSolver.java b/Model/src/main/java/sudoku/solver/BacktrackingSudokuSolver.java
new file mode 100644
index 0000000..3740045
--- /dev/null
+++ b/Model/src/main/java/sudoku/solver/BacktrackingSudokuSolver.java
@@ -0,0 +1,84 @@
+package sudoku.solver;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import sudoku.consts.Consts;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.gamestate.BoardType;
+import sudoku.model.SudokuBoard;
+
+public class BacktrackingSudokuSolver implements SudokuSolver {
+
+ private final ArrayList values = makeList();
+
+ private ArrayList makeList() {
+ ArrayList list = new ArrayList<>();
+ for (int i = 1; i <= Consts.SIZE; i++) {
+ list.add(i);
+ }
+ return list;
+ }
+
+ private boolean isNumberValid(SudokuBoard board, int x, int y, int value) throws
+ FieldOutOfBoundsException {
+ for (int i = 0; i < Consts.SIZE; i++) {
+ if (board.getField(i, y, BoardType.ORIGINAL) == value
+ || board.getField(x, i, BoardType.ORIGINAL) == value) {
+ return false;
+ }
+ }
+
+ int sectionSize = (int) Math.sqrt(Consts.SIZE);
+ int sectionFirstRow = x - x % sectionSize;
+ int sectionFirstCol = y - y % sectionSize;
+
+ for (int i = sectionFirstRow; i < sectionFirstRow + sectionSize; i++) {
+ for (int j = sectionFirstCol; j < sectionFirstCol + sectionSize; j++) {
+ if (board.getField(i, j, BoardType.ORIGINAL) == value) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ private boolean backtrackingAlgorithm(SudokuBoard board, int x, int y) throws
+ FieldOutOfBoundsException, InvalidFieldValueException {
+ boolean valid = false;
+
+ Collections.shuffle(values);
+ for (int i = 0; i < values.size() && !valid; i++) {
+ if (isNumberValid(board, x, y, values.get(i))) {
+ board.setField(x, y, values.get(i), BoardType.ORIGINAL);
+ if (x == Consts.SIZE - 1) {
+ if (y == Consts.SIZE - 1) {
+ return true;
+ }
+ valid = backtrackingAlgorithm(board, 0, y + 1);
+ } else {
+ valid = backtrackingAlgorithm(board, x + 1, y);
+ }
+ }
+ }
+ if (!valid) {
+ board.setField(x, y, Consts.UNINITIALIZED, BoardType.ORIGINAL);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void solve(SudokuBoard board) throws
+ FieldOutOfBoundsException, InvalidFieldValueException {
+ if (board.getField(0, 0, BoardType.ORIGINAL) != Consts.UNINITIALIZED) {
+ for (int i = 0; i < Consts.SIZE; i++) {
+ for (int j = 0; j < Consts.SIZE; j++) {
+ board.setField(j, i, Consts.UNINITIALIZED, BoardType.ORIGINAL);
+ }
+ }
+ }
+ backtrackingAlgorithm(board, 0, 0);
+ }
+}
\ No newline at end of file
diff --git a/Model/src/main/java/sudoku/solver/SudokuSolver.java b/Model/src/main/java/sudoku/solver/SudokuSolver.java
new file mode 100644
index 0000000..7b13083
--- /dev/null
+++ b/Model/src/main/java/sudoku/solver/SudokuSolver.java
@@ -0,0 +1,10 @@
+package sudoku.solver;
+
+import java.io.Serializable;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.model.SudokuBoard;
+
+public interface SudokuSolver extends Serializable {
+ void solve(SudokuBoard board) throws FieldOutOfBoundsException, InvalidFieldValueException;
+}
diff --git a/Model/src/test/java/sudoku/dao/FileSudokuBoardDaoTest.java b/Model/src/test/java/sudoku/dao/FileSudokuBoardDaoTest.java
new file mode 100644
index 0000000..d4ce1c0
--- /dev/null
+++ b/Model/src/test/java/sudoku/dao/FileSudokuBoardDaoTest.java
@@ -0,0 +1,56 @@
+package sudoku.dao;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.exceptions.ReadBoardException;
+import sudoku.exceptions.WriteBoardException;
+import sudoku.model.SudokuBoard;
+import sudoku.solver.BacktrackingSudokuSolver;
+
+class FileSudokuBoardDaoTest {
+ private final static String fileName = "SavedBoard.board";
+ private final static SudokuBoard board = new SudokuBoard(new BacktrackingSudokuSolver());
+ private final Dao fileSudokuBoardDao =
+ new SudokuBoardDaoFactory().getFileDao(fileName);
+
+ @BeforeAll
+ static void initialize() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ board.solveGame();
+ }
+
+ @Test
+ void writeTest() throws WriteBoardException {
+ fileSudokuBoardDao.write(board);
+ File file = new File(fileName);
+ Assertions.assertTrue(file.exists());
+ Assertions.assertTrue(file.length() > 0);
+ }
+
+ @Test
+ void readTest() throws ReadBoardException {
+ SudokuBoard loadedBoard = fileSudokuBoardDao.read();
+ Assertions.assertNotNull(loadedBoard);
+ Assertions.assertEquals(loadedBoard, board);
+ }
+
+ @Test
+ void closeTest() {
+ try (FileSudokuBoardDao ignored = new FileSudokuBoardDao(fileName)) {
+ Assertions.assertTrue(true);
+ }
+ }
+
+ @AfterAll
+ static void cleanup() {
+ File file = new File(fileName);
+ if (file.exists()) {
+ Assertions.assertTrue(file.delete());
+ }
+ }
+}
\ No newline at end of file
diff --git a/Model/src/test/java/sudoku/gamestate/GameStateTest.java b/Model/src/test/java/sudoku/gamestate/GameStateTest.java
new file mode 100644
index 0000000..5ed1f1d
--- /dev/null
+++ b/Model/src/test/java/sudoku/gamestate/GameStateTest.java
@@ -0,0 +1,25 @@
+package sudoku.gamestate;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+
+class GameStateTest {
+
+ @Test
+ public void GameStateConstructionTest() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ GameState gameState = new GameState(Difficulty.NORMAL);
+ byte zerosCount = 0;
+
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ if (gameState.getBoard().getField(i, j, BoardType.USER) == 0) {
+ zerosCount++;
+ }
+ }
+ }
+ Assertions.assertEquals(Difficulty.NORMAL.getValue(), zerosCount);
+ }
+
+}
\ No newline at end of file
diff --git a/Model/src/test/java/sudoku/model/SudokuBoardTest.java b/Model/src/test/java/sudoku/model/SudokuBoardTest.java
new file mode 100644
index 0000000..12cc5a7
--- /dev/null
+++ b/Model/src/test/java/sudoku/model/SudokuBoardTest.java
@@ -0,0 +1,165 @@
+package sudoku.model;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import sudoku.consts.Consts;
+import sudoku.exceptions.ContainerOutOfBoundsException;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.exceptions.SudokuBoardException;
+import sudoku.exceptions.SudokuContainerException;
+import sudoku.gamestate.BoardType;
+import sudoku.solver.BacktrackingSudokuSolver;
+
+class SudokuBoardTest {
+
+ private final SudokuBoard sudokuBoard = new SudokuBoard(new BacktrackingSudokuSolver());
+
+ @Test
+ public void getFieldTest() throws FieldOutOfBoundsException {
+ Assertions.assertThrows(
+ FieldOutOfBoundsException.class,
+ () -> sudokuBoard.getField(-1, 4, BoardType.ORIGINAL));
+
+ Assertions.assertEquals(sudokuBoard.getField(0, 0, BoardType.ORIGINAL), 0);
+ }
+
+ @Test
+ public void setFieldTest() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ Assertions.assertThrows(
+ FieldOutOfBoundsException.class,
+ () -> sudokuBoard.setField(-1, 4, 1, BoardType.ORIGINAL));
+
+ Assertions.assertThrows(
+ InvalidFieldValueException.class,
+ () -> sudokuBoard.setField(1, 4, -1, BoardType.ORIGINAL));
+
+ sudokuBoard.setField(0, 0, 1, BoardType.ORIGINAL);
+ Assertions.assertEquals(sudokuBoard.getField(0, 0, BoardType.ORIGINAL), 1);
+ }
+
+ @Test
+ public void getColumnTest() throws ContainerOutOfBoundsException, SudokuContainerException {
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getColumn(-1));
+
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getColumn(9));
+
+ Assertions.assertNotEquals(sudokuBoard.getColumn(0).values.size(), 0);
+
+ for (SudokuField f : sudokuBoard.getColumn(0).values) {
+ Assertions.assertEquals(f.getFieldValue(), 0);
+ }
+ }
+
+ @Test
+ public void getRowTest() throws ContainerOutOfBoundsException, SudokuContainerException {
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getRow(-1));
+
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getRow(9));
+
+ for (SudokuField f : sudokuBoard.getRow(0).values) {
+ Assertions.assertEquals(f.getFieldValue(), 0);
+ }
+ }
+
+ @Test
+ public void getBoxTest() throws SudokuBoardException, SudokuContainerException {
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getBox(-1, 5));
+
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getBox(5, -1));
+
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getBox(9, 4));
+
+ Assertions.assertThrows(
+ ContainerOutOfBoundsException.class,
+ () -> sudokuBoard.getBox(5, 9));
+
+ for (SudokuField f : sudokuBoard.getBox(0, 0).values) {
+ Assertions.assertEquals(f.getFieldValue(), 0);
+ }
+ }
+
+ @Test
+ public void equalsTest() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ Assertions.assertNotEquals(sudokuBoard, null);
+ Assertions.assertNotEquals(sudokuBoard, new SudokuField());
+ Assertions.assertEquals(sudokuBoard, sudokuBoard);
+
+ sudokuBoard.setField(0, 0, 2, BoardType.ORIGINAL);
+ SudokuBoard newSudokuBoard = sudokuBoard;
+ Assertions.assertEquals(sudokuBoard, newSudokuBoard);
+
+ newSudokuBoard = new SudokuBoard(new BacktrackingSudokuSolver());
+ Assertions.assertNotEquals(sudokuBoard, newSudokuBoard);
+
+ for (int i = 0; i < Consts.SIZE; i++) {
+ for (int j = 0; j < Consts.SIZE; j++) {
+ sudokuBoard.setField(i, j, 1, BoardType.ORIGINAL);
+ newSudokuBoard.setField(i, j, 1, BoardType.ORIGINAL);
+ }
+ }
+ Assertions.assertEquals(sudokuBoard, newSudokuBoard);
+ }
+
+ @Test
+ public void hashCodeTest() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ SudokuBoard newSudokuBoard = new SudokuBoard(new BacktrackingSudokuSolver());
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ newSudokuBoard.setField(i, j, sudokuBoard.getField(i, j, BoardType.ORIGINAL),
+ BoardType.ORIGINAL);
+ }
+ }
+
+ Assertions.assertEquals(sudokuBoard.hashCode(), newSudokuBoard.hashCode());
+
+ newSudokuBoard.setField(0, 0, 9, BoardType.ORIGINAL);
+ newSudokuBoard.setField(1, 0, 9, BoardType.ORIGINAL);
+ Assertions.assertNotEquals(sudokuBoard.hashCode(), newSudokuBoard.hashCode());
+ }
+
+ @Test
+ public void toStringTest() {
+ Assertions.assertEquals(sudokuBoard.toString(), sudokuBoard.toString());
+ Assertions.assertNotEquals(
+ sudokuBoard.toString(),
+ new SudokuBoard(new BacktrackingSudokuSolver()).toString()
+ );
+ }
+
+ @Test
+ public void cloneTest() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ sudokuBoard.solveGame();
+ SudokuBoard clonedSudokuBoard = sudokuBoard.clone();
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ Assertions.assertEquals(
+ sudokuBoard.getField(i, j, BoardType.ORIGINAL),
+ clonedSudokuBoard.getField(i, j, BoardType.ORIGINAL)
+ );
+ }
+ }
+
+ sudokuBoard.setField(0, 0, 3, BoardType.ORIGINAL);
+ clonedSudokuBoard.setField(0, 0, 4, BoardType.ORIGINAL);
+
+ Assertions.assertNotEquals(
+ sudokuBoard.getField(0, 0, BoardType.ORIGINAL),
+ clonedSudokuBoard.getField(0, 0, BoardType.ORIGINAL)
+ );
+ }
+}
\ No newline at end of file
diff --git a/Model/src/test/java/sudoku/model/SudokuContainerTest.java b/Model/src/test/java/sudoku/model/SudokuContainerTest.java
new file mode 100644
index 0000000..fc93252
--- /dev/null
+++ b/Model/src/test/java/sudoku/model/SudokuContainerTest.java
@@ -0,0 +1,113 @@
+package sudoku.model;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import java.util.Arrays;
+import sudoku.exceptions.ContainerOutOfBoundsException;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidContainerLengthException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.exceptions.NullContainerException;
+import sudoku.exceptions.SudokuBoardException;
+import sudoku.exceptions.SudokuContainerException;
+import sudoku.gamestate.BoardType;
+import sudoku.solver.BacktrackingSudokuSolver;
+
+class SudokuContainerTest {
+ private final SudokuBoard testBoard = new SudokuBoard(new BacktrackingSudokuSolver());
+
+ @Test
+ public void constructorTest() {
+ Assertions.assertThrows(
+ NullContainerException.class,
+ () -> new SudokuColumn(null));
+
+ Assertions.assertThrows(
+ NullContainerException.class,
+ () -> new SudokuColumn(Arrays.asList(new SudokuField(), null, null, null, null, null, null, null, null)));
+
+ Assertions.assertThrows(
+ InvalidContainerLengthException.class,
+ () -> new SudokuColumn(Arrays.asList(new SudokuField[4])));
+ }
+
+ @Test
+ public void verifyTest() throws SudokuContainerException, SudokuBoardException, InvalidFieldValueException {
+ SudokuBoard testBoard = new SudokuBoard(new BacktrackingSudokuSolver());
+
+ SudokuRow row = testBoard.getRow(0);
+ SudokuColumn column = testBoard.getColumn(0);
+ SudokuBox box = testBoard.getBox(0, 0);
+
+ Assertions.assertFalse(row.verify());
+ Assertions.assertFalse(column.verify());
+ Assertions.assertFalse(box.verify());
+
+ testBoard.solveGame();
+ row = testBoard.getRow(0);
+ column = testBoard.getColumn(0);
+ box = testBoard.getBox(0, 0);
+
+ Assertions.assertTrue(row.verify());
+ Assertions.assertTrue(column.verify());
+ Assertions.assertTrue(box.verify());
+ }
+
+ @Test
+ public void equalsTest() throws SudokuContainerException, ContainerOutOfBoundsException, FieldOutOfBoundsException, InvalidFieldValueException {
+ SudokuRow firstRow = testBoard.getRow(0);
+ SudokuRow secondRow = testBoard.getRow(1);
+ SudokuColumn column = testBoard.getColumn(0);
+
+ Assertions.assertEquals(firstRow, firstRow);
+ Assertions.assertNotEquals(firstRow, null);
+ Assertions.assertNotEquals(firstRow, column);
+
+ Assertions.assertEquals(firstRow, secondRow);
+
+ testBoard.setField(0, 0, 2, BoardType.ORIGINAL);
+ Assertions.assertNotEquals(firstRow, secondRow);
+ testBoard.setField(0, 1, 2, BoardType.ORIGINAL);
+ Assertions.assertEquals(firstRow, secondRow);
+ }
+
+ @Test
+ public void hashCodeTest() throws FieldOutOfBoundsException, InvalidFieldValueException, SudokuContainerException, ContainerOutOfBoundsException {
+ testBoard.setField(0, 1, 5, BoardType.ORIGINAL);
+
+ Assertions.assertEquals(
+ testBoard.getRow(0).hashCode(),
+ testBoard.getRow(0).hashCode());
+
+ Assertions.assertNotEquals(
+ testBoard.getRow(0).hashCode(),
+ testBoard.getRow(1).hashCode());
+ }
+
+ @Test
+ public void toStringTest() throws SudokuContainerException, ContainerOutOfBoundsException {
+ SudokuRow firstRow = testBoard.getRow(0);
+ SudokuRow secondRow = testBoard.getRow(1);
+ Assertions.assertEquals(firstRow.toString(), firstRow.toString());
+ Assertions.assertNotEquals(firstRow.toString(), secondRow.toString());
+ }
+
+ @Test
+ public void cloneTest() throws CloneNotSupportedException, SudokuContainerException, ContainerOutOfBoundsException, FieldOutOfBoundsException, InvalidFieldValueException {
+ SudokuRow firstRow = testBoard.getRow(0);
+ SudokuRow clonedFirstRow = firstRow.clone();
+
+ int firstFieldValue = testBoard.getField(0, 0, BoardType.ORIGINAL);
+ int secondFieldValue = testBoard.getField(1, 0, BoardType.ORIGINAL);
+
+ testBoard.setField(0, 0, 1, BoardType.ORIGINAL);
+ testBoard.setField(1, 0, 1, BoardType.ORIGINAL);
+
+ Assertions.assertEquals(firstRow.verify(), clonedFirstRow.verify());
+
+ testBoard.setField(0, 0, firstFieldValue, BoardType.ORIGINAL);
+ testBoard.setField(1, 0, secondFieldValue, BoardType.ORIGINAL);
+
+ Assertions.assertEquals(firstRow.verify(), clonedFirstRow.verify());
+ }
+}
\ No newline at end of file
diff --git a/Model/src/test/java/sudoku/model/SudokuFieldTest.java b/Model/src/test/java/sudoku/model/SudokuFieldTest.java
new file mode 100644
index 0000000..c9eb5e4
--- /dev/null
+++ b/Model/src/test/java/sudoku/model/SudokuFieldTest.java
@@ -0,0 +1,84 @@
+package sudoku.model;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import sudoku.exceptions.InvalidFieldValueException;
+
+class SudokuFieldTest {
+ private SudokuField field = new SudokuField();
+ private SudokuField newField = field;
+
+ @Test
+ public void getFieldValueTest() {
+ Assertions.assertEquals(field.getFieldValue(), 0);
+ }
+
+ @Test
+ public void setFieldValueTest() throws InvalidFieldValueException {
+ Assertions.assertThrows(
+ InvalidFieldValueException.class,
+ () -> field.setFieldValue(-1));
+
+ Assertions.assertThrows(
+ InvalidFieldValueException.class,
+ () -> field.setFieldValue(10));
+
+ field.setFieldValue(5);
+ Assertions.assertEquals(5, field.getFieldValue());
+ }
+
+ @Test
+ public void equalsTest() throws InvalidFieldValueException {
+ Assertions.assertNotEquals(field, null);
+ Assertions.assertEquals(field, field);
+
+ Assertions.assertEquals(field, newField);
+
+ newField = new SudokuField();
+ field.setFieldValue(1);
+ Assertions.assertNotEquals(field, newField);
+
+ newField.setFieldValue(1);
+ Assertions.assertEquals(field, newField);
+ }
+
+ @Test
+ public void hashCodeTest() throws InvalidFieldValueException {
+ Assertions.assertEquals(field.hashCode(), newField.hashCode());
+
+ field = new SudokuField();
+ field.setFieldValue(9);
+ newField.setFieldValue(9);
+ Assertions.assertEquals(field.hashCode(), newField.hashCode());
+
+ field.setFieldValue(8);
+ Assertions.assertNotEquals(field.hashCode(), newField.hashCode());
+ }
+
+ @Test
+ public void toStringTest() {
+ newField = new SudokuField();
+ Assertions.assertEquals(field.toString(), field.toString());
+ Assertions.assertNotEquals(field.toString(), newField.toString());
+ }
+
+ @Test
+ public void cloneTest() throws CloneNotSupportedException, InvalidFieldValueException {
+ newField.setFieldValue(7);
+ SudokuField testerField = newField.clone();
+ testerField.setFieldValue(4);
+ Assertions.assertTrue(testerField.getFieldValue() != newField.getFieldValue());
+ }
+
+ @Test
+ public void compareToTest() throws InvalidFieldValueException {
+ newField.setFieldValue(5);
+ SudokuField testerField = new SudokuField();
+ testerField.setFieldValue(4);
+ Assertions.assertEquals(newField.compareTo(testerField), 1);
+ testerField.setFieldValue(5);
+ Assertions.assertEquals(newField.compareTo(testerField), 0);
+ testerField.setFieldValue(6);
+ Assertions.assertEquals(newField.compareTo(testerField), -1);
+ }
+}
\ No newline at end of file
diff --git a/Model/src/test/java/sudoku/solver/BacktrackingSudokuSolverTest.java b/Model/src/test/java/sudoku/solver/BacktrackingSudokuSolverTest.java
new file mode 100644
index 0000000..2248ef3
--- /dev/null
+++ b/Model/src/test/java/sudoku/solver/BacktrackingSudokuSolverTest.java
@@ -0,0 +1,74 @@
+package sudoku.solver;
+
+import java.util.HashSet;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.exceptions.SudokuBoardException;
+import sudoku.exceptions.SudokuContainerException;
+import sudoku.gamestate.BoardType;
+import sudoku.model.SudokuBoard;
+
+class BacktrackingSudokuSolverTest {
+ private final SudokuBoard sudokuBoard = new SudokuBoard(new BacktrackingSudokuSolver());
+ private final SudokuBoard boardOne = new SudokuBoard(new BacktrackingSudokuSolver());
+ private final SudokuBoard boardTwo = new SudokuBoard(new BacktrackingSudokuSolver());
+
+
+ @Test
+ void solveTest() throws SudokuBoardException, InvalidFieldValueException, SudokuContainerException {
+ sudokuBoard.solveGame();
+ HashSet set = new HashSet<>();
+ for (int k = 0; k < 2; k++) {
+ boolean row = k == 0;
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ Assertions.assertFalse(set.contains(sudokuBoard.getField(row ? j : i, row ? i : j, BoardType.ORIGINAL)));
+ set.add(sudokuBoard.getField(row ? j : i, row ? i : j, BoardType.ORIGINAL));
+ }
+ set.clear();
+ }
+ }
+ for (int k = 0; k < 3; k++) {
+ for (int i = (k * 3); i < 3 * (k + 1); i++) {
+ for (int l = 0; l < 3; l++) {
+ for (int j = (l * 3); j < 3 * (l + 1); j++) {
+ set.add(sudokuBoard.getField(j, i, BoardType.ORIGINAL));
+ }
+ }
+ Assertions.assertEquals(9, set.size());
+ set.clear();
+ }
+ }
+
+ sudokuBoard.solveGame();
+ for (int i = 0; i < 9; i++) {
+ Assertions.assertTrue(sudokuBoard.getColumn(i).verify());
+ Assertions.assertTrue(sudokuBoard.getRow(i).verify());
+ }
+ for (int i = 0; i < 6; i += 3) {
+ for (int j = 0; j < 6; j += 3) {
+ Assertions.assertTrue(sudokuBoard.getBox(i, j).verify());
+ }
+ }
+ }
+
+ @Test
+ void boardsDifferencesTest() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ boardOne.solveGame();
+ boardTwo.solveGame();
+ int differences = 0;
+
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ if (boardOne.getField(j, i, BoardType.ORIGINAL) != boardTwo.getField(j, i, BoardType.ORIGINAL)) {
+ differences++;
+ }
+ }
+ }
+
+ Assertions.assertTrue(differences > 0);
+ System.out.println("Boards have " + differences + " different cells");
+ }
+}
\ No newline at end of file
diff --git a/SudokuGameProject.iml b/SudokuGameProject.iml
new file mode 100644
index 0000000..4fd5057
--- /dev/null
+++ b/SudokuGameProject.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/View/SudokuView.iml b/View/SudokuView.iml
new file mode 100644
index 0000000..fb40cca
--- /dev/null
+++ b/View/SudokuView.iml
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/View/pom.xml b/View/pom.xml
new file mode 100644
index 0000000..dd2bca4
--- /dev/null
+++ b/View/pom.xml
@@ -0,0 +1,73 @@
+
+
+
+ SudokuGameProject
+ 3107
+ 2.0
+
+ 4.0.0
+ SudokuView
+ jar
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+ org.openjfx
+ javafx-maven-plugin
+ 0.0.4
+
+ view.Launcher
+
+
+
+
+
+
+
+ org.openjfx
+ javafx-controls
+ 15-ea+3
+
+
+ org.openjfx
+ javafx-fxml
+ 15-ea+3
+
+
+ 3107
+ ModelProject
+ 2.0
+ compile
+
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.13.3
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.13.3
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.7.0-M1
+ test
+
+
+
+
+ UTF-8
+ 11
+ 11
+
+
+
\ No newline at end of file
diff --git a/View/src/main/java/module-info.java b/View/src/main/java/module-info.java
new file mode 100644
index 0000000..54af1e4
--- /dev/null
+++ b/View/src/main/java/module-info.java
@@ -0,0 +1,13 @@
+module View {
+ requires Model;
+ requires java.sql;
+ requires java.desktop;
+ requires javafx.fxml;
+ requires javafx.controls;
+ requires org.apache.logging.log4j;
+ requires org.apache.logging.log4j.core;
+
+ opens view;
+ exports view;
+ exports view.exceptions;
+}
\ No newline at end of file
diff --git a/View/src/main/java/view/Authors_en.java b/View/src/main/java/view/Authors_en.java
new file mode 100644
index 0000000..ec875aa
--- /dev/null
+++ b/View/src/main/java/view/Authors_en.java
@@ -0,0 +1,16 @@
+package view;
+
+import java.util.ListResourceBundle;
+
+public class Authors_en extends ListResourceBundle {
+
+ private final Object[][] contents = {
+ {"1", "Jakub Pietras"},
+ {"2", "Bartłomiej Graczyk"}
+ };
+
+ @Override
+ protected Object[][] getContents() {
+ return contents;
+ }
+}
\ No newline at end of file
diff --git a/View/src/main/java/view/Authors_pl.java b/View/src/main/java/view/Authors_pl.java
new file mode 100644
index 0000000..7e7dcae
--- /dev/null
+++ b/View/src/main/java/view/Authors_pl.java
@@ -0,0 +1,16 @@
+package view;
+
+import java.util.ListResourceBundle;
+
+public class Authors_pl extends ListResourceBundle {
+
+ private final Object[][] contents = {
+ {"1", "Jakub Pietras"},
+ {"2", "Bartłomiej Graczyk"}
+ };
+
+ @Override
+ protected Object[][] getContents() {
+ return contents;
+ }
+}
\ No newline at end of file
diff --git a/View/src/main/java/view/GameController.java b/View/src/main/java/view/GameController.java
new file mode 100644
index 0000000..223464c
--- /dev/null
+++ b/View/src/main/java/view/GameController.java
@@ -0,0 +1,274 @@
+package view;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.Timer;
+import java.util.TimerTask;
+import javafx.collections.ObservableList;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.fxml.Initializable;
+import javafx.scene.Node;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.layout.GridPane;
+import javafx.stage.Modality;
+import javafx.stage.Stage;
+import javax.swing.SwingUtilities;
+import sudoku.exceptions.FieldOutOfBoundsException;
+import sudoku.exceptions.InvalidFieldValueException;
+import sudoku.gamestate.BoardType;
+import sudoku.gamestate.Difficulty;
+import sudoku.gamestate.GameState;
+import sudoku.model.SudokuBoard;
+
+public class GameController implements Initializable {
+
+ @FXML
+ GridPane gridPane;
+
+ @FXML
+ TextField difficulty;
+
+ @FXML
+ TextField gameName;
+
+ @FXML
+ TextField elapsedTime;
+
+ @FXML
+ TextField authors;
+
+ private int i = 0;
+
+ private ResourceBundle resourceBundle;
+
+ private GameState gameState;
+
+ @Override
+ public void initialize(URL url, ResourceBundle resourceBundle) {
+ this.resourceBundle = resourceBundle;
+ addCheckingToFields();
+ authorsDisplay();
+ }
+
+ public void startup(Difficulty difficulty) {
+ Main.logger.info("Created new game, difficulty: " + difficulty.toString());
+ try {
+ gameState = new GameState(difficulty);
+ } catch (FieldOutOfBoundsException | InvalidFieldValueException e) {
+ Main.logger.error("Error creating new GameState - invalid parameters");
+ e.printStackTrace();
+ }
+ resetGUI(difficulty);
+ timerDisplay();
+ }
+
+ private void resetGUI(Difficulty difficulty) {
+ displayGame();
+ resetStyle();
+ this.difficulty.setText(resourceBundle.getString("DifficultyLabel").concat(difficulty.name()));
+ gameName.setText(resourceBundle.getString("GameNameLabel").concat(gameState.getGameName()));
+ }
+
+ @FXML
+ private void resetGame() {
+ gameState.reset();
+ resetGUI(gameState.getDifficulty());
+ }
+
+ GameState getGameState() {
+ return gameState;
+ }
+
+ void updateGameState(SudokuBoard sudokuBoard, String name) {
+ this.gameState = new GameState(sudokuBoard, name);
+ i = 0;
+ resetGUI(gameState.getDifficulty());
+ }
+
+ public void quitGameMode() throws IOException {
+ ResourceBundle bundle = ResourceBundle.getBundle("textMenu", resourceBundle.getLocale());
+ FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("Scenes/main_menu.fxml"), bundle);
+ Parent root = loader.load();
+ Main.stage.setScene(new Scene(root));
+ Main.logger.info("Game closed");
+ }
+
+ void displayGame() {
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ try {
+ setFieldValue(j, i, String.valueOf(gameState.getBoard().getField(j, i, BoardType.USER)));
+ } catch (FieldOutOfBoundsException e) {
+ Main.logger.error("Field indexes are wrong");
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private void addCheckingToFields() {
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ setFieldValidator(j, i, onFieldInput);
+ }
+ }
+ }
+
+ public void newGame() {
+ resetStyle();
+ try {
+ gameState = new GameState(gameState.getDifficulty(), "Sudoku");
+ } catch (FieldOutOfBoundsException | InvalidFieldValueException e) {
+ Main.logger.error("Error creating new GameState - invalid parameters");
+ e.printStackTrace();
+ }
+ Main.logger.info("Created new game");
+ displayGame();
+ }
+
+ private final EventHandler onFieldInput = keyEvent -> {
+ String input = keyEvent.getCharacter();
+ TextField field = (TextField) keyEvent.getTarget();
+ if (!input.matches("[1-9]") && !input.equals("") || field.getText().length() > 1) {
+ if (input.matches("[1-9]")) {
+ field.setText(input);
+ updateFields();
+ } else {
+ field.setText("");
+ }
+ } else {
+ updateFields();
+ }
+ };
+
+ public void verify() throws FieldOutOfBoundsException, InvalidFieldValueException {
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ if (!getField(j, i).getText().equals("")) {
+ gameState.getBoard().setField(j, i, Integer.parseInt(getField(j, i).getText()), BoardType.USER);
+ }
+ getField(j, i).setStyle("-fx-text-fill: black;");
+ if (!getField(j, i).getText().equals("") && !gameState.compareFields(j, i)) {
+ getField(j, i).setStyle("-fx-text-fill: red;");
+ }
+ }
+ }
+ }
+
+ public void solve() throws FieldOutOfBoundsException {
+ SudokuBoard board = gameState.getBoard();
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ getField(j, i).setStyle("-fx-text-fill: black;");
+ getField(j, i).setText(Integer.toString(board.getField(j, i, BoardType.ORIGINAL)));
+ }
+ }
+ Main.logger.info("Performed solve operation");
+ }
+
+ public void resetStyle() {
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+ getField(j, i).setStyle("-fx-text-fill: black;");
+ }
+ }
+ }
+
+ public void openSaveBoardMenu() {
+ ResourceBundle bundle = ResourceBundle.getBundle("textSave", resourceBundle.getLocale());
+ FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("Scenes/save_menu.fxml"), bundle);
+
+ try {
+ Parent root = loader.load();
+ Stage stage = new Stage();
+ SaveController saveController = loader.getController();
+ saveController.startup(this);
+ stage.setScene(new Scene(root));
+ stage.setTitle("Menu");
+ stage.initModality(Modality.APPLICATION_MODAL);
+ stage.showAndWait();
+
+ } catch (IOException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ public void openLoadBoardMenu() {
+ ResourceBundle bundle = ResourceBundle.getBundle("textLoad", resourceBundle.getLocale());
+ FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("Scenes/load_menu.fxml"), bundle);
+
+ try {
+ Parent root = loader.load();
+ Stage stage = new Stage();
+ LoadController loadController = loader.getController();
+ loadController.startup(this);
+ stage.setScene(new Scene(root));
+ stage.setTitle("Menu");
+ stage.initModality(Modality.APPLICATION_MODAL);
+ stage.showAndWait();
+
+ } catch (IOException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ private void updateFields() {
+ try {
+ for (int i = 0; i < 9; i++) {
+ for (int j = 0; j < 9; j++) {
+
+ String fieldValue = getField(j, i).getText();
+ int boardIntValue = gameState.getBoard().getField(j, i, BoardType.USER);
+ String boardValue = Integer.toString(boardIntValue);
+
+ if (!fieldValue.equals("") && !fieldValue.equals(boardValue)) {
+ int parsedValue = Integer.parseInt(fieldValue);
+ gameState.getBoard().setField(j, i, parsedValue, BoardType.USER);
+ return;
+ }
+ }
+ }
+ } catch (FieldOutOfBoundsException | InvalidFieldValueException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ private TextField getField(int x, int y) {
+ ObservableList subGrids = gridPane.getChildren();
+ ObservableList boxFields = ((GridPane) subGrids.get(((y / 3) * 3) + (x / 3))).getChildren();
+ return (TextField) (boxFields.get(((y % 3) * 3) + (x % 3)));
+ }
+
+ private void setFieldValue(int x, int y, String value) {
+ getField(x, y).setText(!value.equals("0") ? value : "");
+ }
+
+ private void setFieldValidator(int x, int y, EventHandler validator) {
+ getField(x, y).setOnKeyTyped(validator);
+ }
+
+ private void authorsDisplay() {
+ ResourceBundle authorsList = ResourceBundle.getBundle("view.Authors", Locale.getDefault());
+ authors.setText(resourceBundle.getString("AuthorsLabel").concat(
+ authorsList.getObject("1") + " & " + authorsList.getObject("2")));
+ }
+
+ private void timerDisplay() {
+ Timer timer = new Timer();
+ timer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ SwingUtilities.invokeLater(
+ () -> elapsedTime.setText(resourceBundle.getString("TimeLabel") + i++)
+ );
+ }
+ }, 0, 1000);
+ }
+}
\ No newline at end of file
diff --git a/View/src/main/java/view/Launcher.java b/View/src/main/java/view/Launcher.java
new file mode 100644
index 0000000..a45b498
--- /dev/null
+++ b/View/src/main/java/view/Launcher.java
@@ -0,0 +1,7 @@
+package view;
+
+public class Launcher {
+ public static void main(String[] args) {
+ Main.main(args);
+ }
+}
diff --git a/View/src/main/java/view/LoadController.java b/View/src/main/java/view/LoadController.java
new file mode 100644
index 0000000..26fc4dc
--- /dev/null
+++ b/View/src/main/java/view/LoadController.java
@@ -0,0 +1,168 @@
+package view;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+import java.util.ResourceBundle;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.Node;
+import javafx.scene.control.ListView;
+import javafx.scene.control.TextField;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import sudoku.database.Board;
+import sudoku.database.DatabaseManager;
+import sudoku.dao.Dao;
+import sudoku.model.SudokuBoard;
+import sudoku.dao.SudokuBoardDaoFactory;
+import sudoku.exceptions.ReadBoardException;
+
+public class LoadController implements Initializable {
+ private GameController gameController;
+
+ @FXML
+ private TextField pathTextField;
+
+ @FXML
+ private TextField status;
+
+ @FXML
+ private TextField idField;
+
+ @FXML
+ private TextField nameField;
+
+ @FXML
+ private ListView listView;
+
+ private ResourceBundle resourceBundle;
+
+ @Override
+ public void initialize(URL url, ResourceBundle resourceBundle) {
+ this.resourceBundle = resourceBundle;
+ }
+
+ public void startup(GameController gameController) {
+ this.gameController = gameController;
+ }
+
+ @FXML
+ private void selectBoardFile() {
+ FileChooser fileChooser = new FileChooser();
+ File file = fileChooser.showOpenDialog(Main.stage);
+ if (file != null) {
+ pathTextField.setText(file.getAbsolutePath());
+ status.setText(resourceBundle.getString("file_selected"));
+ } else {
+ Main.logger.error("Wrong file or none selected");
+ }
+ }
+
+ @FXML
+ private void loadBoardFromFile() {
+ File file = new File(pathTextField.getText());
+ if (file.exists()) {
+ String path = pathTextField.getText();
+ Dao fileSudokuBoardDao = new SudokuBoardDaoFactory().getFileDao(path);
+ SudokuBoard board = null;
+ try {
+ board = fileSudokuBoardDao.read();
+ status.setText(resourceBundle.getString("board_file_loaded"));
+ } catch (ReadBoardException exception) {
+ Main.logger.error("Could not read selected file");
+ exception.printStackTrace();
+ }
+ gameController.updateGameState(board, gameController.getGameState().getGameName());
+ gameController.displayGame();
+
+ } else {
+ status.setText(resourceBundle.getString("board_file_failed"));
+ }
+ }
+
+ @FXML
+ private void loadSelected() {
+ String selection = listView.getSelectionModel().getSelectedItem();
+ if (selection != null) {
+ selection = selection.substring(0, selection.indexOf(' '));
+ if (!idField.getText().equals(selection)) {
+ idField.setText(selection);
+ } else {
+ loadBoardById();
+ idField.setText("");
+ }
+ }
+ }
+
+ @FXML
+ private void loadBoardById() {
+ DatabaseManager databaseManager = new DatabaseManager();
+
+ try {
+ long id = Long.parseLong(idField.getText());
+ String gameName = databaseManager.getNameFromId(id);
+ Dao sudokuBoardDao = new SudokuBoardDaoFactory().getJpaDao(id);
+ SudokuBoard sudokuBoard = sudokuBoardDao.read();
+ Main.logger.info(gameName);
+
+ if (sudokuBoard != null) {
+ gameController.updateGameState(sudokuBoard, gameName);
+ status.setText(resourceBundle.getString("db_loaded"));
+ } else {
+ status.setText(resourceBundle.getString("no_record"));
+ }
+ } catch (NumberFormatException exception) {
+ status.setText(resourceBundle.getString("invalid_id"));
+ } catch (ReadBoardException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ @FXML
+ private void loadBoardByName() {
+ String gameName = nameField.getText();
+ Dao sudokuBoardDao = new SudokuBoardDaoFactory().getJpaDao(gameName);
+
+ try {
+ SudokuBoard sudokuBoard = sudokuBoardDao.read();
+ if (sudokuBoard != null) {
+ gameController.updateGameState(sudokuBoard, gameName);
+ status.setText(resourceBundle.getString("db_loaded"));
+ } else {
+ status.setText(resourceBundle.getString("no_record"));
+ }
+ } catch (ReadBoardException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ @FXML
+ private void displayDatabaseEntries() {
+ DatabaseManager databaseManager = new DatabaseManager();
+ List boards = databaseManager.getAllEntries();
+ databaseManager.releaseResources();
+ ObservableList results = FXCollections.observableArrayList();
+
+ for (Board board : boards) {
+ results.add(board.getId().toString() + " " + board.getName() + " " + board.getDifficulty());
+ }
+ listView.setItems(results);
+
+ if (results.isEmpty()) {
+ status.setText(resourceBundle.getString("no_results"));
+ } else {
+ status.setText(resourceBundle.getString("finished"));
+ }
+ }
+
+ @FXML
+ private void returnToGame(ActionEvent event) {
+ Node source = (Node) event.getSource();
+ Stage thisStage = (Stage) source.getScene().getWindow();
+ thisStage.close();
+ }
+}
\ No newline at end of file
diff --git a/View/src/main/java/view/Main.java b/View/src/main/java/view/Main.java
new file mode 100644
index 0000000..3c1c4d2
--- /dev/null
+++ b/View/src/main/java/view/Main.java
@@ -0,0 +1,46 @@
+package view;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.ResourceBundle;
+
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+import javafx.stage.WindowEvent;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class Main extends Application {
+
+ static Stage stage;
+ static ResourceBundle resourceBundle;
+ final static Logger logger = LogManager.getLogger("Main");
+
+ public static void main(String[] args) {
+ launch(args);
+ }
+
+ @Override
+ public void start(Stage primaryStage) {
+ try {
+ stage = primaryStage;
+ Locale locale = new Locale("en", "UK");
+ resourceBundle = ResourceBundle.getBundle("textMenu", locale);
+ Parent root = FXMLLoader.load(
+ Objects.requireNonNull(
+ getClass().getClassLoader().getResource("Scenes/main_menu.fxml")),
+ resourceBundle
+ );
+ primaryStage.setTitle("Sudoku");
+ primaryStage.setScene(new Scene(root));
+ primaryStage.getScene().getStylesheets().add("Styles/main_menu_style.css");
+ primaryStage.setOnCloseRequest((WindowEvent we) -> System.exit(0));
+ primaryStage.show();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/View/src/main/java/view/MenuController.java b/View/src/main/java/view/MenuController.java
new file mode 100644
index 0000000..25bae59
--- /dev/null
+++ b/View/src/main/java/view/MenuController.java
@@ -0,0 +1,93 @@
+package view;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import javafx.application.Platform;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.fxml.Initializable;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.control.RadioButton;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.input.MouseEvent;
+import sudoku.gamestate.Difficulty;
+import view.exceptions.IOLanguageFileException;
+import view.exceptions.IllegalDifficultyException;
+
+public class MenuController implements Initializable {
+
+ @FXML
+ Button enLang;
+
+ @FXML
+ Button plLang;
+
+ @FXML
+ private ToggleGroup difficultyGroup;
+
+ private ResourceBundle resourceBundle;
+
+ @FXML
+ private final EventHandler onLanguageSelect = actionEvent -> {
+ String lang = ((Button) actionEvent.getSource()).getText();
+ try {
+ setLanguage(lang.toLowerCase());
+ } catch (IOException e) {
+ Main.logger.error("Could not find language file");
+ throw new IOLanguageFileException(resourceBundle.getString("NoLangFile"), e);
+ }
+ };
+
+
+ @Override
+ public void initialize(URL url, ResourceBundle resourceBundle) {
+ this.resourceBundle = resourceBundle;
+ plLang.setOnMouseClicked(onLanguageSelect);
+ enLang.setOnMouseClicked(onLanguageSelect);
+ }
+
+ public void startGame() throws IOException, IllegalDifficultyException {
+ Main.logger.info("Starting new game");
+ ResourceBundle bundle = ResourceBundle.getBundle("textGame", resourceBundle.getLocale());
+ FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("Scenes/game.fxml"), bundle);
+ Difficulty difficulty;
+ String level = ((RadioButton) difficultyGroup.getSelectedToggle()).getText();
+ if (level.equals((resourceBundle.getString("EasyRadioButton")))) {
+ difficulty = Difficulty.EASY;
+ } else if (level.equals((resourceBundle.getString("NormalRadioButton")))) {
+ difficulty = Difficulty.NORMAL;
+ } else if (level.equals((resourceBundle.getString("HardRadioButton")))) {
+ difficulty = Difficulty.HARD;
+ } else {
+ Main.logger.error("Invalid difficulty state");
+ throw new IllegalDifficultyException(
+ bundle.getString("IllegalDifficulty") + difficultyGroup.getSelectedToggle().toString()
+ );
+ }
+ Parent root = loader.load();
+ GameController gameController = loader.getController();
+ gameController.startup(difficulty);
+ Main.stage.setScene(new Scene(root));
+ }
+
+ private void setLanguage(String language) throws IOException {
+ Locale locale = new Locale(language);
+ Locale.setDefault(locale);
+ resourceBundle = ResourceBundle.getBundle("textMenu", locale);
+
+ FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("Scenes/main_menu.fxml"), resourceBundle);
+ Parent root = loader.load();
+ Main.stage.setScene(new Scene(root));
+ }
+
+ public void quitApplication() {
+ Main.logger.info("Exiting application");
+ Platform.exit();
+ System.exit(0);
+ }
+}
diff --git a/View/src/main/java/view/SaveController.java b/View/src/main/java/view/SaveController.java
new file mode 100644
index 0000000..555b39a
--- /dev/null
+++ b/View/src/main/java/view/SaveController.java
@@ -0,0 +1,125 @@
+package view;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+import java.util.ResourceBundle;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.Node;
+import javafx.scene.control.ListView;
+import javafx.scene.control.TextField;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import sudoku.dao.Dao;
+import sudoku.dao.SudokuBoardDaoFactory;
+import sudoku.database.Board;
+import sudoku.database.DatabaseManager;
+import sudoku.exceptions.WriteBoardException;
+import sudoku.model.SudokuBoard;
+
+public class SaveController implements Initializable {
+ private GameController gameController;
+
+ @FXML
+ private TextField name;
+
+ @FXML
+ private TextField status;
+
+ @FXML
+ private ListView listView;
+
+ private ResourceBundle resourceBundle;
+
+ @Override
+ public void initialize(URL url, ResourceBundle resourceBundle) {
+ this.resourceBundle = resourceBundle;
+ }
+
+ public void startup(GameController gameController) {
+ this.gameController = gameController;
+ }
+
+ @FXML
+ private void saveBoardToFile() {
+ FileChooser fileChooser = new FileChooser();
+ File file = fileChooser.showSaveDialog(Main.stage);
+ if (file != null) {
+ Dao fileSudokuBoardDao = new SudokuBoardDaoFactory().getFileDao(file.getAbsolutePath());
+ try {
+ fileSudokuBoardDao.write(gameController.getGameState().getBoard());
+ status.setText(resourceBundle.getString("saved_file"));
+ } catch (WriteBoardException e) {
+ Main.logger.error("Could not save board to selected file");
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @FXML
+ private void displayDatabaseEntries() {
+ DatabaseManager databaseManager = new DatabaseManager();
+ List boards = databaseManager.getAllEntries();
+ databaseManager.releaseResources();
+ ObservableList results = FXCollections.observableArrayList();
+
+ for (Board board : boards) {
+ results.add(board.getId().toString() + " " + board.getName() + " " + board.getDifficulty());
+ }
+ listView.setItems(results);
+
+ if (results.isEmpty()) {
+ status.setText(resourceBundle.getString("no_results"));
+ } else {
+ status.setText(resourceBundle.getString("finished"));
+ }
+ }
+
+ @FXML
+ private void deleteAllRecords() {
+ DatabaseManager databaseManager = new DatabaseManager();
+ databaseManager.removeAll();
+ databaseManager.releaseResources();
+ displayDatabaseEntries();
+ }
+
+ @FXML
+ private void deleteNamedRecord() {
+ DatabaseManager databaseManager = new DatabaseManager();
+ databaseManager.removeData(name.getText());
+ databaseManager.releaseResources();
+ displayDatabaseEntries();
+ }
+
+ @FXML
+ private void saveToDatabase() {
+ if (!name.getText().equals("")) {
+ DatabaseManager databaseManager = new DatabaseManager();
+
+ if (!databaseManager.checkIfNameExists(name.getText())) {
+ Dao sudokuBoardDao = new SudokuBoardDaoFactory().getJpaDao(name.getText());
+
+ try {
+ sudokuBoardDao.write(gameController.getGameState().getBoard());
+ displayDatabaseEntries();
+ status.setText(resourceBundle.getString("saved_database"));
+ } catch (WriteBoardException exception) {
+ exception.printStackTrace();
+ }
+ } else {
+ status.setText(resourceBundle.getString("board_exists"));
+ }
+ }
+ }
+
+ @FXML
+ private void returnToGame(ActionEvent event) {
+ Node source = (Node) event.getSource();
+ Stage thisStage = (Stage) source.getScene().getWindow();
+ thisStage.close();
+ }
+}
diff --git a/View/src/main/java/view/exceptions/IOLanguageFileException.java b/View/src/main/java/view/exceptions/IOLanguageFileException.java
new file mode 100644
index 0000000..a6fd62b
--- /dev/null
+++ b/View/src/main/java/view/exceptions/IOLanguageFileException.java
@@ -0,0 +1,11 @@
+package view.exceptions;
+
+public class IOLanguageFileException extends RuntimeException {
+ public IOLanguageFileException() {
+ super();
+ }
+
+ public IOLanguageFileException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/View/src/main/java/view/exceptions/IllegalDifficultyException.java b/View/src/main/java/view/exceptions/IllegalDifficultyException.java
new file mode 100644
index 0000000..da1d4f9
--- /dev/null
+++ b/View/src/main/java/view/exceptions/IllegalDifficultyException.java
@@ -0,0 +1,11 @@
+package view.exceptions;
+
+public class IllegalDifficultyException extends RuntimeException {
+ public IllegalDifficultyException() {
+ super();
+ }
+
+ public IllegalDifficultyException(String message) {
+ super(message);
+ }
+}
diff --git a/View/src/main/resources/META-INF/persistence.xml b/View/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..a75383d
--- /dev/null
+++ b/View/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,18 @@
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ sudoku.database.Board
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/View/src/main/resources/Scenes/game.fxml b/View/src/main/resources/Scenes/game.fxml
new file mode 100644
index 0000000..39bc275
--- /dev/null
+++ b/View/src/main/resources/Scenes/game.fxml
@@ -0,0 +1,682 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/View/src/main/resources/Scenes/load_menu.fxml b/View/src/main/resources/Scenes/load_menu.fxml
new file mode 100644
index 0000000..6e3f904
--- /dev/null
+++ b/View/src/main/resources/Scenes/load_menu.fxml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/View/src/main/resources/Scenes/main_menu.fxml b/View/src/main/resources/Scenes/main_menu.fxml
new file mode 100644
index 0000000..0866818
--- /dev/null
+++ b/View/src/main/resources/Scenes/main_menu.fxml
@@ -0,0 +1,155 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/View/src/main/resources/Scenes/save_menu.fxml b/View/src/main/resources/Scenes/save_menu.fxml
new file mode 100644
index 0000000..606c591
--- /dev/null
+++ b/View/src/main/resources/Scenes/save_menu.fxml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/View/src/main/resources/Styles/game_style.css b/View/src/main/resources/Styles/game_style.css
new file mode 100644
index 0000000..21d0d70
--- /dev/null
+++ b/View/src/main/resources/Styles/game_style.css
@@ -0,0 +1,43 @@
+.panel {
+ -fx-background-color: #505050;
+}
+
+.active {
+ -fx-text-fill: #FAFAFA;
+ -fx-control-inner-background: #606060;
+ -fx-highlight-fill: null;
+ -fx-highlight-text-fill: null;
+ -fx-background-insets: 0, 0 0 0 0 ;
+ -fx-table-cell-border-color: #404040;
+ -fx-background-radius: 12 12 12 12;
+}
+
+.logo {
+ -fx-text-fill: #FAFAFA;
+ -fx-control-inner-background: #CC2060;
+ -fx-highlight-fill: null;
+ -fx-highlight-text-fill: null;
+ -fx-background-insets: 0, 0 0 0 0 ;
+ -fx-table-cell-border-color: #404040;
+ -fx-background-radius: 16 16 16 16;
+}
+
+.button {
+ -fx-background-color: #00AA99;
+ -fx-text-fill: #FAFAFA;
+ -fx-background-radius: 2 2 2 2;
+}
+
+.button:pressed {
+ -fx-background-color: #CC2060;
+ -fx-text-fill: #FAFAFA;
+ -fx-background-radius: 2 2 2 2;
+}
+
+.saturatedField {
+ -fx-background-color: #77CCAA;
+}
+
+.desaturatedField {
+ -fx-background-color: #55AA88;
+}
\ No newline at end of file
diff --git a/View/src/main/resources/Styles/load_save_style.css b/View/src/main/resources/Styles/load_save_style.css
new file mode 100644
index 0000000..7401ce2
--- /dev/null
+++ b/View/src/main/resources/Styles/load_save_style.css
@@ -0,0 +1,15 @@
+.split-pane:horizontal > .split-pane-divider {
+ -fx-background-color: #555555;
+}
+
+.button {
+ -fx-background-color: #00AA99;
+ -fx-text-fill: #FAFAFA;
+ -fx-background-radius: 2 2 2 2;
+}
+
+.button:pressed {
+ -fx-background-color: #CC2060;
+ -fx-text-fill: #FAFAFA;
+ -fx-background-radius: 2 2 2 2;
+}
\ No newline at end of file
diff --git a/View/src/main/resources/Styles/main_menu_style.css b/View/src/main/resources/Styles/main_menu_style.css
new file mode 100644
index 0000000..e107bae
--- /dev/null
+++ b/View/src/main/resources/Styles/main_menu_style.css
@@ -0,0 +1,60 @@
+.panel {
+ -fx-background-color: #404040;
+}
+
+.button, .toggle-button {
+ -fx-background-color: #00AA99;
+ -fx-text-fill: #FAFAFA;
+}
+
+.button:pressed, .toggle-button:selected {
+ -fx-background-color: #CC2060;
+ -fx-text-fill: #FAFAFA;
+}
+
+.radio {
+ -fx-text-fill: #CCCCCC;
+}
+
+.difficulty {
+ -fx-text-fill: #FAFAFA;
+ -fx-control-inner-background: #00AA99;
+ -fx-highlight-fill: null;
+ -fx-highlight-text-fill: null;
+ -fx-background-insets: 0, 0 0 0 0 ;
+ -fx-table-cell-border-color: #404040;
+ -fx-background-radius: 12 12 12 12;
+}
+
+.logoUpper {
+ -fx-text-fill: #FAFAFA;
+ -fx-control-inner-background: #00AA99;
+ -fx-background-color: -fx-text-box-border, -fx-control-inner-background;
+ -fx-highlight-fill: null;
+ -fx-highlight-text-fill: null;
+ -fx-background-insets: 0, 0 0 0 0 ;
+ -fx-table-cell-border-color: #404040;
+ -fx-background-radius: 5 5 0 0;
+ -fx-effect: null;
+}
+
+.logoDown {
+ -fx-text-fill: #FAFAFA;
+ -fx-control-inner-background: #00AA99;
+ -fx-background-color: -fx-text-box-border, -fx-control-inner-background;
+ -fx-highlight-fill: null;
+ -fx-highlight-text-fill: null;
+ -fx-background-insets: 0, 0 0 0 0 ;
+ -fx-table-cell-border-color: #404040;
+ -fx-background-radius: 0 0 5 5;
+ -fx-effect: null;
+}
+
+.radio-button .radio {
+ -fx-background-color: #99CCAA;
+}
+
+.radio-button:selected .radio .dot {
+ -fx-background-color: #CC2060;
+ -fx-background-insets: 0;
+}
\ No newline at end of file
diff --git a/View/src/main/resources/log4j2.xml b/View/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..25cae49
--- /dev/null
+++ b/View/src/main/resources/log4j2.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/View/src/main/resources/textGame_en.properties b/View/src/main/resources/textGame_en.properties
new file mode 100644
index 0000000..6f90e39
--- /dev/null
+++ b/View/src/main/resources/textGame_en.properties
@@ -0,0 +1,13 @@
+AuthorsLabel=Authors:
+CheckButton=Check
+DifficultyLabel=Difficulty:
+GameNameLabel=Game Name:
+LoadBoardButton=Load Board
+NewBoardButton=New Board
+QuitButton=Quit
+SaveBoardButton=Save Board
+SolveButton=Solve
+TimeLabel=Elapsed Time:
+IllegalDifficulty=Provided difficulty level is illegal
+NoLangFile=Could not find specified language file
+Reset=Reset
\ No newline at end of file
diff --git a/View/src/main/resources/textGame_pl.properties b/View/src/main/resources/textGame_pl.properties
new file mode 100644
index 0000000..2cf0e07
--- /dev/null
+++ b/View/src/main/resources/textGame_pl.properties
@@ -0,0 +1,13 @@
+AuthorsLabel=Autorzy:
+CheckButton=Sprawd\u017a
+DifficultyLabel=Poziom Trudno\u015bci:
+GameNameLabel=Nazwa Gry:
+LoadBoardButton=Wczytaj Plansz\u0119
+NewBoardButton=Nowa Plansza
+QuitButton=Zamknij
+SaveBoardButton=Zapisz Plansz\u0119
+SolveButton=Rozwi\u0105\u017c
+TimeLabel=Czas:
+IllegalDifficulty=Wybrano nielegalny poziom trudno\u015bci
+NoLangFile=Nie znaleziono okre\u015blonego pliku z j\u0119zykowego
+Reset=Reset
\ No newline at end of file
diff --git a/View/src/main/resources/textLoad_en.properties b/View/src/main/resources/textLoad_en.properties
new file mode 100644
index 0000000..8b8afc0
--- /dev/null
+++ b/View/src/main/resources/textLoad_en.properties
@@ -0,0 +1,19 @@
+file=FILE
+database=DATABASE
+path=File Path
+board_file=Select Board File
+file_load=Load Board from File
+return=Return to Game
+id_num=ID
+name=Name
+display=Display Saved Boards
+load_id=Load Board (ID)
+load_name=Load Board (Name)
+file_selected=File Selected
+board_file_loaded=Board File Loaded
+board_file_failed=File Error
+no_results=DB Is Empty
+finished=Finished
+no_record=Board Not Found
+invalid_id=Invalid ID
+db_loaded=Board Fetched
\ No newline at end of file
diff --git a/View/src/main/resources/textLoad_pl.properties b/View/src/main/resources/textLoad_pl.properties
new file mode 100644
index 0000000..baa156f
--- /dev/null
+++ b/View/src/main/resources/textLoad_pl.properties
@@ -0,0 +1,19 @@
+file=PLIK
+database=BAZA
+path=\u015acie\u017cka do Pliku
+board_file=Wybierz Plik z Plansz\u0105
+file_load=Wczytaj Plansz\u0119 z Pliku
+return=Powr\u00f3t do Gry
+id_num=ID
+name=Nazwa
+display=Wy\u015bwietl Zapisane Plansze
+load_id=Wczytaj Plansz\u0119 (ID)
+load_name=Wczytaj Plansz\u0119 (Name)
+file_selected=Wybrano Plik
+board_file_loaded=Plik Wczytany
+board_file_failed=B\u0142\u0105d Pliku
+no_results=Baza Jest Pusta
+finished=Zako\u0144czono
+no_record=Brak Planszy w Bazie
+invalid_id=Niew\u0142a\u015bciwe ID
+db_loaded=Plansza Pobrana
\ No newline at end of file
diff --git a/View/src/main/resources/textMenu_en.properties b/View/src/main/resources/textMenu_en.properties
new file mode 100644
index 0000000..565f721
--- /dev/null
+++ b/View/src/main/resources/textMenu_en.properties
@@ -0,0 +1,6 @@
+DifficultyLabel=Difficulty Level
+EasyRadioButton=Easy
+HardRadioButton=Hard
+NormalRadioButton=Normal
+QuitButton=Quit
+StartButton=Start Game
\ No newline at end of file
diff --git a/View/src/main/resources/textMenu_pl.properties b/View/src/main/resources/textMenu_pl.properties
new file mode 100644
index 0000000..c61f9d4
--- /dev/null
+++ b/View/src/main/resources/textMenu_pl.properties
@@ -0,0 +1,6 @@
+DifficultyLabel=Poziom Trudno\u015Bci
+EasyRadioButton=\u0141atwy
+HardRadioButton=Trudny
+NormalRadioButton=Normalny
+QuitButton=Zako\u0144cz
+StartButton=Rozpocznij Gr\u0119
\ No newline at end of file
diff --git a/View/src/main/resources/textSave_en.properties b/View/src/main/resources/textSave_en.properties
new file mode 100644
index 0000000..f8af3bb
--- /dev/null
+++ b/View/src/main/resources/textSave_en.properties
@@ -0,0 +1,15 @@
+file=FILE
+database=DATABASE
+return=Return to Game
+name=Name
+display=Display Saved Boards
+board_file=Save Board To File
+board_file_failed=File Error
+no_results=DB Is Empty
+finished=Finished
+delete_name=Delete Board
+delete_all=Delete All Boards
+saved_file=Saved Board To File
+saved_database=Saved Board To Database
+board_exists=Board With Same Name Exists
+save_database=Save Board To Database
\ No newline at end of file
diff --git a/View/src/main/resources/textSave_pl.properties b/View/src/main/resources/textSave_pl.properties
new file mode 100644
index 0000000..6fa8e5c
--- /dev/null
+++ b/View/src/main/resources/textSave_pl.properties
@@ -0,0 +1,15 @@
+file=PLIK
+database=BAZA
+return=Powr\u00f3t do Gry
+name=Nazwa
+display=Wy\u015bwietl Zapisane Plansze
+board_file=Zapisz Plansz\u0119 do Pliku
+board_file_failed=B\u0142\u0105d Pliku
+no_results=Baza Jest Pusta
+finished=Zako\u0144czono
+delete_name=Usu\u0144 Plansz\u0119
+delete_all=Usu\u0144 Wszystkie Plansze
+saved_file=Zapisano Plansz\u0119 do Pliku
+saved_database=Zapisano Plansz\u0119 w Bazie
+board_exists=Nazwana Baza Ju\u017c Istnieje
+save_database=Zapisz Plansz\u0119 w Bazie
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..23eac2f
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,20 @@
+
+
+ 4.0.0
+
+ SudokuApp
+ 3107
+ SudokuGameProject
+ 2.0
+ pom
+
+ Model
+ View
+
+
+
+ UTF-8
+
+
\ No newline at end of file