From 307e78ed771ac5e38b3fc106b00fce110b75081b Mon Sep 17 00:00:00 2001 From: koda Date: Tue, 30 Dec 2014 07:51:59 +0900 Subject: [PATCH] =?UTF-8?q?0.2.1=20=E3=83=AA=E3=83=AA=E3=83=BC=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bowerrc | 3 + .gitignore | 6 + LICENSE.md | 95 + README.md | 31 + bower.json | 16 + document/database/A5M2_knowledge.pdf | Bin 0 -> 100913 bytes document/database/knowledge.a5er | 803 + pom.xml | 122 + .../redcomet/knowledge/bat/FileParseBat.java | 141 + .../knowledge/bat/KnowledgeFileClearBat.java | 22 + .../redcomet/knowledge/config/AppConfig.java | 37 + .../redcomet/knowledge/config/FileType.java | 25 + .../redcomet/knowledge/config/IndexType.java | 17 + .../redcomet/knowledge/control/Control.java | 118 + .../knowledge/control/IndexControl.java | 20 + .../knowledge/control/admin/UsersControl.java | 295 + .../knowledge/control/open/FileControl.java | 29 + .../control/open/KnowledgeControl.java | 220 + .../control/open/LicenseControl.java | 7 + .../control/protect/AccountControl.java | 112 + .../control/protect/FileControl.java | 78 + .../control/protect/KnowledgeControl.java | 258 + .../redcomet/knowledge/dao/CommentsDao.java | 38 + .../knowledge/dao/KnowledgeFilesDao.java | 114 + .../knowledge/dao/KnowledgeGroupsDao.java | 28 + .../knowledge/dao/KnowledgeTagsDao.java | 36 + .../knowledge/dao/KnowledgeUsersDao.java | 36 + .../redcomet/knowledge/dao/KnowledgesDao.java | 131 + .../java/redcomet/knowledge/dao/LikesDao.java | 33 + .../redcomet/knowledge/dao/StocksDao.java | 28 + .../java/redcomet/knowledge/dao/TagsDao.java | 99 + .../knowledge/dao/ViewHistoriesDao.java | 28 + .../java/redcomet/knowledge/dao/VotesDao.java | 28 + .../knowledge/dao/gen/GenCommentsDao.java | 261 + .../dao/gen/GenKnowledgeFilesDao.java | 268 + .../dao/gen/GenKnowledgeGroupsDao.java | 285 + .../dao/gen/GenKnowledgeTagsDao.java | 285 + .../dao/gen/GenKnowledgeUsersDao.java | 285 + .../knowledge/dao/gen/GenKnowledgesDao.java | 263 + .../knowledge/dao/gen/GenLikesDao.java | 259 + .../knowledge/dao/gen/GenStocksDao.java | 287 + .../knowledge/dao/gen/GenTagsDao.java | 259 + .../dao/gen/GenViewHistoriesDao.java | 261 + .../knowledge/dao/gen/GenVotesDao.java | 261 + .../sql/CommentsDao/CommentsDao_delete.sql | 4 + .../sql/CommentsDao/CommentsDao_insert.sql | 20 + .../CommentsDao_physical_select_all.sql | 1 + .../CommentsDao_physical_select_on_key.sql | 4 + .../CommentsDao/CommentsDao_select_all.sql | 2 + .../CommentsDao/CommentsDao_select_on_key.sql | 5 + .../sql/CommentsDao/CommentsDao_update.sql | 12 + .../KnowledgeFilesDao_delete.sql | 4 + .../KnowledgeFilesDao_insert.sql | 26 + .../KnowledgeFilesDao_physical_select_all.sql | 1 + ...dgeFilesDao_physical_select_on_file_no.sql | 5 + ...owledgeFilesDao_physical_select_on_key.sql | 4 + ...lesDao_physical_select_on_knowledge_id.sql | 5 + .../KnowledgeFilesDao_select_all.sql | 2 + .../KnowledgeFilesDao_select_on_file_no.sql | 5 + .../KnowledgeFilesDao_select_on_key.sql | 5 + ...owledgeFilesDao_select_on_knowledge_id.sql | 5 + .../KnowledgeFilesDao_update.sql | 15 + .../KnowledgeGroupsDao_delete.sql | 5 + .../KnowledgeGroupsDao_insert.sql | 18 + ...KnowledgeGroupsDao_physical_select_all.sql | 1 + ...eGroupsDao_physical_select_on_group_id.sql | 5 + ...wledgeGroupsDao_physical_select_on_key.sql | 5 + ...upsDao_physical_select_on_knowledge_id.sql | 5 + .../KnowledgeGroupsDao_select_all.sql | 2 + .../KnowledgeGroupsDao_select_on_group_id.sql | 5 + .../KnowledgeGroupsDao_select_on_key.sql | 6 + ...wledgeGroupsDao_select_on_knowledge_id.sql | 5 + .../KnowledgeGroupsDao_update.sql | 11 + .../KnowledgeTagsDao_delete.sql | 5 + .../KnowledgeTagsDao_insert.sql | 18 + .../KnowledgeTagsDao_physical_select_all.sql | 1 + ...nowledgeTagsDao_physical_select_on_key.sql | 5 + ...agsDao_physical_select_on_knowledge_id.sql | 5 + ...ledgeTagsDao_physical_select_on_tag_id.sql | 5 + .../KnowledgeTagsDao_select_all.sql | 2 + .../KnowledgeTagsDao_select_on_key.sql | 6 + ...nowledgeTagsDao_select_on_knowledge_id.sql | 5 + .../KnowledgeTagsDao_select_on_tag_id.sql | 5 + .../KnowledgeTagsDao_update.sql | 11 + .../KnowledgeUsersDao_delete.sql | 5 + .../KnowledgeUsersDao_insert.sql | 18 + .../KnowledgeUsersDao_physical_select_all.sql | 1 + ...owledgeUsersDao_physical_select_on_key.sql | 5 + ...ersDao_physical_select_on_knowledge_id.sql | 5 + ...dgeUsersDao_physical_select_on_user_id.sql | 5 + .../KnowledgeUsersDao_select_all.sql | 2 + .../KnowledgeUsersDao_select_on_key.sql | 6 + ...owledgeUsersDao_select_on_knowledge_id.sql | 5 + .../KnowledgeUsersDao_select_on_user_id.sql | 5 + .../KnowledgeUsersDao_update.sql | 11 + .../KnowledgesDao/KnowledgesDao_delete.sql | 4 + .../KnowledgesDao/KnowledgesDao_insert.sql | 22 + .../KnowledgesDao_physical_select_all.sql | 1 + .../KnowledgesDao_physical_select_on_key.sql | 4 + .../KnowledgesDao_selectOnKeyWithUserName.sql | 11 + .../KnowledgesDao_select_all.sql | 2 + .../KnowledgesDao_select_on_key.sql | 5 + .../KnowledgesDao/KnowledgesDao_update.sql | 13 + .../dao/sql/LikesDao/LikesDao_delete.sql | 4 + .../dao/sql/LikesDao/LikesDao_insert.sql | 18 + .../LikesDao/LikesDao_physical_select_all.sql | 1 + .../LikesDao_physical_select_on_key.sql | 4 + .../dao/sql/LikesDao/LikesDao_select_all.sql | 2 + .../sql/LikesDao/LikesDao_select_on_key.sql | 5 + .../dao/sql/LikesDao/LikesDao_update.sql | 11 + .../dao/sql/StocksDao/StocksDao_delete.sql | 5 + .../dao/sql/StocksDao/StocksDao_insert.sql | 20 + .../StocksDao_physical_select_all.sql | 1 + .../StocksDao_physical_select_on_key.sql | 5 + ...cksDao_physical_select_on_knowledge_id.sql | 5 + .../StocksDao_physical_select_on_user_id.sql | 5 + .../sql/StocksDao/StocksDao_select_all.sql | 2 + .../sql/StocksDao/StocksDao_select_on_key.sql | 6 + .../StocksDao_select_on_knowledge_id.sql | 5 + .../StocksDao/StocksDao_select_on_user_id.sql | 5 + .../dao/sql/StocksDao/StocksDao_update.sql | 12 + .../dao/sql/TagsDao/TagsDao_delete.sql | 4 + .../dao/sql/TagsDao/TagsDao_insert.sql | 18 + .../TagsDao/TagsDao_physical_select_all.sql | 1 + .../TagsDao_physical_select_on_key.sql | 4 + .../TagsDao/TagsDao_selectOnKnowledgeId.sql | 7 + .../TagsDao/TagsDao_selectTagsWithCount.sql | 13 + .../TagsDao_selectTagsWithCountOnUser.sql | 26 + .../dao/sql/TagsDao/TagsDao_select_all.sql | 2 + .../dao/sql/TagsDao/TagsDao_select_on_key.sql | 5 + .../dao/sql/TagsDao/TagsDao_update.sql | 11 + .../ViewHistoriesDao_delete.sql | 4 + .../ViewHistoriesDao_insert.sql | 20 + .../ViewHistoriesDao_physical_select_all.sql | 1 + ...iewHistoriesDao_physical_select_on_key.sql | 4 + .../ViewHistoriesDao_select_all.sql | 2 + .../ViewHistoriesDao_select_on_key.sql | 5 + .../ViewHistoriesDao_update.sql | 12 + .../dao/sql/VotesDao/VotesDao_delete.sql | 4 + .../dao/sql/VotesDao/VotesDao_insert.sql | 20 + .../VotesDao/VotesDao_physical_select_all.sql | 1 + .../VotesDao_physical_select_on_key.sql | 4 + .../dao/sql/VotesDao/VotesDao_select_all.sql | 2 + .../sql/VotesDao/VotesDao_select_on_key.sql | 5 + .../dao/sql/VotesDao/VotesDao_update.sql | 12 + .../redcomet/knowledge/deploy/InitDB.java | 86 + .../deploy/InitializationListener.java | 41 + .../redcomet/knowledge/deploy/Migrate.java | 13 + .../deploy/v0_0_1/InitializeSystem.java | 69 + .../deploy/v0_1_0/Migrate_0_1_0.java | 16 + .../knowledge/entity/CommentsEntity.java | 68 + .../entity/KnowledgeFilesEntity.java | 47 + .../entity/KnowledgeGroupsEntity.java | 51 + .../knowledge/entity/KnowledgeTagsEntity.java | 47 + .../entity/KnowledgeUsersEntity.java | 51 + .../knowledge/entity/KnowledgesEntity.java | 138 + .../knowledge/entity/LikesEntity.java | 43 + .../knowledge/entity/StocksEntity.java | 51 + .../redcomet/knowledge/entity/TagsEntity.java | 66 + .../knowledge/entity/ViewHistoriesEntity.java | 50 + .../knowledge/entity/VotesEntity.java | 50 + .../entity/gen/GenCommentsEntity.java | 309 + .../entity/gen/GenKnowledgeFilesEntity.java | 384 + .../entity/gen/GenKnowledgeGroupsEntity.java | 316 + .../entity/gen/GenKnowledgeTagsEntity.java | 316 + .../entity/gen/GenKnowledgeUsersEntity.java | 316 + .../entity/gen/GenKnowledgesEntity.java | 347 + .../knowledge/entity/gen/GenLikesEntity.java | 291 + .../knowledge/entity/gen/GenStocksEntity.java | 344 + .../knowledge/entity/gen/GenTagsEntity.java | 311 + .../entity/gen/GenViewHistoriesEntity.java | 319 + .../knowledge/entity/gen/GenVotesEntity.java | 329 + .../redcomet/knowledge/indexer/Indexer.java | 30 + .../knowledge/indexer/IndexingValue.java | 198 + .../knowledge/indexer/impl/LuceneIndexer.java | 181 + .../knowledge/listener/CronListener.java | 84 + .../redcomet/knowledge/logic/IndexLogic.java | 74 + .../knowledge/logic/KnowledgeLogic.java | 542 + .../redcomet/knowledge/logic/TagLogic.java | 43 + .../knowledge/logic/UploadedFileLogic.java | 213 + .../redcomet/knowledge/logic/UserLogic.java | 135 + .../redcomet/knowledge/parser/Parser.java | 18 + .../knowledge/parser/ParserFactory.java | 70 + .../knowledge/parser/impl/TextParser.java | 127 + .../knowledge/parser/impl/TikaParser.java | 92 + .../knowledge/searcher/SearchResultValue.java | 110 + .../redcomet/knowledge/searcher/Searcher.java | 19 + .../knowledge/searcher/SearchingValue.java | 172 + .../searcher/impl/LuceneSearcher.java | 201 + .../java/redcomet/knowledge/vo/LikeCount.java | 30 + .../redcomet/knowledge/vo/ParseResult.java | 26 + .../java/redcomet/knowledge/vo/Roles.java | 20 + .../java/redcomet/knowledge/vo/Sentence.java | 20 + .../redcomet/knowledge/vo/UploadFile.java | 127 + .../redcomet/knowledge/vo/UploadResults.java | 25 + src/main/resources/appconfig.xml | 9 + src/main/resources/appresource.properties | 45 + .../resources/appresource_ja_JP.properties | 45 + src/main/resources/connection.xml | 10 + src/main/resources/log4j.xml | 100 + .../redcomet/knowledge/database/ddl.sql | 322 + .../webapp/WEB-INF/views/admin/users/list.jsp | 70 + .../WEB-INF/views/admin/users/view_add.jsp | 71 + .../WEB-INF/views/admin/users/view_edit.jsp | 90 + .../WEB-INF/views/auth/authorizerError.jsp | 15 + src/main/webapp/WEB-INF/views/auth/form.jsp | 100 + .../WEB-INF/views/commons/errors/error.jsp | 28 + .../views/commons/errors/forbidden.jsp | 24 + .../views/commons/errors/jsp_error.jsp | 22 + .../views/commons/errors/not_found.jsp | 27 + .../views/commons/errors/server_error.jsp | 38 + .../views/commons/errors/unauthorized.jsp | 24 + .../views/commons/layout/commonHeader.jsp | 29 + .../views/commons/layout/commonNavbar.jsp | 103 + .../views/commons/layout/commonScripts.jsp | 92 + .../views/commons/layout/layoutMain.jsp | 82 + .../views/commons/layout/layoutNoMenu.jsp | 53 + src/main/webapp/WEB-INF/views/index/index.jsp | 54 + .../WEB-INF/views/open/knowledge/list.jsp | 165 + .../WEB-INF/views/open/knowledge/view.jsp | 146 + .../WEB-INF/views/open/license/index.jsp | 134 + .../WEB-INF/views/protect/account/index.jsp | 56 + .../views/protect/account/withdrawal.jsp | 58 + .../views/protect/knowledge/view_add.jsp | 125 + .../views/protect/knowledge/view_edit.jsp | 125 + src/main/webapp/WEB-INF/web.xml | 144 + src/main/webapp/css/common.css | 37 + src/main/webapp/css/knowledge-edit.css | 28 + src/main/webapp/css/knowledge-list.css | 40 + src/main/webapp/css/knowledge-view.css | 101 + src/main/webapp/favicon.ico | Bin 0 -> 4286 bytes src/main/webapp/images/icon/107039.png | Bin 0 -> 76977 bytes src/main/webapp/images/icon/110197.png | Bin 0 -> 62116 bytes src/main/webapp/images/icon/112224.png | Bin 0 -> 27737 bytes src/main/webapp/js/knowledge-edit.js | 118 + src/main/webapp/js/knowledge-list.js | 44 + src/main/webapp/js/knowledge-view.js | 33 + .../java/redcomet/knowledge/TestCommon.java | 57 + .../knowledge/dao/KnowledgesDaoTest.java | 65 + .../knowledge/logic/KnowledgeLogicTest.java | 142 + .../knowledge/searcher/SearchTest.java | 173 + .../knowledge/tool/AddSampleDatas.java | 200 + .../knowledge/tool/AddSampleKnowledge.java | 106 + .../knowledge/tool/KnowledgeDBGen.java | 25 + src/test/resources/dummy_text.txt | 461 + src/test/resources/ormappingtool.xml | 39 + src/test/resources/randam_user.xml | 15003 ++++++++++++++++ src/test/resources/randamu_kana.txt | 302 + 248 files changed, 33128 insertions(+) create mode 100644 .bowerrc create mode 100755 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 bower.json create mode 100755 document/database/A5M2_knowledge.pdf create mode 100755 document/database/knowledge.a5er create mode 100644 pom.xml create mode 100644 src/main/java/redcomet/knowledge/bat/FileParseBat.java create mode 100644 src/main/java/redcomet/knowledge/bat/KnowledgeFileClearBat.java create mode 100644 src/main/java/redcomet/knowledge/config/AppConfig.java create mode 100644 src/main/java/redcomet/knowledge/config/FileType.java create mode 100644 src/main/java/redcomet/knowledge/config/IndexType.java create mode 100644 src/main/java/redcomet/knowledge/control/Control.java create mode 100644 src/main/java/redcomet/knowledge/control/IndexControl.java create mode 100644 src/main/java/redcomet/knowledge/control/admin/UsersControl.java create mode 100644 src/main/java/redcomet/knowledge/control/open/FileControl.java create mode 100644 src/main/java/redcomet/knowledge/control/open/KnowledgeControl.java create mode 100644 src/main/java/redcomet/knowledge/control/open/LicenseControl.java create mode 100644 src/main/java/redcomet/knowledge/control/protect/AccountControl.java create mode 100644 src/main/java/redcomet/knowledge/control/protect/FileControl.java create mode 100644 src/main/java/redcomet/knowledge/control/protect/KnowledgeControl.java create mode 100644 src/main/java/redcomet/knowledge/dao/CommentsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/KnowledgeFilesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/KnowledgeGroupsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/KnowledgeTagsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/KnowledgeUsersDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/KnowledgesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/LikesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/StocksDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/TagsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/ViewHistoriesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/VotesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenCommentsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeFilesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeGroupsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeTagsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeUsersDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenKnowledgesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenLikesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenStocksDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenTagsDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenViewHistoriesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/gen/GenVotesDao.java create mode 100644 src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_file_no.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_file_no.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_group_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_group_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_tag_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_tag_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_user_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_user_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_selectOnKeyWithUserName.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_user_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_knowledge_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_user_id.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectOnKnowledgeId.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCount.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCountOnUser.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_delete.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_insert.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_all.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_on_key.sql create mode 100644 src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_update.sql create mode 100644 src/main/java/redcomet/knowledge/deploy/InitDB.java create mode 100644 src/main/java/redcomet/knowledge/deploy/InitializationListener.java create mode 100644 src/main/java/redcomet/knowledge/deploy/Migrate.java create mode 100644 src/main/java/redcomet/knowledge/deploy/v0_0_1/InitializeSystem.java create mode 100644 src/main/java/redcomet/knowledge/deploy/v0_1_0/Migrate_0_1_0.java create mode 100644 src/main/java/redcomet/knowledge/entity/CommentsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/KnowledgeFilesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/KnowledgeGroupsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/KnowledgeTagsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/KnowledgeUsersEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/KnowledgesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/LikesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/StocksEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/TagsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/ViewHistoriesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/VotesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenCommentsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeFilesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeGroupsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeTagsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeUsersEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenKnowledgesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenLikesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenStocksEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenTagsEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenViewHistoriesEntity.java create mode 100644 src/main/java/redcomet/knowledge/entity/gen/GenVotesEntity.java create mode 100644 src/main/java/redcomet/knowledge/indexer/Indexer.java create mode 100644 src/main/java/redcomet/knowledge/indexer/IndexingValue.java create mode 100644 src/main/java/redcomet/knowledge/indexer/impl/LuceneIndexer.java create mode 100644 src/main/java/redcomet/knowledge/listener/CronListener.java create mode 100644 src/main/java/redcomet/knowledge/logic/IndexLogic.java create mode 100644 src/main/java/redcomet/knowledge/logic/KnowledgeLogic.java create mode 100644 src/main/java/redcomet/knowledge/logic/TagLogic.java create mode 100644 src/main/java/redcomet/knowledge/logic/UploadedFileLogic.java create mode 100644 src/main/java/redcomet/knowledge/logic/UserLogic.java create mode 100755 src/main/java/redcomet/knowledge/parser/Parser.java create mode 100755 src/main/java/redcomet/knowledge/parser/ParserFactory.java create mode 100755 src/main/java/redcomet/knowledge/parser/impl/TextParser.java create mode 100755 src/main/java/redcomet/knowledge/parser/impl/TikaParser.java create mode 100644 src/main/java/redcomet/knowledge/searcher/SearchResultValue.java create mode 100644 src/main/java/redcomet/knowledge/searcher/Searcher.java create mode 100644 src/main/java/redcomet/knowledge/searcher/SearchingValue.java create mode 100644 src/main/java/redcomet/knowledge/searcher/impl/LuceneSearcher.java create mode 100644 src/main/java/redcomet/knowledge/vo/LikeCount.java create mode 100644 src/main/java/redcomet/knowledge/vo/ParseResult.java create mode 100644 src/main/java/redcomet/knowledge/vo/Roles.java create mode 100644 src/main/java/redcomet/knowledge/vo/Sentence.java create mode 100644 src/main/java/redcomet/knowledge/vo/UploadFile.java create mode 100644 src/main/java/redcomet/knowledge/vo/UploadResults.java create mode 100644 src/main/resources/appconfig.xml create mode 100644 src/main/resources/appresource.properties create mode 100644 src/main/resources/appresource_ja_JP.properties create mode 100644 src/main/resources/connection.xml create mode 100644 src/main/resources/log4j.xml create mode 100644 src/main/resources/redcomet/knowledge/database/ddl.sql create mode 100644 src/main/webapp/WEB-INF/views/admin/users/list.jsp create mode 100644 src/main/webapp/WEB-INF/views/admin/users/view_add.jsp create mode 100644 src/main/webapp/WEB-INF/views/admin/users/view_edit.jsp create mode 100644 src/main/webapp/WEB-INF/views/auth/authorizerError.jsp create mode 100644 src/main/webapp/WEB-INF/views/auth/form.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/errors/error.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/errors/forbidden.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/errors/jsp_error.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/errors/not_found.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/errors/server_error.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/errors/unauthorized.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/layout/commonHeader.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/layout/commonNavbar.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/layout/commonScripts.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/layout/layoutMain.jsp create mode 100644 src/main/webapp/WEB-INF/views/commons/layout/layoutNoMenu.jsp create mode 100644 src/main/webapp/WEB-INF/views/index/index.jsp create mode 100644 src/main/webapp/WEB-INF/views/open/knowledge/list.jsp create mode 100644 src/main/webapp/WEB-INF/views/open/knowledge/view.jsp create mode 100644 src/main/webapp/WEB-INF/views/open/license/index.jsp create mode 100644 src/main/webapp/WEB-INF/views/protect/account/index.jsp create mode 100644 src/main/webapp/WEB-INF/views/protect/account/withdrawal.jsp create mode 100644 src/main/webapp/WEB-INF/views/protect/knowledge/view_add.jsp create mode 100644 src/main/webapp/WEB-INF/views/protect/knowledge/view_edit.jsp create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/css/common.css create mode 100644 src/main/webapp/css/knowledge-edit.css create mode 100644 src/main/webapp/css/knowledge-list.css create mode 100644 src/main/webapp/css/knowledge-view.css create mode 100644 src/main/webapp/favicon.ico create mode 100644 src/main/webapp/images/icon/107039.png create mode 100644 src/main/webapp/images/icon/110197.png create mode 100644 src/main/webapp/images/icon/112224.png create mode 100644 src/main/webapp/js/knowledge-edit.js create mode 100644 src/main/webapp/js/knowledge-list.js create mode 100644 src/main/webapp/js/knowledge-view.js create mode 100644 src/test/java/redcomet/knowledge/TestCommon.java create mode 100644 src/test/java/redcomet/knowledge/dao/KnowledgesDaoTest.java create mode 100644 src/test/java/redcomet/knowledge/logic/KnowledgeLogicTest.java create mode 100644 src/test/java/redcomet/knowledge/searcher/SearchTest.java create mode 100644 src/test/java/redcomet/knowledge/tool/AddSampleDatas.java create mode 100644 src/test/java/redcomet/knowledge/tool/AddSampleKnowledge.java create mode 100644 src/test/java/redcomet/knowledge/tool/KnowledgeDBGen.java create mode 100644 src/test/resources/dummy_text.txt create mode 100644 src/test/resources/ormappingtool.xml create mode 100644 src/test/resources/randam_user.xml create mode 100644 src/test/resources/randamu_kana.txt diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 000000000..0901d291a --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory" : "src/main/webapp/bower" +} diff --git a/.gitignore b/.gitignore new file mode 100755 index 000000000..26090b435 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +bower +target +.classpath +.project +.settings + diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..3c6eb0679 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,95 @@ +### This Project License +- This project is provided under Apache License, Version 2.0 +- http://www.apache.org/licenses/LICENSE-2.0 + + +### Third-Party License + +#### Server side Library + +- H2 Database Engine + - License: [MPL 2.0] http://www.h2database.com/html/license.html + - project-url: http://www.h2database.com/html/main.html + +- javassist + - License: [MPL 1.1] https://github.com/jboss-javassist/javassist/blob/3.18/License.html + - project-url: http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ + +- log4j + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://logging.apache.org/log4j/1.2/ + +- Commons Lang + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://commons.apache.org/proper/commons-lang/ + +- JSONIC + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://jsonic.sourceforge.jp/ + +- Simple-Xml + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://simple.sourceforge.net/ + +- JUnit + - License: [Eclipse Public License - v 1.0] https://github.com/junit-team/junit/blob/master/LICENSE-junit.txt + - project-url: http://junit.org/ + +- Commons FileUpload + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://commons.apache.org/proper/commons-fileupload/ + +- OWASP AntiSamy + - License: [Creative Commons Attribution-ShareAlike 3.0 license] http://creativecommons.org/licenses/by-sa/3.0/ + - project-url: https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project + +- Apache Lucene + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://lucene.apache.org/ + +- Apache Tika + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://tika.apache.org/ + +#### Front end Library +- jQuery + - License: [MIT] https://jquery.org/license/ + - project-url: http://jquery.com/ + +- Bootstrap + - License: [MIT] https://github.com/twbs/bootstrap/blob/master/LICENSE + - project-url: http://getbootstrap.com/ + +- Font Awesome + - License: [MIT] http://fortawesome.github.io/Font-Awesome/license/ + - project-url: http://fortawesome.github.io/Font-Awesome/ + +- notifyjs + - License: [MIT] https://github.com/jpillora/notifyjs + - project-url: http://notifyjs.com/ + +- marked + - License: [MIT] https://github.com/chjj/marked/blob/master/LICENSE + - project-url: https://github.com/chjj/marked + +- highlightjs + - License: [BSD] https://github.com/isagalaev/highlight.js/blob/master/LICENSE + - project-url: https://highlightjs.org/ + +- bootbox + - License: [MIT] https://github.com/makeusabrew/bootbox/blob/master/LICENSE.md + - project-url: http://bootboxjs.com/ + +- bootstrap-tagsinput + - License: [MIT] https://github.com/TimSchlechter/bootstrap-tagsinput/blob/master/LICENSE + - project-url: http://timschlechter.github.io/bootstrap-tagsinput/examples/ + +- jquery-file-upload + - License: [MIT] http://opensource.org/licenses/MIT + - project-url: https://blueimp.github.io/jQuery-File-Upload/ + +- teambox.free-file-icons + - License: [MIT] https://github.com/teambox/Free-file-icons/blob/master/LICENSE + - project-url: https://github.com/teambox/Free-file-icons + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..f9f5f7436 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +## knowledge + +=============== + +#### 概要 +- Knowledgeは、フリーの情報共有サービスです。 +- 社内などで閉じた情報の管理が出来ます。 + +### 特徴 +- Markdown記法で情報登録 +- 記事のタイトル/本文を全文検索で目的の情報を探せます +- 情報の公開範囲を、「公開」「非公開(自分のみ)」の指定ができます + - いずれ、指定したユーザに公開/グループに公開などを行えるようにします(予定) +- 情報に付けたタグで、情報の種別の管理を行えます +- 添付ファイルを登録できます(予定) +- 添付ファイルの中身でも検索できます(予定) + + +#### 使い方 +- Tomcat 7.0 以降をインストール + - http://tomcat.apache.org/ + - Tomcat でなくても、Servlet3.0 以降に対応しているサーバーであれば動作すると思います +- knowledge.war をダウンロード +- Tomcatのwebappsディレクトリに、knowledge.warを置く + - warが配備され使えるようになります + +#### アプリケーションのデータ +- Tomcatの起動ユーザの、ホームディレクトリに「.knowledge」というフォルダを作成し、その中にデータを格納します + - データのバックアップは、このディレクトリをコピーしておくことで可能です + - Linuxなどでは、Tomcat起動ユーザで上記のディレクトリにアクセス出来るように、権限を設定してください + diff --git a/bower.json b/bower.json new file mode 100644 index 000000000..36146c357 --- /dev/null +++ b/bower.json @@ -0,0 +1,16 @@ +{ + "name": "knowledge", + "dependencies": { + "jquery": "2.1.1", + "bootstrap": "3.3.1", + "font-awesome": "4.2.0", + "notifyjs": "0.3.2", + "marked": "0.3.2", + "highlightjs": "8.3.0", + "bootbox": "4.3.0", + "bootstrap-tagsinput": "0.4.2", + "jquery-file-upload": "9.8.1", + "teambox.free-file-icons": "teambox/Free-file-icons" + }, + "devDependencies": {} +} diff --git a/document/database/A5M2_knowledge.pdf b/document/database/A5M2_knowledge.pdf new file mode 100755 index 0000000000000000000000000000000000000000..2a1bac5527c808e3ca5ad3492f69822c150e99ca GIT binary patch literal 100913 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 E4;0Pp_5c6? literal 0 HcmV?d00001 diff --git a/document/database/knowledge.a5er b/document/database/knowledge.a5er new file mode 100755 index 000000000..90f3679f6 --- /dev/null +++ b/document/database/knowledge.a5er @@ -0,0 +1,803 @@ +# A5:ER FORMAT:09 +# A5:ER ENCODING:UTF8 +# A5:ER Mk-1 Copyright (C)2007 m.matsubara +# A5:SQL Mk-2 Copyright (C)1997 m.matsubara +# http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/ + +[Manager] +ProjectName=knowledge +Author= +MaxEntityRowShow=1000 +ReadOnlyRecommend=0 +Page=Main +PageInfo="Main",7,"A4Landscape",$FFFFFF +LogicalView=1 +DecodeDomain=0 +ViewModePageIndividually=1 +ViewMode=7 +ViewFormat=0 +UseNondependenceDashLine=0 +FontName=Tahoma +FontSize=6 +PaperSize=A3Landscape +HeaderLeft= +HeaderCenter= +HeaderRight= +FooterLeft= +FooterCenter= +FooterRight= +ShowPageoutRelation=1 +RDBMSType=6 +RDBMSTypeName=PostgreSQL +GenerateDropTableStatement=1 +DropTableIfExists=1 +CreateFk=1 +FkOnDeleteOption=on delete cascade +FkOnUpdateOption=on update cascade +CommonField="登録ユーザ","INSERT_USER","@INT",,,"","",$FFFFFFFF +CommonField="登録日時","INSERT_DATETIME","@DATETIME",,,"","",$FFFFFFFF +CommonField="更新ユーザ","UPDATE_USER","@INT",,,"","",$FFFFFFFF +CommonField="更新日時","UPDATE_DATETIME","@DATETIME",,,"","",$FFFFFFFF +CommonField="削除フラグ","DELETE_FLAG","@INT",,,"","",$FFFFFFFF +DefaultPkName=%0:s_PKC +DefaultPkIndexName=%0:s_PKI +DefaultIndexName=%0:s_IX%1:d +DefaultFkName=%0:s_FK%1:d +SqlSeparator=0 +ShowTag=1 +ShowCommonAttributes=0 + +[Relation] +Entity1=KNOWLEDGES +Entity2=LIKES +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,7735,2265,7597,R,R +Dependence=0 +Caption= +PName= +LineMode=0 +Bar1=774 +Bar2=226 +Bar3=760 +TermPos1=R +TermPos2=R + +[Entity] +PName=LIKES +LName=いいね +Comment= +TableOption= +Page=MAIN +Left=100 +Top=900 +Field="NO","NO","bigint","NOT NULL",0,"","",$FFFFFFFF,"AUTO_INCREMENT" +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141228073716 +Position="MAIN",100,900 + +[Relation] +Entity1=KNOWLEDGES +Entity2=COMMENTS +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,8619,2544,5304,R,R +Dependence=1 +Caption= +PName= +ModifiedDateTime=20141222155941 +LineMode=0 +Bar1=862 +Bar2=254 +Bar3=530 +TermPos1=R +TermPos2=R + +[Entity] +PName=COMMENTS +LName=コメント +Comment= +TableOption= +Page=MAIN +Left=1300 +Top=1550 +Field="コメント番号","COMMENT_NO","bigint","NOT NULL",0,"","",$FFFFFFFF,"AUTO_INCREMENT" +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",,"","",$FFFFFFFF,"" +Field="コメント","COMMENT","text",,,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222160017 +Position="MAIN",1300,1550 + +[Relation] +Entity1=KNOWLEDGES +Entity2=VOTES +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,7100,4465,3310,R,R +Dependence=0 +Caption= +PName= +LineMode=0 +Bar1=710 +Bar2=446 +Bar3=331 +TermPos1=R +TermPos2=R + +[Entity] +PName=VOTES +LName=投票 +Comment= +TableOption= +Page=MAIN +Left=1250 +Top=1400 +Field="VOTE_NO","VOTE_NO","bigint","NOT NULL",0,"","",$FFFFFFFF,"AUTO_INCREMENT" +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",,"","",$FFFFFFFF,"" +Field="投票区分","VOTE_KIND","@INT","NOT NULL",,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222155133 +Position="MAIN",1250,1400,435,89 + +[Relation] +Entity1=KNOWLEDGES +Entity2=VIEW_HISTORIES +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,0,2814,9500,R,R +Dependence=1 +Caption= +PName= +ModifiedDateTime=20141204130740 +LineMode=0 +Bar1=0 +Bar2=281 +Bar3=950 +TermPos1=R +TermPos2=R + +[Entity] +PName=VIEW_HISTORIES +LName=ナレッジの参照履歴 +Comment= +TableOption= +Page=MAIN +Left=1150 +Top=850 +Field="HISTORY_NO","HISTORY_NO","bigint","NOT NULL",0,"","",$FFFFFFFF,"AUTO_INCREMENT" +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",,"","",$FFFFFFFF,"" +Field="日時","VIEW_DATE_TIME","@DATETIME","NOT NULL",,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222154942 +Position="MAIN",1150,850 + +[Relation] +Entity1=KNOWLEDGES +Entity2=STOCKS +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,4961,5725,1497,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=496 +Bar2=572 +Bar3=150 +TermPos1=R +TermPos2=R + +[Entity] +PName=STOCKS +LName=ストックしたナレッジ +Comment= +TableOption= +Page=MAIN +Left=1200 +Top=1250 +Field="USER_ID","USER_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",1,"","",$FFFFFFFF,"" +Field="コメント","COMMENT","@VARCHAR(1024)",,,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222154849 +Position="MAIN",1200,1250 + +[Relation] +Entity1=KNOWLEDGES +Entity2=KNOWLEDGE_GROUPS +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,3845,4009,8397,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=384 +Bar2=401 +Bar3=840 +TermPos1=R +TermPos2=R + +[Entity] +PName=KNOWLEDGE_GROUPS +LName=アクセス可能なグループ +Comment= +TableOption= +Page=MAIN +Left=1200 +Top=1100 +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",0,"","",$FFFFFFFF,"" +Field="GROUP_ID","GROUP_ID","@INT","NOT NULL",1,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222154841 +Position="MAIN",1200,1100 + +[Relation] +Entity1=KNOWLEDGES +Entity2=KNOWLEDGE_USERS +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,2357,3553,8174,R,R +Dependence=1 +Caption= +PName= +ModifiedDateTime=20141204125301 +LineMode=0 +Bar1=236 +Bar2=355 +Bar3=817 +TermPos1=R +TermPos2=R + +[Entity] +PName=KNOWLEDGE_USERS +LName=アクセス可能なユーザ +Comment= +TableOption= +Page=MAIN +Left=1200 +Top=1000 +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",0,"","",$FFFFFFFF,"" +Field="USER_ID","USER_ID","@INT","NOT NULL",1,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222154833 +Position="MAIN",1200,1000 + +[Relation] +Entity1=TAGS +Entity2=KNOWLEDGE_TAGS +RelationType1=1 +RelationType2=3 +Fields1=TAG_ID +Fields2=TAG_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,4552,5672,4658,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=455 +Bar2=567 +Bar3=466 +TermPos1=R +TermPos2=R + +[Relation] +Entity1=KNOWLEDGES +Entity2=KNOWLEDGE_TAGS +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,4572,7878,5351,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=457 +Bar2=788 +Bar3=535 +TermPos1=R +TermPos2=R + +[Entity] +PName=KNOWLEDGE_TAGS +LName=ナレッジが持つタグ +Comment= +TableOption= +Page=MAIN +Left=600 +Top=1100 +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",0,"","",$FFFFFFFF,"" +Field="タグ_ID","TAG_ID","@INT","NOT NULL",1,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222154737 +Position="MAIN",600,1100 + +[Entity] +PName=TAGS +LName=タグ +Comment= +TableOption= +Page=MAIN +Left=600 +Top=850 +Field="タグ_ID","TAG_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"AUTO_INCREMENT" +Field="タグ名称","TAG_NAME","@VARCHAR(128)","NOT NULL",,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141120205901 +Position="MAIN",600,850 + +[Relation] +Entity1=KNOWLEDGES +Entity2=KNOWLEDGE_FILES +RelationType1=1 +RelationType2=3 +Fields1=KNOWLEDGE_ID +Fields2=KNOWLEDGE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,4961,5662,4736,R,R +Dependence=1 +Caption= +PName= +ModifiedDateTime=20141222154815 +LineMode=0 +Bar1=496 +Bar2=566 +Bar3=474 +TermPos1=R +TermPos2=R + +[Entity] +PName=KNOWLEDGE_FILES +LName=添付ファイル +Comment= +TableOption= +Page=MAIN +Left=600 +Top=1600 +Field="添付ファイル番号","FILE_NO","bigint","NOT NULL",0,"","",$FFFFFFFF,"AUTO_INCREMENT" +Field="ナレッジID","KNOWLEDGE_ID","bigint",,,"","",$FFFFFFFF,"" +Field="ファイル名","FILE_NAME","@VARCHAR(256)",,,"","",$FFFFFFFF,"" +Field="ファイルサイズ","FILE_SIZE","@DOUBLE",,,"","",$FFFFFFFF,"" +Field="バイナリ","FILE_BINARY","blob",,,"","",$FFFFFFFF,"" +Field="パース結果","PARSE_STATUS","@INT","NOT NULL",,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141226051251 +Position="MAIN",600,1600 + +[Entity] +PName=KNOWLEDGES +LName=ナレッジ +Comment= +TableOption= +Page=MAIN +Left=600 +Top=1300 +Field="ナレッジID","KNOWLEDGE_ID","bigint","NOT NULL",0,"","",$FFFFFFFF,"AUTO_INCREMENT" +Field="タイトル","TITLE","@VARCHAR(1024)","NOT NULL",,"","",$FFFFFFFF,"" +Field="内容","CONTENT","text",,,"","",$FFFFFFFF,"" +Field="公開区分","PUBLIC_FLAG","@INT",,,"","",$FFFFFFFF,"" +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20141222155113 +Position="MAIN",600,1300 + +[Comment] +Comment=knowledge +FontName=Tahoma +FontBold=0 +FontItalic=0 +FontUnderline=0 +FontSize=7 +FontColor=$FFFFFF +LineColor=$000000 +BkColor=$000000 +Page=Main +Left=0 +Top=750 +Width=402 +Height=53 + +[Comment] +Comment=Web共通テーブル +FontName=Tahoma +FontBold=0 +FontItalic=0 +FontUnderline=0 +FontSize=7 +FontColor=$FFFFFF +LineColor=$000000 +BkColor=$000000 +Page=Main +Left=0 +Top=0 +Width=402 +Height=53 + +[Comment] +Comment=ユーザID/グループIDはシステムで採番する。\n(制御用で桁合わせする)\nKEYは、ユーザが使う一意のキー +FontName=Tahoma +FontBold=0 +FontItalic=0 +FontUnderline=0 +FontSize=6 +FontColor=$000000 +LineColor=$000000 +BkColor=$99FFFF +Page=Main +Left=1150 +Top=600 +Width=527 +Height=110 + +[Relation] +Entity1=GROUPS +Entity2=USER_GROUPS +RelationType1=2 +RelationType2=3 +Fields1=GROUP_KEY +Fields2=GROUP_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,3256,6098,5013,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=326 +Bar2=610 +Bar3=501 +TermPos1=R +TermPos2=R + +[Relation] +Entity1=USERS +Entity2=USER_GROUPS +RelationType1=2 +RelationType2=3 +Fields1=USER_ID +Fields2=USER_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,2786,8120,4179,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=279 +Bar2=812 +Bar3=418 +TermPos1=R +TermPos2=R + +[Entity] +PName=USER_GROUPS +LName=ユーザが所属するグループ +Comment= +TableOption= +Page=MAIN +Left=1350 +Top=500 +Field="ユーザID","USER_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" +Field="グループID","GROUP_ID","@INT","NOT NULL",1,"","CHARACTER SET latin1",$FFFFFFFF,"" +Field="グループの権限","GROUP_ROLE","@INT",,,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20140429060638 +Position="MAIN",1350,500 + +[Entity] +PName=GROUPS +LName=グループ +Comment= +TableOption= +Page=MAIN +Left=1350 +Top=200 +Field="グループID","GROUP_ID","@INT","NOT NULL",0,"","CHARACTER SET latin1",$FFFFFFFF,"" +Field="グループKEY","GROUP_KEY","@VARCHAR(68)","NOT NULL",,"","ユニーク",$FFFFFFFF,"" +Field="グループ名称","GROUP_NAME","@VARCHAR(128)","NOT NULL",,"","",$FFFFFFFF,"" +Field="説明","DESCRIPTION","@VARCHAR(256)",,,"","",$FFFFFFFF,"" +Field="親グループKKEY","PARENT_GROUP_KEY","@VARCHAR(128)",,,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20130928170709 +Position="MAIN",1350,200 + +[Entity] +PName=USERS +LName=ユーザ +Comment= +TableOption= +Page=MAIN +Left=700 +Top=500 +Field="ユーザID","USER_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" +Field="ユーザKEY","USER_KEY","@VARCHAR(256)","NOT NULL",,"","ユニーク",$FFFFFFFF,"" +Field="ユーザ名","USER_NAME","@VARCHAR(256)","NOT NULL",,"","",$FFFFFFFF,"" +Field="パスワード","PASSWORD","@VARCHAR(256)","NOT NULL",,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20130928170728 +Position="MAIN",700,500 + +[Entity] +PName=ROLES +LName=権限 +Comment= +TableOption= +Page=MAIN +Left=100 +Top=450 +Field="権限ID","ROLE_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" +Field="権限KEY","ROLE_KEY","@VARCHAR(12)","NOT NULL",,"","",$FFFFFFFF,"" +Field="権限名","ROLE_NAME","@VARCHAR(50)",,,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20130928170719 +Position="MAIN",100,450 + +[Entity] +PName=USER_ROLES +LName=ユーザの権限 +Comment= +TableOption= +Page=MAIN +Left=100 +Top=600 +Field="ユーザID","USER_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" +Field="権限ID","ROLE_ID","@INT","NOT NULL",1,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20130928170723 +Position="MAIN",100,600 + +[Relation] +Entity1=USERS +Entity2=USER_ROLES +RelationType1=1 +RelationType2=3 +Fields1=USER_ID +Fields2=USER_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,5000,5000,5925,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=500 +Bar2=500 +Bar3=592 +TermPos1=R +TermPos2=R + +[Relation] +Entity1=ROLES +Entity2=USER_ROLES +RelationType1=1 +RelationType2=3 +Fields1=ROLE_ID +Fields2=ROLE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,5000,5000,6158,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=500 +Bar2=500 +Bar3=616 +TermPos1=R +TermPos2=R + +[Entity] +PName=LOGIN_HISTORIES +LName=ログイン履歴 +Comment= +TableOption= +Page=MAIN +Left=700 +Top=200 +Field="ユーザID","USER_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" +Field="ログイン番号","LOGIN_COUNT","@DOUBLE","NOT NULL",1,"","",$FFFFFFFF,"" +Field="ログイン日時","LODIN_DATE_TIME","@DATETIME","NOT NULL",,"","",$FFFFFFFF,"" +Field="IPアドレス","IP_ADDRESS","@VARCHAR(15)",,,"","",$FFFFFFFF,"" +Field="エージェント","USER_AGENT","@VARCHAR(256)",,,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20130928170707 +Position="MAIN",700,200 + +[Relation] +Entity1=USERS +Entity2=LOGIN_HISTORIES +RelationType1=1 +RelationType2=3 +Fields1=USER_ID +Fields2=USER_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,5239,5000,4486,R,R +Dependence=1 +Caption= +PName= +ModifiedDateTime=20121112222858 +LineMode=0 +Bar1=524 +Bar2=500 +Bar3=449 +TermPos1=R +TermPos2=R + +[Entity] +PName=FUNCTIONS +LName=機能 +Comment= +TableOption= +Page=MAIN +Left=100 +Top=150 +Field="機能","FUNCTION_KEY","@VARCHAR(64)","NOT NULL",0,"","",$FFFFFFFF,"" +Field="機能の説明","DESCRIPTION","@VARCHAR(256)",,,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20130928170659 +Position="MAIN",100,150 + +[Entity] +PName=ROLE_FUNCTIONS +LName=機能にアクセスできる権限 +Comment= +TableOption= +Page=MAIN +Left=100 +Top=300 +Field="権限ID","ROLE_ID","@INT","NOT NULL",0,"","",$FFFFFFFF,"" +Field="機能","FUNCTION_KEY","@VARCHAR(64)","NOT NULL",1,"","",$FFFFFFFF,"" +NoDDL=1 +EffectMode=None +Color=$000000 +BkColor=$FFFFFF +ModifiedDateTime=20130928170704 +Position="MAIN",100,300 + +[Relation] +Entity1=ROLES +Entity2=ROLE_FUNCTIONS +RelationType1=1 +RelationType2=3 +Fields1=ROLE_ID +Fields2=ROLE_ID +Cardinarity1= +Cardinarity2= +Position="MAIN",0,5182,5000,4396,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=518 +Bar2=500 +Bar3=440 +TermPos1=R +TermPos2=R + +[Relation] +Entity1=FUNCTIONS +Entity2=ROLE_FUNCTIONS +RelationType1=1 +RelationType2=3 +Fields1=FUNCTION_KEY +Fields2=FUNCTION_KEY +Cardinarity1= +Cardinarity2= +Position="MAIN",0,5000,5000,4710,R,R +Dependence=1 +Caption= +PName= +LineMode=0 +Bar1=500 +Bar2=500 +Bar3=471 +TermPos1=R +TermPos2=R + +[Shape] +Page=Main +Left=19 +Top=11 +Width=2198 +Height=712 +BrushColor=$F0CAA6 +BrushAlpha=50 +ShapeType=Rectangle +Text= +FontName=Tahoma +FontSize=9 +FontColor=$000000 +ImageFileName= + +[Shape] +Page=Main +Left=21 +Top=794 +Width=2203 +Height=1028 +BrushColor=$DEB2C7 +BrushAlpha=50 +ShapeType=Rectangle +Text= +FontName=Tahoma +FontSize=9 +FontColor=$000000 +ImageFileName= diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..ab3e9243a --- /dev/null +++ b/pom.xml @@ -0,0 +1,122 @@ + + 4.0.0 + redcomet + knowledge + war + 0.2.1 + webapp for knowledge + https://support-project.org/ + + + UTF-8 + + + + + + redcomet + web + 0.2.1 + + + + com.h2database + h2 + 1.4.183 + + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + javax.servlet + jstl + 1.2 + + + + org.apache.lucene + lucene-core + 4.10.2 + + + org.apache.lucene + lucene-analyzers-common + 4.10.2 + + + org.apache.lucene + lucene-analyzers-kuromoji + 4.10.2 + + + org.apache.lucene + lucene-queryparser + 4.10.2 + + + org.apache.lucene + lucene-highlighter + 4.10.2 + + + + + org.apache.tika + tika-parsers + 1.6 + + + + + + + + private + https://support-project.org/nexus/content/repositories/public/ + + + + + + knowledge + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + UTF-8 + 1.7 + 1.7 + + + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + false + + + + + + + + + redcomet-releases + https://support-project.org/nexus/content/repositories/releases/ + + + redcomet-snapshots + https://support-project.org/nexus/content/repositories/snapshots/ + + + + diff --git a/src/main/java/redcomet/knowledge/bat/FileParseBat.java b/src/main/java/redcomet/knowledge/bat/FileParseBat.java new file mode 100644 index 000000000..db407dde4 --- /dev/null +++ b/src/main/java/redcomet/knowledge/bat/FileParseBat.java @@ -0,0 +1,141 @@ +package redcomet.knowledge.bat; + +import java.io.File; +import java.io.FileOutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.List; + +import org.apache.tika.mime.MimeType; +import org.apache.tika.mime.MimeTypes; + +import redcomet.common.config.ConfigLoader; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.FileUtil; +import redcomet.common.util.StringUtils; +import redcomet.knowledge.config.AppConfig; +import redcomet.knowledge.config.IndexType; +import redcomet.knowledge.dao.KnowledgeFilesDao; +import redcomet.knowledge.dao.KnowledgesDao; +import redcomet.knowledge.dao.TagsDao; +import redcomet.knowledge.entity.KnowledgeFilesEntity; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.entity.TagsEntity; +import redcomet.knowledge.indexer.IndexingValue; +import redcomet.knowledge.logic.IndexLogic; +import redcomet.knowledge.logic.KnowledgeLogic; +import redcomet.knowledge.parser.Parser; +import redcomet.knowledge.parser.ParserFactory; +import redcomet.knowledge.vo.ParseResult; + +public class FileParseBat { + /** ログ */ + private static Log LOG = LogFactory.getLog(FileParseBat.class); + + public static final int PARSE_STATUS_WAIT = 0; + public static final int PARSE_STATUS_PARSING = 1; + public static final int PARSE_STATUS_PARSED = 100; + + public static final int PARSE_STATUS_NO_TARGET = -1; + + public static final Integer UPDATE_USER_ID = -100; // システムユーザ(パースバッチ) + + public static final int TYPE_FILE = IndexType.KnowledgeFile.getValue(); + public static final String ID_PREFIX = "FILE-"; + + public static void main(String[] args) throws Exception { + FileParseBat bat = new FileParseBat(); + bat.start(); + } + + private void start() throws Exception { + LOG.info("start"); + KnowledgeFilesDao filesDao = KnowledgeFilesDao.get(); + IndexLogic indexLogic = IndexLogic.get(); + KnowledgesDao knowledgesDao = KnowledgesDao.get(); + TagsDao tagsDao = TagsDao.get(); + + // パースステータスがパース待ち(0)かつナレッジに紐づいているものを取得 + List filesEntities = filesDao.selectWaitStateFiles(); + AppConfig appConfig = ConfigLoader.load(AppConfig.APP_CONFIG, AppConfig.class); + File tmpDir = new File(appConfig.getTmpPath()); + + for (KnowledgeFilesEntity knowledgeFilesEntity : filesEntities) { + // ナレッジを取得 + KnowledgesEntity knowledgesEntity = knowledgesDao.selectOnKey(knowledgeFilesEntity.getKnowledgeId()); + if (knowledgesEntity == null) { + // 紐づくナレッジが存在していないのであれば解析はしない + filesDao.changeStatus(knowledgeFilesEntity.getFileNo(), PARSE_STATUS_NO_TARGET, UPDATE_USER_ID); + continue; + } + // タグを取得 + List tagsEntities = tagsDao.selectOnKnowledgeId(knowledgesEntity.getKnowledgeId()); + + // DBから取得したバイナリをいったんファイルに格納 + KnowledgeFilesEntity entity = filesDao.selectOnKey(knowledgeFilesEntity.getFileNo()); + StringBuilder name = new StringBuilder(); + name.append(entity.getFileNo()); + String extension = StringUtils.getExtension(entity.getFileName()); + if (StringUtils.isNotEmpty(extension)) { + name.append(extension); + } + + File tmp = new File(tmpDir, name.toString()); + FileOutputStream outputStream = new FileOutputStream(tmp); + try { + FileUtil.copy(entity.getFileBinary(), outputStream); + LOG.info("file: " + entity.getFileNo() + " to " + tmp.getAbsolutePath()); + } finally { + outputStream.close(); + entity.getFileBinary().close(); + } + if (StringUtils.isEmpty(extension)) { + String mime = Files.probeContentType(tmp.toPath()); + MimeTypes allTypes = MimeTypes.getDefaultMimeTypes(); + MimeType mimeType = allTypes.forName(mime); + String mimeExtention = mimeType.getExtension(); // Mimeから拡張子判定 + if (StringUtils.isNotEmpty(mimeExtention)) { + name.append(".").append(mimeExtention); + Files.move(tmp.toPath(), Paths.get(name.toString()), StandardCopyOption.REPLACE_EXISTING); + tmp = new File(name.toString()); + } + } + + // パースステータスをパース中(1)に変更(もしパースでエラーが発生しても、次回から対象外になる) + filesDao.changeStatus(entity.getFileNo(), PARSE_STATUS_PARSING, UPDATE_USER_ID); + + // パースを実行 + Parser parser = ParserFactory.getParser(tmp.getAbsolutePath()); + ParseResult result = parser.parse(tmp); + LOG.info("content text(length): " + result.getText().length()); + + // 全文検索エンジンへ登録 + IndexingValue value = new IndexingValue(); + value.setType(TYPE_FILE); + value.setId(ID_PREFIX + entity.getFileNo()); + value.setTitle(entity.getFileName()); + value.setContents(result.getText()); + value.addUser(entity.getInsertUser()); + if (knowledgesEntity.getPublicFlag() == null + || KnowledgeLogic.PUBLIC_FLAG_PUBLIC == knowledgesEntity.getPublicFlag()) { + value.addUser(KnowledgeLogic.ALL_USER); + } + for (TagsEntity tagsEntity : tagsEntities) { + value.addTag(tagsEntity.getTagId()); + } + value.setCreator(entity.getInsertUser()); + value.setTime(entity.getUpdateDatetime().getTime()); // 更新日時をセットするので、更新日時でソート + indexLogic.save(value); + + // パースステータスをパース完了に変更(もしパースでエラーが発生しても、次回から対象外になる) + filesDao.changeStatus(entity.getFileNo(), PARSE_STATUS_PARSED, UPDATE_USER_ID); + + // 正常に終了すれば、テンポラリを削除 + tmp.delete(); + LOG.info("deleteed: " + tmp.getAbsolutePath()); + } + } + +} diff --git a/src/main/java/redcomet/knowledge/bat/KnowledgeFileClearBat.java b/src/main/java/redcomet/knowledge/bat/KnowledgeFileClearBat.java new file mode 100644 index 000000000..e6b186fde --- /dev/null +++ b/src/main/java/redcomet/knowledge/bat/KnowledgeFileClearBat.java @@ -0,0 +1,22 @@ +package redcomet.knowledge.bat; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.knowledge.dao.KnowledgeFilesDao; + +public class KnowledgeFileClearBat { + + /** ログ */ + private static Log LOG = LogFactory.getLog(KnowledgeFileClearBat.class); + + public static void main(String[] args) { + LOG.trace("start"); + + KnowledgeFilesDao filesDao = KnowledgeFilesDao.get(); + int count = filesDao.deleteNotConnectFiles(); + if (count > 0) { + LOG.debug("Knowledge Files deleted. Count: " + count + ""); + } + } + +} diff --git a/src/main/java/redcomet/knowledge/config/AppConfig.java b/src/main/java/redcomet/knowledge/config/AppConfig.java new file mode 100644 index 000000000..819e04297 --- /dev/null +++ b/src/main/java/redcomet/knowledge/config/AppConfig.java @@ -0,0 +1,37 @@ +package redcomet.knowledge.config; + + +public class AppConfig extends redcomet.web.config.AppConfig { + + private String indexPath; + + private boolean convIndexPath = false; + + /** + * @return the indexPath + */ + public String getIndexPath() { + if (!convIndexPath) { + String path = indexPath; + if (path.indexOf("{user.home}") != -1) { + String userHome = System.getProperty("user.home"); + path = path.replace("{user.home}", userHome); + } + if (path.indexOf("\\") != -1) { + path = path.replaceAll("\\\\", "/"); + } + this.indexPath = path; + convIndexPath = true; + } + return indexPath; + } + + /** + * @param indexPath the indexPath to set + */ + public void setIndexPath(String indexPath) { + this.indexPath = indexPath; + } + + +} diff --git a/src/main/java/redcomet/knowledge/config/FileType.java b/src/main/java/redcomet/knowledge/config/FileType.java new file mode 100644 index 000000000..bc27cce25 --- /dev/null +++ b/src/main/java/redcomet/knowledge/config/FileType.java @@ -0,0 +1,25 @@ +package redcomet.knowledge.config; + + +public enum FileType { + NotCovered, //対象外(パースしない) + Other, //その他(Tikaでパースしてみる) + Text, + Word, + Excel, + PowerPoint, + HTML, + PDF, + Java; + + + public int getValue() { + return ordinal(); + } + + public static FileType getType(int type) { + FileType[] values = values(); + return values[type]; + } + +} diff --git a/src/main/java/redcomet/knowledge/config/IndexType.java b/src/main/java/redcomet/knowledge/config/IndexType.java new file mode 100644 index 000000000..ae91345fe --- /dev/null +++ b/src/main/java/redcomet/knowledge/config/IndexType.java @@ -0,0 +1,17 @@ +package redcomet.knowledge.config; + +public enum IndexType { + Knoeledge, + KnowledgeFile; + + + public int getValue() { + return ordinal(); + } + + public static IndexType getType(int type) { + IndexType[] values = values(); + return values[type]; + } + +} diff --git a/src/main/java/redcomet/knowledge/control/Control.java b/src/main/java/redcomet/knowledge/control/Control.java new file mode 100644 index 000000000..73aea1483 --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/Control.java @@ -0,0 +1,118 @@ +package redcomet.knowledge.control; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.owasp.validator.html.AntiSamy; +import org.owasp.validator.html.CleanResults; +import org.owasp.validator.html.Policy; +import org.owasp.validator.html.PolicyException; +import org.owasp.validator.html.ScanException; + +import redcomet.common.bean.ValidateError; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.log.LogLevel; +import redcomet.common.util.HtmlUtils; +import redcomet.web.util.JspUtil; + +public abstract class Control extends redcomet.web.control.Control { + /** ログ */ + private static Log LOG = LogFactory.getLog(Control.class); + + public static final String PATH_ANTISAMY_POLICY = JspUtil.PATH_ANTISAMY_POLICY; + + public static final String MSG_INFO = "NOTIFY_MSG_INFO"; + public static final String MSG_SUCCESS = "NOTIFY_MSG_SUCCESS"; + public static final String MSG_WARN = "NOTIFY_MSG_WARN"; + public static final String MSG_ERROR = "NOTIFY_MSG_ERROR"; + + private List infos = null; + private List successes = null; + private List warns = null; + private List errors = null; + + @Override + public void setRequest(HttpServletRequest request) { + super.setRequest(request); + infos = new ArrayList(); + successes = new ArrayList(); + warns = new ArrayList(); + errors = new ArrayList(); + + request.setAttribute(MSG_INFO, infos); + request.setAttribute(MSG_SUCCESS, successes); + request.setAttribute(MSG_WARN, warns); + request.setAttribute(MSG_ERROR, errors); + } + + protected void addMsgInfo(String msg) { + infos.add(HtmlUtils.escapeHTML(msg)); + } + + protected void addMsgSuccess(String msg) { + successes.add(HtmlUtils.escapeHTML(msg)); + } + + protected void addMsgWarn(String msg) { + warns.add(HtmlUtils.escapeHTML(msg)); + } + + protected void addMsgError(String msg) { + errors.add(HtmlUtils.escapeHTML(msg)); + } + + protected void setResult(String successMsg, List errors) { + if (errors == null || errors.isEmpty()) { + addMsgSuccess(successMsg); + } else { + for (ValidateError validateError : errors) { + if (validateError.getLevel().intValue() == LogLevel.ERROR.getValue()) { + addMsgError(validateError.getMsg()); + } else { + addMsgWarn(validateError.getMsg()); + } + } + } + } + + public static String doSamy(String str) throws PolicyException, ScanException { + Policy policy = Policy.getInstance(Control.class.getResourceAsStream(PATH_ANTISAMY_POLICY)); + AntiSamy as = new AntiSamy(); + CleanResults cr = as.scan(str, policy); + String escape = cr.getCleanHTML(); + if (LOG.isDebugEnabled()) { + if (str != null && !str.equals(escape)) { + LOG.debug("escape string\n before:" + str + "\naftter:" + escape); + } + } + return escape; + } + + /* (non-Javadoc) + * @see redcomet.web.control.Control#copy(redcomet.web.control.Control) + */ + @Override + protected void copy(redcomet.web.control.Control control) { + super.copy(control); + if (control instanceof Control) { + Control c = (Control) control; + for (String string : infos) { + c.addMsgInfo(string); + } + for (String string : successes) { + c.addMsgSuccess(string); + } + for (String string : warns) { + c.addMsgWarn(string); + } + for (String string : errors) { + c.addMsgError(string); + } + } + } + + +} diff --git a/src/main/java/redcomet/knowledge/control/IndexControl.java b/src/main/java/redcomet/knowledge/control/IndexControl.java new file mode 100644 index 000000000..86bf08892 --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/IndexControl.java @@ -0,0 +1,20 @@ +package redcomet.knowledge.control; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.web.bean.MessageResult; +import redcomet.web.boundary.Boundary; +import redcomet.web.config.MessageStatus; + +public class IndexControl extends Control { + /** ログ */ + private static Log log = LogFactory.getLog(IndexControl.class); + + public Boundary msg() { + MessageResult result = new MessageResult(); + result.setStatus(MessageStatus.Success.getValue()); + result.setMessage("OK"); + return send(result); + } + +} diff --git a/src/main/java/redcomet/knowledge/control/admin/UsersControl.java b/src/main/java/redcomet/knowledge/control/admin/UsersControl.java new file mode 100644 index 000000000..419276891 --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/admin/UsersControl.java @@ -0,0 +1,295 @@ +package redcomet.knowledge.control.admin; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.common.util.PropertyUtil; +import redcomet.common.util.StringUtils; +import redcomet.knowledge.control.Control; +import redcomet.knowledge.logic.UserLogic; +import redcomet.knowledge.vo.Roles; +import redcomet.web.annotation.Auth; +import redcomet.web.boundary.Boundary; +import redcomet.web.config.RedCometWebParameter; +import redcomet.web.dao.RolesDao; +import redcomet.web.dao.UsersDao; +import redcomet.web.entity.RolesEntity; +import redcomet.web.entity.UsersEntity; +import redcomet.web.exception.InvalidParamException; + +public class UsersControl extends Control { + + public static final int PAGE_LIMIT = 100; + + /** + * ユーザー一覧を表示 + * @return + * @throws InvalidParamException + */ + @Auth(roles="admin") + public Boundary list() throws InvalidParamException { + Integer offset = super.getPathInteger(0); + if (offset == null) { + offset = 0; + } + String keyword = super.getParam("keyword"); + return list(offset, keyword); + } + + /** + * 一覧表示 + * @param offset + * @param keyword + * @return + */ + @Auth(roles="admin") + private Boundary list(Integer offset, String keyword) { + UsersDao dao = UsersDao.get(); + List users = dao.selectOnKeyword(offset * PAGE_LIMIT, PAGE_LIMIT, keyword); + for (UsersEntity usersEntity : users) { + usersEntity.setPassword(""); + } + setAttribute("users", users); + + int previous = offset -1; + if (previous < 0) { + previous = 0; + } + setAttribute("offset", offset); + setAttribute("previous", previous); + setAttribute("next", offset + 1); + + return forward("list.jsp"); + } + + + /** + * 登録画面を表示する + * @return + */ + @Auth(roles="admin") + public Boundary view_add() { + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + UsersEntity entity = new UsersEntity(); + setAttributeOnProperty(entity); + + // 登録されているロールをセット + setSystemRoles(null); + + return forward("view_add.jsp"); + } + + /** + * システムに登録されているロールをセット + */ + private void setSystemRoles(UsersEntity user) { + RolesDao rolesDao = RolesDao.get(); + List rolesEntities = rolesDao.selectAll(); + List roles = new ArrayList<>(); + for (RolesEntity rolesEntity : rolesEntities) { + Roles role = new Roles(); + PropertyUtil.copyPropertyValue(rolesEntity, role); + roles.add(role); + } + + Map map = new HashMap(); + for (Roles role : roles) { + map.put(role.getRoleKey(), role); + } + if (user != null) { + // ユーザのロールを取得 + List userRoles = rolesDao.selectOnUserKey(user.getUserKey()); + for (RolesEntity userRolesEntity : userRoles) { + if (map.containsKey(userRolesEntity.getRoleKey())) { + Roles role = map.get(userRolesEntity.getRoleKey()); + role.setChecked(true); + } + } + } else { + // ユーザが指定されていない = 新規登録なので、デフォルト値をチェック(一般ユーザ権限にチェック) + if (map.containsKey(RedCometWebParameter.ROLE_USER)) { + Roles role = map.get(RedCometWebParameter.ROLE_USER); + role.setChecked(true); + } + } + + setAttribute("systemRoles", roles); + } + + /** + * 更新画面を表示する + * @return + * @throws InvalidParamException + */ + @Auth(roles="admin") + public Boundary view_edit() throws InvalidParamException { + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + UsersEntity entity = new UsersEntity(); + setAttributeOnProperty(entity); + + Integer userId = super.getPathInteger(); + UsersDao dao = UsersDao.get(); + UsersEntity user = dao.selectOnKey(userId); + if (user == null) { + return sendError(404, "user is missing."); + } + user.setPassword(""); + setAttributeOnProperty(user); + + // 登録されているロールをセット + setSystemRoles(user); + + return forward("view_edit.jsp"); + } + + + + /** + * ユーザを追加 + * @return + */ + @Auth(roles="admin") + public Boundary create() { + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + + UsersEntity user = new UsersEntity(); + Map values = getParams(); + List errors = user.validate(values); + if (!StringUtils.isEmpty(getParam("password"))) { + if (!getParam("password").equals(getParam("confirm_password", String.class))) { + ValidateError error = new ValidateError("PasswordとConfirm Passwordが違っています"); + errors.add(error); + } + } + UsersDao dao = UsersDao.get(); + user = dao.selectOnUserKey(getParam("userKey")); + if (user != null) { + ValidateError error = new ValidateError("既に登録されているEmail Addressです"); + errors.add(error); + } + if (!errors.isEmpty()) { + setResult(null, errors); + return forward("view_add.jsp"); + } + + // エラーが無い場合のみ登録 + user = super.getParams(UsersEntity.class); + String[] roles = getRequest().getParameterValues("roles"); + user = UserLogic.get().insert(user, roles, getLoginedUser()); + setAttributeOnProperty(user); + + // 登録されているロールをセット + setSystemRoles(user); + + String successMsg = "登録しました"; + setResult(successMsg, errors); + return forward("view_edit.jsp"); + + } + + + + /** + * ユーザを更新 + * @return + */ + @Auth(roles="admin") + public Boundary save() { + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + + UsersEntity user = new UsersEntity(); + Map values = getParams(); + List errors = new ArrayList(); + + if (StringUtils.isEmpty(getParam("password"))) { + values.put("password", "-"); + } else { + if (!getParam("password").equals(getParam("confirm_password", String.class))) { + ValidateError error = new ValidateError("PasswordとConfirm Passwordが違っています"); + errors.add(error); + } + } + errors.addAll(user.validate(values)); + + UsersDao dao = UsersDao.get(); + user = dao.selectOnKey(getParam("userId", Integer.class)); + if (user == null) { + ValidateError error = new ValidateError("削除されています"); + errors.add(error); + } else { + UsersEntity check = dao.selectOnUserKey(getParam("userKey")); + if (check != null && check.getUserId().intValue() != user.getUserId().intValue()) { + ValidateError error = new ValidateError("既に登録されているEmail Addressです"); + errors.add(error); + } + } + if (!errors.isEmpty()) { + setResult(null, errors); + return forward("view_edit.jsp"); + } + + user.setUserKey(getParam("userKey")); + user.setUserName(getParam("userName")); + if (!StringUtils.isEmpty(getParam("password"))) { + user.setPassword(getParam("password")); + user.setEncrypted(false); + } + // エラーが無い場合のみ登録 + String[] roles = getRequest().getParameterValues("roles"); + user = UserLogic.get().update(user, roles, getLoginedUser()); + setAttributeOnProperty(user); + + // 登録されているロールをセット + setSystemRoles(user); + + String successMsg = "更新しました"; + setResult(successMsg, errors); + return forward("view_edit.jsp"); + } + + + /** + * ユーザを削除 + * @return + * @throws Exception + */ + @Auth(roles="admin") + public Boundary delete() throws Exception { + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + UsersDao dao = UsersDao.get(); + UsersEntity user = dao.selectOnKey(getParam("userId", Integer.class)); + if (user != null) { + //dao.delete(user.getUserId()); + UserLogic.get().withdrawal(user.getUserId(), true); + } + String successMsg = "削除しました"; + setResult(successMsg, null); + return list(Integer.parseInt(offset), ""); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/control/open/FileControl.java b/src/main/java/redcomet/knowledge/control/open/FileControl.java new file mode 100644 index 000000000..c61a8d056 --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/open/FileControl.java @@ -0,0 +1,29 @@ +package redcomet.knowledge.control.open; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.knowledge.control.Control; +import redcomet.knowledge.entity.KnowledgeFilesEntity; +import redcomet.knowledge.logic.UploadedFileLogic; +import redcomet.web.boundary.Boundary; +import redcomet.web.common.HttpStatus; + +public class FileControl extends Control { + /** ログ */ + private static Log LOG = LogFactory.getLog(FileControl.class); + + private UploadedFileLogic fileLogic = UploadedFileLogic.get(); + + public Boundary download() { + LOG.trace("download()"); + + Long fileNo = getParam("fileNo", Long.class); + KnowledgeFilesEntity entity = fileLogic.getFile(fileNo, getLoginedUser()); + + if (entity == null) { + return sendError(HttpStatus.SC_404_NOT_FOUND, "NOT FOUND"); + } + + return download(entity.getFileName(), entity.getFileBinary(), entity.getFileSize().longValue()); + } +} diff --git a/src/main/java/redcomet/knowledge/control/open/KnowledgeControl.java b/src/main/java/redcomet/knowledge/control/open/KnowledgeControl.java new file mode 100644 index 000000000..54887573e --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/open/KnowledgeControl.java @@ -0,0 +1,220 @@ +package redcomet.knowledge.control.open; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.Cookie; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.StringUtils; +import redcomet.knowledge.control.Control; +import redcomet.knowledge.dao.CommentsDao; +import redcomet.knowledge.dao.LikesDao; +import redcomet.knowledge.dao.TagsDao; +import redcomet.knowledge.entity.CommentsEntity; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.entity.TagsEntity; +import redcomet.knowledge.logic.KnowledgeLogic; +import redcomet.knowledge.logic.TagLogic; +import redcomet.knowledge.logic.UploadedFileLogic; +import redcomet.knowledge.vo.LikeCount; +import redcomet.knowledge.vo.UploadFile; +import redcomet.web.bean.LoginedUser; +import redcomet.web.boundary.Boundary; +import redcomet.web.common.HttpStatus; +import redcomet.web.exception.InvalidParamException; + +public class KnowledgeControl extends Control { + /** ログ */ + private static Log LOG = LogFactory.getLog(KnowledgeControl.class); + + public static final int PAGE_LIMIT = 10; + public static final int COOKIE_AGE = 60 * 60 * 24 * 31; + + /** + * ナレッジを表示 + * @return + * @throws InvalidParamException + */ + public Boundary view() throws InvalidParamException { + Long knowledgeId = super.getPathLong(Long.valueOf(-1)); + + KnowledgeLogic knowledgeLogic = KnowledgeLogic.get(); + + // 今見たナレッジの情報をCookieに保存 + // TODO セッションのデータを操作 + List ids = new ArrayList(); + ids.add(String.valueOf(knowledgeId)); + Cookie[] cookies = getRequest().getCookies(); + for (Cookie cookie : cookies) { + if (cookie.getName().equals("KNOWLEDGE_HISTORY")) { + String history = cookie.getValue(); + if (history.indexOf(",") != -1) { + String[] historyIds = history.split(","); + for (int i = historyIds.length - 1; i >= 0; i--) { + if (!ids.contains(historyIds[i])) { + ids.add(historyIds[i]); + } + if (ids.size() >= 10) { + break; + } + } + } else { + if (!ids.contains(history)) { + ids.add(history); + } + } + } + } + String cookieHistory = String.join(",", ids); + Cookie cookie = new Cookie("KNOWLEDGE_HISTORY", cookieHistory); + cookie.setPath(getRequest().getContextPath()); + cookie.setMaxAge(COOKIE_AGE); + getResponse().addCookie(cookie); + + KnowledgesEntity entity = knowledgeLogic.select(knowledgeId, getLoginedUser()); + if (entity == null) { + return sendError(HttpStatus.SC_404_NOT_FOUND, "NOT FOUND"); + } + setAttributeOnProperty(entity); + + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + + // ナレッジに紐づく添付ファイルを取得 + UploadedFileLogic fileLogic = UploadedFileLogic.get(); + List files = fileLogic.selectOnKnowledgeId(knowledgeId, getRequest().getContextPath()); + setAttribute("files", files); + + // 閲覧履歴を追加 + knowledgeLogic.addViewHistory(knowledgeId, getLoginedUser()); + + // いいね!の件数取得 + LikesDao likesDao = LikesDao.get(); + Long count = likesDao.countOnKnowledgeId(knowledgeId); + setAttribute("like_count", count); + + // コメント取得 + CommentsDao commentsDao = CommentsDao.get(); + List comments = commentsDao.selectOnKnowledgeId(knowledgeId); + setAttribute("comments", comments); + + return forward("view.jsp"); + } + + /** + * リストを表示 + * @return + * @throws Exception + */ + public Boundary list() throws Exception { + TagsDao tagsDao = TagsDao.get(); + KnowledgeLogic knowledgeLogic = KnowledgeLogic.get(); + + Integer offset = super.getPathInteger(0); + LoginedUser loginedUser = super.getLoginedUser(); + String keyword = getParam("keyword"); + String tag = getParam("tag"); + + List knowledges = new ArrayList<>(); + + if (StringUtils.isInteger(tag)) { + //タグを選択している + LOG.trace("show on Tag"); + knowledges.addAll(knowledgeLogic.showKnowledgeOnTag(tag, loginedUser, offset * PAGE_LIMIT, PAGE_LIMIT)); + TagsEntity tagsEntity = tagsDao.selectOnKey(new Integer(tag)); + setAttribute("selectedTag", tagsEntity); + } else { + // その他 + LOG.trace("search"); + knowledges.addAll(knowledgeLogic.searchKnowledge(keyword, loginedUser, offset * PAGE_LIMIT, PAGE_LIMIT)); + } + setAttribute("knowledges", knowledges); + + int previous = offset -1; + if (previous < 0) { + previous = 0; + } + + // タグの情報を取得 + if (super.getLoginedUser() != null && super.getLoginedUser().isAdmin()) { + // 管理者であれば、ナレッジの件数は、参照権限を考慮していない + List tags = tagsDao.selectTagsWithCount(0, PAGE_LIMIT); + setAttribute("tags", tags); + } else { + TagLogic tagLogic = TagLogic.get(); + List tags = tagLogic.selectTagsWithCount(loginedUser, 0, PAGE_LIMIT); + setAttribute("tags", tags); + } + + // History表示 + // TODO 履歴表示を毎回取得するのはイマイチ。いったんセッションに保存しておくのが良いかも + Cookie[] cookies = getRequest().getCookies(); + List historyIds = new ArrayList<>(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals("KNOWLEDGE_HISTORY")) { + String history = cookie.getValue(); + LOG.debug("history: " + history); + if (history.indexOf(",") != -1) { + String[] splits = history.split(","); + for (String string : splits) { + historyIds.add(string); + } + } else { + historyIds.add(history); + } + } + } + } + List histories = knowledgeLogic.getKnowledges(historyIds, loginedUser); + for (KnowledgesEntity knowledgesEntity : histories) { + knowledgesEntity.setContent(org.apache.commons.lang.StringUtils.abbreviate( + knowledgesEntity.getContent(), 40)); + knowledgesEntity.setContent(doSamy(knowledgesEntity.getContent())); + } + setAttribute("histories", histories); + + setAttribute("offset", offset); + setAttribute("previous", previous); + setAttribute("next", offset + 1); + return forward("list.jsp"); + } + + /** + * いいねを押下 + * @return + * @throws InvalidParamException + */ + public Boundary like() throws InvalidParamException { + Long knowledgeId = super.getPathLong(Long.valueOf(-1)); + KnowledgeLogic knowledgeLogic = KnowledgeLogic.get(); + Long count = knowledgeLogic.addLike(knowledgeId, getLoginedUser()); + LikeCount likeCount = new LikeCount(); + likeCount.setKnowledgeId(knowledgeId); + likeCount.setCount(count); + return send(likeCount); + } + + + + /** + * タイトルとコンテンツの危険なタグをエスケープした結果を返す + * (KnowledgesEntityのgetXXXで実施しているので、entityにセットしてJSONで返すだけで良い) + * TODO クライアント側で出来ないか? + * @param entity + * @return + */ + public Boundary escape(KnowledgesEntity entity) { + return super.send(entity); + } + + + +} + + diff --git a/src/main/java/redcomet/knowledge/control/open/LicenseControl.java b/src/main/java/redcomet/knowledge/control/open/LicenseControl.java new file mode 100644 index 000000000..79ac4749e --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/open/LicenseControl.java @@ -0,0 +1,7 @@ +package redcomet.knowledge.control.open; + +import redcomet.knowledge.control.Control; + +public class LicenseControl extends Control { + +} diff --git a/src/main/java/redcomet/knowledge/control/protect/AccountControl.java b/src/main/java/redcomet/knowledge/control/protect/AccountControl.java new file mode 100644 index 000000000..56cb9a2ef --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/protect/AccountControl.java @@ -0,0 +1,112 @@ +package redcomet.knowledge.control.protect; + +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.common.util.StringUtils; +import redcomet.di.Container; +import redcomet.knowledge.control.Control; +import redcomet.knowledge.logic.UserLogic; +import redcomet.web.bean.LoginedUser; +import redcomet.web.boundary.Boundary; +import redcomet.web.common.HttpStatus; +import redcomet.web.dao.UsersDao; +import redcomet.web.entity.UsersEntity; +import redcomet.web.logic.AuthenticationLogic; +import redcomet.web.logic.impl.DefaultAuthenticationLogicImpl; + +public class AccountControl extends Control { + + @Override + public Boundary index() { + LoginedUser loginedUser = super.getLoginedUser(); + if (loginedUser == null) { + sendError(HttpStatus.SC_401_UNAUTHORIZED, ""); + } + Integer userId = loginedUser.getLoginUser().getUserId(); + UsersEntity user = UsersDao.get().selectOnKey(userId); + user.setPassword(null); + + setAttributeOnProperty(user); + return forward("index.jsp"); + } + + public Boundary update() { + LoginedUser loginedUser = super.getLoginedUser(); + if (loginedUser == null) { + sendError(HttpStatus.SC_401_UNAUTHORIZED, ""); + } + + Map values = getParams(); + values.put("userId", String.valueOf(super.getLoginUserId())); + values.put("rowId", "-"); //row_idは必須だが、画面からはこない + if (StringUtils.isEmpty(getParam("password"))) { + values.put("password", "-"); + } + + UsersEntity user = new UsersEntity(); + List errors = user.validate(values); + if (!StringUtils.isEmpty(getParam("password"))) { + if (!getParam("password").equals(getParam("confirm_password", String.class))) { + ValidateError error = new ValidateError("PasswordとConfirm Passwordが違っています"); + errors.add(error); + } + } + + if (errors.isEmpty()) { + // エラーが無い場合のみ更新する + //UsersEntity user = super.getParams(UsersEntity.class); + UsersDao dao = UsersDao.get(); + user = dao.selectOnKey(getLoginUserId()); + if (user == null) { + sendError(HttpStatus.SC_400_BAD_REQUEST, "user is allready removed."); + } + user.setUserKey(getParam("userKey")); + user.setUserName(getParam("userName")); + if (!StringUtils.isEmpty(getParam("password"))) { + user.setPassword(getParam("password")); + user.setEncrypted(false); + } + dao.update(user); + } + String successMsg = "更新しました"; + setResult(successMsg, errors); + + return forward("index.jsp"); + } + + /** + * 退会画面を表示 + * @return + */ + public Boundary withdrawal() { + return forward("withdrawal.jsp"); + } + + + + /** + * 退会を実行 + * @return + * @throws Exception + */ + public Boundary delete() throws Exception { + // アカウント削除(退会処理) + boolean knowledgeRemove = true; + if ("2".equals(getParam("knowledge_remove"))) { + knowledgeRemove = false; + } + UserLogic.get().withdrawal(getLoginUserId(), knowledgeRemove); + + // セッションを破棄 + AuthenticationLogic authenticationLogic = Container.getComp(DefaultAuthenticationLogicImpl.class); + authenticationLogic.clearSession(getRequest()); + + addMsgInfo("ご利用ありがとうございました"); + return devolution("index/index"); + //return redirect(getRequest().getContextPath()); + } + + +} diff --git a/src/main/java/redcomet/knowledge/control/protect/FileControl.java b/src/main/java/redcomet/knowledge/control/protect/FileControl.java new file mode 100644 index 000000000..4fa87a980 --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/protect/FileControl.java @@ -0,0 +1,78 @@ +package redcomet.knowledge.control.protect; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.fileupload.FileItem; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.knowledge.control.Control; +import redcomet.knowledge.dao.KnowledgeFilesDao; +import redcomet.knowledge.entity.KnowledgeFilesEntity; +import redcomet.knowledge.logic.UploadedFileLogic; +import redcomet.knowledge.vo.UploadFile; +import redcomet.knowledge.vo.UploadResults; +import redcomet.web.boundary.Boundary; +import redcomet.web.boundary.JsonBoundary; +import redcomet.web.common.HttpStatus; + +public class FileControl extends Control { + /** ログ */ + private static Log LOG = LogFactory.getLog(FileControl.class); + + private KnowledgeFilesDao filesDao = KnowledgeFilesDao.get(); + private UploadedFileLogic fileLogic = UploadedFileLogic.get(); + + /** + * アップロードされたファイルを保存する + * @return + * @throws Exception + */ + public Boundary upload() throws Exception { + UploadResults results = new UploadResults(); + List files = new ArrayList(); + Object obj = getParam("files[]", Object.class); + if (obj instanceof FileItem) { + FileItem fileItem = (FileItem) obj; + UploadFile file = fileLogic.saveFile(fileItem, getLoginedUser(), getRequest().getContextPath()); + files.add(file); + } else if (obj instanceof List) { + List fileItems = (List) obj; + for (FileItem fileItem : fileItems) { + UploadFile file = fileLogic.saveFile(fileItem, getLoginedUser(), getRequest().getContextPath()); + files.add(file); + } + } + results.setFiles(files); + return send(HttpStatus.SC_200_OK, results); + } + + + + public JsonBoundary delete() { + LOG.trace("delete()"); + + Long fileNo = getParam("fileNo", Long.class); + KnowledgeFilesEntity entity = filesDao.selectOnKeyWithoutBinary(fileNo); + if (entity == null) { + // 既に削除済 + return send(HttpStatus.SC_200_OK, "success: " + fileNo); + } + if (0 == entity.getKnowledgeId() || entity.getKnowledgeId() == null) { + // ナレッジと紐づいていないものなので削除してOK + // 紐づいているものは、ナレッジを更新した際に、紐付きがなければ削除になるので、実際の削除処理は実施しない + if (!getLoginedUser().isAdmin()) { + if (entity.getInsertUser().intValue() != getLoginUserId().intValue()) { + // 登録者以外に削除はさせない + return send(HttpStatus.SC_400_BAD_REQUEST, "fail: " + fileNo); + } + } + // 削除実行 + fileLogic.removeFile(fileNo, getLoginedUser()); + } + return send(HttpStatus.SC_200_OK, "success: " + fileNo); + } + + +} diff --git a/src/main/java/redcomet/knowledge/control/protect/KnowledgeControl.java b/src/main/java/redcomet/knowledge/control/protect/KnowledgeControl.java new file mode 100644 index 000000000..512926b4a --- /dev/null +++ b/src/main/java/redcomet/knowledge/control/protect/KnowledgeControl.java @@ -0,0 +1,258 @@ +package redcomet.knowledge.control.protect; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import redcomet.common.bean.ValidateError; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.StringUtils; +import redcomet.di.Container; +import redcomet.knowledge.control.Control; +import redcomet.knowledge.dao.CommentsDao; +import redcomet.knowledge.dao.KnowledgesDao; +import redcomet.knowledge.entity.CommentsEntity; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.entity.TagsEntity; +import redcomet.knowledge.logic.KnowledgeLogic; +import redcomet.knowledge.logic.UploadedFileLogic; +import redcomet.knowledge.vo.UploadFile; +import redcomet.web.boundary.Boundary; +import redcomet.web.common.HttpStatus; +import redcomet.web.exception.InvalidParamException; + +public class KnowledgeControl extends Control { + /** ログ */ + private static Log LOG = LogFactory.getLog(KnowledgeControl.class); + + private KnowledgeLogic knowledgeLogic = KnowledgeLogic.get(); + private UploadedFileLogic fileLogic = UploadedFileLogic.get(); + + /** + * 登録画面を表示する + * @return + */ + public Boundary view_add() { + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + + return forward("view_add.jsp"); + } + /** + * 登録画面を表示する + * @return + * @throws InvalidParamException + */ + public Boundary view_edit() throws InvalidParamException { + String offset = super.getParam("offset", String.class); + if (StringUtils.isEmpty(offset)) { + offset = "0"; + } + setAttribute("offset", offset); + + Long knowledgeId = super.getPathLong(); + KnowledgesEntity entity = knowledgeLogic.select(knowledgeId, getLoginedUser()); + if (entity == null) { + return sendError(HttpStatus.SC_404_NOT_FOUND, "NOT_FOUND"); + } + setAttributeOnProperty(entity); + + // ナレッジに紐づく添付ファイルを取得 + List files = fileLogic.selectOnKnowledgeId(knowledgeId, getRequest().getContextPath()); + setAttribute("files", files); + + if (!super.getLoginedUser().isAdmin() && entity.getInsertUser().intValue() != super.getLoginUserId().intValue()) { + addMsgWarn("自分で登録したもの以外は編集出来ません"); + return forward("/open/knowledge/view.jsp"); + } + return forward("view_edit.jsp"); + } + + /** + * 登録する + * @return + * @throws Exception + */ + public Boundary add(KnowledgesEntity entity) throws Exception { + LOG.trace("validate"); + List fileNos = new ArrayList(); + Object obj = getParam("files", Object.class); + if (obj != null) { + if (obj instanceof String) { + String string = (String) obj; + if (StringUtils.isLong(string)) { + fileNos.add(new Long(string)); + } + } else if (obj instanceof List) { + List strings = (List) obj; + for (String string : strings) { + if (StringUtils.isLong(string)) { + fileNos.add(new Long(string)); + } + } + } + } + + List errors = entity.validate(); + if (!errors.isEmpty()) { + setResult(null, errors); + // バリデーションエラーが発生した場合、設定されていた添付ファイルの情報は再取得 + List files = fileLogic.selectOnFileNos(fileNos, getRequest().getContextPath()); + Iterator iterator = files.iterator(); + while (iterator.hasNext()) { + UploadFile uploadFile = (UploadFile) iterator.next(); + if (uploadFile.getKnowlegeId() != null) { + // 新規登録なのに、添付ファイルが既にナレッジに紐づいている(おかしい) + iterator.remove(); + } + } + setAttribute("files", files); + + return forward("view_add.jsp"); + } + LOG.trace("save"); + String tags = super.getParam("tags"); + List tagList = knowledgeLogic.manegeTags(tags); + entity = knowledgeLogic.insert(entity, tagList, fileNos, super.getLoginedUser()); + setAttributeOnProperty(entity); + + List files = fileLogic.selectOnKnowledgeId(entity.getKnowledgeId(), getRequest().getContextPath()); + setAttribute("files", files); + + addMsgSuccess("登録しました"); + return forward("view_edit.jsp"); + } + + /** + * 更新する + * @return + * @throws Exception + */ + public Boundary update(KnowledgesEntity entity) throws Exception { + LOG.trace("validate"); + List fileNos = new ArrayList(); + Object obj = getParam("files", Object.class); + if (obj != null) { + if (obj instanceof String) { + String string = (String) obj; + if (StringUtils.isLong(string)) { + fileNos.add(new Long(string)); + } + } else if (obj instanceof List) { + List strings = (List) obj; + for (String string : strings) { + if (StringUtils.isLong(string)) { + fileNos.add(new Long(string)); + } + } + } + } + + KnowledgesDao dao = Container.getComp(KnowledgesDao.class); + List errors = entity.validate(); + if (!errors.isEmpty()) { + setResult(null, errors); + + // バリデーションエラーが発生した場合、設定されていた添付ファイルの情報は再取得 + List files = fileLogic.selectOnFileNos(fileNos, getRequest().getContextPath()); + Iterator iterator = files.iterator(); + while (iterator.hasNext()) { + UploadFile uploadFile = (UploadFile) iterator.next(); + if (uploadFile.getKnowlegeId() != null + && uploadFile.getKnowlegeId().longValue() != entity.getKnowledgeId().longValue()) { + // ナレッジIDが空でなく、かつ、更新中のナレッジ以外に紐づいている添付ファイルはおかしいので削除 + iterator.remove(); + } + } + setAttribute("files", files); + + return forward("view_edit.jsp"); + } + + KnowledgesEntity check = dao.selectOnKey(entity.getKnowledgeId()); + if (check == null) { + return sendError(HttpStatus.SC_404_NOT_FOUND, "NOT_FOUND"); + } + if (!super.getLoginedUser().isAdmin() && check.getInsertUser().intValue() != super.getLoginUserId().intValue()) { + addMsgWarn("自分で登録したもの以外は編集出来ません"); + return forward("/open/knowledge/view.jsp"); + } + + LOG.trace("save"); + String tags = super.getParam("tags"); + List tagList = knowledgeLogic.manegeTags(tags); + entity = knowledgeLogic.update(entity, tagList, fileNos, super.getLoginedUser()); + setAttributeOnProperty(entity); + addMsgSuccess("更新しました"); + + List files = fileLogic.selectOnKnowledgeId(entity.getKnowledgeId(), getRequest().getContextPath()); + setAttribute("files", files); + + return forward("view_edit.jsp"); + } + + /** + * ナレッジを削除 + * @return + * @throws Exception + */ + public Boundary delete() throws Exception { + LOG.trace("validate"); + KnowledgesDao dao = Container.getComp(KnowledgesDao.class); + String id = getParam("knowledgeId"); + if (!StringUtils.isInteger(id)) { + // 削除するIDが指定されていない + //return sendError(HttpStatus.SC_400_BAD_REQUEST, null); + addMsgError("削除するナレッジが指定されていません"); + //return super.devolution("open.knowledge/list"); + return forward("/commons/errors/server_error.jsp"); + } + Long knowledgeId = new Long(id); + KnowledgesEntity check = dao.selectOnKey(knowledgeId); + if (check == null) { + return sendError(HttpStatus.SC_404_NOT_FOUND, "NOT_FOUND"); + } + if (!super.getLoginedUser().isAdmin() && check.getInsertUser().intValue() != super.getLoginUserId().intValue()) { + addMsgWarn("自分で登録したもの以外は削除出来ません"); + return forward("/open/knowledge/view.jsp"); + } + LOG.trace("save"); + knowledgeLogic.delete(knowledgeId, getLoginedUser()); + + addMsgSuccess("削除しました"); + return super.devolution("open.knowledge/list"); + } + + /** + * ログイン後、表示しなおし + * @return + * @throws InvalidParamException + */ + public Boundary view() throws InvalidParamException { + Long knowledgeId = super.getPathLong(Long.valueOf(-1)); + return super.redirect(getRequest().getContextPath() + "/open.knowledge/view/" + knowledgeId); + } + + + public Boundary comment() throws InvalidParamException { + Long knowledgeId = super.getPathLong(Long.valueOf(-1)); + + String comment = getParam("comment"); + CommentsDao commentsDao = CommentsDao.get(); + CommentsEntity commentsEntity = new CommentsEntity(); + commentsEntity.setKnowledgeId(knowledgeId); + commentsEntity.setComment(comment); + commentsDao.insert(commentsEntity); + + return super.redirect(getRequest().getContextPath() + "/open.knowledge/view/" + knowledgeId); + } + +} + + + + diff --git a/src/main/java/redcomet/knowledge/dao/CommentsDao.java b/src/main/java/redcomet/knowledge/dao/CommentsDao.java new file mode 100644 index 000000000..5712acbd9 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/CommentsDao.java @@ -0,0 +1,38 @@ +package redcomet.knowledge.dao; + +import java.util.List; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.dao.gen.GenCommentsDao; +import redcomet.knowledge.entity.CommentsEntity; + +/** + * コメント + */ +@DI(instance=Instance.Singleton) +public class CommentsDao extends GenCommentsDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static CommentsDao get() { + return Container.getComp(CommentsDao.class); + } + + public List selectOnKnowledgeId(Long knowledgeId) { + StringBuilder builder = new StringBuilder(); + builder.append("SELECT *, USERS.USER_NAME AS UPDATE_USER_NAME FROM COMMENTS "); + builder.append("LEFT OUTER JOIN USERS ON USERS.USER_ID = COMMENTS.UPDATE_USER "); + builder.append("WHERE KNOWLEDGE_ID = ? "); + return executeQueryList(builder.toString(), CommentsEntity.class, knowledgeId); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/KnowledgeFilesDao.java b/src/main/java/redcomet/knowledge/dao/KnowledgeFilesDao.java new file mode 100644 index 000000000..035d8866c --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/KnowledgeFilesDao.java @@ -0,0 +1,114 @@ +package redcomet.knowledge.dao; + +import java.sql.Timestamp; +import java.util.Date; +import java.util.List; + +import redcomet.aop.Aspect; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.dao.gen.GenKnowledgeFilesDao; +import redcomet.knowledge.entity.KnowledgeFilesEntity; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.web.bean.LoginedUser; + +/** + * 添付ファイル + */ +@DI(instance=Instance.Singleton) +public class KnowledgeFilesDao extends GenKnowledgeFilesDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeFilesDao get() { + return Container.getComp(KnowledgeFilesDao.class); + } + + /** + * ナレッジIDで添付ファイルを取得 + * (ファイルのバイナリは取得しない) + * + * @param knowledgeId + * @return + */ + public List selectOnKnowledgeId(Long knowledgeId) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT FILE_NO, KNOWLEDGE_ID, FILE_NAME, FILE_SIZE, INSERT_USER, INSERT_DATETIME, UPDATE_USER, UPDATE_DATETIME, DELETE_FLAG "); + sql.append("FROM KNOWLEDGE_FILES WHERE KNOWLEDGE_ID = ?;"); + return executeQuery(sql.toString(), KnowledgeFilesEntity.class, knowledgeId); + } + + /** + * キーで1件取得 + * (ファイルのバイナリは取得しない) + */ + public KnowledgeFilesEntity selectOnKeyWithoutBinary(Long fileNo) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT FILE_NO, KNOWLEDGE_ID, FILE_NAME, FILE_SIZE, INSERT_USER, INSERT_DATETIME, UPDATE_USER, UPDATE_DATETIME, DELETE_FLAG "); + sql.append("FROM KNOWLEDGE_FILES WHERE FILE_NO = ?;"); + return executeQueryOnKey(sql.toString(), KnowledgeFilesEntity.class, fileNo); + } + + /** + * 添付ファイルのナレッジIDをセット + * @param fileNo + * @param knowledgeId + * @param loginedUser + */ + public void connectKnowledge(Long fileNo, Long knowledgeId, LoginedUser loginedUser) { + StringBuilder sql = new StringBuilder(); + sql.append("UPDATE KNOWLEDGE_FILES "); + sql.append("SET KNOWLEDGE_ID = ?, UPDATE_USER = ?, UPDATE_DATETIME = ? "); + sql.append("WHERE FILE_NO = ? "); + executeUpdate(sql.toString(), knowledgeId, loginedUser.getUserId(), new Timestamp(new Date().getTime()), fileNo); + } + + /** + * ナレッジに紐づいていないファイルで、かつ更新日が24時間前のものは削除する + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public int deleteNotConnectFiles() { + StringBuilder sql = new StringBuilder(); + sql.append("DELETE FROM KNOWLEDGE_FILES WHERE KNOWLEDGE_ID IS NULL AND UPDATE_DATETIME < ? "); + Timestamp timestamp = new Timestamp(new Date().getTime() - (1000 * 60 * 60 * 24)); + int count = executeUpdate(sql.toString(), timestamp); + return count; + } + + + /** + * パース待ちの状態にあるファイルを取得 + * (バイナリは取得しない) + * @return + */ + public List selectWaitStateFiles() { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT FILE_NO, KNOWLEDGE_ID, FILE_NAME, FILE_SIZE, INSERT_USER, INSERT_DATETIME, UPDATE_USER, UPDATE_DATETIME, DELETE_FLAG "); + sql.append("FROM KNOWLEDGE_FILES WHERE PARSE_STATUS = 0 AND KNOWLEDGE_ID IS NOT NULL"); + return executeQueryList(sql.toString(), KnowledgeFilesEntity.class); + } + + /** + * パースのステータス更新 + * @param fileNo + * @param parseStatus + * @param updateUserId + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void changeStatus(Long fileNo, int parseStatus, Integer updateUserId) { + StringBuilder sql = new StringBuilder(); + sql.append("UPDATE KNOWLEDGE_FILES "); + sql.append("SET PARSE_STATUS = ?, UPDATE_USER = ?, UPDATE_DATETIME = ? "); + sql.append("WHERE FILE_NO = ? "); + executeUpdate(sql.toString(), parseStatus, updateUserId, new Timestamp(new Date().getTime()), fileNo); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/KnowledgeGroupsDao.java b/src/main/java/redcomet/knowledge/dao/KnowledgeGroupsDao.java new file mode 100644 index 000000000..5a5a84f4c --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/KnowledgeGroupsDao.java @@ -0,0 +1,28 @@ +package redcomet.knowledge.dao; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import redcomet.knowledge.dao.gen.GenKnowledgeGroupsDao; + +/** + * アクセス可能なグループ + */ +@DI(instance=Instance.Singleton) +public class KnowledgeGroupsDao extends GenKnowledgeGroupsDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeGroupsDao get() { + return Container.getComp(KnowledgeGroupsDao.class); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/KnowledgeTagsDao.java b/src/main/java/redcomet/knowledge/dao/KnowledgeTagsDao.java new file mode 100644 index 000000000..f9f94f265 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/KnowledgeTagsDao.java @@ -0,0 +1,36 @@ +package redcomet.knowledge.dao; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.dao.gen.GenKnowledgeTagsDao; + +/** + * ナレッジが持つタグ + */ +@DI(instance=Instance.Singleton) +public class KnowledgeTagsDao extends GenKnowledgeTagsDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeTagsDao get() { + return Container.getComp(KnowledgeTagsDao.class); + } + + /** + * ナレッジが持つタグを削除 + * @param knowledgeId + */ + public void deleteOnKnowledgeId(Long knowledgeId) { + String sql = "DELETE FROM KNOWLEDGE_TAGS WHERE KNOWLEDGE_ID = ?"; + super.executeUpdate(sql, knowledgeId); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/KnowledgeUsersDao.java b/src/main/java/redcomet/knowledge/dao/KnowledgeUsersDao.java new file mode 100644 index 000000000..60c744e2b --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/KnowledgeUsersDao.java @@ -0,0 +1,36 @@ +package redcomet.knowledge.dao; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.dao.gen.GenKnowledgeUsersDao; + +/** + * アクセス可能なユーザ + */ +@DI(instance=Instance.Singleton) +public class KnowledgeUsersDao extends GenKnowledgeUsersDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeUsersDao get() { + return Container.getComp(KnowledgeUsersDao.class); + } + + /** + * ナレッジIDを指定し、アクセス可能ユーザ情報をクリアする + * @param knowledgeId + */ + public void deleteOnKnowledgeId(Long knowledgeId) { + String sql = "DELETE FROM KNOWLEDGE_USERS WHERE KNOWLEDGE_ID = ?"; + super.executeUpdate(sql, knowledgeId); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/KnowledgesDao.java b/src/main/java/redcomet/knowledge/dao/KnowledgesDao.java new file mode 100644 index 000000000..c80311617 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/KnowledgesDao.java @@ -0,0 +1,131 @@ +package redcomet.knowledge.dao; + +import java.sql.Timestamp; +import java.util.Date; +import java.util.List; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.dao.gen.GenKnowledgesDao; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.ormapping.common.SQLManager; + +/** + * ナレッジ + */ +@DI(instance=Instance.Singleton) +public class KnowledgesDao extends GenKnowledgesDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgesDao get() { + return Container.getComp(KnowledgesDao.class); + } + + + /** + * ID + */ + private int currentId = 0; + + /** + * IDを採番 + * ※コミットしなくても次のIDを採番する為、保存しなければ欠番になる + */ + public Integer getNextId() { + String sql = "SELECT MAX(KNOWLEDGE_ID) FROM KNOWLEDGES;"; + Integer integer = executeQuerySingle(sql, Integer.class); + if (integer != null) { + if (currentId < integer) { + currentId = integer; + } + } + currentId++; + return currentId; + } + + + + public List selectKnowledge(int offset, int limit, Integer userId) { + String sql = "SELECT * FROM KNOWLEDGES WHERE DELETE_FLAG = 0 ORDER BY UPDATE_DATETIME DESC Limit ? offset ?;"; + return executeQuery(sql, KnowledgesEntity.class, limit, offset); + } + + + /** + * ナレッジIDを複数渡して、その情報を取得 + * @param knowledgeIds + * @return + */ + public List selectKnowledges(List knowledgeIds) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT "); + sql.append(" KNOWLEDGES.KNOWLEDGE_ID"); + sql.append(" ,KNOWLEDGES.TITLE"); + sql.append(" ,KNOWLEDGES.CONTENT"); + sql.append(" ,KNOWLEDGES.PUBLIC_FLAG"); + sql.append(" ,KNOWLEDGES.INSERT_USER"); + sql.append(" ,KNOWLEDGES.INSERT_DATETIME"); + sql.append(" ,KNOWLEDGES.UPDATE_USER"); + sql.append(" ,KNOWLEDGES.UPDATE_DATETIME"); + sql.append(" ,KNOWLEDGES.DELETE_FLAG"); + sql.append(" ,USERS.USER_NAME AS INSERT_USER_NAME"); + sql.append(" FROM"); + sql.append(" KNOWLEDGES"); + sql.append(" LEFT OUTER JOIN USERS"); + sql.append(" ON USERS.USER_ID = KNOWLEDGES.INSERT_USER"); + sql.append(" WHERE KNOWLEDGE_ID IN ("); + int count = 0; + for (Long integer : knowledgeIds) { + if (count > 0) { + sql.append(", "); + } + sql.append("?"); + count++; + } + sql.append(")"); + return executeQuery(sql.toString(), KnowledgesEntity.class, knowledgeIds.toArray(new Long[0])); + } + + + /** + * ナレッジを取得 + * 取得する際に、登録者名も取得 + * @param knowledgeId + * @return + */ + public KnowledgesEntity selectOnKeyWithUserName(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_selectOnKeyWithUserName.sql"); + return executeQueryOnKey(sql, KnowledgesEntity.class, knowledgeId); + } + + + /** + * ユーザが登録したナレッジのIDを全て取得 + * @param userId + * @return + */ + public List selectOnUser(Integer userId) { + String sql = "SELECT KNOWLEDGE_ID FROM KNOWLEDGES WHERE INSERT_USER = ? ORDER BY KNOWLEDGE_ID DESC"; + return executeQuery(sql, Long.class, userId); + } + + + /** + * ユーザが登録したナレッジを全て削除 + * (論理削除) + * @param loginUserId + */ + public void deleteOnUser(Integer loginUserId) { + String sql = "UPDATE KNOWLEDGES SET DELETE_FLAG = 1 , UPDATE_USER = ? , UPDATE_DATETIME = ? WHERE INSERT_USER = ?"; + super.executeUpdate(sql, loginUserId, new Timestamp(new Date().getTime()), loginUserId); + } + + +} diff --git a/src/main/java/redcomet/knowledge/dao/LikesDao.java b/src/main/java/redcomet/knowledge/dao/LikesDao.java new file mode 100644 index 000000000..4991c4c8c --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/LikesDao.java @@ -0,0 +1,33 @@ +package redcomet.knowledge.dao; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.dao.gen.GenLikesDao; + +/** + * いいね + */ +@DI(instance=Instance.Singleton) +public class LikesDao extends GenLikesDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static LikesDao get() { + return Container.getComp(LikesDao.class); + } + + + public Long countOnKnowledgeId(Long knowledgeId) { + String sql = "SELECT COUNT(*) FROM LIKES WHERE KNOWLEDGE_ID = ?"; + return super.executeQuerySingle(sql, Long.class, knowledgeId); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/StocksDao.java b/src/main/java/redcomet/knowledge/dao/StocksDao.java new file mode 100644 index 000000000..dd1953f32 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/StocksDao.java @@ -0,0 +1,28 @@ +package redcomet.knowledge.dao; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import redcomet.knowledge.dao.gen.GenStocksDao; + +/** + * ストックしたナレッジ + */ +@DI(instance=Instance.Singleton) +public class StocksDao extends GenStocksDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static StocksDao get() { + return Container.getComp(StocksDao.class); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/TagsDao.java b/src/main/java/redcomet/knowledge/dao/TagsDao.java new file mode 100644 index 000000000..f39f053af --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/TagsDao.java @@ -0,0 +1,99 @@ +package redcomet.knowledge.dao; + +import java.util.List; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.dao.gen.GenTagsDao; +import redcomet.knowledge.entity.TagsEntity; +import redcomet.ormapping.common.SQLManager; + +/** + * タグ + */ +@DI(instance=Instance.Singleton) +public class TagsDao extends GenTagsDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static TagsDao get() { + return Container.getComp(TagsDao.class); + } + + + /** + * ID + */ + private int currentId = 0; + + /** + * IDを採番 + * ※コミットしなくても次のIDを採番する為、保存しなければ欠番になる + */ + public Integer getNextId() { + String sql = "SELECT MAX(TAG_ID) FROM TAGS;"; + Integer integer = executeQuerySingle(sql, Integer.class); + if (integer != null) { + if (currentId < integer) { + currentId = integer; + } + } + currentId++; + return currentId; + } + + /** + * タグを名称で取得 + * @param tag + * @return + */ + public TagsEntity selectOnTagName(String tag) { + String sql = "SELECT * FROM TAGS WHERE TAG_NAME = ?"; + return executeQuerySingle(sql, TagsEntity.class, tag); + } + + /** + * 指定のナレッジが持つタグを取得 + * @param knowledgeId + * @return + */ + public List selectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectOnKnowledgeId.sql"); + return executeQuery(sql, TagsEntity.class, knowledgeId); + } + + + /** + * タグの一覧を取得 + * 同時にカウント取得 + * アクセス権を考慮していない + * @param offset + * @param limit + * @return + */ + public List selectTagsWithCount(int offset, int limit) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCount.sql"); + return executeQuery(sql, TagsEntity.class, limit, offset); + } + + /** + * タグの一覧を取得 + * 同時にカウント取得 + * ユーザIDがアクセス権に登録されている、もしくは公開のもののみカウント対象 + * @param userid + * @param offset + * @param limit + * @return + */ + public List selectTagsWithCountOnUser(int userid, int offset, int limit) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCountOnUser.sql"); + return executeQuery(sql, TagsEntity.class, userid, limit, offset); + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/ViewHistoriesDao.java b/src/main/java/redcomet/knowledge/dao/ViewHistoriesDao.java new file mode 100644 index 000000000..0b72241ba --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/ViewHistoriesDao.java @@ -0,0 +1,28 @@ +package redcomet.knowledge.dao; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import redcomet.knowledge.dao.gen.GenViewHistoriesDao; + +/** + * ナレッジの参照履歴 + */ +@DI(instance=Instance.Singleton) +public class ViewHistoriesDao extends GenViewHistoriesDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static ViewHistoriesDao get() { + return Container.getComp(ViewHistoriesDao.class); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/VotesDao.java b/src/main/java/redcomet/knowledge/dao/VotesDao.java new file mode 100644 index 000000000..ef99170b4 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/VotesDao.java @@ -0,0 +1,28 @@ +package redcomet.knowledge.dao; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import redcomet.knowledge.dao.gen.GenVotesDao; + +/** + * 投票 + */ +@DI(instance=Instance.Singleton) +public class VotesDao extends GenVotesDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static VotesDao get() { + return Container.getComp(VotesDao.class); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenCommentsDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenCommentsDao.java new file mode 100644 index 000000000..a953461b4 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenCommentsDao.java @@ -0,0 +1,261 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.CommentsEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * コメント + */ +@DI(instance=Instance.Singleton) +public class GenCommentsDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenCommentsDao get() { + return Container.getComp(GenCommentsDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_all.sql"); + return executeQuery(sql, CommentsEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public CommentsEntity physicalSelectOnKey(Long commentNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, CommentsEntity.class, commentNo); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_all.sql"); + return executeQuery(sql, CommentsEntity.class); + } + /** + * キーで1件取得 + */ + public CommentsEntity selectOnKey(Long commentNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_on_key.sql"); + return executeQueryOnKey(sql, CommentsEntity.class, commentNo); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity physicalInsert(CommentsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_insert.sql"); + Class type = PropertyUtil.getPropertyType(entity, "commentNo"); + Object key = executeInsert(sql, type, + entity.getCommentNo() + , entity.getKnowledgeId() + , entity.getComment() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + PropertyUtil.setPropertyValue(entity, "commentNo", key); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity insert(Integer user, CommentsEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity insert(CommentsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity physicalUpdate(CommentsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_update.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getComment() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getCommentNo() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity update(Integer user, CommentsEntity entity) { + CommentsEntity db = selectOnKey(entity.getCommentNo()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity update(CommentsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity save(Integer user, CommentsEntity entity) { + CommentsEntity db = selectOnKey(entity.getCommentNo()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public CommentsEntity save(CommentsEntity entity) { + CommentsEntity db = selectOnKey(entity.getCommentNo()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long commentNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_delete.sql"); + executeUpdate(sql, commentNo); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(CommentsEntity entity) { + physicalDelete(entity.getCommentNo()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long commentNo) { + CommentsEntity db = selectOnKey(commentNo); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long commentNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, commentNo); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, CommentsEntity entity) { + delete(user, entity.getCommentNo()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(CommentsEntity entity) { + delete(entity.getCommentNo()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long commentNo) { + CommentsEntity db = physicalSelectOnKey(commentNo); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long commentNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, commentNo); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, CommentsEntity entity) { + activation(user, entity.getCommentNo()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(CommentsEntity entity) { + activation(entity.getCommentNo()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeFilesDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeFilesDao.java new file mode 100644 index 000000000..d17fac7e5 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeFilesDao.java @@ -0,0 +1,268 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.io.InputStream; +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.KnowledgeFilesEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * 添付ファイル + */ +@DI(instance=Instance.Singleton) +public class GenKnowledgeFilesDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeFilesDao get() { + return Container.getComp(GenKnowledgeFilesDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_all.sql"); + return executeQuery(sql, KnowledgeFilesEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public KnowledgeFilesEntity physicalSelectOnKey(Long fileNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeFilesEntity.class, fileNo); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_all.sql"); + return executeQuery(sql, KnowledgeFilesEntity.class); + } + /** + * キーで1件取得 + */ + public KnowledgeFilesEntity selectOnKey(Long fileNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeFilesEntity.class, fileNo); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity physicalInsert(KnowledgeFilesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_insert.sql"); + Class type = PropertyUtil.getPropertyType(entity, "fileNo"); + Object key = executeInsert(sql, type, + entity.getFileNo() + , entity.getKnowledgeId() + , entity.getFileName() + , entity.getFileSize() + , entity.getFileBinary() + , entity.getParseStatus() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + PropertyUtil.setPropertyValue(entity, "fileNo", key); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity insert(Integer user, KnowledgeFilesEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity insert(KnowledgeFilesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity physicalUpdate(KnowledgeFilesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_update.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getFileName() + , entity.getFileSize() + , entity.getFileBinary() + , entity.getParseStatus() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getFileNo() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity update(Integer user, KnowledgeFilesEntity entity) { + KnowledgeFilesEntity db = selectOnKey(entity.getFileNo()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity update(KnowledgeFilesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity save(Integer user, KnowledgeFilesEntity entity) { + KnowledgeFilesEntity db = selectOnKey(entity.getFileNo()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeFilesEntity save(KnowledgeFilesEntity entity) { + KnowledgeFilesEntity db = selectOnKey(entity.getFileNo()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long fileNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_delete.sql"); + executeUpdate(sql, fileNo); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(KnowledgeFilesEntity entity) { + physicalDelete(entity.getFileNo()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long fileNo) { + KnowledgeFilesEntity db = selectOnKey(fileNo); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long fileNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, fileNo); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, KnowledgeFilesEntity entity) { + delete(user, entity.getFileNo()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(KnowledgeFilesEntity entity) { + delete(entity.getFileNo()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long fileNo) { + KnowledgeFilesEntity db = physicalSelectOnKey(fileNo); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long fileNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, fileNo); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, KnowledgeFilesEntity entity) { + activation(user, entity.getFileNo()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(KnowledgeFilesEntity entity) { + activation(entity.getFileNo()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeGroupsDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeGroupsDao.java new file mode 100644 index 000000000..8ddb1f9f8 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeGroupsDao.java @@ -0,0 +1,285 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.KnowledgeGroupsEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * アクセス可能なグループ + */ +@DI(instance=Instance.Singleton) +public class GenKnowledgeGroupsDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeGroupsDao get() { + return Container.getComp(GenKnowledgeGroupsDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_all.sql"); + return executeQuery(sql, KnowledgeGroupsEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public KnowledgeGroupsEntity physicalSelectOnKey(Integer groupId, Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeGroupsEntity.class, groupId, knowledgeId); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_all.sql"); + return executeQuery(sql, KnowledgeGroupsEntity.class); + } + /** + * キーで1件取得 + */ + public KnowledgeGroupsEntity selectOnKey(Integer groupId, Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeGroupsEntity.class, groupId, knowledgeId); + } + /** + * GROUP_ID でリストを取得 + */ + public List selectOnGroupId(Integer groupId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_group_id.sql"); + return executeQuery(sql, KnowledgeGroupsEntity.class, groupId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List selectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_knowledge_id.sql"); + return executeQuery(sql, KnowledgeGroupsEntity.class, knowledgeId); + } + /** + * GROUP_ID でリストを取得 + */ + public List physicalSelectOnGroupId(Integer groupId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_group_id.sql"); + return executeQuery(sql, KnowledgeGroupsEntity.class, groupId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List physicalSelectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_knowledge_id.sql"); + return executeQuery(sql, KnowledgeGroupsEntity.class, knowledgeId); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity physicalInsert(KnowledgeGroupsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_insert.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getGroupId() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity insert(Integer user, KnowledgeGroupsEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity insert(KnowledgeGroupsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity physicalUpdate(KnowledgeGroupsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_update.sql"); + executeUpdate(sql, + entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getGroupId() + , entity.getKnowledgeId() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity update(Integer user, KnowledgeGroupsEntity entity) { + KnowledgeGroupsEntity db = selectOnKey(entity.getGroupId(), entity.getKnowledgeId()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity update(KnowledgeGroupsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity save(Integer user, KnowledgeGroupsEntity entity) { + KnowledgeGroupsEntity db = selectOnKey(entity.getGroupId(), entity.getKnowledgeId()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeGroupsEntity save(KnowledgeGroupsEntity entity) { + KnowledgeGroupsEntity db = selectOnKey(entity.getGroupId(), entity.getKnowledgeId()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Integer groupId, Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_delete.sql"); + executeUpdate(sql, groupId, knowledgeId); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(KnowledgeGroupsEntity entity) { + physicalDelete(entity.getGroupId(), entity.getKnowledgeId()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Integer groupId, Long knowledgeId) { + KnowledgeGroupsEntity db = selectOnKey(groupId, knowledgeId); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer groupId, Long knowledgeId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, groupId, knowledgeId); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, KnowledgeGroupsEntity entity) { + delete(user, entity.getGroupId(), entity.getKnowledgeId()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(KnowledgeGroupsEntity entity) { + delete(entity.getGroupId(), entity.getKnowledgeId()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Integer groupId, Long knowledgeId) { + KnowledgeGroupsEntity db = physicalSelectOnKey(groupId, knowledgeId); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer groupId, Long knowledgeId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, groupId, knowledgeId); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, KnowledgeGroupsEntity entity) { + activation(user, entity.getGroupId(), entity.getKnowledgeId()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(KnowledgeGroupsEntity entity) { + activation(entity.getGroupId(), entity.getKnowledgeId()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeTagsDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeTagsDao.java new file mode 100644 index 000000000..7cb0f36a9 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeTagsDao.java @@ -0,0 +1,285 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.KnowledgeTagsEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * ナレッジが持つタグ + */ +@DI(instance=Instance.Singleton) +public class GenKnowledgeTagsDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeTagsDao get() { + return Container.getComp(GenKnowledgeTagsDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_all.sql"); + return executeQuery(sql, KnowledgeTagsEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public KnowledgeTagsEntity physicalSelectOnKey(Long knowledgeId, Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeTagsEntity.class, knowledgeId, tagId); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_all.sql"); + return executeQuery(sql, KnowledgeTagsEntity.class); + } + /** + * キーで1件取得 + */ + public KnowledgeTagsEntity selectOnKey(Long knowledgeId, Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeTagsEntity.class, knowledgeId, tagId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List selectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_knowledge_id.sql"); + return executeQuery(sql, KnowledgeTagsEntity.class, knowledgeId); + } + /** + * TAG_ID でリストを取得 + */ + public List selectOnTagId(Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_tag_id.sql"); + return executeQuery(sql, KnowledgeTagsEntity.class, tagId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List physicalSelectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_knowledge_id.sql"); + return executeQuery(sql, KnowledgeTagsEntity.class, knowledgeId); + } + /** + * TAG_ID でリストを取得 + */ + public List physicalSelectOnTagId(Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_tag_id.sql"); + return executeQuery(sql, KnowledgeTagsEntity.class, tagId); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity physicalInsert(KnowledgeTagsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_insert.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getTagId() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity insert(Integer user, KnowledgeTagsEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity insert(KnowledgeTagsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity physicalUpdate(KnowledgeTagsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_update.sql"); + executeUpdate(sql, + entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getKnowledgeId() + , entity.getTagId() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity update(Integer user, KnowledgeTagsEntity entity) { + KnowledgeTagsEntity db = selectOnKey(entity.getKnowledgeId(), entity.getTagId()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity update(KnowledgeTagsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity save(Integer user, KnowledgeTagsEntity entity) { + KnowledgeTagsEntity db = selectOnKey(entity.getKnowledgeId(), entity.getTagId()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeTagsEntity save(KnowledgeTagsEntity entity) { + KnowledgeTagsEntity db = selectOnKey(entity.getKnowledgeId(), entity.getTagId()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long knowledgeId, Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_delete.sql"); + executeUpdate(sql, knowledgeId, tagId); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(KnowledgeTagsEntity entity) { + physicalDelete(entity.getKnowledgeId(), entity.getTagId()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long knowledgeId, Integer tagId) { + KnowledgeTagsEntity db = selectOnKey(knowledgeId, tagId); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long knowledgeId, Integer tagId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, knowledgeId, tagId); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, KnowledgeTagsEntity entity) { + delete(user, entity.getKnowledgeId(), entity.getTagId()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(KnowledgeTagsEntity entity) { + delete(entity.getKnowledgeId(), entity.getTagId()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long knowledgeId, Integer tagId) { + KnowledgeTagsEntity db = physicalSelectOnKey(knowledgeId, tagId); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long knowledgeId, Integer tagId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, knowledgeId, tagId); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, KnowledgeTagsEntity entity) { + activation(user, entity.getKnowledgeId(), entity.getTagId()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(KnowledgeTagsEntity entity) { + activation(entity.getKnowledgeId(), entity.getTagId()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeUsersDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeUsersDao.java new file mode 100644 index 000000000..308543fb5 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgeUsersDao.java @@ -0,0 +1,285 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.KnowledgeUsersEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * アクセス可能なユーザ + */ +@DI(instance=Instance.Singleton) +public class GenKnowledgeUsersDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeUsersDao get() { + return Container.getComp(GenKnowledgeUsersDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_all.sql"); + return executeQuery(sql, KnowledgeUsersEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public KnowledgeUsersEntity physicalSelectOnKey(Long knowledgeId, Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeUsersEntity.class, knowledgeId, userId); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_all.sql"); + return executeQuery(sql, KnowledgeUsersEntity.class); + } + /** + * キーで1件取得 + */ + public KnowledgeUsersEntity selectOnKey(Long knowledgeId, Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgeUsersEntity.class, knowledgeId, userId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List selectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_knowledge_id.sql"); + return executeQuery(sql, KnowledgeUsersEntity.class, knowledgeId); + } + /** + * USER_ID でリストを取得 + */ + public List selectOnUserId(Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_user_id.sql"); + return executeQuery(sql, KnowledgeUsersEntity.class, userId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List physicalSelectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_knowledge_id.sql"); + return executeQuery(sql, KnowledgeUsersEntity.class, knowledgeId); + } + /** + * USER_ID でリストを取得 + */ + public List physicalSelectOnUserId(Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_user_id.sql"); + return executeQuery(sql, KnowledgeUsersEntity.class, userId); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity physicalInsert(KnowledgeUsersEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_insert.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getUserId() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity insert(Integer user, KnowledgeUsersEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity insert(KnowledgeUsersEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity physicalUpdate(KnowledgeUsersEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_update.sql"); + executeUpdate(sql, + entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getKnowledgeId() + , entity.getUserId() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity update(Integer user, KnowledgeUsersEntity entity) { + KnowledgeUsersEntity db = selectOnKey(entity.getKnowledgeId(), entity.getUserId()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity update(KnowledgeUsersEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity save(Integer user, KnowledgeUsersEntity entity) { + KnowledgeUsersEntity db = selectOnKey(entity.getKnowledgeId(), entity.getUserId()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgeUsersEntity save(KnowledgeUsersEntity entity) { + KnowledgeUsersEntity db = selectOnKey(entity.getKnowledgeId(), entity.getUserId()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long knowledgeId, Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_delete.sql"); + executeUpdate(sql, knowledgeId, userId); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(KnowledgeUsersEntity entity) { + physicalDelete(entity.getKnowledgeId(), entity.getUserId()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long knowledgeId, Integer userId) { + KnowledgeUsersEntity db = selectOnKey(knowledgeId, userId); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long knowledgeId, Integer userId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, knowledgeId, userId); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, KnowledgeUsersEntity entity) { + delete(user, entity.getKnowledgeId(), entity.getUserId()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(KnowledgeUsersEntity entity) { + delete(entity.getKnowledgeId(), entity.getUserId()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long knowledgeId, Integer userId) { + KnowledgeUsersEntity db = physicalSelectOnKey(knowledgeId, userId); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long knowledgeId, Integer userId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, knowledgeId, userId); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, KnowledgeUsersEntity entity) { + activation(user, entity.getKnowledgeId(), entity.getUserId()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(KnowledgeUsersEntity entity) { + activation(entity.getKnowledgeId(), entity.getUserId()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgesDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgesDao.java new file mode 100644 index 000000000..8f533ce5a --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenKnowledgesDao.java @@ -0,0 +1,263 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * ナレッジ + */ +@DI(instance=Instance.Singleton) +public class GenKnowledgesDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgesDao get() { + return Container.getComp(GenKnowledgesDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_all.sql"); + return executeQuery(sql, KnowledgesEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public KnowledgesEntity physicalSelectOnKey(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgesEntity.class, knowledgeId); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_all.sql"); + return executeQuery(sql, KnowledgesEntity.class); + } + /** + * キーで1件取得 + */ + public KnowledgesEntity selectOnKey(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_on_key.sql"); + return executeQueryOnKey(sql, KnowledgesEntity.class, knowledgeId); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity physicalInsert(KnowledgesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_insert.sql"); + Class type = PropertyUtil.getPropertyType(entity, "knowledgeId"); + Object key = executeInsert(sql, type, + entity.getKnowledgeId() + , entity.getTitle() + , entity.getContent() + , entity.getPublicFlag() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + PropertyUtil.setPropertyValue(entity, "knowledgeId", key); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity insert(Integer user, KnowledgesEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity insert(KnowledgesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity physicalUpdate(KnowledgesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_update.sql"); + executeUpdate(sql, + entity.getTitle() + , entity.getContent() + , entity.getPublicFlag() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getKnowledgeId() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity update(Integer user, KnowledgesEntity entity) { + KnowledgesEntity db = selectOnKey(entity.getKnowledgeId()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity update(KnowledgesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity save(Integer user, KnowledgesEntity entity) { + KnowledgesEntity db = selectOnKey(entity.getKnowledgeId()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity save(KnowledgesEntity entity) { + KnowledgesEntity db = selectOnKey(entity.getKnowledgeId()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_delete.sql"); + executeUpdate(sql, knowledgeId); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(KnowledgesEntity entity) { + physicalDelete(entity.getKnowledgeId()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long knowledgeId) { + KnowledgesEntity db = selectOnKey(knowledgeId); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long knowledgeId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, knowledgeId); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, KnowledgesEntity entity) { + delete(user, entity.getKnowledgeId()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(KnowledgesEntity entity) { + delete(entity.getKnowledgeId()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long knowledgeId) { + KnowledgesEntity db = physicalSelectOnKey(knowledgeId); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long knowledgeId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, knowledgeId); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, KnowledgesEntity entity) { + activation(user, entity.getKnowledgeId()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(KnowledgesEntity entity) { + activation(entity.getKnowledgeId()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenLikesDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenLikesDao.java new file mode 100644 index 000000000..a35e561ae --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenLikesDao.java @@ -0,0 +1,259 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.LikesEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * いいね + */ +@DI(instance=Instance.Singleton) +public class GenLikesDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenLikesDao get() { + return Container.getComp(GenLikesDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_all.sql"); + return executeQuery(sql, LikesEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public LikesEntity physicalSelectOnKey(Long no) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, LikesEntity.class, no); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_all.sql"); + return executeQuery(sql, LikesEntity.class); + } + /** + * キーで1件取得 + */ + public LikesEntity selectOnKey(Long no) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_on_key.sql"); + return executeQueryOnKey(sql, LikesEntity.class, no); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity physicalInsert(LikesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/LikesDao/LikesDao_insert.sql"); + Class type = PropertyUtil.getPropertyType(entity, "no"); + Object key = executeInsert(sql, type, + entity.getNo() + , entity.getKnowledgeId() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + PropertyUtil.setPropertyValue(entity, "no", key); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity insert(Integer user, LikesEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity insert(LikesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity physicalUpdate(LikesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/LikesDao/LikesDao_update.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getNo() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity update(Integer user, LikesEntity entity) { + LikesEntity db = selectOnKey(entity.getNo()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity update(LikesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity save(Integer user, LikesEntity entity) { + LikesEntity db = selectOnKey(entity.getNo()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public LikesEntity save(LikesEntity entity) { + LikesEntity db = selectOnKey(entity.getNo()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long no) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/LikesDao/LikesDao_delete.sql"); + executeUpdate(sql, no); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(LikesEntity entity) { + physicalDelete(entity.getNo()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long no) { + LikesEntity db = selectOnKey(no); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long no) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, no); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, LikesEntity entity) { + delete(user, entity.getNo()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(LikesEntity entity) { + delete(entity.getNo()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long no) { + LikesEntity db = physicalSelectOnKey(no); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long no) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, no); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, LikesEntity entity) { + activation(user, entity.getNo()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(LikesEntity entity) { + activation(entity.getNo()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenStocksDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenStocksDao.java new file mode 100644 index 000000000..a1fc437fc --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenStocksDao.java @@ -0,0 +1,287 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.StocksEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * ストックしたナレッジ + */ +@DI(instance=Instance.Singleton) +public class GenStocksDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenStocksDao get() { + return Container.getComp(GenStocksDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_all.sql"); + return executeQuery(sql, StocksEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public StocksEntity physicalSelectOnKey(Long knowledgeId, Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, StocksEntity.class, knowledgeId, userId); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_all.sql"); + return executeQuery(sql, StocksEntity.class); + } + /** + * キーで1件取得 + */ + public StocksEntity selectOnKey(Long knowledgeId, Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_key.sql"); + return executeQueryOnKey(sql, StocksEntity.class, knowledgeId, userId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List selectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_knowledge_id.sql"); + return executeQuery(sql, StocksEntity.class, knowledgeId); + } + /** + * USER_ID でリストを取得 + */ + public List selectOnUserId(Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_user_id.sql"); + return executeQuery(sql, StocksEntity.class, userId); + } + /** + * KNOWLEDGE_ID でリストを取得 + */ + public List physicalSelectOnKnowledgeId(Long knowledgeId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_knowledge_id.sql"); + return executeQuery(sql, StocksEntity.class, knowledgeId); + } + /** + * USER_ID でリストを取得 + */ + public List physicalSelectOnUserId(Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_user_id.sql"); + return executeQuery(sql, StocksEntity.class, userId); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity physicalInsert(StocksEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_insert.sql"); + executeUpdate(sql, + entity.getUserId() + , entity.getKnowledgeId() + , entity.getComment() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity insert(Integer user, StocksEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity insert(StocksEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity physicalUpdate(StocksEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_update.sql"); + executeUpdate(sql, + entity.getComment() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getKnowledgeId() + , entity.getUserId() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity update(Integer user, StocksEntity entity) { + StocksEntity db = selectOnKey(entity.getKnowledgeId(), entity.getUserId()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity update(StocksEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity save(Integer user, StocksEntity entity) { + StocksEntity db = selectOnKey(entity.getKnowledgeId(), entity.getUserId()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public StocksEntity save(StocksEntity entity) { + StocksEntity db = selectOnKey(entity.getKnowledgeId(), entity.getUserId()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long knowledgeId, Integer userId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/StocksDao/StocksDao_delete.sql"); + executeUpdate(sql, knowledgeId, userId); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(StocksEntity entity) { + physicalDelete(entity.getKnowledgeId(), entity.getUserId()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long knowledgeId, Integer userId) { + StocksEntity db = selectOnKey(knowledgeId, userId); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long knowledgeId, Integer userId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, knowledgeId, userId); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, StocksEntity entity) { + delete(user, entity.getKnowledgeId(), entity.getUserId()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(StocksEntity entity) { + delete(entity.getKnowledgeId(), entity.getUserId()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long knowledgeId, Integer userId) { + StocksEntity db = physicalSelectOnKey(knowledgeId, userId); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long knowledgeId, Integer userId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, knowledgeId, userId); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, StocksEntity entity) { + activation(user, entity.getKnowledgeId(), entity.getUserId()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(StocksEntity entity) { + activation(entity.getKnowledgeId(), entity.getUserId()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenTagsDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenTagsDao.java new file mode 100644 index 000000000..ec9b5d848 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenTagsDao.java @@ -0,0 +1,259 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.TagsEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * タグ + */ +@DI(instance=Instance.Singleton) +public class GenTagsDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenTagsDao get() { + return Container.getComp(GenTagsDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_all.sql"); + return executeQuery(sql, TagsEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public TagsEntity physicalSelectOnKey(Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, TagsEntity.class, tagId); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_all.sql"); + return executeQuery(sql, TagsEntity.class); + } + /** + * キーで1件取得 + */ + public TagsEntity selectOnKey(Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_on_key.sql"); + return executeQueryOnKey(sql, TagsEntity.class, tagId); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity physicalInsert(TagsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_insert.sql"); + Class type = PropertyUtil.getPropertyType(entity, "tagId"); + Object key = executeInsert(sql, type, + entity.getTagId() + , entity.getTagName() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + PropertyUtil.setPropertyValue(entity, "tagId", key); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity insert(Integer user, TagsEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity insert(TagsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity physicalUpdate(TagsEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_update.sql"); + executeUpdate(sql, + entity.getTagName() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getTagId() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity update(Integer user, TagsEntity entity) { + TagsEntity db = selectOnKey(entity.getTagId()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity update(TagsEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity save(Integer user, TagsEntity entity) { + TagsEntity db = selectOnKey(entity.getTagId()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public TagsEntity save(TagsEntity entity) { + TagsEntity db = selectOnKey(entity.getTagId()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Integer tagId) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/TagsDao/TagsDao_delete.sql"); + executeUpdate(sql, tagId); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(TagsEntity entity) { + physicalDelete(entity.getTagId()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Integer tagId) { + TagsEntity db = selectOnKey(tagId); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer tagId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, tagId); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, TagsEntity entity) { + delete(user, entity.getTagId()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(TagsEntity entity) { + delete(entity.getTagId()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Integer tagId) { + TagsEntity db = physicalSelectOnKey(tagId); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer tagId) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, tagId); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, TagsEntity entity) { + activation(user, entity.getTagId()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(TagsEntity entity) { + activation(entity.getTagId()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenViewHistoriesDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenViewHistoriesDao.java new file mode 100644 index 000000000..90bdabb48 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenViewHistoriesDao.java @@ -0,0 +1,261 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.ViewHistoriesEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * ナレッジの参照履歴 + */ +@DI(instance=Instance.Singleton) +public class GenViewHistoriesDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenViewHistoriesDao get() { + return Container.getComp(GenViewHistoriesDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_all.sql"); + return executeQuery(sql, ViewHistoriesEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public ViewHistoriesEntity physicalSelectOnKey(Long historyNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, ViewHistoriesEntity.class, historyNo); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_all.sql"); + return executeQuery(sql, ViewHistoriesEntity.class); + } + /** + * キーで1件取得 + */ + public ViewHistoriesEntity selectOnKey(Long historyNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_on_key.sql"); + return executeQueryOnKey(sql, ViewHistoriesEntity.class, historyNo); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity physicalInsert(ViewHistoriesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_insert.sql"); + Class type = PropertyUtil.getPropertyType(entity, "historyNo"); + Object key = executeInsert(sql, type, + entity.getHistoryNo() + , entity.getKnowledgeId() + , entity.getViewDateTime() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + PropertyUtil.setPropertyValue(entity, "historyNo", key); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity insert(Integer user, ViewHistoriesEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity insert(ViewHistoriesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity physicalUpdate(ViewHistoriesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_update.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getViewDateTime() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getHistoryNo() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity update(Integer user, ViewHistoriesEntity entity) { + ViewHistoriesEntity db = selectOnKey(entity.getHistoryNo()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity update(ViewHistoriesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity save(Integer user, ViewHistoriesEntity entity) { + ViewHistoriesEntity db = selectOnKey(entity.getHistoryNo()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public ViewHistoriesEntity save(ViewHistoriesEntity entity) { + ViewHistoriesEntity db = selectOnKey(entity.getHistoryNo()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long historyNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_delete.sql"); + executeUpdate(sql, historyNo); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(ViewHistoriesEntity entity) { + physicalDelete(entity.getHistoryNo()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long historyNo) { + ViewHistoriesEntity db = selectOnKey(historyNo); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long historyNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, historyNo); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, ViewHistoriesEntity entity) { + delete(user, entity.getHistoryNo()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(ViewHistoriesEntity entity) { + delete(entity.getHistoryNo()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long historyNo) { + ViewHistoriesEntity db = physicalSelectOnKey(historyNo); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long historyNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, historyNo); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, ViewHistoriesEntity entity) { + activation(user, entity.getHistoryNo()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(ViewHistoriesEntity entity) { + activation(entity.getHistoryNo()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/gen/GenVotesDao.java b/src/main/java/redcomet/knowledge/dao/gen/GenVotesDao.java new file mode 100644 index 000000000..227a49b2d --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/gen/GenVotesDao.java @@ -0,0 +1,261 @@ +package redcomet.knowledge.dao.gen; + +import java.util.List; + +import java.sql.Timestamp; + + +import redcomet.knowledge.entity.VotesEntity; +import redcomet.ormapping.dao.AbstractDao; +import redcomet.ormapping.exception.ORMappingException; +import redcomet.ormapping.common.SQLManager; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.common.IDGen; +import redcomet.common.util.PropertyUtil; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.aop.Aspect; + +/** + * 投票 + */ +@DI(instance=Instance.Singleton) +public class GenVotesDao extends AbstractDao { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenVotesDao get() { + return Container.getComp(GenVotesDao.class); + } + + /** + * 全て取得(削除フラグを無視して取得) + */ + public List physicalSelectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_all.sql"); + return executeQuery(sql, VotesEntity.class); + } + /** + * キーで1件取得(削除フラグを無視して取得) + */ + public VotesEntity physicalSelectOnKey(Long voteNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_on_key.sql"); + return executeQueryOnKey(sql, VotesEntity.class, voteNo); + } + /** + * 全て取得 + */ + public List selectAll() { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_all.sql"); + return executeQuery(sql, VotesEntity.class); + } + /** + * キーで1件取得 + */ + public VotesEntity selectOnKey(Long voteNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_on_key.sql"); + return executeQueryOnKey(sql, VotesEntity.class, voteNo); + } + /** + * 登録(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity physicalInsert(VotesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/VotesDao/VotesDao_insert.sql"); + Class type = PropertyUtil.getPropertyType(entity, "voteNo"); + Object key = executeInsert(sql, type, + entity.getVoteNo() + , entity.getKnowledgeId() + , entity.getVoteKind() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + ); + PropertyUtil.setPropertyValue(entity, "voteNo", key); + return entity; + } + /** + * 登録(登録ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity insert(Integer user, VotesEntity entity) { + entity.setInsertUser(user); + entity.setInsertDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + entity.setDeleteFlag(0); + return physicalInsert(entity); + } + /** + * 登録 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity insert(VotesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return insert(userId, entity); + } + /** + * 更新(データを生で操作) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity physicalUpdate(VotesEntity entity) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/VotesDao/VotesDao_update.sql"); + executeUpdate(sql, + entity.getKnowledgeId() + , entity.getVoteKind() + , entity.getInsertUser() + , entity.getInsertDatetime() + , entity.getUpdateUser() + , entity.getUpdateDatetime() + , entity.getDeleteFlag() + , entity.getVoteNo() + ); + return entity; + } + /** + * 更新(更新ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity update(Integer user, VotesEntity entity) { + VotesEntity db = selectOnKey(entity.getVoteNo()); + entity.setInsertUser(db.getInsertUser()); + entity.setInsertDatetime(db.getInsertDatetime()); + entity.setDeleteFlag(db.getDeleteFlag()); + entity.setUpdateUser(user); + entity.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + return physicalUpdate(entity); + } + /** + * 更新 + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity update(VotesEntity entity) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer userId = (Integer) pool.getUser(); + return update(userId, entity); + } + /** + * 保存(ユーザを指定) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity save(Integer user, VotesEntity entity) { + VotesEntity db = selectOnKey(entity.getVoteNo()); + if (db == null) { + return insert(user, entity); + } else { + return update(user, entity); + } + } + /** + * 保存(存在しなければ登録、存在すれば更新) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public VotesEntity save(VotesEntity entity) { + VotesEntity db = selectOnKey(entity.getVoteNo()); + if (db == null) { + return insert(entity); + } else { + return update(entity); + } + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(Long voteNo) { + String sql = SQLManager.getInstance().getSql("/redcomet/knowledge/dao/sql/VotesDao/VotesDao_delete.sql"); + executeUpdate(sql, voteNo); + } + /** + * 削除(データを生で操作/物理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void physicalDelete(VotesEntity entity) { + physicalDelete(entity.getVoteNo()); + + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, Long voteNo) { + VotesEntity db = selectOnKey(voteNo); + db.setDeleteFlag(1); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long voteNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + delete(user, voteNo); + } + /** + * 削除(削除ユーザを指定/論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Integer user, VotesEntity entity) { + delete(user, entity.getVoteNo()); + + } + /** + * 削除(論理削除があれば論理削除) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(VotesEntity entity) { + delete(entity.getVoteNo()); + + } + /** + 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, Long voteNo) { + VotesEntity db = physicalSelectOnKey(voteNo); + db.setDeleteFlag(0); + db.setUpdateUser(user); + db.setUpdateDatetime(new Timestamp(new java.util.Date().getTime())); + physicalUpdate(db); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Long voteNo) { + DBUserPool pool = Container.getComp(DBUserPool.class); + Integer user = (Integer) pool.getUser(); + activation(user, voteNo); + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(Integer user, VotesEntity entity) { + activation(user, entity.getVoteNo()); + + } + /** + * 復元(論理削除されていたものを有効化) + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void activation(VotesEntity entity) { + activation(entity.getVoteNo()); + + } + +} diff --git a/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_delete.sql new file mode 100644 index 000000000..4317fd6ab --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_delete.sql @@ -0,0 +1,4 @@ +DELETE FROM COMMENTS +WHERE +COMMENT_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_insert.sql new file mode 100644 index 000000000..84df3c317 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_insert.sql @@ -0,0 +1,20 @@ +INSERT INTO COMMENTS +( +COMMENT_NO + , KNOWLEDGE_ID + , COMMENT + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_all.sql new file mode 100644 index 000000000..d7f800b65 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM COMMENTS; diff --git a/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_on_key.sql new file mode 100644 index 000000000..9795e3b84 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_physical_select_on_key.sql @@ -0,0 +1,4 @@ +SELECT * FROM COMMENTS + WHERE +COMMENT_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_all.sql new file mode 100644 index 000000000..1cdf91673 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM COMMENTS + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_on_key.sql new file mode 100644 index 000000000..6d8d016b3 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM COMMENTS + WHERE +COMMENT_NO = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_update.sql new file mode 100644 index 000000000..e6d69874a --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/CommentsDao/CommentsDao_update.sql @@ -0,0 +1,12 @@ +UPDATE COMMENTS +SET + KNOWLEDGE_ID = ? + , COMMENT = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +COMMENT_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_delete.sql new file mode 100644 index 000000000..12bdac241 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_delete.sql @@ -0,0 +1,4 @@ +DELETE FROM KNOWLEDGE_FILES +WHERE +FILE_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_insert.sql new file mode 100644 index 000000000..b0fdbab57 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_insert.sql @@ -0,0 +1,26 @@ +INSERT INTO KNOWLEDGE_FILES +( +FILE_NO + , KNOWLEDGE_ID + , FILE_NAME + , FILE_SIZE + , FILE_BINARY + , PARSE_STATUS + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_all.sql new file mode 100644 index 000000000..234183ac4 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM KNOWLEDGE_FILES; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_file_no.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_file_no.sql new file mode 100644 index 000000000..323e2a8b2 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_file_no.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_FILES + WHERE +FILE_NO = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_key.sql new file mode 100644 index 000000000..5929079f5 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_key.sql @@ -0,0 +1,4 @@ +SELECT * FROM KNOWLEDGE_FILES + WHERE +FILE_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_knowledge_id.sql new file mode 100644 index 000000000..1c1eb68cc --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_physical_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_FILES + WHERE +KNOWLEDGE_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_all.sql new file mode 100644 index 000000000..7555488a0 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM KNOWLEDGE_FILES + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_file_no.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_file_no.sql new file mode 100644 index 000000000..c91efe11b --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_file_no.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_FILES + WHERE +FILE_NO = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_key.sql new file mode 100644 index 000000000..c91efe11b --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_FILES + WHERE +FILE_NO = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_knowledge_id.sql new file mode 100644 index 000000000..3c85ff6d7 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_FILES + WHERE +KNOWLEDGE_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_update.sql new file mode 100644 index 000000000..e248a0d22 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeFilesDao/KnowledgeFilesDao_update.sql @@ -0,0 +1,15 @@ +UPDATE KNOWLEDGE_FILES +SET + KNOWLEDGE_ID = ? + , FILE_NAME = ? + , FILE_SIZE = ? + , FILE_BINARY = ? + , PARSE_STATUS = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +FILE_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_delete.sql new file mode 100644 index 000000000..ad82bc39f --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_delete.sql @@ -0,0 +1,5 @@ +DELETE FROM KNOWLEDGE_GROUPS +WHERE +GROUP_ID = ? + AND KNOWLEDGE_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_insert.sql new file mode 100644 index 000000000..747662ebc --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_insert.sql @@ -0,0 +1,18 @@ +INSERT INTO KNOWLEDGE_GROUPS +( +KNOWLEDGE_ID + , GROUP_ID + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_all.sql new file mode 100644 index 000000000..5a398aff1 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM KNOWLEDGE_GROUPS; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_group_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_group_id.sql new file mode 100644 index 000000000..5a849db1f --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_group_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_GROUPS + WHERE +GROUP_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_key.sql new file mode 100644 index 000000000..b692b5e6c --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_GROUPS + WHERE +GROUP_ID = ? + AND KNOWLEDGE_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_knowledge_id.sql new file mode 100644 index 000000000..0715dfab1 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_physical_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_GROUPS + WHERE +KNOWLEDGE_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_all.sql new file mode 100644 index 000000000..77f8bd1f3 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM KNOWLEDGE_GROUPS + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_group_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_group_id.sql new file mode 100644 index 000000000..8e51cf106 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_group_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_GROUPS + WHERE +GROUP_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_key.sql new file mode 100644 index 000000000..1fe71e892 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_key.sql @@ -0,0 +1,6 @@ +SELECT * FROM KNOWLEDGE_GROUPS + WHERE +GROUP_ID = ? + AND KNOWLEDGE_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_knowledge_id.sql new file mode 100644 index 000000000..987b036df --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_GROUPS + WHERE +KNOWLEDGE_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_update.sql new file mode 100644 index 000000000..03df05f2e --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeGroupsDao/KnowledgeGroupsDao_update.sql @@ -0,0 +1,11 @@ +UPDATE KNOWLEDGE_GROUPS +SET + INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +GROUP_ID = ? + AND KNOWLEDGE_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_delete.sql new file mode 100644 index 000000000..b85144dd7 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_delete.sql @@ -0,0 +1,5 @@ +DELETE FROM KNOWLEDGE_TAGS +WHERE +KNOWLEDGE_ID = ? + AND TAG_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_insert.sql new file mode 100644 index 000000000..3e41c4aca --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_insert.sql @@ -0,0 +1,18 @@ +INSERT INTO KNOWLEDGE_TAGS +( +KNOWLEDGE_ID + , TAG_ID + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_all.sql new file mode 100644 index 000000000..721cd6d1d --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM KNOWLEDGE_TAGS; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_key.sql new file mode 100644 index 000000000..2a247110e --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_TAGS + WHERE +KNOWLEDGE_ID = ? + AND TAG_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_knowledge_id.sql new file mode 100644 index 000000000..4d8257f89 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_TAGS + WHERE +KNOWLEDGE_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_tag_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_tag_id.sql new file mode 100644 index 000000000..142325713 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_physical_select_on_tag_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_TAGS + WHERE +TAG_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_all.sql new file mode 100644 index 000000000..2612b153c --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM KNOWLEDGE_TAGS + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_key.sql new file mode 100644 index 000000000..cc9a19bf6 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_key.sql @@ -0,0 +1,6 @@ +SELECT * FROM KNOWLEDGE_TAGS + WHERE +KNOWLEDGE_ID = ? + AND TAG_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_knowledge_id.sql new file mode 100644 index 000000000..c45d54367 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_TAGS + WHERE +KNOWLEDGE_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_tag_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_tag_id.sql new file mode 100644 index 000000000..4aec23c4a --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_select_on_tag_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_TAGS + WHERE +TAG_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_update.sql new file mode 100644 index 000000000..d8d1e5f8e --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeTagsDao/KnowledgeTagsDao_update.sql @@ -0,0 +1,11 @@ +UPDATE KNOWLEDGE_TAGS +SET + INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +KNOWLEDGE_ID = ? + AND TAG_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_delete.sql new file mode 100644 index 000000000..b086ebbc7 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_delete.sql @@ -0,0 +1,5 @@ +DELETE FROM KNOWLEDGE_USERS +WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_insert.sql new file mode 100644 index 000000000..9440e9f3f --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_insert.sql @@ -0,0 +1,18 @@ +INSERT INTO KNOWLEDGE_USERS +( +KNOWLEDGE_ID + , USER_ID + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_all.sql new file mode 100644 index 000000000..3fb763b2e --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM KNOWLEDGE_USERS; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_key.sql new file mode 100644 index 000000000..b40ce19ec --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_USERS + WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_knowledge_id.sql new file mode 100644 index 000000000..1adf3514b --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_USERS + WHERE +KNOWLEDGE_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_user_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_user_id.sql new file mode 100644 index 000000000..df7bb24c6 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_physical_select_on_user_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_USERS + WHERE +USER_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_all.sql new file mode 100644 index 000000000..c7832e5fd --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM KNOWLEDGE_USERS + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_key.sql new file mode 100644 index 000000000..4c1d5d9ac --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_key.sql @@ -0,0 +1,6 @@ +SELECT * FROM KNOWLEDGE_USERS + WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_knowledge_id.sql new file mode 100644 index 000000000..4b0237bbb --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_USERS + WHERE +KNOWLEDGE_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_user_id.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_user_id.sql new file mode 100644 index 000000000..3ad80e093 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_select_on_user_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGE_USERS + WHERE +USER_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_update.sql new file mode 100644 index 000000000..6f31b030e --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgeUsersDao/KnowledgeUsersDao_update.sql @@ -0,0 +1,11 @@ +UPDATE KNOWLEDGE_USERS +SET + INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_delete.sql new file mode 100644 index 000000000..f6ace22f9 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_delete.sql @@ -0,0 +1,4 @@ +DELETE FROM KNOWLEDGES +WHERE +KNOWLEDGE_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_insert.sql new file mode 100644 index 000000000..7e339382d --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_insert.sql @@ -0,0 +1,22 @@ +INSERT INTO KNOWLEDGES +( +KNOWLEDGE_ID + , TITLE + , CONTENT + , PUBLIC_FLAG + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_all.sql new file mode 100644 index 000000000..b34a9253d --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM KNOWLEDGES; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_on_key.sql new file mode 100644 index 000000000..f9a960d02 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_physical_select_on_key.sql @@ -0,0 +1,4 @@ +SELECT * FROM KNOWLEDGES + WHERE +KNOWLEDGE_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_selectOnKeyWithUserName.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_selectOnKeyWithUserName.sql new file mode 100644 index 000000000..adf55c306 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_selectOnKeyWithUserName.sql @@ -0,0 +1,11 @@ +SELECT + KNOWLEDGES.* + ,USERS.USER_NAME AS INSERT_USER_NAME + FROM + KNOWLEDGES + LEFT OUTER JOIN USERS + ON USERS.USER_ID = KNOWLEDGES.INSERT_USER + WHERE + KNOWLEDGES.KNOWLEDGE_ID = ? + AND KNOWLEDGES.DELETE_FLAG = 0; + diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_all.sql new file mode 100644 index 000000000..216d9710f --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM KNOWLEDGES + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_on_key.sql new file mode 100644 index 000000000..f69871fde --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM KNOWLEDGES + WHERE +KNOWLEDGE_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_update.sql new file mode 100644 index 000000000..89dc9ee3a --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/KnowledgesDao/KnowledgesDao_update.sql @@ -0,0 +1,13 @@ +UPDATE KNOWLEDGES +SET + TITLE = ? + , CONTENT = ? + , PUBLIC_FLAG = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +KNOWLEDGE_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_delete.sql new file mode 100644 index 000000000..217b0b043 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_delete.sql @@ -0,0 +1,4 @@ +DELETE FROM LIKES +WHERE +NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_insert.sql new file mode 100644 index 000000000..2783621da --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_insert.sql @@ -0,0 +1,18 @@ +INSERT INTO LIKES +( +NO + , KNOWLEDGE_ID + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_all.sql new file mode 100644 index 000000000..b67688ee1 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM LIKES; diff --git a/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_on_key.sql new file mode 100644 index 000000000..06be35f80 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_physical_select_on_key.sql @@ -0,0 +1,4 @@ +SELECT * FROM LIKES + WHERE +NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_all.sql new file mode 100644 index 000000000..d4692ee66 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM LIKES + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_on_key.sql new file mode 100644 index 000000000..4fbe99efc --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM LIKES + WHERE +NO = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_update.sql new file mode 100644 index 000000000..99fe0c150 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/LikesDao/LikesDao_update.sql @@ -0,0 +1,11 @@ +UPDATE LIKES +SET + KNOWLEDGE_ID = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_delete.sql new file mode 100644 index 000000000..b4df3654f --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_delete.sql @@ -0,0 +1,5 @@ +DELETE FROM STOCKS +WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_insert.sql new file mode 100644 index 000000000..fb43fb550 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_insert.sql @@ -0,0 +1,20 @@ +INSERT INTO STOCKS +( +USER_ID + , KNOWLEDGE_ID + , COMMENT + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_all.sql new file mode 100644 index 000000000..9fd0ed43d --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM STOCKS; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_key.sql new file mode 100644 index 000000000..eab28d5a6 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM STOCKS + WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_knowledge_id.sql new file mode 100644 index 000000000..c27a05529 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM STOCKS + WHERE +KNOWLEDGE_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_user_id.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_user_id.sql new file mode 100644 index 000000000..4c3aa2950 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_physical_select_on_user_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM STOCKS + WHERE +USER_ID = ? +; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_all.sql new file mode 100644 index 000000000..3f4113f51 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM STOCKS + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_key.sql new file mode 100644 index 000000000..f1cfb80e5 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_key.sql @@ -0,0 +1,6 @@ +SELECT * FROM STOCKS + WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_knowledge_id.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_knowledge_id.sql new file mode 100644 index 000000000..b963e866f --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_knowledge_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM STOCKS + WHERE +KNOWLEDGE_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_user_id.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_user_id.sql new file mode 100644 index 000000000..1d92d8914 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_select_on_user_id.sql @@ -0,0 +1,5 @@ +SELECT * FROM STOCKS + WHERE +USER_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_update.sql new file mode 100644 index 000000000..d864cef69 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/StocksDao/StocksDao_update.sql @@ -0,0 +1,12 @@ +UPDATE STOCKS +SET + COMMENT = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +KNOWLEDGE_ID = ? + AND USER_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_delete.sql new file mode 100644 index 000000000..66dbe186d --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_delete.sql @@ -0,0 +1,4 @@ +DELETE FROM TAGS +WHERE +TAG_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_insert.sql new file mode 100644 index 000000000..1ec2e9328 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_insert.sql @@ -0,0 +1,18 @@ +INSERT INTO TAGS +( +TAG_ID + , TAG_NAME + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_all.sql new file mode 100644 index 000000000..ba02a2143 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM TAGS; diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_on_key.sql new file mode 100644 index 000000000..0dbef166b --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_physical_select_on_key.sql @@ -0,0 +1,4 @@ +SELECT * FROM TAGS + WHERE +TAG_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectOnKnowledgeId.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectOnKnowledgeId.sql new file mode 100644 index 000000000..57d99162f --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectOnKnowledgeId.sql @@ -0,0 +1,7 @@ +SELECT + TAGS.* + FROM + TAGS INNER JOIN KNOWLEDGE_TAGS + ON TAGS.TAG_ID = KNOWLEDGE_TAGS.TAG_ID +WHERE + KNOWLEDGE_TAGS.KNOWLEDGE_ID = ? diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCount.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCount.sql new file mode 100644 index 000000000..1385c50b3 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCount.sql @@ -0,0 +1,13 @@ +SELECT + TAGS.TAG_ID + ,TAGS.TAG_NAME + ,COUNT(KNOWLEDGES.KNOWLEDGE_ID) AS KNOWLEDGE_COUNT + FROM + TAGS INNER JOIN KNOWLEDGE_TAGS + ON TAGS.TAG_ID = KNOWLEDGE_TAGS.TAG_ID INNER JOIN KNOWLEDGES + ON KNOWLEDGE_TAGS.KNOWLEDGE_ID = KNOWLEDGES.KNOWLEDGE_ID +GROUP BY + TAGS.TAG_ID + ,TAGS.TAG_NAME +ORDER BY + KNOWLEDGE_COUNT DESC LIMIT ? OFFSET ?; \ No newline at end of file diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCountOnUser.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCountOnUser.sql new file mode 100644 index 000000000..4f373e881 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_selectTagsWithCountOnUser.sql @@ -0,0 +1,26 @@ +SELECT + TAGS.TAG_ID + ,TAGS.TAG_NAME + ,COUNT(KNOWLEDGES.KNOWLEDGE_ID) AS KNOWLEDGE_COUNT + FROM + TAGS + INNER JOIN KNOWLEDGE_TAGS + ON TAGS.TAG_ID = KNOWLEDGE_TAGS.TAG_ID + INNER JOIN KNOWLEDGES + ON KNOWLEDGE_TAGS.KNOWLEDGE_ID = KNOWLEDGES.KNOWLEDGE_ID + WHERE + EXISTS ( + SELECT * FROM KNOWLEDGES KNOWLEDGES2 + INNER JOIN KNOWLEDGE_USERS + ON KNOWLEDGES2.KNOWLEDGE_ID = KNOWLEDGE_USERS.KNOWLEDGE_ID + WHERE + KNOWLEDGES.KNOWLEDGE_ID = KNOWLEDGES2.KNOWLEDGE_ID + AND + KNOWLEDGE_USERS.USER_ID IN (0, ?) + ) +GROUP BY + TAGS.TAG_ID + ,TAGS.TAG_NAME +ORDER BY + KNOWLEDGE_COUNT DESC LIMIT ? OFFSET ?; + \ No newline at end of file diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_all.sql new file mode 100644 index 000000000..b73516a02 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM TAGS + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_on_key.sql new file mode 100644 index 000000000..846219ac1 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM TAGS + WHERE +TAG_ID = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_update.sql new file mode 100644 index 000000000..2bd6af276 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/TagsDao/TagsDao_update.sql @@ -0,0 +1,11 @@ +UPDATE TAGS +SET + TAG_NAME = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +TAG_ID = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_delete.sql new file mode 100644 index 000000000..63c6ba6a6 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_delete.sql @@ -0,0 +1,4 @@ +DELETE FROM VIEW_HISTORIES +WHERE +HISTORY_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_insert.sql new file mode 100644 index 000000000..e3e44900e --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_insert.sql @@ -0,0 +1,20 @@ +INSERT INTO VIEW_HISTORIES +( +HISTORY_NO + , KNOWLEDGE_ID + , VIEW_DATE_TIME + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_all.sql new file mode 100644 index 000000000..51a33e84a --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM VIEW_HISTORIES; diff --git a/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_on_key.sql new file mode 100644 index 000000000..c78d382d4 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_physical_select_on_key.sql @@ -0,0 +1,4 @@ +SELECT * FROM VIEW_HISTORIES + WHERE +HISTORY_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_all.sql new file mode 100644 index 000000000..b16a965cd --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM VIEW_HISTORIES + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_on_key.sql new file mode 100644 index 000000000..a3c614705 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM VIEW_HISTORIES + WHERE +HISTORY_NO = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_update.sql new file mode 100644 index 000000000..6bda20d30 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/ViewHistoriesDao/ViewHistoriesDao_update.sql @@ -0,0 +1,12 @@ +UPDATE VIEW_HISTORIES +SET + KNOWLEDGE_ID = ? + , VIEW_DATE_TIME = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +HISTORY_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_delete.sql b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_delete.sql new file mode 100644 index 000000000..40933b8cd --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_delete.sql @@ -0,0 +1,4 @@ +DELETE FROM VOTES +WHERE +VOTE_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_insert.sql b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_insert.sql new file mode 100644 index 000000000..f0cc30dfa --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_insert.sql @@ -0,0 +1,20 @@ +INSERT INTO VOTES +( +VOTE_NO + , KNOWLEDGE_ID + , VOTE_KIND + , INSERT_USER + , INSERT_DATETIME + , UPDATE_USER + , UPDATE_DATETIME + , DELETE_FLAG +) VALUES ( +? + , ? + , ? + , ? + , ? + , ? + , ? + , ? +); diff --git a/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_all.sql new file mode 100644 index 000000000..df615cd26 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_all.sql @@ -0,0 +1 @@ +SELECT * FROM VOTES; diff --git a/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_on_key.sql new file mode 100644 index 000000000..59a12ef76 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_physical_select_on_key.sql @@ -0,0 +1,4 @@ +SELECT * FROM VOTES + WHERE +VOTE_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_all.sql b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_all.sql new file mode 100644 index 000000000..b85e357b2 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_all.sql @@ -0,0 +1,2 @@ +SELECT * FROM VOTES + WHERE DELETE_FLAG = 0; diff --git a/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_on_key.sql b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_on_key.sql new file mode 100644 index 000000000..87514a848 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_select_on_key.sql @@ -0,0 +1,5 @@ +SELECT * FROM VOTES + WHERE +VOTE_NO = ? + AND DELETE_FLAG = 0; +; diff --git a/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_update.sql b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_update.sql new file mode 100644 index 000000000..5e59ac805 --- /dev/null +++ b/src/main/java/redcomet/knowledge/dao/sql/VotesDao/VotesDao_update.sql @@ -0,0 +1,12 @@ +UPDATE VOTES +SET + KNOWLEDGE_ID = ? + , VOTE_KIND = ? + , INSERT_USER = ? + , INSERT_DATETIME = ? + , UPDATE_USER = ? + , UPDATE_DATETIME = ? + , DELETE_FLAG = ? +WHERE +VOTE_NO = ? +; diff --git a/src/main/java/redcomet/knowledge/deploy/InitDB.java b/src/main/java/redcomet/knowledge/deploy/InitDB.java new file mode 100644 index 000000000..3ffe7a536 --- /dev/null +++ b/src/main/java/redcomet/knowledge/deploy/InitDB.java @@ -0,0 +1,86 @@ +package redcomet.knowledge.deploy; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.knowledge.deploy.v0_0_1.InitializeSystem; +import redcomet.web.dao.SystemsDao; +import redcomet.web.entity.SystemsEntity; + + +public class InitDB { + /** ログ */ + private static Log LOG = LogFactory.getLog(InitDB.class); + + private static final String SYSTEM_NAME = "knowledge"; + private static final Map MAP = new LinkedHashMap<>(); + + public InitDB() { + super(); + // MAP.put("0.0.1", InitializeSystem.get()); + // MAP.put("0.1.0", Migrate_0_1_0.get()); + MAP.put("0.2.0", InitializeSystem.get()); //既存データは全てクリア + } + + public static void main(String[] args) throws Exception { + InitDB init = new InitDB(); + init.start(); + } + + public void start() throws Exception { + String version = ""; + + Migrate migrate = null; + SystemsDao dao = SystemsDao.get(); + SystemsEntity entity = null; + do { + migrate = null; + boolean finded = false; + try { + entity = dao.selectOnKey(SYSTEM_NAME); + if (entity != null) { + version = entity.getVersion(); + } else { + finded = true; + } + } catch (Exception e) { + //テーブルが存在しない + finded = true; + } + + Iterator versions = MAP.keySet().iterator(); + while (versions.hasNext()) { + String v = (String) versions.next(); + if (finded) { + version = v; + migrate = MAP.get(v); + break; + } + if (version.equals(v)) { + finded = true; + } + } + + if (migrate == null) { + break; + } + + // Migrate 実行 + boolean result = migrate.doMigrate(); + if (result) { + if (entity == null) { + entity = new SystemsEntity(SYSTEM_NAME); + } + entity.setVersion(version); + LOG.info("Migrate to " + version); + dao.save(entity); + } + } while (migrate != null); + } + + + +} diff --git a/src/main/java/redcomet/knowledge/deploy/InitializationListener.java b/src/main/java/redcomet/knowledge/deploy/InitializationListener.java new file mode 100644 index 000000000..4fa171d18 --- /dev/null +++ b/src/main/java/redcomet/knowledge/deploy/InitializationListener.java @@ -0,0 +1,41 @@ +package redcomet.knowledge.deploy; + +import java.util.TimeZone; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import redcomet.common.exception.SystemException; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.ormapping.connection.ConnectionManager; + +public class InitializationListener implements ServletContextListener { + /** ログ */ + private static Log LOG = LogFactory.getLog(InitializationListener.class); + + @Override + public void contextDestroyed(ServletContextEvent contextEvent) { + LOG.debug("contextDestroyed"); + ConnectionManager connectionManager = ConnectionManager.getInstance(); + connectionManager.release(); + connectionManager.destroy(); + } + + @Override + public void contextInitialized(ServletContextEvent contextEvent) { + LOG.debug("contextInitialized"); + InitDB initDB = new InitDB(); + try { + initDB.start(); + } catch (Exception e) { + throw new SystemException(e); + } + // 内部的には、日付はGMTとして扱う + TimeZone zone = TimeZone.getTimeZone("GMT"); + TimeZone.setDefault(zone); + + + } + +} diff --git a/src/main/java/redcomet/knowledge/deploy/Migrate.java b/src/main/java/redcomet/knowledge/deploy/Migrate.java new file mode 100644 index 000000000..888b200d0 --- /dev/null +++ b/src/main/java/redcomet/knowledge/deploy/Migrate.java @@ -0,0 +1,13 @@ +package redcomet.knowledge.deploy; + +public interface Migrate { + + /** + * マイグレーション実行 + * @return + * @throws Exception + */ + boolean doMigrate() throws Exception; + + +} diff --git a/src/main/java/redcomet/knowledge/deploy/v0_0_1/InitializeSystem.java b/src/main/java/redcomet/knowledge/deploy/v0_0_1/InitializeSystem.java new file mode 100644 index 000000000..9a02bc420 --- /dev/null +++ b/src/main/java/redcomet/knowledge/deploy/v0_0_1/InitializeSystem.java @@ -0,0 +1,69 @@ +package redcomet.knowledge.deploy.v0_0_1; + +import redcomet.knowledge.deploy.Migrate; +import redcomet.ormapping.tool.dao.InitializeDao; +import redcomet.web.dao.RolesDao; +import redcomet.web.dao.UserRolesDao; +import redcomet.web.dao.UsersDao; +import redcomet.web.entity.RolesEntity; +import redcomet.web.entity.UserRolesEntity; +import redcomet.web.entity.UsersEntity; + +public class InitializeSystem implements Migrate { + + public static InitializeSystem get() { + return redcomet.di.Container.getComp(InitializeSystem.class); + } + + @Override + public boolean doMigrate() throws Exception { + createTables(); + addInitDatas(); + return true; + } + + private void addInitDatas() { + //権限の追加 + RolesEntity adminRole = RolesEntity.get(); + adminRole.setRoleId(1); + adminRole.setRoleKey("admin"); + adminRole.setRoleName("管理者権限"); + RolesDao.get().insert(adminRole); + + RolesEntity userRole = RolesEntity.get(); + userRole.setRoleId(2); + userRole.setRoleKey("user"); + userRole.setRoleName("一般ユーザ権限"); + RolesDao.get().insert(userRole); + + //管理者ユーザ追加 + UsersDao usersDao = UsersDao.get(); + UsersEntity usersEntity = UsersEntity.get(); + usersEntity.setUserId(1); + usersEntity.setUserKey("admin"); + usersEntity.setPassword("admin123"); + usersEntity.setUserName("管理者ユーザ"); + usersDao.save(usersEntity); + + //管理者ユーザと管理者権を紐付け + UserRolesDao userRolesDao = UserRolesDao.get(); + UserRolesEntity userRolesEntity = UserRolesEntity.get(); + userRolesEntity.setUserId(1); + userRolesEntity.setRoleId(1); + userRolesDao.save(userRolesEntity); + } + + private void createTables() { + //存在するテーブルを全て削除 + InitializeDao initializeDao = InitializeDao.get(); + initializeDao.dropAllTable(); + + String[] sqlpaths = { + "/redcomet/web/database/ddl.sql", + "/redcomet/knowledge/database/ddl.sql" + }; + initializeDao.initializeDatabase(sqlpaths); + } + + +} diff --git a/src/main/java/redcomet/knowledge/deploy/v0_1_0/Migrate_0_1_0.java b/src/main/java/redcomet/knowledge/deploy/v0_1_0/Migrate_0_1_0.java new file mode 100644 index 000000000..6e3ba2c17 --- /dev/null +++ b/src/main/java/redcomet/knowledge/deploy/v0_1_0/Migrate_0_1_0.java @@ -0,0 +1,16 @@ +package redcomet.knowledge.deploy.v0_1_0; + +import redcomet.knowledge.deploy.Migrate; + +public class Migrate_0_1_0 implements Migrate { + + public static Migrate_0_1_0 get() { + return redcomet.di.Container.getComp(Migrate_0_1_0.class); + } + + @Override + public boolean doMigrate() throws Exception { + return true; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/CommentsEntity.java b/src/main/java/redcomet/knowledge/entity/CommentsEntity.java new file mode 100644 index 000000000..cd2efef55 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/CommentsEntity.java @@ -0,0 +1,68 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenCommentsEntity; + +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * コメント + */ +@DI(instance=Instance.Prototype) +public class CommentsEntity extends GenCommentsEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** 更新ユーザ名 */ + private String updateUserName; + + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static CommentsEntity get() { + return Container.getComp(CommentsEntity.class); + } + + /** + * コンストラクタ + */ + public CommentsEntity() { + super(); + } + + /** + * コンストラクタ + * @param commentNo コメント番号 + */ + + public CommentsEntity(Long commentNo) { + super( commentNo); + } + + /** + * @return the updateUserName + */ + public String getUpdateUserName() { + return updateUserName; + } + + /** + * @param updateUserName the updateUserName to set + */ + public void setUpdateUserName(String updateUserName) { + this.updateUserName = updateUserName; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/KnowledgeFilesEntity.java b/src/main/java/redcomet/knowledge/entity/KnowledgeFilesEntity.java new file mode 100644 index 000000000..982e3df12 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/KnowledgeFilesEntity.java @@ -0,0 +1,47 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenKnowledgeFilesEntity; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.io.InputStream; +import java.sql.Timestamp; + + +/** + * 添付ファイル + */ +@DI(instance=Instance.Prototype) +public class KnowledgeFilesEntity extends GenKnowledgeFilesEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeFilesEntity get() { + return Container.getComp(KnowledgeFilesEntity.class); + } + + /** + * コンストラクタ + */ + public KnowledgeFilesEntity() { + super(); + } + + /** + * コンストラクタ + * @param fileNo 添付ファイル番号 + */ + + public KnowledgeFilesEntity(Long fileNo) { + super(fileNo); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/KnowledgeGroupsEntity.java b/src/main/java/redcomet/knowledge/entity/KnowledgeGroupsEntity.java new file mode 100644 index 000000000..47710f116 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/KnowledgeGroupsEntity.java @@ -0,0 +1,51 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenKnowledgeGroupsEntity; + +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * アクセス可能なグループ + */ +@DI(instance=Instance.Prototype) +public class KnowledgeGroupsEntity extends GenKnowledgeGroupsEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeGroupsEntity get() { + return Container.getComp(KnowledgeGroupsEntity.class); + } + + /** + * コンストラクタ + */ + public KnowledgeGroupsEntity() { + super(); + } + + /** + * コンストラクタ + * @param groupId GROUP_ID + * @param knowledgeId ナレッジID + */ + + public KnowledgeGroupsEntity(Integer groupId, Long knowledgeId) { + super(groupId, knowledgeId); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/KnowledgeTagsEntity.java b/src/main/java/redcomet/knowledge/entity/KnowledgeTagsEntity.java new file mode 100644 index 000000000..89cf019b1 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/KnowledgeTagsEntity.java @@ -0,0 +1,47 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenKnowledgeTagsEntity; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * ナレッジが持つタグ + */ +@DI(instance=Instance.Prototype) +public class KnowledgeTagsEntity extends GenKnowledgeTagsEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeTagsEntity get() { + return Container.getComp(KnowledgeTagsEntity.class); + } + + /** + * コンストラクタ + */ + public KnowledgeTagsEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + * @param tagId タグ_ID + */ + + public KnowledgeTagsEntity(Long knowledgeId, Integer tagId) { + super(knowledgeId, tagId); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/KnowledgeUsersEntity.java b/src/main/java/redcomet/knowledge/entity/KnowledgeUsersEntity.java new file mode 100644 index 000000000..3397d2781 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/KnowledgeUsersEntity.java @@ -0,0 +1,51 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenKnowledgeUsersEntity; + +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * アクセス可能なユーザ + */ +@DI(instance=Instance.Prototype) +public class KnowledgeUsersEntity extends GenKnowledgeUsersEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgeUsersEntity get() { + return Container.getComp(KnowledgeUsersEntity.class); + } + + /** + * コンストラクタ + */ + public KnowledgeUsersEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + * @param userId USER_ID + */ + + public KnowledgeUsersEntity(Long knowledgeId, Integer userId) { + super(knowledgeId, userId); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/KnowledgesEntity.java b/src/main/java/redcomet/knowledge/entity/KnowledgesEntity.java new file mode 100644 index 000000000..0e3a0322f --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/KnowledgesEntity.java @@ -0,0 +1,138 @@ +package redcomet.knowledge.entity; + +import org.owasp.validator.html.PolicyException; +import org.owasp.validator.html.ScanException; + +import redcomet.common.exception.SystemException; +import redcomet.common.util.StringUtils; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.control.Control; +import redcomet.knowledge.entity.gen.GenKnowledgesEntity; + + +/** + * ナレッジ + */ +@DI(instance=Instance.Prototype) +public class KnowledgesEntity extends GenKnowledgesEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static KnowledgesEntity get() { + return Container.getComp(KnowledgesEntity.class); + } + + /** + * 登録者の名称 + */ + private String insertUserName; + /** + * タグ + */ + private String tags; + + /** いいねのカウント */ + private Long likeCount; + + + /** + * コンストラクタ + */ + public KnowledgesEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + */ + + public KnowledgesEntity(Long knowledgeId) { + super( knowledgeId); + } + + /* (non-Javadoc) + * @see redcomet.knowledge.entity.gen.GenKnowledgesEntity#getTitle() + */ + @Override + public String getTitle() { + if (StringUtils.isEmpty(super.getTitle())) { + return super.getTitle(); + } + try { + return Control.doSamy(super.getTitle()); + } catch (PolicyException | ScanException e) { + throw new SystemException(e); + } + } + + /* (non-Javadoc) + * @see redcomet.knowledge.entity.gen.GenKnowledgesEntity#getContent() + */ + @Override + public String getContent() { + if (StringUtils.isEmpty(super.getContent())) { + return super.getContent(); + } + try { + return Control.doSamy(super.getContent()); + } catch (PolicyException | ScanException e) { + throw new SystemException(e); + } + } + + /** + * @return the insertUserName + */ + public String getInsertUserName() { + return insertUserName; + } + + /** + * @param insertUserName the insertUserName to set + */ + public void setInsertUserName(String insertUserName) { + this.insertUserName = insertUserName; + } + + /** + * @return the tags + */ + public String getTags() { + return tags; + } + + /** + * @param tags the tags to set + */ + public void setTags(String tags) { + this.tags = tags; + } + + /** + * @return the likeCount + */ + public Long getLikeCount() { + return likeCount; + } + + /** + * @param likeCount the likeCount to set + */ + public void setLikeCount(Long likeCount) { + this.likeCount = likeCount; + } + + + + + +} diff --git a/src/main/java/redcomet/knowledge/entity/LikesEntity.java b/src/main/java/redcomet/knowledge/entity/LikesEntity.java new file mode 100644 index 000000000..23422d702 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/LikesEntity.java @@ -0,0 +1,43 @@ +package redcomet.knowledge.entity; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.entity.gen.GenLikesEntity; + + +/** + * いいね + */ +@DI(instance=Instance.Prototype) +public class LikesEntity extends GenLikesEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static LikesEntity get() { + return Container.getComp(LikesEntity.class); + } + + /** + * コンストラクタ + */ + public LikesEntity() { + super(); + } + + /** + * コンストラクタ + * @param no NO + */ + + public LikesEntity(Long no) { + super(no); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/StocksEntity.java b/src/main/java/redcomet/knowledge/entity/StocksEntity.java new file mode 100644 index 000000000..2fdda9a12 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/StocksEntity.java @@ -0,0 +1,51 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenStocksEntity; + +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * ストックしたナレッジ + */ +@DI(instance=Instance.Prototype) +public class StocksEntity extends GenStocksEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static StocksEntity get() { + return Container.getComp(StocksEntity.class); + } + + /** + * コンストラクタ + */ + public StocksEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + * @param userId USER_ID + */ + + public StocksEntity(Long knowledgeId, Integer userId) { + super(knowledgeId, userId); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/TagsEntity.java b/src/main/java/redcomet/knowledge/entity/TagsEntity.java new file mode 100644 index 000000000..1ea5b148e --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/TagsEntity.java @@ -0,0 +1,66 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenTagsEntity; + +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * タグ + */ +@DI(instance=Instance.Prototype) +public class TagsEntity extends GenTagsEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * タグに紐づくナレッジの件数 + */ + private Integer knowledgeCount; + + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static TagsEntity get() { + return Container.getComp(TagsEntity.class); + } + + /** + * コンストラクタ + */ + public TagsEntity() { + super(); + } + + /** + * コンストラクタ + * @param tagId タグ_ID + */ + + public TagsEntity(Integer tagId) { + super( tagId); + } + + /** + * @return the knowledgeCount + */ + public Integer getKnowledgeCount() { + return knowledgeCount; + } + + /** + * @param knowledgeCount the knowledgeCount to set + */ + public void setKnowledgeCount(Integer knowledgeCount) { + this.knowledgeCount = knowledgeCount; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/ViewHistoriesEntity.java b/src/main/java/redcomet/knowledge/entity/ViewHistoriesEntity.java new file mode 100644 index 000000000..bb748d887 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/ViewHistoriesEntity.java @@ -0,0 +1,50 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenViewHistoriesEntity; + +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * ナレッジの参照履歴 + */ +@DI(instance=Instance.Prototype) +public class ViewHistoriesEntity extends GenViewHistoriesEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static ViewHistoriesEntity get() { + return Container.getComp(ViewHistoriesEntity.class); + } + + /** + * コンストラクタ + */ + public ViewHistoriesEntity() { + super(); + } + + /** + * コンストラクタ + * @param historyNo HISTORY_NO + */ + + public ViewHistoriesEntity(Long historyNo) { + super( historyNo); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/VotesEntity.java b/src/main/java/redcomet/knowledge/entity/VotesEntity.java new file mode 100644 index 000000000..ff9cc8c14 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/VotesEntity.java @@ -0,0 +1,50 @@ +package redcomet.knowledge.entity; + +import redcomet.knowledge.entity.gen.GenVotesEntity; + +import java.util.List; +import java.util.Map; + +import redcomet.common.bean.ValidateError; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +import java.sql.Timestamp; + + +/** + * 投票 + */ +@DI(instance=Instance.Prototype) +public class VotesEntity extends GenVotesEntity { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static VotesEntity get() { + return Container.getComp(VotesEntity.class); + } + + /** + * コンストラクタ + */ + public VotesEntity() { + super(); + } + + /** + * コンストラクタ + * @param voteNo VOTE_NO + */ + + public VotesEntity(Long voteNo) { + super( voteNo); + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenCommentsEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenCommentsEntity.java new file mode 100644 index 000000000..24fc92fe1 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenCommentsEntity.java @@ -0,0 +1,309 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * コメント + */ +@DI(instance=Instance.Prototype) +public class GenCommentsEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenCommentsEntity get() { + return Container.getComp(GenCommentsEntity.class); + } + + /** + * コンストラクタ + */ + public GenCommentsEntity() { + super(); + } + + /** + * コンストラクタ + * @param commentNo コメント番号 + */ + + public GenCommentsEntity(Long commentNo) { + super(); + this.commentNo = commentNo; + } + /** コメント番号 */ + private Long commentNo; + /** ナレッジID */ + private Long knowledgeId; + /** コメント */ + private String comment; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * コメント番号 を取得する + */ + public Long getCommentNo() { + return this.commentNo; + } + /** + * コメント番号 を設定する + * @param commentNo コメント番号 + */ + public GenCommentsEntity setCommentNo(Long commentNo) { + this.commentNo = commentNo; + return this; + } + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenCommentsEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * コメント を取得する + */ + public String getComment() { + return this.comment; + } + /** + * コメント を設定する + * @param comment コメント + */ + public GenCommentsEntity setComment(String comment) { + this.comment = comment; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenCommentsEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenCommentsEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenCommentsEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenCommentsEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenCommentsEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[1]; + keyValues[0] = this.commentNo; + return keyValues; + } + /** + * キーの値を設定 + * @param commentNo コメント番号 + */ + public void setKeyValues(Long commentNo) { + this.commentNo = commentNo; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenCommentsEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("commentNo = ").append(commentNo).append("\n"); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("comment = ").append(comment).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeFilesEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeFilesEntity.java new file mode 100644 index 000000000..9e45a1938 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeFilesEntity.java @@ -0,0 +1,384 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.io.InputStream; +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * 添付ファイル + */ +@DI(instance=Instance.Prototype) +public class GenKnowledgeFilesEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeFilesEntity get() { + return Container.getComp(GenKnowledgeFilesEntity.class); + } + + /** + * コンストラクタ + */ + public GenKnowledgeFilesEntity() { + super(); + } + + /** + * コンストラクタ + * @param fileNo 添付ファイル番号 + */ + + public GenKnowledgeFilesEntity(Long fileNo) { + super(); + this.fileNo = fileNo; + } + /** 添付ファイル番号 */ + private Long fileNo; + /** ナレッジID */ + private Long knowledgeId; + /** ファイル名 */ + private String fileName; + /** ファイルサイズ */ + private Double fileSize; + /** バイナリ */ + private InputStream fileBinary; + /** パース結果 */ + private Integer parseStatus; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * 添付ファイル番号 を取得する + */ + public Long getFileNo() { + return this.fileNo; + } + /** + * 添付ファイル番号 を設定する + * @param fileNo 添付ファイル番号 + */ + public GenKnowledgeFilesEntity setFileNo(Long fileNo) { + this.fileNo = fileNo; + return this; + } + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenKnowledgeFilesEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * ファイル名 を取得する + */ + public String getFileName() { + return this.fileName; + } + /** + * ファイル名 を設定する + * @param fileName ファイル名 + */ + public GenKnowledgeFilesEntity setFileName(String fileName) { + this.fileName = fileName; + return this; + } + + /** + * ファイルサイズ を取得する + */ + public Double getFileSize() { + return this.fileSize; + } + /** + * ファイルサイズ を設定する + * @param fileSize ファイルサイズ + */ + public GenKnowledgeFilesEntity setFileSize(Double fileSize) { + this.fileSize = fileSize; + return this; + } + + /** + * バイナリ を取得する + */ + public InputStream getFileBinary() { + return this.fileBinary; + } + /** + * バイナリ を設定する + * @param fileBinary バイナリ + */ + public GenKnowledgeFilesEntity setFileBinary(InputStream fileBinary) { + this.fileBinary = fileBinary; + return this; + } + + /** + * パース結果 を取得する + */ + public Integer getParseStatus() { + return this.parseStatus; + } + /** + * パース結果 を設定する + * @param parseStatus パース結果 + */ + public GenKnowledgeFilesEntity setParseStatus(Integer parseStatus) { + this.parseStatus = parseStatus; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenKnowledgeFilesEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenKnowledgeFilesEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenKnowledgeFilesEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenKnowledgeFilesEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenKnowledgeFilesEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[1]; + keyValues[0] = this.fileNo; + return keyValues; + } + /** + * キーの値を設定 + * @param fileNo 添付ファイル番号 + */ + public void setKeyValues(Long fileNo) { + this.fileNo = fileNo; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenKnowledgeFilesEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("fileNo = ").append(fileNo).append("\n"); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("fileName = ").append(fileName).append("\n"); + builder.append("fileSize = ").append(fileSize).append("\n"); + builder.append("fileBinary = ").append(fileBinary).append("\n"); + builder.append("parseStatus = ").append(parseStatus).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(this.fileName, convLabelName("File Name"), 256); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.parseStatus, convLabelName("Parse Status")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.parseStatus, convLabelName("Parse Status")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(values.get("fileName"), convLabelName("File Name"), 256); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("parseStatus"), convLabelName("Parse Status")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("parseStatus"), convLabelName("Parse Status")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeGroupsEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeGroupsEntity.java new file mode 100644 index 000000000..4fde8da0d --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeGroupsEntity.java @@ -0,0 +1,316 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * アクセス可能なグループ + */ +@DI(instance=Instance.Prototype) +public class GenKnowledgeGroupsEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeGroupsEntity get() { + return Container.getComp(GenKnowledgeGroupsEntity.class); + } + + /** + * コンストラクタ + */ + public GenKnowledgeGroupsEntity() { + super(); + } + + /** + * コンストラクタ + * @param groupId GROUP_ID + * @param knowledgeId ナレッジID + */ + + public GenKnowledgeGroupsEntity(Integer groupId, Long knowledgeId) { + super(); + this.groupId = groupId; + this.knowledgeId = knowledgeId; + } + /** ナレッジID */ + private Long knowledgeId; + /** GROUP_ID */ + private Integer groupId; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenKnowledgeGroupsEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * GROUP_ID を取得する + */ + public Integer getGroupId() { + return this.groupId; + } + /** + * GROUP_ID を設定する + * @param groupId GROUP_ID + */ + public GenKnowledgeGroupsEntity setGroupId(Integer groupId) { + this.groupId = groupId; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenKnowledgeGroupsEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenKnowledgeGroupsEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenKnowledgeGroupsEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenKnowledgeGroupsEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenKnowledgeGroupsEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[2]; + keyValues[0] = this.groupId; + keyValues[1] = this.knowledgeId; + return keyValues; + } + /** + * キーの値を設定 + * @param groupId GROUP_ID + * @param knowledgeId ナレッジID + */ + public void setKeyValues(Integer groupId, Long knowledgeId) { + this.groupId = groupId; + this.knowledgeId = knowledgeId; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenKnowledgeGroupsEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("groupId = ").append(groupId).append("\n"); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.groupId, convLabelName("Group Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.groupId, convLabelName("Group Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("groupId"), convLabelName("Group Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("groupId"), convLabelName("Group Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeTagsEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeTagsEntity.java new file mode 100644 index 000000000..4b1eb2b00 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeTagsEntity.java @@ -0,0 +1,316 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * ナレッジが持つタグ + */ +@DI(instance=Instance.Prototype) +public class GenKnowledgeTagsEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeTagsEntity get() { + return Container.getComp(GenKnowledgeTagsEntity.class); + } + + /** + * コンストラクタ + */ + public GenKnowledgeTagsEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + * @param tagId タグ_ID + */ + + public GenKnowledgeTagsEntity(Long knowledgeId, Integer tagId) { + super(); + this.knowledgeId = knowledgeId; + this.tagId = tagId; + } + /** ナレッジID */ + private Long knowledgeId; + /** タグ_ID */ + private Integer tagId; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenKnowledgeTagsEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * タグ_ID を取得する + */ + public Integer getTagId() { + return this.tagId; + } + /** + * タグ_ID を設定する + * @param tagId タグ_ID + */ + public GenKnowledgeTagsEntity setTagId(Integer tagId) { + this.tagId = tagId; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenKnowledgeTagsEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenKnowledgeTagsEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenKnowledgeTagsEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenKnowledgeTagsEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenKnowledgeTagsEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[2]; + keyValues[0] = this.knowledgeId; + keyValues[1] = this.tagId; + return keyValues; + } + /** + * キーの値を設定 + * @param knowledgeId ナレッジID + * @param tagId タグ_ID + */ + public void setKeyValues(Long knowledgeId, Integer tagId) { + this.knowledgeId = knowledgeId; + this.tagId = tagId; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenKnowledgeTagsEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("tagId = ").append(tagId).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.tagId, convLabelName("Tag Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.tagId, convLabelName("Tag Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("tagId"), convLabelName("Tag Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("tagId"), convLabelName("Tag Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeUsersEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeUsersEntity.java new file mode 100644 index 000000000..c83a25422 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgeUsersEntity.java @@ -0,0 +1,316 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * アクセス可能なユーザ + */ +@DI(instance=Instance.Prototype) +public class GenKnowledgeUsersEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgeUsersEntity get() { + return Container.getComp(GenKnowledgeUsersEntity.class); + } + + /** + * コンストラクタ + */ + public GenKnowledgeUsersEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + * @param userId USER_ID + */ + + public GenKnowledgeUsersEntity(Long knowledgeId, Integer userId) { + super(); + this.knowledgeId = knowledgeId; + this.userId = userId; + } + /** ナレッジID */ + private Long knowledgeId; + /** USER_ID */ + private Integer userId; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenKnowledgeUsersEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * USER_ID を取得する + */ + public Integer getUserId() { + return this.userId; + } + /** + * USER_ID を設定する + * @param userId USER_ID + */ + public GenKnowledgeUsersEntity setUserId(Integer userId) { + this.userId = userId; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenKnowledgeUsersEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenKnowledgeUsersEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenKnowledgeUsersEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenKnowledgeUsersEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenKnowledgeUsersEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[2]; + keyValues[0] = this.knowledgeId; + keyValues[1] = this.userId; + return keyValues; + } + /** + * キーの値を設定 + * @param knowledgeId ナレッジID + * @param userId USER_ID + */ + public void setKeyValues(Long knowledgeId, Integer userId) { + this.knowledgeId = knowledgeId; + this.userId = userId; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenKnowledgeUsersEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("userId = ").append(userId).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.userId, convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.userId, convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("userId"), convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("userId"), convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgesEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgesEntity.java new file mode 100644 index 000000000..040f77805 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenKnowledgesEntity.java @@ -0,0 +1,347 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * ナレッジ + */ +@DI(instance=Instance.Prototype) +public class GenKnowledgesEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenKnowledgesEntity get() { + return Container.getComp(GenKnowledgesEntity.class); + } + + /** + * コンストラクタ + */ + public GenKnowledgesEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + */ + + public GenKnowledgesEntity(Long knowledgeId) { + super(); + this.knowledgeId = knowledgeId; + } + /** ナレッジID */ + private Long knowledgeId; + /** タイトル */ + private String title; + /** 内容 */ + private String content; + /** 公開区分 */ + private Integer publicFlag; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenKnowledgesEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * タイトル を取得する + */ + public String getTitle() { + return this.title; + } + /** + * タイトル を設定する + * @param title タイトル + */ + public GenKnowledgesEntity setTitle(String title) { + this.title = title; + return this; + } + + /** + * 内容 を取得する + */ + public String getContent() { + return this.content; + } + /** + * 内容 を設定する + * @param content 内容 + */ + public GenKnowledgesEntity setContent(String content) { + this.content = content; + return this; + } + + /** + * 公開区分 を取得する + */ + public Integer getPublicFlag() { + return this.publicFlag; + } + /** + * 公開区分 を設定する + * @param publicFlag 公開区分 + */ + public GenKnowledgesEntity setPublicFlag(Integer publicFlag) { + this.publicFlag = publicFlag; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenKnowledgesEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenKnowledgesEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenKnowledgesEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenKnowledgesEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenKnowledgesEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[1]; + keyValues[0] = this.knowledgeId; + return keyValues; + } + /** + * キーの値を設定 + * @param knowledgeId ナレッジID + */ + public void setKeyValues(Long knowledgeId) { + this.knowledgeId = knowledgeId; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenKnowledgesEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("title = ").append(title).append("\n"); + builder.append("content = ").append(content).append("\n"); + builder.append("publicFlag = ").append(publicFlag).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.title, convLabelName("Title")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(this.title, convLabelName("Title"), 1024); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.publicFlag, convLabelName("Public Flag")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("title"), convLabelName("Title")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(values.get("title"), convLabelName("Title"), 1024); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("publicFlag"), convLabelName("Public Flag")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenLikesEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenLikesEntity.java new file mode 100644 index 000000000..beba364e8 --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenLikesEntity.java @@ -0,0 +1,291 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * いいね + */ +@DI(instance=Instance.Prototype) +public class GenLikesEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenLikesEntity get() { + return Container.getComp(GenLikesEntity.class); + } + + /** + * コンストラクタ + */ + public GenLikesEntity() { + super(); + } + + /** + * コンストラクタ + * @param no NO + */ + + public GenLikesEntity(Long no) { + super(); + this.no = no; + } + /** NO */ + private Long no; + /** ナレッジID */ + private Long knowledgeId; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * NO を取得する + */ + public Long getNo() { + return this.no; + } + /** + * NO を設定する + * @param no NO + */ + public GenLikesEntity setNo(Long no) { + this.no = no; + return this; + } + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenLikesEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenLikesEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenLikesEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenLikesEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenLikesEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenLikesEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[1]; + keyValues[0] = this.no; + return keyValues; + } + /** + * キーの値を設定 + * @param no NO + */ + public void setKeyValues(Long no) { + this.no = no; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenLikesEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("no = ").append(no).append("\n"); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenStocksEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenStocksEntity.java new file mode 100644 index 000000000..ba2763e5c --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenStocksEntity.java @@ -0,0 +1,344 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * ストックしたナレッジ + */ +@DI(instance=Instance.Prototype) +public class GenStocksEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenStocksEntity get() { + return Container.getComp(GenStocksEntity.class); + } + + /** + * コンストラクタ + */ + public GenStocksEntity() { + super(); + } + + /** + * コンストラクタ + * @param knowledgeId ナレッジID + * @param userId USER_ID + */ + + public GenStocksEntity(Long knowledgeId, Integer userId) { + super(); + this.knowledgeId = knowledgeId; + this.userId = userId; + } + /** USER_ID */ + private Integer userId; + /** ナレッジID */ + private Long knowledgeId; + /** コメント */ + private String comment; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * USER_ID を取得する + */ + public Integer getUserId() { + return this.userId; + } + /** + * USER_ID を設定する + * @param userId USER_ID + */ + public GenStocksEntity setUserId(Integer userId) { + this.userId = userId; + return this; + } + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenStocksEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * コメント を取得する + */ + public String getComment() { + return this.comment; + } + /** + * コメント を設定する + * @param comment コメント + */ + public GenStocksEntity setComment(String comment) { + this.comment = comment; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenStocksEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenStocksEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenStocksEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenStocksEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenStocksEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[2]; + keyValues[0] = this.knowledgeId; + keyValues[1] = this.userId; + return keyValues; + } + /** + * キーの値を設定 + * @param knowledgeId ナレッジID + * @param userId USER_ID + */ + public void setKeyValues(Long knowledgeId, Integer userId) { + this.knowledgeId = knowledgeId; + this.userId = userId; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenStocksEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("userId = ").append(userId).append("\n"); + builder.append("comment = ").append(comment).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.userId, convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.userId, convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(this.comment, convLabelName("Comment"), 1024); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("userId"), convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("userId"), convLabelName("User Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(values.get("comment"), convLabelName("Comment"), 1024); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenTagsEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenTagsEntity.java new file mode 100644 index 000000000..448ea339c --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenTagsEntity.java @@ -0,0 +1,311 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * タグ + */ +@DI(instance=Instance.Prototype) +public class GenTagsEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenTagsEntity get() { + return Container.getComp(GenTagsEntity.class); + } + + /** + * コンストラクタ + */ + public GenTagsEntity() { + super(); + } + + /** + * コンストラクタ + * @param tagId タグ_ID + */ + + public GenTagsEntity(Integer tagId) { + super(); + this.tagId = tagId; + } + /** タグ_ID */ + private Integer tagId; + /** タグ名称 */ + private String tagName; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * タグ_ID を取得する + */ + public Integer getTagId() { + return this.tagId; + } + /** + * タグ_ID を設定する + * @param tagId タグ_ID + */ + public GenTagsEntity setTagId(Integer tagId) { + this.tagId = tagId; + return this; + } + + /** + * タグ名称 を取得する + */ + public String getTagName() { + return this.tagName; + } + /** + * タグ名称 を設定する + * @param tagName タグ名称 + */ + public GenTagsEntity setTagName(String tagName) { + this.tagName = tagName; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenTagsEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenTagsEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenTagsEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenTagsEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenTagsEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[1]; + keyValues[0] = this.tagId; + return keyValues; + } + /** + * キーの値を設定 + * @param tagId タグ_ID + */ + public void setKeyValues(Integer tagId) { + this.tagId = tagId; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenTagsEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("tagId = ").append(tagId).append("\n"); + builder.append("tagName = ").append(tagName).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.tagId, convLabelName("Tag Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.tagName, convLabelName("Tag Name")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(this.tagName, convLabelName("Tag Name"), 128); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("tagId"), convLabelName("Tag Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("tagName"), convLabelName("Tag Name")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.MAX_LENGTH); + error = validator.validate(values.get("tagName"), convLabelName("Tag Name"), 128); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenViewHistoriesEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenViewHistoriesEntity.java new file mode 100644 index 000000000..85eadf6dc --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenViewHistoriesEntity.java @@ -0,0 +1,319 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * ナレッジの参照履歴 + */ +@DI(instance=Instance.Prototype) +public class GenViewHistoriesEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenViewHistoriesEntity get() { + return Container.getComp(GenViewHistoriesEntity.class); + } + + /** + * コンストラクタ + */ + public GenViewHistoriesEntity() { + super(); + } + + /** + * コンストラクタ + * @param historyNo HISTORY_NO + */ + + public GenViewHistoriesEntity(Long historyNo) { + super(); + this.historyNo = historyNo; + } + /** HISTORY_NO */ + private Long historyNo; + /** ナレッジID */ + private Long knowledgeId; + /** 日時 */ + private Timestamp viewDateTime; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * HISTORY_NO を取得する + */ + public Long getHistoryNo() { + return this.historyNo; + } + /** + * HISTORY_NO を設定する + * @param historyNo HISTORY_NO + */ + public GenViewHistoriesEntity setHistoryNo(Long historyNo) { + this.historyNo = historyNo; + return this; + } + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenViewHistoriesEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * 日時 を取得する + */ + public Timestamp getViewDateTime() { + return this.viewDateTime; + } + /** + * 日時 を設定する + * @param viewDateTime 日時 + */ + public GenViewHistoriesEntity setViewDateTime(Timestamp viewDateTime) { + this.viewDateTime = viewDateTime; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenViewHistoriesEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenViewHistoriesEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenViewHistoriesEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenViewHistoriesEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenViewHistoriesEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[1]; + keyValues[0] = this.historyNo; + return keyValues; + } + /** + * キーの値を設定 + * @param historyNo HISTORY_NO + */ + public void setKeyValues(Long historyNo) { + this.historyNo = historyNo; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenViewHistoriesEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("historyNo = ").append(historyNo).append("\n"); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("viewDateTime = ").append(viewDateTime).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.viewDateTime, convLabelName("View Date Time")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("viewDateTime"), convLabelName("View Date Time")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/entity/gen/GenVotesEntity.java b/src/main/java/redcomet/knowledge/entity/gen/GenVotesEntity.java new file mode 100644 index 000000000..c7469b00f --- /dev/null +++ b/src/main/java/redcomet/knowledge/entity/gen/GenVotesEntity.java @@ -0,0 +1,329 @@ +package redcomet.knowledge.entity.gen; + +import java.io.Serializable; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +import java.sql.Timestamp; + + + +import redcomet.common.bean.ValidateError; +import redcomet.common.validate.Validator; +import redcomet.common.validate.ValidatorFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; + +/** + * 投票 + */ +@DI(instance=Instance.Prototype) +public class GenVotesEntity implements Serializable { + + /** SerialVersion */ + private static final long serialVersionUID = 1L; + + /** + * インスタンス取得 + * AOPに対応 + * @return インスタンス + */ + public static GenVotesEntity get() { + return Container.getComp(GenVotesEntity.class); + } + + /** + * コンストラクタ + */ + public GenVotesEntity() { + super(); + } + + /** + * コンストラクタ + * @param voteNo VOTE_NO + */ + + public GenVotesEntity(Long voteNo) { + super(); + this.voteNo = voteNo; + } + /** VOTE_NO */ + private Long voteNo; + /** ナレッジID */ + private Long knowledgeId; + /** 投票区分 */ + private Integer voteKind; + /** 登録ユーザ */ + private Integer insertUser; + /** 登録日時 */ + private Timestamp insertDatetime; + /** 更新ユーザ */ + private Integer updateUser; + /** 更新日時 */ + private Timestamp updateDatetime; + /** 削除フラグ */ + private Integer deleteFlag; + + /** + * VOTE_NO を取得する + */ + public Long getVoteNo() { + return this.voteNo; + } + /** + * VOTE_NO を設定する + * @param voteNo VOTE_NO + */ + public GenVotesEntity setVoteNo(Long voteNo) { + this.voteNo = voteNo; + return this; + } + + /** + * ナレッジID を取得する + */ + public Long getKnowledgeId() { + return this.knowledgeId; + } + /** + * ナレッジID を設定する + * @param knowledgeId ナレッジID + */ + public GenVotesEntity setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + return this; + } + + /** + * 投票区分 を取得する + */ + public Integer getVoteKind() { + return this.voteKind; + } + /** + * 投票区分 を設定する + * @param voteKind 投票区分 + */ + public GenVotesEntity setVoteKind(Integer voteKind) { + this.voteKind = voteKind; + return this; + } + + /** + * 登録ユーザ を取得する + */ + public Integer getInsertUser() { + return this.insertUser; + } + /** + * 登録ユーザ を設定する + * @param insertUser 登録ユーザ + */ + public GenVotesEntity setInsertUser(Integer insertUser) { + this.insertUser = insertUser; + return this; + } + + /** + * 登録日時 を取得する + */ + public Timestamp getInsertDatetime() { + return this.insertDatetime; + } + /** + * 登録日時 を設定する + * @param insertDatetime 登録日時 + */ + public GenVotesEntity setInsertDatetime(Timestamp insertDatetime) { + this.insertDatetime = insertDatetime; + return this; + } + + /** + * 更新ユーザ を取得する + */ + public Integer getUpdateUser() { + return this.updateUser; + } + /** + * 更新ユーザ を設定する + * @param updateUser 更新ユーザ + */ + public GenVotesEntity setUpdateUser(Integer updateUser) { + this.updateUser = updateUser; + return this; + } + + /** + * 更新日時 を取得する + */ + public Timestamp getUpdateDatetime() { + return this.updateDatetime; + } + /** + * 更新日時 を設定する + * @param updateDatetime 更新日時 + */ + public GenVotesEntity setUpdateDatetime(Timestamp updateDatetime) { + this.updateDatetime = updateDatetime; + return this; + } + + /** + * 削除フラグ を取得する + */ + public Integer getDeleteFlag() { + return this.deleteFlag; + } + /** + * 削除フラグ を設定する + * @param deleteFlag 削除フラグ + */ + public GenVotesEntity setDeleteFlag(Integer deleteFlag) { + this.deleteFlag = deleteFlag; + return this; + } + + /** + * キーの値を取得 + */ + public Object[] getKeyValues() { + Object[] keyValues = new Object[1]; + keyValues[0] = this.voteNo; + return keyValues; + } + /** + * キーの値を設定 + * @param voteNo VOTE_NO + */ + public void setKeyValues(Long voteNo) { + this.voteNo = voteNo; + } + /** + * キーで比較 + */ + public boolean equalsOnKey(GenVotesEntity entity) { + Object[] keyValues1 = getKeyValues(); + Object[] keyValues2 = entity.getKeyValues(); + for (int i = 0; i < keyValues1.length; i++) { + Object val1 = keyValues1[i]; + Object val2 = keyValues2[i]; + if (val1 == null && val2 != null) { + return false; + } + if (val1 != null && val2 == null) { + return false; + } + if (val1 != null && val2 != null) { + if (!val1.equals(val2)) { + return false; + } + } + + } + return true; + } + /** + * ToString + */ + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("voteNo = ").append(voteNo).append("\n"); + builder.append("knowledgeId = ").append(knowledgeId).append("\n"); + builder.append("voteKind = ").append(voteKind).append("\n"); + builder.append("insertUser = ").append(insertUser).append("\n"); + builder.append("insertDatetime = ").append(insertDatetime).append("\n"); + builder.append("updateUser = ").append(updateUser).append("\n"); + builder.append("updateDatetime = ").append(updateDatetime).append("\n"); + builder.append("deleteFlag = ").append(deleteFlag).append("\n"); + return builder.toString(); + } + /** + * 表示用の名称を変換 + */ + protected String convLabelName(String label) { + return label; + } + /** + * validate + */ + public List validate() { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.knowledgeId, convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(this.voteKind, convLabelName("Vote Kind")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.voteKind, convLabelName("Vote Kind")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.insertUser, convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.updateUser, convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(this.deleteFlag, convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + /** + * validate + */ + public List validate(Map values) { + List errors = new ArrayList<>(); + Validator validator; + ValidateError error; + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("knowledgeId"), convLabelName("Knowledge Id")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.REQUIRED); + error = validator.validate(values.get("voteKind"), convLabelName("Vote Kind")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("voteKind"), convLabelName("Vote Kind")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("insertUser"), convLabelName("Insert User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("updateUser"), convLabelName("Update User")); + if (error != null) { + errors.add(error); + } + validator = ValidatorFactory.getInstance(Validator.INTEGER); + error = validator.validate(values.get("deleteFlag"), convLabelName("Delete Flag")); + if (error != null) { + errors.add(error); + } + return errors; + } + +} diff --git a/src/main/java/redcomet/knowledge/indexer/Indexer.java b/src/main/java/redcomet/knowledge/indexer/Indexer.java new file mode 100644 index 000000000..b7454895f --- /dev/null +++ b/src/main/java/redcomet/knowledge/indexer/Indexer.java @@ -0,0 +1,30 @@ +package redcomet.knowledge.indexer; + +import redcomet.di.DI; +import redcomet.knowledge.indexer.impl.LuceneIndexer; + + +@DI(impl=LuceneIndexer.class) +public interface Indexer { + + /** + * インデックス生成 + * @param indexingValue + * @throws Exception + */ + void writeIndex(IndexingValue indexingValue) throws Exception; + + /** + * インデックスから削除 + * @param entity + * @throws Exception + */ + void deleteItem(String id) throws Exception; + + /** + * ユーザが登録した内容を全て削除 + * @param creator + * @throws Exception + */ + public void deleteOnCreator(Integer creator) throws Exception; +} diff --git a/src/main/java/redcomet/knowledge/indexer/IndexingValue.java b/src/main/java/redcomet/knowledge/indexer/IndexingValue.java new file mode 100644 index 000000000..6c84c703a --- /dev/null +++ b/src/main/java/redcomet/knowledge/indexer/IndexingValue.java @@ -0,0 +1,198 @@ +package redcomet.knowledge.indexer; + +import java.util.ArrayList; +import java.util.List; + +import redcomet.common.util.StringUtils; + + +public class IndexingValue { + public static final int ID_ZEROPADDING_DIGIT = 8; + public static final String SEPARATE = " "; + + /** データのタイプ */ + private Integer type; + /** データの ID */ + private String id; + + /** コンテンツのタイトル */ + private String title; + /** コンテンツの文字列 */ + private String contents; + + /** ユーザの文字列 */ + private List users = new ArrayList(); + /** グループの文字列 */ + private List groups = new ArrayList(); + /** タグの文字列 */ + private List tags = new ArrayList(); + + /** 作成者 */ + private Integer creator; + /** 作成日時(ソート用) */ + private Long time; + + /** + * コンストラクタ + */ + public IndexingValue() { + super(); + } + + /** + * @return the type + */ + public void addUser(Integer user) { + users.add(user); + } + /** + * @return the type + */ + public void addGroup(Integer group) { + groups.add(group); + } + /** + * @return the type + */ + public void addTag(Integer tag) { + tags.add(tag); + } + + /** + * @return the users + */ + public String getUsers() { + StringBuilder builder = new StringBuilder(); + int count =0; + for (Integer integer : users) { + if (count > 0) { + builder.append(SEPARATE); + } + builder.append(StringUtils.zeroPadding(integer, ID_ZEROPADDING_DIGIT)); + count++; + } + return builder.toString(); + } + + /** + * @return the groups + */ + public String getGroups() { + StringBuilder builder = new StringBuilder(); + int count =0; + for (Integer integer : groups) { + if (count > 0) { + builder.append(SEPARATE); + } + builder.append(StringUtils.zeroPadding(integer, ID_ZEROPADDING_DIGIT)); + count++; + } + return builder.toString(); + } + + /** + * @return the tags + */ + public String getTags() { + StringBuilder builder = new StringBuilder(); + int count =0; + for (Integer integer : tags) { + if (count > 0) { + builder.append(SEPARATE); + } + builder.append(StringUtils.zeroPadding(integer, ID_ZEROPADDING_DIGIT)); + count++; + } + return builder.toString(); + } + + /** + * @return the creator + */ + public String getCreator() { + return StringUtils.zeroPadding(creator, ID_ZEROPADDING_DIGIT); + } + + + /** + * @param type the type to set + */ + public void setType(Integer type) { + this.type = type; + } + + /** + * @return the id + */ + public String getId() { + return id; + } + + /** + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * @return the contents + */ + public String getContents() { + return contents; + } + + /** + * @param contents the contents to set + */ + public void setContents(String contents) { + this.contents = contents; + } + + /** + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * @param title the title to set + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * @return the type + */ + public Integer getType() { + return type; + } + + + /** + * @param creator the creator to set + */ + public void setCreator(Integer creator) { + this.creator = creator; + } + + /** + * @return the time + */ + public Long getTime() { + return time; + } + + /** + * @param time the time to set + */ + public void setTime(Long time) { + this.time = time; + } + + + + +} diff --git a/src/main/java/redcomet/knowledge/indexer/impl/LuceneIndexer.java b/src/main/java/redcomet/knowledge/indexer/impl/LuceneIndexer.java new file mode 100644 index 000000000..62cbab477 --- /dev/null +++ b/src/main/java/redcomet/knowledge/indexer/impl/LuceneIndexer.java @@ -0,0 +1,181 @@ +package redcomet.knowledge.indexer.impl; + +import java.io.File; + +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.ja.JapaneseAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.IntField; +import org.apache.lucene.document.LongField; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.IndexWriterConfig.OpenMode; +import org.apache.lucene.index.Term; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; +import org.apache.lucene.util.Version; + +import redcomet.common.config.ConfigLoader; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.StringUtils; +import redcomet.knowledge.config.AppConfig; +import redcomet.knowledge.indexer.Indexer; +import redcomet.knowledge.indexer.IndexingValue; + +public class LuceneIndexer implements Indexer { + /** ログ */ + private static Log log = LogFactory.getLog(LuceneIndexer.class); + + public static final String FIELD_LABEL_TYPE = "type"; + public static final String FIELD_LABEL_ID = "id"; + public static final String FIELD_LABEL_TITLE = "title"; + public static final String FIELD_LABEL_CONTENTS = "contents"; + public static final String FIELD_LABEL_TAGS = "tags"; + public static final String FIELD_LABEL_USERS = "users"; + public static final String FIELD_LABEL_GROUPS = "groups"; + public static final String FIELD_LABEL_CREATE_USER = "creator"; + public static final String FIELD_LABEL_TIME = "time"; + +// private Analyzer analyzer = new SimpleAnalyzer(Version.LUCENE_4_10_2); + private Analyzer analyzer = new JapaneseAnalyzer(); + + private String getIndexPath() { + AppConfig appConfig = ConfigLoader.load(AppConfig.APP_CONFIG, AppConfig.class); + return appConfig.getIndexPath(); + } + + public void writeIndex(IndexingValue indexingValue) throws Exception { + boolean create = true; + File indexDir = new File(getIndexPath()); + if (!indexDir.exists()) { + indexDir.mkdirs(); + } else { + if (indexDir.list().length > 0) { + create = false; + } + } + Directory dir = FSDirectory.open(indexDir); + IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer); + if (create) { + iwc.setOpenMode(OpenMode.CREATE); + } else { + iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); + } + IndexWriter writer = null; + try { + writer = new IndexWriter(dir, iwc); + addDoc(writer, indexingValue); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + private void addDoc(IndexWriter writer, IndexingValue indexingValue) throws Exception { + Document doc = new Document(); + //type + Field typeField = new IntField(FIELD_LABEL_TYPE, indexingValue.getType(), Field.Store.YES); + doc.add(typeField); + //id + Field idField = new StringField(FIELD_LABEL_ID, indexingValue.getId(), Field.Store.YES); + doc.add(idField); + //タイトル + doc.add(new TextField(FIELD_LABEL_TITLE, indexingValue.getTitle(), Field.Store.YES)); + //内容 + doc.add(new TextField(FIELD_LABEL_CONTENTS, indexingValue.getContents(), Field.Store.YES)); + + //タグ + Field tagField = new TextField(FIELD_LABEL_TAGS, indexingValue.getTags(), Field.Store.YES); + doc.add(tagField); + //アクセスできるユーザ + Field userField = new TextField(FIELD_LABEL_USERS, indexingValue.getUsers().toString(), Field.Store.YES); + doc.add(userField); + //アクセスできるグループ + Field groupField = new TextField(FIELD_LABEL_GROUPS, indexingValue.getGroups().toString(), Field.Store.YES); + doc.add(groupField); + + // 登録者 + Field creatorField = new StringField(FIELD_LABEL_CREATE_USER, indexingValue.getCreator(), Field.Store.YES); + doc.add(creatorField); + + // 時刻 + Field timeField = new LongField(FIELD_LABEL_TIME, indexingValue.getTime(), Field.Store.YES); + doc.add(timeField); + + if (writer.getConfig().getOpenMode() == OpenMode.CREATE) { + log.info("adding " + indexingValue.getId()); + writer.addDocument(doc); + } else { + log.info("updating " + indexingValue.getId()); + writer.updateDocument(new Term(FIELD_LABEL_ID, indexingValue.getId()), doc); + } + } + + @Override + public void deleteItem(String id) throws Exception { + boolean create = true; + File indexDir = new File(getIndexPath()); + if (!indexDir.exists()) { + indexDir.mkdirs(); + } else { + if (indexDir.list().length > 0) { + create = false; + } + } + Directory dir = FSDirectory.open(indexDir); + IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer); + if (create) { + iwc.setOpenMode(OpenMode.CREATE); + } else { + iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); + } + IndexWriter writer = null; + try { + writer = new IndexWriter(dir, iwc); + writer.deleteDocuments(new Term(FIELD_LABEL_ID, id)); + writer.commit(); + + } finally { + if (writer != null) { + writer.close(); + } + } + } + + @Override + public void deleteOnCreator(Integer creator) throws Exception { + boolean create = true; + File indexDir = new File(getIndexPath()); + if (!indexDir.exists()) { + indexDir.mkdirs(); + } else { + if (indexDir.list().length > 0) { + create = false; + } + } + Directory dir = FSDirectory.open(indexDir); + IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer); + if (create) { + iwc.setOpenMode(OpenMode.CREATE); + } else { + iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); + } + IndexWriter writer = null; + try { + writer = new IndexWriter(dir, iwc); + writer.deleteDocuments(new Term(FIELD_LABEL_CREATE_USER, StringUtils.zeroPadding(creator, IndexingValue.ID_ZEROPADDING_DIGIT))); + writer.commit(); + } finally { + if (writer != null) { + writer.close(); + } + } + } + + +} diff --git a/src/main/java/redcomet/knowledge/listener/CronListener.java b/src/main/java/redcomet/knowledge/listener/CronListener.java new file mode 100644 index 000000000..7b6d970c0 --- /dev/null +++ b/src/main/java/redcomet/knowledge/listener/CronListener.java @@ -0,0 +1,84 @@ +package redcomet.knowledge.listener; + +import java.io.File; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import redcomet.common.bat.JavaJob; +import redcomet.common.bat.JobResult; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.knowledge.bat.FileParseBat; +import redcomet.knowledge.bat.KnowledgeFileClearBat; + +public class CronListener implements ServletContextListener { + + private static Log LOG = LogFactory.getLog(CronListener.class); + + private ScheduledThreadPoolExecutor service; + private ScheduledFuture fileClearfuture; + private ScheduledFuture parsefuture; + + @Override + public void contextInitialized(final ServletContextEvent sce) { + service = new ScheduledThreadPoolExecutor(1); + fileClearfuture = service.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + LOG.trace("called."); + + // Java を別のVMで実行(添付ファイルの定期的なクリア) + JavaJob job = new JavaJob(); + job.addjarDir(new File(sce.getServletContext().getRealPath("/WEB-INF/lib"))); + job.addClassPathDir(new File(sce.getServletContext().getRealPath("/WEB-INF/classes"))); + job.setMainClass(KnowledgeFileClearBat.class.getName()); + try { + JobResult result = job.execute(); + if (LOG.isDebugEnabled()) { + LOG.debug("finish KnowledgeFileClearBat [result]" + result.getResultCode()); + } + if (LOG.isTraceEnabled()) { + LOG.trace(result.getStdout()); + } + } catch (Exception e) { + LOG.error("添付ファイルの定期的なクリアに失敗しました", e); + } + } + }, 10, 60, TimeUnit.MINUTES); // 10分後に実行、60分毎に実行 + + parsefuture = service.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + LOG.trace("called."); + // Java を別のVMで実行(添付ファイルの中身を抽出し検索可能にする) + JavaJob job = new JavaJob(); + job.addjarDir(new File(sce.getServletContext().getRealPath("/WEB-INF/lib"))); + job.addClassPathDir(new File(sce.getServletContext().getRealPath("/WEB-INF/classes"))); + job.setMainClass(FileParseBat.class.getName()); + try { + JobResult result = job.execute(); + if (LOG.isDebugEnabled()) { + LOG.debug("finish FileParseBat [result]" + result.getResultCode()); + } + if (LOG.isTraceEnabled()) { + LOG.trace(result.getStdout()); + } + } catch (Exception e) { + LOG.error("添付ファイルのパースに失敗しました", e); + } + } + }, 10, 3, TimeUnit.MINUTES); // 10分後に実行、3分毎に実行 + } + + @Override + public void contextDestroyed(final ServletContextEvent sce) { + fileClearfuture.cancel(true); + parsefuture.cancel(true); + service.shutdown(); + } + +} diff --git a/src/main/java/redcomet/knowledge/logic/IndexLogic.java b/src/main/java/redcomet/knowledge/logic/IndexLogic.java new file mode 100644 index 000000000..6e1925b67 --- /dev/null +++ b/src/main/java/redcomet/knowledge/logic/IndexLogic.java @@ -0,0 +1,74 @@ +package redcomet.knowledge.logic; + +import java.util.List; + +import net.arnx.jsonic.JSON; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.di.Container; +import redcomet.knowledge.indexer.Indexer; +import redcomet.knowledge.indexer.IndexingValue; +import redcomet.knowledge.searcher.SearchResultValue; +import redcomet.knowledge.searcher.Searcher; +import redcomet.knowledge.searcher.SearchingValue; + +/** + * 全文検索インデックスを使った処理 + * @author Koda + * + */ +public class IndexLogic { + /** ログ */ + private static Log LOG = LogFactory.getLog(IndexLogic.class); + + public static IndexLogic get() { + return Container.getComp(IndexLogic.class); + } + + /** + * 全文検索エンジンへ登録 + * @param indexingValue + * @throws Exception + */ + public void save(IndexingValue indexingValue) throws Exception { + Indexer indexer = Container.getComp(Indexer.class); + indexer.writeIndex(indexingValue); + } + + /** + * 全文検索エンジンから検索 + * @param search + * @return + * @throws Exception + */ + public List search(SearchingValue search) throws Exception { + Searcher searcher = Container.getComp(Searcher.class); + List list = searcher.search(search); + if (LOG.isDebugEnabled()) { + LOG.debug(JSON.encode(list, true)); + } + return list; + } + + /** + * 全文検索エンジンから削除 + * @param knowledgeId + * @throws Exception + */ + public void delete(Long knowledgeId) throws Exception { + Indexer indexer = Container.getComp(Indexer.class); + indexer.deleteItem(String.valueOf(knowledgeId)); + } + + /** + * 全文検索エンジンから、ユーザが登録したナレッジを全て削除 + * @param loginUserId + * @throws Exception + */ + public void deleteOnUser(Integer loginUserId) throws Exception { + Indexer indexer = Container.getComp(Indexer.class); + indexer.deleteOnCreator(loginUserId); + } + + +} diff --git a/src/main/java/redcomet/knowledge/logic/KnowledgeLogic.java b/src/main/java/redcomet/knowledge/logic/KnowledgeLogic.java new file mode 100644 index 000000000..c36b94f61 --- /dev/null +++ b/src/main/java/redcomet/knowledge/logic/KnowledgeLogic.java @@ -0,0 +1,542 @@ +package redcomet.knowledge.logic; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import redcomet.aop.Aspect; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.PropertyUtil; +import redcomet.common.util.StringUtils; +import redcomet.di.Container; +import redcomet.knowledge.bat.FileParseBat; +import redcomet.knowledge.config.IndexType; +import redcomet.knowledge.dao.KnowledgeFilesDao; +import redcomet.knowledge.dao.KnowledgeTagsDao; +import redcomet.knowledge.dao.KnowledgeUsersDao; +import redcomet.knowledge.dao.KnowledgesDao; +import redcomet.knowledge.dao.LikesDao; +import redcomet.knowledge.dao.TagsDao; +import redcomet.knowledge.dao.ViewHistoriesDao; +import redcomet.knowledge.entity.KnowledgeFilesEntity; +import redcomet.knowledge.entity.KnowledgeTagsEntity; +import redcomet.knowledge.entity.KnowledgeUsersEntity; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.entity.LikesEntity; +import redcomet.knowledge.entity.TagsEntity; +import redcomet.knowledge.entity.ViewHistoriesEntity; +import redcomet.knowledge.indexer.IndexingValue; +import redcomet.knowledge.searcher.SearchResultValue; +import redcomet.knowledge.searcher.SearchingValue; +import redcomet.knowledge.searcher.impl.LuceneSearcher; +import redcomet.web.bean.LoginedUser; + +public class KnowledgeLogic { + /** ログ */ + private static Log LOG = LogFactory.getLog(KnowledgeLogic.class); + + public static final int ALL_USER = 0; + + public static final int PUBLIC_FLAG_PUBLIC = 0; + public static final int PUBLIC_FLAG_PRIVATE = 1; + public static final int PUBLIC_FLAG_SELECT_USERS = 2; + + public static final int TYPE_KNOWLEDGE = IndexType.Knoeledge.getValue(); + public static final int TYPE_FILE = IndexType.KnowledgeFile.getValue(); + + public static KnowledgeLogic get() { + return Container.getComp(KnowledgeLogic.class); + } + + private KnowledgesDao knowledgesDao = Container.getComp(KnowledgesDao.class); + private KnowledgeUsersDao knowledgeUsersDao = KnowledgeUsersDao.get(); + private TagsDao tagsDao = TagsDao.get(); + private KnowledgeTagsDao knowledgeTagsDao = KnowledgeTagsDao.get(); + private UploadedFileLogic fileLogic = UploadedFileLogic.get(); + + /** + * タグの文字列(カンマ区切り)から、登録済のタグであれば、それを取得し、 + * 存在しないものであれば、新たにタグを生成してタグの情報を取得 + * @param tags + * @return + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public List manegeTags(String tags) { + List tagList = new ArrayList<>(); + if (StringUtils.isEmpty(tags)) { + return tagList; + } + String[] splits; + if (tags.indexOf(",") != -1) { + splits = tags.split(","); + } else { + splits = new String[1]; + splits[0] = tags; + } + + for (String tag : splits) { + TagsEntity tagsEntity = tagsDao.selectOnTagName(tag); + if (tagsEntity == null) { + tagsEntity = new TagsEntity(); + tagsEntity.setTagName(tag); + tagsEntity = tagsDao.insert(tagsEntity); + LOG.debug("Tag added." + PropertyUtil.reflectionToString(tagsEntity)); + } + tagList.add(tagsEntity); + } + return tagList; + } + + /** + * ナレッジを登録 + * @param entity + * @param tags + * @param fileNos + * @param loginedUser + * @return + * @throws Exception + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity insert(KnowledgesEntity entity, List tags, List fileNos, LoginedUser loginedUser) throws Exception { + // ナレッジを登録 + entity = knowledgesDao.insert(entity); + // アクセス権を登録 + saveAccessUser(entity, loginedUser); + // タグを登録 + setTags(entity, tags); + + // 添付ファイルを更新(紐付けをセット) + fileLogic.setKnowledgeFiles(entity, fileNos, loginedUser); + + // 全文検索エンジンへ登録 + saveIndex(entity, tags, loginedUser); + return entity; + } + + /** + * ナレッジを更新 + * @param entity + * @param fileNos + * @param loginedUser + * @return + * @throws Exception + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public KnowledgesEntity update(KnowledgesEntity entity, List tags, List fileNos, LoginedUser loginedUser) throws Exception { + // ナレッッジを更新 + entity = knowledgesDao.update(entity); + // アクセス権を登録 + knowledgeUsersDao.deleteOnKnowledgeId(entity.getKnowledgeId()); + saveAccessUser(entity, loginedUser); + + // タグを登録 + knowledgeTagsDao.deleteOnKnowledgeId(entity.getKnowledgeId()); + setTags(entity, tags); + + // 添付ファイルを更新(紐付けをセット) + fileLogic.setKnowledgeFiles(entity, fileNos, loginedUser); + + // 全文検索エンジンへ登録 + saveIndex(entity, tags, loginedUser); + return entity; + } + + + + /** + * タグを登録 + * @param entity + * @param tags + */ + private void setTags(KnowledgesEntity entity, List tags) { + if (tags != null) { + for (TagsEntity tagsEntity : tags) { + KnowledgeTagsEntity knowledgeTagsEntity = new KnowledgeTagsEntity(entity.getKnowledgeId(), tagsEntity.getTagId()); + knowledgeTagsDao.insert(knowledgeTagsEntity); + } + } + } + + + /** + * アクセス権を登録 + * @param entity + * @param loginedUser + */ + private void saveAccessUser(KnowledgesEntity entity, LoginedUser loginedUser) { + // ナレッジにアクセス可能なユーザに、自分自身をセット + KnowledgeUsersEntity knowledgeUsersEntity = new KnowledgeUsersEntity(); + knowledgeUsersEntity.setKnowledgeId(entity.getKnowledgeId()); + knowledgeUsersEntity.setUserId(loginedUser.getLoginUser().getUserId()); + knowledgeUsersDao.insert(knowledgeUsersEntity); + if (entity.getPublicFlag() == null || PUBLIC_FLAG_PUBLIC == entity.getPublicFlag()) { + // 全て公開する情報 + knowledgeUsersEntity = new KnowledgeUsersEntity(); + knowledgeUsersEntity.setKnowledgeId(entity.getKnowledgeId()); + knowledgeUsersEntity.setUserId(ALL_USER); + knowledgeUsersDao.insert(knowledgeUsersEntity); + } + } + + /** + * 全文検索エンジンへ保存 + * @param entity + * @param tags + * @param loginedUser + * @throws Exception + */ + private void saveIndex(KnowledgesEntity entity, List tags, LoginedUser loginedUser) throws Exception { + IndexingValue indexingValue = new IndexingValue(); + indexingValue.setType(TYPE_KNOWLEDGE); + indexingValue.setId(String.valueOf(entity.getKnowledgeId())); + indexingValue.setTitle(entity.getTitle()); + indexingValue.setContents(entity.getContent()); + indexingValue.addUser(loginedUser.getLoginUser().getUserId()); + if (entity.getPublicFlag() == null || PUBLIC_FLAG_PUBLIC == entity.getPublicFlag()) { + indexingValue.addUser(ALL_USER); + } + if (tags != null) { + for (TagsEntity tagsEntity : tags) { + indexingValue.addTag(tagsEntity.getTagId()); + } + } + indexingValue.setCreator(loginedUser.getUserId()); + indexingValue.setTime(entity.getUpdateDatetime().getTime()); // 更新日時をセットするので、更新日時でソート + + IndexLogic.get().save(indexingValue); //全文検索のエンジンにも保存(DBに保存する意味ないかも) + } + + /** + * ナレッジの検索 + * @param keyword + * @param loginedUser + * @param offset + * @param limit + * @return + * @throws Exception + */ + public List searchKnowledge(String keyword, LoginedUser loginedUser, Integer offset, Integer limit) throws Exception { + SearchingValue searchingValue = new SearchingValue(); + searchingValue.setKeyword(keyword); + searchingValue.setOffset(offset); + searchingValue.setLimit(limit); + + if (loginedUser != null && loginedUser.isAdmin()) { + // 管理者の場合はユーザのアクセス権を考慮しない + if (StringUtils.isEmpty(keyword)) { + //キーワードが指定されていなければDBから直接取得 + // TODO 登録ユーザ名 + List list = knowledgesDao.selectKnowledge(offset, limit, loginedUser.getUserId()); + for (KnowledgesEntity entity : list) { + setTags(entity); + setLikeCount(entity); + } + return list; + } + } else { + searchingValue.addUser(ALL_USER); + Integer userId = null; + if (loginedUser != null) { + userId = loginedUser.getLoginUser().getUserId(); + searchingValue.addUser(userId); + } + } + if (LOG.isDebugEnabled()) { + LOG.debug("search params:" + PropertyUtil.reflectionToString(searchingValue)); + } + List list = IndexLogic.get().search(searchingValue); + + return getKnowledgeDatas(list); + } + + /** + * ナレッジをタグ指定で表示 + * @param keyword + * @param loginedUser + * @param offset + * @param limit + * @return + * @throws Exception + */ + public List showKnowledgeOnTag(String tag, LoginedUser loginedUser, Integer offset, Integer limit) throws Exception { + SearchingValue searchingValue = new SearchingValue(); + searchingValue.setOffset(offset); + searchingValue.setLimit(limit); + + if (loginedUser != null && loginedUser.isAdmin()) { + //管理者の場合、ユーザのアクセス権を考慮しない + + } else { + searchingValue.addUser(ALL_USER); + Integer userId = null; + if (loginedUser != null) { + userId = loginedUser.getLoginUser().getUserId(); + searchingValue.addUser(userId); + } + } + + if (StringUtils.isInteger(tag)) { + searchingValue.addTag(new Integer(tag)); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("search params:" + PropertyUtil.reflectionToString(searchingValue)); + } + List list = IndexLogic.get().search(searchingValue); + + return getKnowledgeDatas(list); + } + + /** + * 全文検索エンジンの結果を元に、DBからデータを取得し、 + * さらにアクセス権のチェックなどを行う + * @param list + * @return + */ + private List getKnowledgeDatas(List list) { + KnowledgeFilesDao filesDao = KnowledgeFilesDao.get(); + List knowledgeIds = new ArrayList(); +// List fileIds = new ArrayList<>(); + for (SearchResultValue searchResultValue : list) { + if (searchResultValue.getType() == TYPE_KNOWLEDGE) { + knowledgeIds.add(new Long(searchResultValue.getId())); +// } else if (searchResultValue.getType() == TYPE_FILE) { +// LOG.trace("FILE!!! " + searchResultValue.getId()); +// String id = searchResultValue.getId().substring(FileParseBat.ID_PREFIX.length()); +// fileIds.add(new Long(id)); + } + } + + List dbs = knowledgesDao.selectKnowledges(knowledgeIds); + Map map = new HashMap(); + for (KnowledgesEntity knowledgesEntity : dbs) { + map.put(knowledgesEntity.getKnowledgeId(), knowledgesEntity); + } + + List knowledges = new ArrayList<>(); + for (SearchResultValue searchResultValue : list) { + if (searchResultValue.getType() == TYPE_KNOWLEDGE) { + Long key = new Long(searchResultValue.getId()); + if (map.containsKey(key)) { + KnowledgesEntity entity = map.get(key); + if (StringUtils.isNotEmpty(searchResultValue.getHighlightedTitle())) { + entity.setTitle(searchResultValue.getHighlightedTitle()); + } + if (StringUtils.isNotEmpty(searchResultValue.getHighlightedContents())) { + entity.setContent(searchResultValue.getHighlightedContents()); + } else { + entity.setContent(org.apache.commons.lang.StringUtils.abbreviate(entity.getContent(), LuceneSearcher.CONTENTS_LIMIT_LENGTH)); + } + // タグを取得(1件づつ処理するのでパフォーマンス悪いかも?) + setTags(entity); + // いいねの回数 + setLikeCount(entity); + knowledges.add(entity); + } + } else if (searchResultValue.getType() == TYPE_FILE) { + // TODO 1件づつ処理しているので、パフォーマンスが悪いので後で処理を検討 + String id = searchResultValue.getId().substring(FileParseBat.ID_PREFIX.length()); + Long fileNo = new Long(id); + KnowledgeFilesEntity filesEntity = filesDao.selectOnKeyWithoutBinary(fileNo); + if (filesEntity.getKnowledgeId() != null) { + KnowledgesEntity entity = knowledgesDao.selectOnKeyWithUserName(filesEntity.getKnowledgeId()); + entity.setTitle(entity.getTitle()); + + StringBuilder builder = new StringBuilder(); + builder.append("[添付]"); + + if (StringUtils.isNotEmpty(searchResultValue.getHighlightedTitle())) { + builder.append(searchResultValue.getHighlightedTitle()); + } else { + builder.append(filesEntity.getFileName()); + } + builder.append("
"); + if (StringUtils.isNotEmpty(searchResultValue.getHighlightedContents())) { + builder.append(searchResultValue.getHighlightedContents()); + } + entity.setContent(builder.toString()); + // タグを取得(1件づつ処理するのでパフォーマンス悪いかも?) + setTags(entity); + // いいねの回数 + setLikeCount(entity); + knowledges.add(entity); + } + } + } + return knowledges; + } + + private void setLikeCount(KnowledgesEntity entity) { + LikesDao likesDao = LikesDao.get(); + Long count = likesDao.countOnKnowledgeId(entity.getKnowledgeId()); + entity.setLikeCount(count); + } + + /** + * ナレッジを取得 + * @param knowledgeId + * @param loginedUser + * @return + */ + public KnowledgesEntity select(Long knowledgeId, LoginedUser loginedUser) { + KnowledgesDao dao = Container.getComp(KnowledgesDao.class); + KnowledgesEntity entity = dao.selectOnKeyWithUserName(knowledgeId); + if (entity == null) { + return entity; + } + //タグをセット + setTags(entity); + + if (entity.getPublicFlag() == null || entity.getPublicFlag().intValue() == PUBLIC_FLAG_PUBLIC) { + return entity; + } + Integer userId = Integer.MIN_VALUE; + if (loginedUser != null) { + userId = loginedUser.getLoginUser().getUserId(); + } + if (entity.getInsertUser().intValue() == userId.intValue()) { + // 作成者ならば、アクセス可能 + return entity; + } + if (loginedUser != null && loginedUser.isAdmin()) { + // 管理者は全ての情報にアクセス可能 + return entity; + } + + List usersEntities = knowledgeUsersDao.selectOnKnowledgeId(entity.getKnowledgeId()); + for (KnowledgeUsersEntity knowledgeUsersEntity : usersEntities) { + if (knowledgeUsersEntity.getUserId().intValue() == userId.intValue()) { + // アクセス権限が登録されていれば、取得 + return entity; + } + } + return null; + } + + /** + * ナレッジのタグをセット + * @param entity + */ + private void setTags(KnowledgesEntity entity) { + //タグを取得 + List tagsEntities = tagsDao.selectOnKnowledgeId(entity.getKnowledgeId()); + int count = 0; + StringBuilder builder = new StringBuilder(); + for (TagsEntity tagsEntity : tagsEntities) { + if (count > 0) { + builder.append(","); + } + builder.append(tagsEntity.getTagName()); + count++; + } + entity.setTags(builder.toString()); + } + + /** + * ナレッジを取得 + * @param ids + * @param loginedUser + * @return + */ + public List getKnowledges(List ids, LoginedUser loginedUser) { + List knowledgeIds = new ArrayList<>(); + for (String string : ids) { + if (StringUtils.isLong(string)) { + knowledgeIds.add(new Long(string)); + } + } + + //List knowledgesEntities = knowledgesDao.selectKnowledges(knowledgeIds); + //アクセス権を考慮して取得 + List knowledgesEntities = new ArrayList<>(); + for (Long integer : knowledgeIds) { + KnowledgesEntity entity = select(integer, loginedUser); + if (entity != null) { + knowledgesEntities.add(entity); + } + } + return knowledgesEntities; + } + + /** + * ナレッジを削除 + * @param knowledgeId + * @param loginedUser + * @throws Exception + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void delete(Long knowledgeId, LoginedUser loginedUser) throws Exception { + //ナレッジ削除(通常のdeleteは、論理削除になる → 管理者は見える) + knowledgesDao.delete(knowledgeId); + + // アクセス権削除 + knowledgeUsersDao.deleteOnKnowledgeId(knowledgeId); + // タグを削除 + knowledgeTagsDao.deleteOnKnowledgeId(knowledgeId); + + // 添付ファイルを削除 + fileLogic.deleteOnKnowledgeId(knowledgeId); + + //全文検索エンジンから削除 + IndexLogic indexLogic = IndexLogic.get(); + indexLogic.delete(knowledgeId); + } + + /** + * ユーザのナレッジを削除 + * TODO ものすごく多くのナレッジを登録したユーザの場合、それを全て削除するのは時間がかかるかも? + * ただ、非同期で実施して、「そのうち消えます」と表示するのも気持ち悪いと感じられるので、 + * いったん同期処理で1件づつ消す(効率的な消し方を検討する) + * @param loginUserId + * @throws Exception + */ + public void deleteOnUser(Integer loginUserId) throws Exception { + // ユーザのナレッジを取得 + List knowledgeIds = knowledgesDao.selectOnUser(loginUserId); + for (Long knowledgeId : knowledgeIds) { + LOG.warn(knowledgeId); + // アクセス権削除 + knowledgeUsersDao.deleteOnKnowledgeId(knowledgeId); + // タグを削除 + knowledgeTagsDao.deleteOnKnowledgeId(knowledgeId); + } + // ユーザが登録したナレッジを削除 + knowledgesDao.deleteOnUser(loginUserId); + + //全文検索エンジンから削除 + IndexLogic indexLogic = IndexLogic.get(); + indexLogic.deleteOnUser(loginUserId); + + } + + /** + * 閲覧履歴を保持 + * @param knowledgeId + * @param loginedUser + */ + public void addViewHistory(Long knowledgeId, LoginedUser loginedUser) { + ViewHistoriesDao historiesDao = ViewHistoriesDao.get(); + ViewHistoriesEntity historiesEntity = new ViewHistoriesEntity(); + historiesEntity.setKnowledgeId(knowledgeId); + historiesEntity.setViewDateTime(new Timestamp(new Date().getTime())); + if (loginedUser != null) { + historiesEntity.setInsertUser(loginedUser.getUserId()); + } + historiesDao.insert(historiesEntity); + } + + public Long addLike(Long knowledgeId, LoginedUser loginedUser) { + LikesDao likesDao = LikesDao.get(); + LikesEntity likesEntity = new LikesEntity(); + likesEntity.setKnowledgeId(knowledgeId); + likesDao.insert(likesEntity); + + Long count = likesDao.countOnKnowledgeId(knowledgeId); + return count; + } + +} diff --git a/src/main/java/redcomet/knowledge/logic/TagLogic.java b/src/main/java/redcomet/knowledge/logic/TagLogic.java new file mode 100644 index 000000000..2a4b0ce16 --- /dev/null +++ b/src/main/java/redcomet/knowledge/logic/TagLogic.java @@ -0,0 +1,43 @@ +package redcomet.knowledge.logic; + +import java.util.List; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.di.Container; +import redcomet.knowledge.dao.TagsDao; +import redcomet.knowledge.entity.TagsEntity; +import redcomet.web.bean.LoginedUser; + +public class TagLogic { + /** ログ */ + private static Log LOG = LogFactory.getLog(TagLogic.class); + + public static TagLogic get() { + return Container.getComp(TagLogic.class); + } + + private TagsDao tagsDao = TagsDao.get(); + + /** + * タグの一覧を取得 + * 同時に、ナレッジの件数も取得する + * 件数は、ログインユーザがアクセス権があるもの + * @param loginedUser + * @param i + * @param pageLimit + * @return + */ + public List selectTagsWithCount(LoginedUser loginedUser, int offset, int limit) { + int userid = Integer.MIN_VALUE; + if (loginedUser != null) { + userid = loginedUser.getUserId(); + } + return tagsDao.selectTagsWithCountOnUser(userid, offset, limit); + } + + + + + +} diff --git a/src/main/java/redcomet/knowledge/logic/UploadedFileLogic.java b/src/main/java/redcomet/knowledge/logic/UploadedFileLogic.java new file mode 100644 index 000000000..ba89f24de --- /dev/null +++ b/src/main/java/redcomet/knowledge/logic/UploadedFileLogic.java @@ -0,0 +1,213 @@ +package redcomet.knowledge.logic; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.fileupload.FileItem; + +import redcomet.aop.Aspect; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.di.Container; +import redcomet.knowledge.dao.KnowledgeFilesDao; +import redcomet.knowledge.entity.KnowledgeFilesEntity; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.vo.UploadFile; +import redcomet.web.bean.LoginedUser; + +public class UploadedFileLogic { + /** ログ */ + private static Log LOG = LogFactory.getLog(UploadedFileLogic.class); + + private KnowledgeFilesDao filesDao = KnowledgeFilesDao.get(); + + public static UploadedFileLogic get() { + return Container.getComp(UploadedFileLogic.class); + } + + /** + * ファイルを保存する + * @param fileItem + * @param loginedUser + * @param context + * @return + * @throws IOException + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public UploadFile saveFile(FileItem fileItem, LoginedUser loginedUser, String context) throws IOException { + LOG.trace("saveFile()"); + KnowledgeFilesEntity entity = new KnowledgeFilesEntity(); + entity.setFileName(fileItem.getName()); + entity.setFileSize(new Double(fileItem.getSize())); + entity.setFileBinary(fileItem.getInputStream()); + entity.setParseStatus(0); + entity = filesDao.insert(entity); + UploadFile file = convUploadFile(context, entity); + //処理が完了したら、テンポラリのファイルを削除 + fileItem.delete(); + return file; + } + + /** + * KnowledgeFilesEntity の情報から、画面に戻す UploadFile の情報を生成する + * @param context + * @param entity + * @return + */ + private UploadFile convUploadFile(String context, KnowledgeFilesEntity entity) { + UploadFile file = new UploadFile(); + file.setFileNo(entity.getFileNo()); + file.setUrl(context + "/open.file/download?fileNo=" + entity.getFileNo()); + //file.setThumbnailUrl(context + "/open.file/thumbnai?fileNo=" + entity.getFileNo()); + file.setThumbnailUrl(context + "/bower/teambox.free-file-icons/32px/_blank.png"); + file.setName(entity.getFileName()); + file.setType("-"); + file.setSize(entity.getFileSize()); + file.setDeleteUrl(context + "/protect.file/delete?fileNo=" + entity.getFileNo()); + file.setDeleteType("DELETE"); + if (entity.getKnowledgeId() != null && 0 != entity.getKnowledgeId().longValue()) { + file.setKnowlegeId(entity.getKnowledgeId()); + } + return file; + } + + + + /** + * ナレッジに紐付く添付ファイルの情報を更新 + * + * 1. 現在のナレッジに紐づくファイルを一覧取得する + * 2. 紐づけるファイルの番号のファイルが存在しない場合、ファイル番号でファイル情報を取得 + * 2-1. 取得したファイル情報に、ナレッジ番号をセットし更新 + * 3. 1で取得したファイル一覧から、処理済(紐付け済)ファイル番号を削除する + * 4. 1で取得したファイルの一覧で、残っているものがあれば、そのファイルは削除(紐付けがきれている) + * + * @param entity + * @param fileNos + * @param loginedUser + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void setKnowledgeFiles(KnowledgesEntity knowledgesEntity, List fileNos, LoginedUser loginedUser) { + // 現在、すでに紐づいている添付ファイルを取得 + List filesEntities = filesDao.selectOnKnowledgeId(knowledgesEntity.getKnowledgeId()); + Map filemap = new HashMap<>(); + for (KnowledgeFilesEntity entity : filesEntities) { + filemap.put(entity.getFileNo(), entity); + } + + // 画面で設定されている添付ファイルの番号で紐付けを作成 + for (Long fileNo : fileNos) { + KnowledgeFilesEntity entity = filesDao.selectOnKeyWithoutBinary(fileNo); + if (entity != null) { + if (entity.getKnowledgeId() == null || 0 == entity.getKnowledgeId().longValue()) { + filesDao.connectKnowledge(fileNo, knowledgesEntity.getKnowledgeId(), loginedUser); + } + } + filemap.remove(fileNo); + } + + // 始めに取得した一覧で、紐付けが作成されなかった(=紐付けが切れた)ファイルを削除 + Iterator iterator = filemap.keySet().iterator(); + while (iterator.hasNext()) { + Long fileNo = (Long) iterator.next(); + //filesDao.delete(fileNo); + filesDao.physicalDelete(fileNo); // バイナリは大きいので、物理削除する + + // TODO 全文検索エンジンから情報を削除 + + } + } + + + /** + * ファイルを削除する + * @param fileNo + * @param loginedUser + */ + public void removeFile(Long fileNo, LoginedUser loginedUser) { + // DBのデータを削除 + filesDao.physicalDelete(fileNo); // バイナリは大きいので、物理削除する + + // TODO 全文検索エンジンから情報を削除 + } + + /** + * 指定のナレッジに紐づく添付ファイルの情報を取得 + * @param knowledgeId + * @param context + * @return + */ + public List selectOnKnowledgeId(Long knowledgeId, String context) { + List files = new ArrayList(); + List filesEntities = filesDao.selectOnKnowledgeId(knowledgeId); + for (KnowledgeFilesEntity entity : filesEntities) { + files.add(convUploadFile(context, entity)); + } + return files; + } + + + /** + * 指定の添付ファイル番号の情報を取得 + * @param fileNos + * @param context + * @return + */ + public List selectOnFileNos(List fileNos, String context) { + List files = new ArrayList(); + for (Long fileNo : fileNos) { + KnowledgeFilesEntity entity = filesDao.selectOnKeyWithoutBinary(fileNo); + files.add(convUploadFile(context, entity)); + } + return files; + } + + /** + * ナレッジを削除する際に、添付ファイルを削除 + * @param knowledgeId + */ + public void deleteOnKnowledgeId(Long knowledgeId) { + List filesEntities = filesDao.selectOnKnowledgeId(knowledgeId); + for (KnowledgeFilesEntity entity : filesEntities) { + filesDao.physicalDelete(entity.getFileNo()); + //TODO 全文検索エンジンからも情報を削除 + + } + } + + + /** + * ダウンロードする添付ファイルを取得 + * (取得して良い権限が無い場合はNULLを返す) + * @param fileNo + * @param loginedUser + * @return + */ + public KnowledgeFilesEntity getFile(Long fileNo, LoginedUser loginedUser) { + KnowledgeFilesEntity entity = filesDao.selectOnKeyWithoutBinary(fileNo); + if (entity == null) { + return null; + } + if (entity.getKnowledgeId() != null && 0 != entity.getKnowledgeId().longValue()) { + // ナレッジに紐づいている場合、そのナレッジにアクセスできれば添付ファイルにアクセス可能 + KnowledgeLogic knowledgeLogic = KnowledgeLogic.get(); + if (knowledgeLogic.select(entity.getKnowledgeId(), loginedUser) == null) { + return null; + } + } else { + // ナレッジに紐づいていない場合、登録者のみがアクセス可能 + if (loginedUser == null) { + return null; + } + if (entity.getInsertUser().intValue() != loginedUser.getUserId().intValue()) { + return null; + } + } + return filesDao.selectOnKey(fileNo); + } + +} diff --git a/src/main/java/redcomet/knowledge/logic/UserLogic.java b/src/main/java/redcomet/knowledge/logic/UserLogic.java new file mode 100644 index 000000000..72da50c4f --- /dev/null +++ b/src/main/java/redcomet/knowledge/logic/UserLogic.java @@ -0,0 +1,135 @@ +package redcomet.knowledge.logic; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import redcomet.aop.Aspect; +import redcomet.common.config.INT_FLAG; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.RandomUtil; +import redcomet.di.Container; +import redcomet.web.bean.LoginedUser; +import redcomet.web.dao.RolesDao; +import redcomet.web.dao.UserRolesDao; +import redcomet.web.dao.UsersDao; +import redcomet.web.entity.RolesEntity; +import redcomet.web.entity.UserRolesEntity; +import redcomet.web.entity.UsersEntity; + +public class UserLogic { + /** ログ */ + private static Log LOG = LogFactory.getLog(UserLogic.class); + + private UsersDao usersDao = UsersDao.get(); + private RolesDao rolesDao = RolesDao.get(); + private UserRolesDao userRolesDao = UserRolesDao.get(); + + public static UserLogic get() { + return Container.getComp(UserLogic.class); + } + + /** + * ユーザを新規登録 + * @param user + * @param roles + * @param loginedUser + * @return + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public UsersEntity insert(UsersEntity user, String[] roles, LoginedUser loginedUser) { + LOG.trace("insert"); + + user.setEncrypted(false); + user = usersDao.insert(user); + user.setPassword(""); + + // ロールをセット + insertRoles(user, roles, loginedUser); + + return user; + } + + /** + * ユーザ情報更新 + * @param user + * @param roles + * @param loginedUser + * @return + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public UsersEntity update(UsersEntity user, String[] roles, LoginedUser loginedUser) { + LOG.trace("update"); + + user = usersDao.update(user); + user.setPassword(""); + + // ロールをセット + insertRoles(user, roles, loginedUser); + + return user; + } + + /** + * ユーザのロールを登録 + * (デリートインサート + * @param user + * @param roles 設定されているID + * @param loginedUser + */ + private void insertRoles(UsersEntity user, String[] roles, LoginedUser loginedUser) { + LOG.info(roles); + + + // ユーザに紐づくロールを削除 + userRolesDao.deleteOnUser(user.getUserId()); + + // システムに登録されているロールを全て取得 + RolesDao rolesDao = RolesDao.get(); + List rolesEntities = rolesDao.selectAll(); + Map map = new HashMap(); + for (RolesEntity role : rolesEntities) { + map.put(role.getRoleKey(), role); + } + + // ユーザのロールを登録 + if (roles != null) { + for (String role : roles) { + RolesEntity entity = map.get(role); + if (entity != null) { + UserRolesEntity userRolesEntity = new UserRolesEntity(entity.getRoleId(), user.getUserId()); + userRolesDao.insert(userRolesEntity); + } + } + } + } + + /** + * 退会 + * @param loginUserId + * @param knowledgeRemove + * @throws Exception + */ + @Aspect(advice=redcomet.ormapping.transaction.Transaction.class) + public void withdrawal(Integer loginUserId, boolean knowledgeRemove) throws Exception { + // アカウント削除 + UsersDao usersDao = UsersDao.get(); + UsersEntity user = usersDao.selectOnKey(loginUserId); + if (user != null) { + user.setPassword(RandomUtil.randamGen(32)); + user.setUserKey(RandomUtil.randamGen(32)); + user.setUserName("削除済ユーザー"); + user.setDeleteFlag(INT_FLAG.ON.getValue()); + usersDao.update(user); + usersDao.delete(loginUserId); + } + + if (knowledgeRemove) { + // ナレッジを削除 + KnowledgeLogic.get().deleteOnUser(loginUserId); + } + } + + +} diff --git a/src/main/java/redcomet/knowledge/parser/Parser.java b/src/main/java/redcomet/knowledge/parser/Parser.java new file mode 100755 index 000000000..8c6e40ae0 --- /dev/null +++ b/src/main/java/redcomet/knowledge/parser/Parser.java @@ -0,0 +1,18 @@ +package redcomet.knowledge.parser; + +import java.io.File; + +import redcomet.knowledge.vo.ParseResult; + +public interface Parser { + + /** + * 指定のファイルをパースし中身を取得する + * @param path + * @return + * @throws Exception + */ + ParseResult parse(File tmp) throws Exception; + + +} diff --git a/src/main/java/redcomet/knowledge/parser/ParserFactory.java b/src/main/java/redcomet/knowledge/parser/ParserFactory.java new file mode 100755 index 000000000..51c579204 --- /dev/null +++ b/src/main/java/redcomet/knowledge/parser/ParserFactory.java @@ -0,0 +1,70 @@ +package redcomet.knowledge.parser; + +import java.io.IOException; + +import redcomet.common.util.StringUtils; +import redcomet.di.Container; +import redcomet.knowledge.config.FileType; +import redcomet.knowledge.parser.impl.TikaParser; + +public final class ParserFactory { + + private ParserFactory() {} + + public static Parser getParser(String filePath) throws IOException { +// String mime = Files.probeContentType(Paths.get(filePath)); +// FileType fileType = getFileType(mime, filePath); +// if (fileType == FileType.NotCovered) { +// return null; +// } +// if (fileType == FileType.Text) { +// return TextParser.get(); +// } else if (fileType == FileType.HTML) { +// return TextParser.get(); +// } else if (fileType == FileType.Java) { +// return TextParser.get(); +// } + + //いったん全て、Tikaでパースする + return Container.getComp(TikaParser.class); + } + + + public static FileType getFileType(String mime, String path) { + if (mime != null) { + switch (mime) { + case "text/plain": + return FileType.Text; + + case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": + case "application/vnd.ms-excel": + return FileType.Excel; + + case "application/vnd.openxmlformats-officedocument.wordprocessingml.document": + case "application/msword": + return FileType.Word; + + case "application/vnd.openxmlformats-officedocument.presentationml.presentation": + case "application/vnd.ms-powerpoint": + return FileType.PowerPoint; + + case "application/pdf": + return FileType.PDF; + + case "text/html": + return FileType.HTML; + + default: + break; + } + } else { + String extention = StringUtils.getExtension(path); + if (extention != null && extention.equals(".java")) { + return FileType.Java; + } + } + return FileType.NotCovered; + } + + +} diff --git a/src/main/java/redcomet/knowledge/parser/impl/TextParser.java b/src/main/java/redcomet/knowledge/parser/impl/TextParser.java new file mode 100755 index 000000000..8d4388c57 --- /dev/null +++ b/src/main/java/redcomet/knowledge/parser/impl/TextParser.java @@ -0,0 +1,127 @@ +package redcomet.knowledge.parser.impl; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.mozilla.universalchardet.UniversalDetector; + +import redcomet.common.util.StringUtils; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.parser.Parser; +import redcomet.knowledge.vo.ParseResult; +import redcomet.knowledge.vo.Sentence; + +/** + * テキストファイル用のクローラー + * + * + */ +@DI(instance=Instance.Prototype) +public class TextParser implements Parser { + /** ログ */ + private static final Log LOG = LogFactory.getLog(TextParser.class); + + public static TextParser get() { + return Container.getComp(TextParser.class); + } + + public List parse(File file, String encode) throws Exception { + BufferedReader reader = null; + List sentenceInFileVos = new ArrayList(); + try { + if (StringUtils.isEmpty(encode)) { + // 文字コードの判定 + encode = this.getEncoding(file); + } + + reader = new BufferedReader( + new InputStreamReader( + new FileInputStream(file), encode)); + String line; + int count = 1; + // 読み込みデータがなくなるまで、読み込み + while ((line = reader.readLine()) != null) { + Sentence sentence = new Sentence(); + sentence.setPlace(count + " 行目"); + sentence.setSentence(line); + sentenceInFileVos.add(sentence); + count++; + } + } finally { + if (reader != null) { + reader.close(); + } + } + return sentenceInFileVos; + } + + + /** + * テキストの文字コードを判定する + * 判定にはjuniversalchardet-1.0.3.jarを用いている + * + * @param file + * @return + * @throws IOException + */ + private String getEncoding(File file) throws IOException { + byte[] buf = new byte[4096]; + FileInputStream fis = null; + UniversalDetector detector = null; + try { + fis = new FileInputStream(file); + detector = new UniversalDetector(null); + int nread; + while ((nread = fis.read(buf)) > 0 && !detector.isDone()) { + detector.handleData(buf, 0, nread); + } + detector.dataEnd(); + + String encoding = detector.getDetectedCharset(); + if (encoding != null) { + LOG.debug("Detected encoding = " + encoding); + } else { + LOG.warn("No encoding detected. set default UTF-8"); + encoding = "UTF-8"; + } + return encoding; + } finally { + if (detector != null) { + detector.reset(); + } + if (fis != null) { + fis.close(); + } + + } + + } + + + + @Override + public ParseResult parse(File file) throws Exception { + String encode = this.getEncoding(file); + List sentences = parse(file, encode); + + ParseResult parseResult = new ParseResult(); + parseResult.setSentences(sentences); + + StringBuilder builder = new StringBuilder(); + for (Sentence sentence : sentences) { + builder.append(sentence.getSentence()); + } + parseResult.setText(builder.toString()); + return parseResult; + } + +} diff --git a/src/main/java/redcomet/knowledge/parser/impl/TikaParser.java b/src/main/java/redcomet/knowledge/parser/impl/TikaParser.java new file mode 100755 index 000000000..2c8a9c163 --- /dev/null +++ b/src/main/java/redcomet/knowledge/parser/impl/TikaParser.java @@ -0,0 +1,92 @@ +package redcomet.knowledge.parser.impl; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.tika.metadata.Metadata; +import org.apache.tika.parser.AutoDetectParser; +import org.apache.tika.parser.ParseContext; +import org.apache.tika.parser.ParsingReader; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.di.Container; +import redcomet.di.DI; +import redcomet.di.Instance; +import redcomet.knowledge.parser.Parser; +import redcomet.knowledge.vo.ParseResult; + +@DI(instance=Instance.Prototype) +public class TikaParser implements Parser { + /** ログ */ + private static Log log = LogFactory.getLog(TikaParser.class); + + public static TikaParser get() { + return Container.getComp(TikaParser.class); + } + + + public String read(File file) throws Exception { + StringBuilder builder = new StringBuilder(); + BufferedReader reader = null; + try { + reader = getReader(file.toPath()); + String line; + while ((line = reader.readLine()) != null) { + if (line.trim().length() > 0) { + builder.append(line).append("\n"); + } + } + } catch (Exception e) { +// //読み込めない場合は、catchして読み込み終了(エラーにしない) + StringBuilder msg = new StringBuilder(); + msg.append("read error. skip read.\n"); + msg.append("\t[Path] ").append(file.getAbsolutePath()).append("\n"); + msg.append("\t[Exception] ").append(e.getClass().getName()).append("\n"); + msg.append("\t[Message] ").append(e.getMessage()).append("\n"); + log.warn (msg.toString()); + throw e; + } finally { + if (reader != null) { + reader.close(); + } + } + return builder.toString(); + } + + + + + public BufferedReader getReader(Path path) throws Exception { + AutoDetectParser parser = new AutoDetectParser(); + ParseContext context = new ParseContext(); + Metadata metadata = new Metadata(); + metadata.set(Metadata.RESOURCE_NAME_KEY, path.getFileName().toString()); + InputStream inputStream = Files.newInputStream(path); + BufferedReader reader = null; + reader = new BufferedReader( + new ParsingReader( + parser, + inputStream, + metadata, + context + )); + return reader; + } + + + + + @Override + public ParseResult parse(File file) + throws Exception { + String text = read(file); + ParseResult parseResult = new ParseResult(); + parseResult.setText(text); + return parseResult; + } + +} diff --git a/src/main/java/redcomet/knowledge/searcher/SearchResultValue.java b/src/main/java/redcomet/knowledge/searcher/SearchResultValue.java new file mode 100644 index 000000000..274e370a8 --- /dev/null +++ b/src/main/java/redcomet/knowledge/searcher/SearchResultValue.java @@ -0,0 +1,110 @@ +package redcomet.knowledge.searcher; + + +public class SearchResultValue { + + /** データのタイプ */ + private Integer type; + /** データの ID */ + private String id; + + /** コンテンツのタイトル */ + private String title; + /** コンテンツの文字列 */ + private String contents; + /** スコア */ + private float score; + /** ハイライト(表示用文字) */ + private String highlightedTitle = null; + /** ハイライト(表示用文字) */ + private String highlightedContents = null; + + /** + * @return the type + */ + public Integer getType() { + return type; + } + /** + * @param type the type to set + */ + public void setType(Integer type) { + this.type = type; + } + /** + * @return the id + */ + public String getId() { + return id; + } + /** + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + /** + * @return the contents + */ + public String getContents() { + return contents; + } + /** + * @param contents the contents to set + */ + public void setContents(String contents) { + this.contents = contents; + } + /** + * @return the score + */ + public float getScore() { + return score; + } + /** + * @param score the score to set + */ + public void setScore(float score) { + this.score = score; + } + /** + * @return the highlightedTitle + */ + public String getHighlightedTitle() { + return highlightedTitle; + } + /** + * @param highlightedTitle the highlightedTitle to set + */ + public void setHighlightedTitle(String highlightedTitle) { + this.highlightedTitle = highlightedTitle; + } + /** + * @return the highlightedContents + */ + public String getHighlightedContents() { + return highlightedContents; + } + /** + * @param highlightedContents the highlightedContents to set + */ + public void setHighlightedContents(String highlightedContents) { + this.highlightedContents = highlightedContents; + } + /** + * @return the title + */ + public String getTitle() { + return title; + } + /** + * @param title the title to set + */ + public void setTitle(String title) { + this.title = title; + } + + + + +} diff --git a/src/main/java/redcomet/knowledge/searcher/Searcher.java b/src/main/java/redcomet/knowledge/searcher/Searcher.java new file mode 100644 index 000000000..f6673fbde --- /dev/null +++ b/src/main/java/redcomet/knowledge/searcher/Searcher.java @@ -0,0 +1,19 @@ +package redcomet.knowledge.searcher; + +import java.util.List; + +import redcomet.di.DI; +import redcomet.knowledge.searcher.impl.LuceneSearcher; + +@DI(impl=LuceneSearcher.class) +public interface Searcher { + + /** + * 検索 + * @param value + * @return + * @throws Exception + */ + List search(SearchingValue value) throws Exception; + +} diff --git a/src/main/java/redcomet/knowledge/searcher/SearchingValue.java b/src/main/java/redcomet/knowledge/searcher/SearchingValue.java new file mode 100644 index 000000000..5a386a712 --- /dev/null +++ b/src/main/java/redcomet/knowledge/searcher/SearchingValue.java @@ -0,0 +1,172 @@ +package redcomet.knowledge.searcher; + +import java.util.ArrayList; +import java.util.List; + +import redcomet.common.util.StringUtils; +import redcomet.knowledge.control.open.KnowledgeControl; +import redcomet.knowledge.indexer.IndexingValue; + +public class SearchingValue { + public static final int ID_ZEROPADDING_DIGIT = IndexingValue.ID_ZEROPADDING_DIGIT; + public static final String SEPARATE = IndexingValue.SEPARATE; + + public static final int LIMIT = KnowledgeControl.PAGE_LIMIT; + + /** データのタイプ */ + private Integer type; + + /** コンテンツの文字列 */ + private String keyword; + + /** ユーザの文字列 */ + private List users = new ArrayList(); + /** グループの文字列 */ + private List groups = new ArrayList(); + /** タグの文字列 */ + private List tags = new ArrayList(); + + /** 読み出し開始 */ + private int offset; + /** 読み出し件数 */ + private int limit = LIMIT; + + /** + * コンストラクタ + */ + public SearchingValue() { + super(); + } + + /** + * @return the type + */ + public void addUser(Integer user) { + users.add(user); + } + /** + * @return the type + */ + public void addGroup(Integer group) { + groups.add(group); + } + /** + * @return the type + */ + public void addTag(Integer tag) { + tags.add(tag); + } + + /** + * @return the users + */ + public String getUsers() { + StringBuilder builder = new StringBuilder(); + int count =0; + for (Integer integer : users) { + if (count > 0) { + builder.append(SEPARATE); + } + builder.append(StringUtils.zeroPadding(integer, ID_ZEROPADDING_DIGIT)); + count++; + } + return builder.toString(); + } + + /** + * @return the groups + */ + public String getGroups() { + StringBuilder builder = new StringBuilder(); + int count =0; + for (Integer integer : groups) { + if (count > 0) { + builder.append(SEPARATE); + } + builder.append(StringUtils.zeroPadding(integer, ID_ZEROPADDING_DIGIT)); + count++; + } + return builder.toString(); + } + + /** + * @return the tags + */ + public String getTags() { + StringBuilder builder = new StringBuilder(); + int count =0; + for (Integer integer : tags) { + if (count > 0) { + builder.append(SEPARATE); + } + builder.append(StringUtils.zeroPadding(integer, ID_ZEROPADDING_DIGIT)); + count++; + } + return builder.toString(); + } + + + + /** + * @param type the type to set + */ + public void setType(Integer type) { + this.type = type; + } + + /** + * @return the keyword + */ + public String getKeyword() { + return keyword; + } + + /** + * @param keyword the keyword to set + */ + public void setKeyword(String keyword) { + this.keyword = keyword; + } + + /** + * @return the type + */ + public Integer getType() { + return type; + } + + /** + * @return the offset + */ + public int getOffset() { + return offset; + } + + /** + * @param offset the offset to set + */ + public void setOffset(int offset) { + this.offset = offset; + } + + /** + * @return the limit + */ + public int getLimit() { + return limit; + } + + /** + * @param limit the limit to set + */ + public void setLimit(int limit) { + this.limit = limit; + } + + + + + + + +} diff --git a/src/main/java/redcomet/knowledge/searcher/impl/LuceneSearcher.java b/src/main/java/redcomet/knowledge/searcher/impl/LuceneSearcher.java new file mode 100644 index 000000000..f5732097a --- /dev/null +++ b/src/main/java/redcomet/knowledge/searcher/impl/LuceneSearcher.java @@ -0,0 +1,201 @@ +package redcomet.knowledge.searcher.impl; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.ja.JapaneseAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.queryparser.classic.ParseException; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.queryparser.classic.QueryParser.Operator; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.Sort; +import org.apache.lucene.search.SortField; +import org.apache.lucene.search.TopDocsCollector; +import org.apache.lucene.search.TopFieldCollector; +import org.apache.lucene.search.TopScoreDocCollector; +import org.apache.lucene.search.TotalHitCountCollector; +import org.apache.lucene.search.highlight.Formatter; +import org.apache.lucene.search.highlight.Highlighter; +import org.apache.lucene.search.highlight.InvalidTokenOffsetsException; +import org.apache.lucene.search.highlight.QueryScorer; +import org.apache.lucene.search.highlight.SimpleHTMLFormatter; +import org.apache.lucene.search.highlight.SimpleSpanFragmenter; +import org.apache.lucene.store.FSDirectory; +import org.apache.lucene.util.Version; + +import redcomet.common.config.ConfigLoader; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.StringUtils; +import redcomet.knowledge.config.AppConfig; +import redcomet.knowledge.indexer.impl.LuceneIndexer; +import redcomet.knowledge.searcher.SearchResultValue; +import redcomet.knowledge.searcher.Searcher; +import redcomet.knowledge.searcher.SearchingValue; + +public class LuceneSearcher implements Searcher { + /** ログ */ + private static Log log = LogFactory.getLog(LuceneSearcher.class); + + public static final int CONTENTS_LIMIT_LENGTH = 200; + + public static final String FIELD_LABEL_TYPE = LuceneIndexer.FIELD_LABEL_TYPE; + public static final String FIELD_LABEL_ID = LuceneIndexer.FIELD_LABEL_ID; + public static final String FIELD_LABEL_TITLE = LuceneIndexer.FIELD_LABEL_TITLE; + public static final String FIELD_LABEL_CONTENTS = LuceneIndexer.FIELD_LABEL_CONTENTS; + public static final String FIELD_LABEL_TAGS = LuceneIndexer.FIELD_LABEL_TAGS; + public static final String FIELD_LABEL_USERS = LuceneIndexer.FIELD_LABEL_USERS; + public static final String FIELD_LABEL_GROUPS = LuceneIndexer.FIELD_LABEL_GROUPS; + public static final String FIELD_LABEL_CREATE_USER = LuceneIndexer.FIELD_LABEL_CREATE_USER; + public static final String FIELD_LABEL_TIME = LuceneIndexer.FIELD_LABEL_TIME; + +// private Analyzer analyzer = new SimpleAnalyzer(Version.LUCENE_4_10_2); + private Analyzer analyzer = new JapaneseAnalyzer(); + + private String getIndexPath() { + AppConfig appConfig = ConfigLoader.load(AppConfig.APP_CONFIG, AppConfig.class); + return appConfig.getIndexPath(); + } + + public List search(final SearchingValue value) throws IOException, ParseException, InvalidTokenOffsetsException { + List resultValues = new ArrayList<>(); + + File indexDir = new File(getIndexPath()); + if (!indexDir.exists()) { + return resultValues; + } + + IndexReader reader = DirectoryReader.open(FSDirectory.open(indexDir)); + IndexSearcher searcher = new IndexSearcher(reader); + + Query query = structQuery(value); + log.debug("Searching for: " + query.toString()); + + TotalHitCountCollector countCollector = new TotalHitCountCollector(); + searcher.search(query, countCollector); + log.debug("Found " + countCollector.getTotalHits() + " hits."); + + TopDocsCollector collector; + if (StringUtils.isNotEmpty(value.getKeyword())) { + collector = TopScoreDocCollector.create(value.getOffset() + value.getLimit(), true); + } else { + //Sort sort = new Sort(new SortField(FIELD_LABEL_ID, SortField.Type.INT, true)); + //Sort sort = Sort.INDEXORDER; + Sort sort = new Sort(new SortField(FIELD_LABEL_TIME, SortField.Type.LONG, true)); + collector = TopFieldCollector.create(sort, value.getOffset() + value.getLimit(), true, false, false, false); + } + + searcher.search(query, collector); + ScoreDoc[] hits = collector.topDocs(value.getOffset(), value.getOffset() + value.getLimit()).scoreDocs; + + log.debug("Found " + hits.length + " hits."); + for (int i = 0; i < hits.length; ++i) { + int docId = hits[i].doc; + Document d = searcher.doc(docId); + if (log.isDebugEnabled()) { + log.debug((i + 1) + ". \n" + + "\t[id]\t" + d.get(FIELD_LABEL_ID) + "\n" + + "\t[tag]\t" + d.get(FIELD_LABEL_TAGS) + "\n" + + "\t[user]\t" + d.get(FIELD_LABEL_USERS) + "\n" + + "\t[group]\t" + d.get(FIELD_LABEL_GROUPS) + "\n" + + "\t[score]\t" + hits[i].score + "\n" + ); + } + + SearchResultValue resultValue = new SearchResultValue(); + resultValue.setType(Integer.parseInt(d.get(FIELD_LABEL_TYPE))); + resultValue.setId(d.get(FIELD_LABEL_ID)); + resultValue.setScore(hits[i].score); + resultValue.setTitle(d.get(FIELD_LABEL_TITLE)); + resultValue.setContents(d.get(FIELD_LABEL_CONTENTS)); + + if (StringUtils.isNotEmpty(resultValue.getTitle())) { + String bestFragment = getHighlightedField(query, analyzer, FIELD_LABEL_TITLE, resultValue.getTitle()); + if (log.isDebugEnabled()) { + log.debug("----- highlited title -----\n" + bestFragment); + } + resultValue.setHighlightedTitle(bestFragment); + } + + if (StringUtils.isNotEmpty(resultValue.getContents())) { + String bestFragment = getHighlightedField(query, analyzer, FIELD_LABEL_CONTENTS, resultValue.getContents()); + if (log.isDebugEnabled()) { + log.debug("----- highlited contents -----\n" + bestFragment); + } + resultValue.setHighlightedContents(bestFragment); + } + + + resultValues.add(resultValue); + } + + return resultValues; + + } + + private Query structQuery(final SearchingValue value) throws ParseException { + + // クエリー組み立て + // 条件が指定されていれば、containerに入れていく + BooleanQuery container = new BooleanQuery(); + + if (StringUtils.isNotEmpty(value.getKeyword())) { + //キーワード検索(内容かパス名にキーワードがあるか) + BooleanQuery miniContainer = new BooleanQuery(); + + QueryParser queryParser = new QueryParser(Version.LUCENE_4_10_2, FIELD_LABEL_TITLE, analyzer); + queryParser.setDefaultOperator(Operator.OR); + Query query = queryParser.parse(value.getKeyword()); + miniContainer.add(query, BooleanClause.Occur.SHOULD); + + queryParser = new QueryParser(Version.LUCENE_4_10_2, FIELD_LABEL_CONTENTS, analyzer); + queryParser.setDefaultOperator(Operator.OR); + query = queryParser.parse(value.getKeyword()); + miniContainer.add(query, BooleanClause.Occur.SHOULD); + + container.add(miniContainer, BooleanClause.Occur.MUST); + } + + if (StringUtils.isNotEmpty(value.getTags())) { + QueryParser queryParser = new QueryParser(Version.LUCENE_4_10_2, FIELD_LABEL_TAGS, analyzer); + queryParser.setDefaultOperator(Operator.OR); + Query query = queryParser.parse(value.getTags()); + container.add(query, BooleanClause.Occur.MUST); + } + if (StringUtils.isNotEmpty(value.getUsers())) { + QueryParser queryParser = new QueryParser(Version.LUCENE_4_10_2, FIELD_LABEL_USERS, analyzer); + queryParser.setDefaultOperator(Operator.OR); + Query query = queryParser.parse(value.getUsers()); + container.add(query, BooleanClause.Occur.MUST); + } + if (StringUtils.isNotEmpty(value.getGroups())) { + QueryParser queryParser = new QueryParser(Version.LUCENE_4_10_2, FIELD_LABEL_GROUPS, analyzer); + queryParser.setDefaultOperator(Operator.OR); + Query query = queryParser.parse(value.getGroups()); + container.add(query, BooleanClause.Occur.MUST); + } + return container; + } + + private String getHighlightedField(Query query, Analyzer analyzer, String fieldName, String fieldValue) throws IOException, + InvalidTokenOffsetsException { + Formatter formatter = new SimpleHTMLFormatter("", ""); + //Formatter formatter = new SimpleHTMLFormatter(); + QueryScorer queryScorer = new QueryScorer(query); + Highlighter highlighter = new Highlighter(formatter, queryScorer); + highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer, CONTENTS_LIMIT_LENGTH)); + highlighter.setMaxDocCharsToAnalyze(Integer.MAX_VALUE); + return highlighter.getBestFragment(analyzer, fieldName, fieldValue); + } + +} diff --git a/src/main/java/redcomet/knowledge/vo/LikeCount.java b/src/main/java/redcomet/knowledge/vo/LikeCount.java new file mode 100644 index 000000000..7d158be40 --- /dev/null +++ b/src/main/java/redcomet/knowledge/vo/LikeCount.java @@ -0,0 +1,30 @@ +package redcomet.knowledge.vo; + +public class LikeCount { + private Long knowledgeId; + private Long count; + /** + * @return the knowledgeId + */ + public Long getKnowledgeId() { + return knowledgeId; + } + /** + * @param knowledgeId the knowledgeId to set + */ + public void setKnowledgeId(Long knowledgeId) { + this.knowledgeId = knowledgeId; + } + /** + * @return the count + */ + public Long getCount() { + return count; + } + /** + * @param count the count to set + */ + public void setCount(Long count) { + this.count = count; + } +} diff --git a/src/main/java/redcomet/knowledge/vo/ParseResult.java b/src/main/java/redcomet/knowledge/vo/ParseResult.java new file mode 100644 index 000000000..6b64b55bf --- /dev/null +++ b/src/main/java/redcomet/knowledge/vo/ParseResult.java @@ -0,0 +1,26 @@ +package redcomet.knowledge.vo; + +import java.util.List; + +public class ParseResult { + private String text; + + private List sentences; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public List getSentences() { + return sentences; + } + + public void setSentences(List sentences) { + this.sentences = sentences; + } + +} diff --git a/src/main/java/redcomet/knowledge/vo/Roles.java b/src/main/java/redcomet/knowledge/vo/Roles.java new file mode 100644 index 000000000..9d503a977 --- /dev/null +++ b/src/main/java/redcomet/knowledge/vo/Roles.java @@ -0,0 +1,20 @@ +package redcomet.knowledge.vo; + +import redcomet.web.entity.RolesEntity; + +public class Roles extends RolesEntity { + /** シリアルバージョン */ + private static final long serialVersionUID = 1L; + + private boolean checked = false; + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + + +} diff --git a/src/main/java/redcomet/knowledge/vo/Sentence.java b/src/main/java/redcomet/knowledge/vo/Sentence.java new file mode 100644 index 000000000..d08a8c213 --- /dev/null +++ b/src/main/java/redcomet/knowledge/vo/Sentence.java @@ -0,0 +1,20 @@ +package redcomet.knowledge.vo; + +public class Sentence { + /** 書かれている場所 */ + private String place; + /** 書かれているテキスト */ + private String sentence; + public String getPlace() { + return place; + } + public void setPlace(String place) { + this.place = place; + } + public String getSentence() { + return sentence; + } + public void setSentence(String sentence) { + this.sentence = sentence; + } +} diff --git a/src/main/java/redcomet/knowledge/vo/UploadFile.java b/src/main/java/redcomet/knowledge/vo/UploadFile.java new file mode 100644 index 000000000..e48b872c4 --- /dev/null +++ b/src/main/java/redcomet/knowledge/vo/UploadFile.java @@ -0,0 +1,127 @@ +package redcomet.knowledge.vo; + +public class UploadFile { + + private Long fileNo; + private String url; + private String thumbnailUrl; + private String name; + private String type; + private Double size; + private String deleteUrl; + private String deleteType; + private Long knowlegeId; + + /** + * @return the url + */ + public String getUrl() { + return url; + } + /** + * @param url the url to set + */ + public void setUrl(String url) { + this.url = url; + } + /** + * @return the thumbnailUrl + */ + public String getThumbnailUrl() { + return thumbnailUrl; + } + /** + * @param thumbnailUrl the thumbnailUrl to set + */ + public void setThumbnailUrl(String thumbnailUrl) { + this.thumbnailUrl = thumbnailUrl; + } + /** + * @return the name + */ + public String getName() { + return name; + } + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + /** + * @return the type + */ + public String getType() { + return type; + } + /** + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + /** + * @return the size + */ + public Double getSize() { + return size; + } + /** + * @param size the size to set + */ + public void setSize(Double size) { + this.size = size; + } + /** + * @return the deleteUrl + */ + public String getDeleteUrl() { + return deleteUrl; + } + /** + * @param deleteUrl the deleteUrl to set + */ + public void setDeleteUrl(String deleteUrl) { + this.deleteUrl = deleteUrl; + } + /** + * @return the deleteType + */ + public String getDeleteType() { + return deleteType; + } + /** + * @param deleteType the deleteType to set + */ + public void setDeleteType(String deleteType) { + this.deleteType = deleteType; + } + /** + * @return the fileNo + */ + public Long getFileNo() { + return fileNo; + } + /** + * @param fileNo the fileNo to set + */ + public void setFileNo(Long fileNo) { + this.fileNo = fileNo; + } + /** + * @return the knowlegeId + */ + public Long getKnowlegeId() { + return knowlegeId; + } + /** + * @param knowlegeId the knowlegeId to set + */ + public void setKnowlegeId(Long knowlegeId) { + this.knowlegeId = knowlegeId; + } + + + + +} diff --git a/src/main/java/redcomet/knowledge/vo/UploadResults.java b/src/main/java/redcomet/knowledge/vo/UploadResults.java new file mode 100644 index 000000000..2cad1d3b6 --- /dev/null +++ b/src/main/java/redcomet/knowledge/vo/UploadResults.java @@ -0,0 +1,25 @@ +package redcomet.knowledge.vo; + +import java.util.List; + +public class UploadResults { + + private List files; + + /** + * @return the files + */ + public List getFiles() { + return files; + } + + /** + * @param files the files to set + */ + public void setFiles(List files) { + this.files = files; + } + + + +} diff --git a/src/main/resources/appconfig.xml b/src/main/resources/appconfig.xml new file mode 100644 index 000000000..646bee0a1 --- /dev/null +++ b/src/main/resources/appconfig.xml @@ -0,0 +1,9 @@ + + + Asia/Tokyo + {user.home}/.knowledge/index/ + {user.home}/.knowledge/tmp/ + 5 + + + diff --git a/src/main/resources/appresource.properties b/src/main/resources/appresource.properties new file mode 100644 index 000000000..66b7549dd --- /dev/null +++ b/src/main/resources/appresource.properties @@ -0,0 +1,45 @@ +errors.header=

    +errors.footer=
+errors.prefix=
  • +errors.suffix=
  • +errors.invalid={1} is invalid. +errors.maxlength={1} can not be greater than {2} characters. +errors.minlength={1} can not be less than {2} characters. +errors.maxbytelength={1} can not be greater than {2} bytes. +errors.minbytelength={1} can not be less than {2} bytes. +errors.range={1} is not in the range {2} through {3}. +errors.required={1} is required. +errors.required.other={1} is required ({2}). +errors.byte={1} must be an byte. +errors.date={1} is not a date. +errors.double={1} must be an double. +errors.float={1} must be an float. +errors.integer={1} must be an integer. +errors.long={1} must be an long. +errors.short={1} must be an short. +errors.creditcard={1} is not a valid credit card number. +errors.email={1} is an invalid e-mail address. +errors.url={1} is an invalid url (web address). +errors.exist={1} is already registered. +errors.noexist={1} is not exist. +errors.noauthority=No authority. + +label.login=Login +message.login.error=ID/Password invalid +message.authorize.error=\u30a2\u30af\u30bb\u30b9\u3059\u308b\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 + +message.httpstatus.401=Unauthorized +message.httpstatus.404=Not Found +message.httpstatus.403=Forbidden +message.httpstatus.500=Internal Server Error + +message.success.insert=Registered. +message.success.update=Changed. +message.success.delete=Removed. + +message.success.insert.target={1} was Registered. +message.success.update.target={1} was Changed. +message.success.delete.target={1} was Removed. + + + diff --git a/src/main/resources/appresource_ja_JP.properties b/src/main/resources/appresource_ja_JP.properties new file mode 100644 index 000000000..2cc8cb5d6 --- /dev/null +++ b/src/main/resources/appresource_ja_JP.properties @@ -0,0 +1,45 @@ +errors.header=
      +errors.footer=
    +errors.prefix=
  • +errors.suffix=
  • +errors.invalid={1}\u304c\u4e0d\u6b63\u3067\u3059\u3002 +errors.maxlength={1}\u306e\u9577\u3055\u304c\u6700\u5927\u5024({2})\u3092\u8d85\u3048\u3066\u3044\u307e\u3059\u3002 +errors.minlength={1}\u306e\u9577\u3055\u304c\u6700\u5c0f\u5024({2})\u672a\u6e80\u3067\u3059\u3002 +errors.maxbytelength={1}\u306e\u30d0\u30a4\u30c8\u9577\u304c\u6700\u5927\u5024({2})\u3092\u8d85\u3048\u3066\u3044\u307e\u3059\u3002 +errors.minbytelength={1}\u306e\u30d0\u30a4\u30c8\u9577\u304c\u6700\u5c0f\u5024({2})\u672a\u6e80\u3067\u3059\u3002 +errors.range={1}\u306f{2}\u3068{3}\u306e\u9593\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +errors.required={1}\u306f\u5fc5\u9808\u3067\u3059\u3002 +errors.required.other={1} is required ({2}). +errors.byte={1}\u306f\u30d0\u30a4\u30c8\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +errors.date={1}\u306f\u65e5\u4ed8\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093 +errors.double={1}\u306f\u500d\u7cbe\u5ea6\u5b9f\u6570\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +errors.float={1}\u306f\u5358\u7cbe\u5ea6\u5b9f\u6570\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +errors.integer={1}\u306f\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +errors.long={1}\u306f\u9577\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +errors.short={1}\u306f\u77ed\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +errors.creditcard={1}\u306f\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9\u756a\u53f7\u3068\u3057\u3066\u4e0d\u6b63\u3067\u3059\u3002 +errors.email={1}\u306f\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u3057\u3066\u4e0d\u6b63\u3067\u3059\u3002 +errors.url={1}\u306fURL\u3068\u3057\u3066\u4e0d\u6b63\u3067\u3059\u3002 +errors.exist=\u5165\u529b\u3055\u308c\u305f{1}\u306f\u65e2\u306b\u767b\u9332\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +errors.noexist=\u5165\u529b\u3055\u308c\u305f{1}\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 +errors.noauthority=\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 + +label.login=Login +message.login.error=ID/Password\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059\u3002 +message.authorize.error=\u30a2\u30af\u30bb\u30b9\u3059\u308b\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 + +message.httpstatus.401=Unauthorized +message.httpstatus.404=Not Found +message.httpstatus.403=Forbidden +message.httpstatus.500=Internal Server Error + +message.success.insert=\u767b\u9332\u3057\u307e\u3057\u305f\u3002 +message.success.update=\u5909\u66f4\u3057\u307e\u3057\u305f\u3002 +message.success.delete=\u524a\u9664\u3057\u307e\u3057\u305f\u3002 + +message.success.insert.target={1} \u3092\u767b\u9332\u3057\u307e\u3057\u305f\u3002 +message.success.update.target={1} \u3092\u5909\u66f4\u3057\u307e\u3057\u305f\u3002 +message.success.delete.target={1} \u3092\u524a\u9664\u3057\u307e\u3057\u305f\u3002 + + + diff --git a/src/main/resources/connection.xml b/src/main/resources/connection.xml new file mode 100644 index 000000000..e43ab4ca6 --- /dev/null +++ b/src/main/resources/connection.xml @@ -0,0 +1,10 @@ + + + org.h2.Driver + jdbc:h2:{user.home}/.knowledge/knowledge_db + sa + + public + 5 + false + diff --git a/src/main/resources/log4j.xml b/src/main/resources/log4j.xml new file mode 100644 index 000000000..37a308641 --- /dev/null +++ b/src/main/resources/log4j.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/redcomet/knowledge/database/ddl.sql b/src/main/resources/redcomet/knowledge/database/ddl.sql new file mode 100644 index 000000000..d43126eb8 --- /dev/null +++ b/src/main/resources/redcomet/knowledge/database/ddl.sql @@ -0,0 +1,322 @@ +-- いいね +drop table if exists LIKES cascade; + +create table LIKES ( + NO bigint not null AUTO_INCREMENT + , KNOWLEDGE_ID bigint not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint LIKES_PKC primary key (NO) +) ; + +-- コメント +drop table if exists COMMENTS cascade; + +create table COMMENTS ( + COMMENT_NO bigint not null AUTO_INCREMENT + , KNOWLEDGE_ID bigint not null + , COMMENT text + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint COMMENTS_PKC primary key (COMMENT_NO) +) ; + +-- 投票 +drop table if exists VOTES cascade; + +create table VOTES ( + VOTE_NO bigint not null AUTO_INCREMENT + , KNOWLEDGE_ID bigint not null + , VOTE_KIND integer not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint VOTES_PKC primary key (VOTE_NO) +) ; + +-- ナレッジの参照履歴 +drop table if exists VIEW_HISTORIES cascade; + +create table VIEW_HISTORIES ( + HISTORY_NO bigint not null AUTO_INCREMENT + , KNOWLEDGE_ID bigint not null + , VIEW_DATE_TIME timestamp not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint VIEW_HISTORIES_PKC primary key (HISTORY_NO) +) ; + +-- ストックしたナレッジ +drop table if exists STOCKS cascade; + +create table STOCKS ( + USER_ID integer not null + , KNOWLEDGE_ID bigint not null + , COMMENT character varying(1024) + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint STOCKS_PKC primary key (USER_ID,KNOWLEDGE_ID) +) ; + +-- アクセス可能なグループ +drop table if exists KNOWLEDGE_GROUPS cascade; + +create table KNOWLEDGE_GROUPS ( + KNOWLEDGE_ID bigint not null + , GROUP_ID integer not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint KNOWLEDGE_GROUPS_PKC primary key (KNOWLEDGE_ID,GROUP_ID) +) ; + +-- アクセス可能なユーザ +drop table if exists KNOWLEDGE_USERS cascade; + +create table KNOWLEDGE_USERS ( + KNOWLEDGE_ID bigint not null + , USER_ID integer not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint KNOWLEDGE_USERS_PKC primary key (KNOWLEDGE_ID,USER_ID) +) ; + +-- ナレッジが持つタグ +drop table if exists KNOWLEDGE_TAGS cascade; + +create table KNOWLEDGE_TAGS ( + KNOWLEDGE_ID bigint not null + , TAG_ID integer not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint KNOWLEDGE_TAGS_PKC primary key (KNOWLEDGE_ID,TAG_ID) +) ; + +-- タグ +drop table if exists TAGS cascade; + +create table TAGS ( + TAG_ID integer not null AUTO_INCREMENT + , TAG_NAME character varying(128) not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint TAGS_PKC primary key (TAG_ID) +) ; + +-- 添付ファイル +drop table if exists KNOWLEDGE_FILES cascade; + +create table KNOWLEDGE_FILES ( + FILE_NO bigint not null AUTO_INCREMENT + , KNOWLEDGE_ID bigint + , FILE_NAME character varying(256) + , FILE_SIZE double precision + , FILE_BINARY blob + , PARSE_STATUS integer not null + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint KNOWLEDGE_FILES_PKC primary key (FILE_NO) +) ; + +-- ナレッジ +drop table if exists KNOWLEDGES cascade; + +create table KNOWLEDGES ( + KNOWLEDGE_ID bigint not null AUTO_INCREMENT + , TITLE character varying(1024) not null + , CONTENT text + , PUBLIC_FLAG integer + , INSERT_USER integer + , INSERT_DATETIME timestamp + , UPDATE_USER integer + , UPDATE_DATETIME timestamp + , DELETE_FLAG integer + , constraint KNOWLEDGES_PKC primary key (KNOWLEDGE_ID) +) ; + +alter table LIKES + add constraint LIKES_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table COMMENTS + add constraint COMMENTS_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table VOTES + add constraint VOTES_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table VIEW_HISTORIES + add constraint VIEW_HISTORIES_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table STOCKS + add constraint STOCKS_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table KNOWLEDGE_GROUPS + add constraint KNOWLEDGE_GROUPS_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table KNOWLEDGE_USERS + add constraint KNOWLEDGE_USERS_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table KNOWLEDGE_TAGS + add constraint KNOWLEDGE_TAGS_FK1 foreign key (TAG_ID) references TAGS(TAG_ID) + on delete cascade + on update cascade; + +alter table KNOWLEDGE_TAGS + add constraint KNOWLEDGE_TAGS_FK2 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +alter table KNOWLEDGE_FILES + add constraint KNOWLEDGE_FILES_FK1 foreign key (KNOWLEDGE_ID) references KNOWLEDGES(KNOWLEDGE_ID) + on delete cascade + on update cascade; + +comment on table LIKES is 'いいね'; +comment on column LIKES.NO is 'NO'; +comment on column LIKES.KNOWLEDGE_ID is 'ナレッジID'; +comment on column LIKES.INSERT_USER is '登録ユーザ'; +comment on column LIKES.INSERT_DATETIME is '登録日時'; +comment on column LIKES.UPDATE_USER is '更新ユーザ'; +comment on column LIKES.UPDATE_DATETIME is '更新日時'; +comment on column LIKES.DELETE_FLAG is '削除フラグ'; + +comment on table COMMENTS is 'コメント'; +comment on column COMMENTS.COMMENT_NO is 'コメント番号'; +comment on column COMMENTS.KNOWLEDGE_ID is 'ナレッジID'; +comment on column COMMENTS.COMMENT is 'コメント'; +comment on column COMMENTS.INSERT_USER is '登録ユーザ'; +comment on column COMMENTS.INSERT_DATETIME is '登録日時'; +comment on column COMMENTS.UPDATE_USER is '更新ユーザ'; +comment on column COMMENTS.UPDATE_DATETIME is '更新日時'; +comment on column COMMENTS.DELETE_FLAG is '削除フラグ'; + +comment on table VOTES is '投票'; +comment on column VOTES.VOTE_NO is 'VOTE_NO'; +comment on column VOTES.KNOWLEDGE_ID is 'ナレッジID'; +comment on column VOTES.VOTE_KIND is '投票区分'; +comment on column VOTES.INSERT_USER is '登録ユーザ'; +comment on column VOTES.INSERT_DATETIME is '登録日時'; +comment on column VOTES.UPDATE_USER is '更新ユーザ'; +comment on column VOTES.UPDATE_DATETIME is '更新日時'; +comment on column VOTES.DELETE_FLAG is '削除フラグ'; + +comment on table VIEW_HISTORIES is 'ナレッジの参照履歴'; +comment on column VIEW_HISTORIES.HISTORY_NO is 'HISTORY_NO'; +comment on column VIEW_HISTORIES.KNOWLEDGE_ID is 'ナレッジID'; +comment on column VIEW_HISTORIES.VIEW_DATE_TIME is '日時'; +comment on column VIEW_HISTORIES.INSERT_USER is '登録ユーザ'; +comment on column VIEW_HISTORIES.INSERT_DATETIME is '登録日時'; +comment on column VIEW_HISTORIES.UPDATE_USER is '更新ユーザ'; +comment on column VIEW_HISTORIES.UPDATE_DATETIME is '更新日時'; +comment on column VIEW_HISTORIES.DELETE_FLAG is '削除フラグ'; + +comment on table STOCKS is 'ストックしたナレッジ'; +comment on column STOCKS.USER_ID is 'USER_ID'; +comment on column STOCKS.KNOWLEDGE_ID is 'ナレッジID'; +comment on column STOCKS.COMMENT is 'コメント'; +comment on column STOCKS.INSERT_USER is '登録ユーザ'; +comment on column STOCKS.INSERT_DATETIME is '登録日時'; +comment on column STOCKS.UPDATE_USER is '更新ユーザ'; +comment on column STOCKS.UPDATE_DATETIME is '更新日時'; +comment on column STOCKS.DELETE_FLAG is '削除フラグ'; + +comment on table KNOWLEDGE_GROUPS is 'アクセス可能なグループ'; +comment on column KNOWLEDGE_GROUPS.KNOWLEDGE_ID is 'ナレッジID'; +comment on column KNOWLEDGE_GROUPS.GROUP_ID is 'GROUP_ID'; +comment on column KNOWLEDGE_GROUPS.INSERT_USER is '登録ユーザ'; +comment on column KNOWLEDGE_GROUPS.INSERT_DATETIME is '登録日時'; +comment on column KNOWLEDGE_GROUPS.UPDATE_USER is '更新ユーザ'; +comment on column KNOWLEDGE_GROUPS.UPDATE_DATETIME is '更新日時'; +comment on column KNOWLEDGE_GROUPS.DELETE_FLAG is '削除フラグ'; + +comment on table KNOWLEDGE_USERS is 'アクセス可能なユーザ'; +comment on column KNOWLEDGE_USERS.KNOWLEDGE_ID is 'ナレッジID'; +comment on column KNOWLEDGE_USERS.USER_ID is 'USER_ID'; +comment on column KNOWLEDGE_USERS.INSERT_USER is '登録ユーザ'; +comment on column KNOWLEDGE_USERS.INSERT_DATETIME is '登録日時'; +comment on column KNOWLEDGE_USERS.UPDATE_USER is '更新ユーザ'; +comment on column KNOWLEDGE_USERS.UPDATE_DATETIME is '更新日時'; +comment on column KNOWLEDGE_USERS.DELETE_FLAG is '削除フラグ'; + +comment on table KNOWLEDGE_TAGS is 'ナレッジが持つタグ'; +comment on column KNOWLEDGE_TAGS.KNOWLEDGE_ID is 'ナレッジID'; +comment on column KNOWLEDGE_TAGS.TAG_ID is 'タグ_ID'; +comment on column KNOWLEDGE_TAGS.INSERT_USER is '登録ユーザ'; +comment on column KNOWLEDGE_TAGS.INSERT_DATETIME is '登録日時'; +comment on column KNOWLEDGE_TAGS.UPDATE_USER is '更新ユーザ'; +comment on column KNOWLEDGE_TAGS.UPDATE_DATETIME is '更新日時'; +comment on column KNOWLEDGE_TAGS.DELETE_FLAG is '削除フラグ'; + +comment on table TAGS is 'タグ'; +comment on column TAGS.TAG_ID is 'タグ_ID'; +comment on column TAGS.TAG_NAME is 'タグ名称'; +comment on column TAGS.INSERT_USER is '登録ユーザ'; +comment on column TAGS.INSERT_DATETIME is '登録日時'; +comment on column TAGS.UPDATE_USER is '更新ユーザ'; +comment on column TAGS.UPDATE_DATETIME is '更新日時'; +comment on column TAGS.DELETE_FLAG is '削除フラグ'; + +comment on table KNOWLEDGE_FILES is '添付ファイル'; +comment on column KNOWLEDGE_FILES.FILE_NO is '添付ファイル番号'; +comment on column KNOWLEDGE_FILES.KNOWLEDGE_ID is 'ナレッジID'; +comment on column KNOWLEDGE_FILES.FILE_NAME is 'ファイル名'; +comment on column KNOWLEDGE_FILES.FILE_SIZE is 'ファイルサイズ'; +comment on column KNOWLEDGE_FILES.FILE_BINARY is 'バイナリ'; +comment on column KNOWLEDGE_FILES.PARSE_STATUS is 'パース結果'; +comment on column KNOWLEDGE_FILES.INSERT_USER is '登録ユーザ'; +comment on column KNOWLEDGE_FILES.INSERT_DATETIME is '登録日時'; +comment on column KNOWLEDGE_FILES.UPDATE_USER is '更新ユーザ'; +comment on column KNOWLEDGE_FILES.UPDATE_DATETIME is '更新日時'; +comment on column KNOWLEDGE_FILES.DELETE_FLAG is '削除フラグ'; + +comment on table KNOWLEDGES is 'ナレッジ'; +comment on column KNOWLEDGES.KNOWLEDGE_ID is 'ナレッジID'; +comment on column KNOWLEDGES.TITLE is 'タイトル'; +comment on column KNOWLEDGES.CONTENT is '内容'; +comment on column KNOWLEDGES.PUBLIC_FLAG is '公開区分'; +comment on column KNOWLEDGES.INSERT_USER is '登録ユーザ'; +comment on column KNOWLEDGES.INSERT_DATETIME is '登録日時'; +comment on column KNOWLEDGES.UPDATE_USER is '更新ユーザ'; +comment on column KNOWLEDGES.UPDATE_DATETIME is '更新日時'; +comment on column KNOWLEDGES.DELETE_FLAG is '削除フラグ'; diff --git a/src/main/webapp/WEB-INF/views/admin/users/list.jsp b/src/main/webapp/WEB-INF/views/admin/users/list.jsp new file mode 100644 index 000000000..db1fae32e --- /dev/null +++ b/src/main/webapp/WEB-INF/views/admin/users/list.jsp @@ -0,0 +1,70 @@ +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/views/admin/users/view_add.jsp b/src/main/webapp/WEB-INF/views/admin/users/view_add.jsp new file mode 100644 index 000000000..84c2a2b20 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/admin/users/view_add.jsp @@ -0,0 +1,71 @@ +<%@page import="redcomet.knowledge.vo.Roles"%> +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + + + + + +
    + +
    + + +
    +
    + + +
    + +
    + + +
    +
    + + +
    + +
    +
    + + + +
    + + + + + +  一覧へ戻る + +
    + + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/admin/users/view_edit.jsp b/src/main/webapp/WEB-INF/views/admin/users/view_edit.jsp new file mode 100644 index 000000000..656e7ad04 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/admin/users/view_edit.jsp @@ -0,0 +1,90 @@ +<%@page import="redcomet.knowledge.vo.Roles"%> +<%@page import="redcomet.web.util.JspUtil"%> + +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + + + + + +
    + +
    + + +
    +
    + + +
    + +
    + + +
    +
    + + +
    + +
    +
    + + + +
    + +
    + +

    +  <%= jspUtil.date("insertDatetime")%> / +  <%= jspUtil.date("updateDatetime")%> +

    +
    + + + + + + +  一覧へ戻る + +
    + + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/auth/authorizerError.jsp b/src/main/webapp/WEB-INF/views/auth/authorizerError.jsp new file mode 100644 index 000000000..d5c51ceaa --- /dev/null +++ b/src/main/webapp/WEB-INF/views/auth/authorizerError.jsp @@ -0,0 +1,15 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" +isErrorPage="true" %> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + アクセスする権限がありません。 + + + + diff --git a/src/main/webapp/WEB-INF/views/auth/form.jsp b/src/main/webapp/WEB-INF/views/auth/form.jsp new file mode 100644 index 000000000..d9b847522 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/auth/form.jsp @@ -0,0 +1,100 @@ +<%@page import="redcomet.common.util.StringUtils"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + + + + + + + + +
    + + +
    + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/commons/errors/error.jsp b/src/main/webapp/WEB-INF/views/commons/errors/error.jsp new file mode 100644 index 000000000..1142d43f3 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/errors/error.jsp @@ -0,0 +1,28 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" isErrorPage="true"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +

    Error

    + +

    + + + +

    + +<% +if (request.getRemoteAddr().startsWith("192.168.") || request.getRemoteAddr().equals("127.0.0.1")) { + if (exception == null && request.getAttribute("SERVER_EXCEPTION") != null) { + exception = (Throwable) request.getAttribute("SERVER_EXCEPTION"); + } + if (exception != null) { + java.io.PrintWriter pw = new java.io.PrintWriter(out); + pw.println("
    ");
    +		exception.printStackTrace(pw);
    +		pw.println("
    "); + } +} +%> + + diff --git a/src/main/webapp/WEB-INF/views/commons/errors/forbidden.jsp b/src/main/webapp/WEB-INF/views/commons/errors/forbidden.jsp new file mode 100644 index 000000000..3a1beccf3 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/errors/forbidden.jsp @@ -0,0 +1,24 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" isErrorPage="true"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + +
    +

    Error

    +

    + + + +

    +
    + +
    + +
    + + + diff --git a/src/main/webapp/WEB-INF/views/commons/errors/jsp_error.jsp b/src/main/webapp/WEB-INF/views/commons/errors/jsp_error.jsp new file mode 100644 index 000000000..9f1498d1a --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/errors/jsp_error.jsp @@ -0,0 +1,22 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" isErrorPage="true"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% exception.printStackTrace(); %> + +

    Error

    + +

    + + + +

    + +<% +if (request.getRemoteAddr().startsWith("192.168.") || request.getRemoteAddr().equals("127.0.0.1")) { + exception.printStackTrace(new java.io.PrintWriter(out)); +} +%> + + diff --git a/src/main/webapp/WEB-INF/views/commons/errors/not_found.jsp b/src/main/webapp/WEB-INF/views/commons/errors/not_found.jsp new file mode 100644 index 000000000..94ae739b9 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/errors/not_found.jsp @@ -0,0 +1,27 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" isErrorPage="true"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + +
    +

    Error

    +

    + + + +

    +
    + +
    + +
    + + + + + + diff --git a/src/main/webapp/WEB-INF/views/commons/errors/server_error.jsp b/src/main/webapp/WEB-INF/views/commons/errors/server_error.jsp new file mode 100644 index 000000000..b571c7279 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/errors/server_error.jsp @@ -0,0 +1,38 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" isErrorPage="true"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + +
    + +

    Server Error

    + +

    + + + +

    + + +<% +if (request.getRemoteAddr().startsWith("192.168.") || request.getRemoteAddr().equals("127.0.0.1")) { + if (exception == null && request.getAttribute("SERVER_EXCEPTION") != null) { + exception = (Throwable) request.getAttribute("SERVER_EXCEPTION"); + } + if (exception != null) { + java.io.PrintWriter pw = new java.io.PrintWriter(out); + pw.println("
    ");
    +		exception.printStackTrace(pw);
    +		pw.println("
    "); + } +} +%> + +
    +
    + +
    + + diff --git a/src/main/webapp/WEB-INF/views/commons/errors/unauthorized.jsp b/src/main/webapp/WEB-INF/views/commons/errors/unauthorized.jsp new file mode 100644 index 000000000..896ec7573 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/errors/unauthorized.jsp @@ -0,0 +1,24 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" isErrorPage="true"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + +
    +

    Error

    +

    + + + +

    +
    + +
    + +
    + + + diff --git a/src/main/webapp/WEB-INF/views/commons/layout/commonHeader.jsp b/src/main/webapp/WEB-INF/views/commons/layout/commonHeader.jsp new file mode 100644 index 000000000..53a6476e9 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/layout/commonHeader.jsp @@ -0,0 +1,29 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/views/commons/layout/commonNavbar.jsp b/src/main/webapp/WEB-INF/views/commons/layout/commonNavbar.jsp new file mode 100644 index 000000000..fcbe42b59 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/layout/commonNavbar.jsp @@ -0,0 +1,103 @@ +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% String top = "/open.knowledge/list"; %> +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + diff --git a/src/main/webapp/WEB-INF/views/commons/layout/commonScripts.jsp b/src/main/webapp/WEB-INF/views/commons/layout/commonScripts.jsp new file mode 100644 index 000000000..44451b08f --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/layout/commonScripts.jsp @@ -0,0 +1,92 @@ +<%@page import="redcomet.web.util.JspUtil"%> +<%@page import="redcomet.knowledge.control.Control"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/views/commons/layout/layoutMain.jsp b/src/main/webapp/WEB-INF/views/commons/layout/layoutMain.jsp new file mode 100644 index 000000000..597506b6f --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/layout/layoutMain.jsp @@ -0,0 +1,82 @@ +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + +<%-- 後からヘッダー部に何か追加する場合のパラメータ --%> + + ${param.PARAM_HEAD} + + + +<c:if test="${param.PARAM_PAGE_TITLE != null}"> + ${param.PARAM_PAGE_TITLE} +</c:if> +<c:if test="${param.PARAM_PAGE_TITLE == null}"> + Knowledge +</c:if> + + + + + + + + + + +<%-- + +--%> + +
    +${param.PARAM_CONTENT} +<% jspUtil.debug(); %> +
    + + + + +${param.PARAM_SCRIPTS} + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/views/commons/layout/layoutNoMenu.jsp b/src/main/webapp/WEB-INF/views/commons/layout/layoutNoMenu.jsp new file mode 100644 index 000000000..c8c1451ab --- /dev/null +++ b/src/main/webapp/WEB-INF/views/commons/layout/layoutNoMenu.jsp @@ -0,0 +1,53 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + +<%-- 後からヘッダー部に何か追加する場合のパラメータ --%> + + ${param.PARAM_HEAD} + + + +<c:if test="${param.PARAM_PAGE_TITLE != null}"> + ${param.PARAM_PAGE_TITLE} +</c:if> +<c:if test="${param.PARAM_PAGE_TITLE == null}"> + Knowledge +</c:if> + + + + + + + + +
    +${param.PARAM_CONTENT} +
    + + + + +${param.PARAM_SCRIPTS} + + + + + diff --git a/src/main/webapp/WEB-INF/views/index/index.jsp b/src/main/webapp/WEB-INF/views/index/index.jsp new file mode 100644 index 000000000..24c5ac3bd --- /dev/null +++ b/src/main/webapp/WEB-INF/views/index/index.jsp @@ -0,0 +1,54 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" + errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + + + + + + + +
    +

     Knowledge

    +

    +

    Knowledgeはフリーの情報共有サービスです

    +

    + +  見てみる + +

    +
    + +
    +#### 特徴 +- Markdown記法で情報登録 +- 記事のタイトル/本文を全文検索で目的の情報を探せます +- 情報の公開範囲を、「公開」「非公開(自分のみ)」の指定ができます +- 情報に付けたタグで、情報の種別の管理を行えます +- 添付ファイルを登録できます +- 添付ファイルの中身でも検索できます +
    + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/open/knowledge/list.jsp b/src/main/webapp/WEB-INF/views/open/knowledge/list.jsp new file mode 100644 index 000000000..d2e7b62b9 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/open/knowledge/list.jsp @@ -0,0 +1,165 @@ +<%@page import="redcomet.knowledge.logic.KnowledgeLogic"%> +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + empty + + + +
    ', '${tag}');"> +
     show!
    +
    +

    [${knowledge.knowledgeId}] ${knowledge.title}

    + + +

    + +

    +
    + +

    +  ${knowledge.insertUserName} +     +  × ${knowledge.likeCount} +     + +  <%= jspUtil.date("knowledge.updateDatetime")%> +     + <%= jspUtil.is(String.valueOf(KnowledgeLogic.PUBLIC_FLAG_PUBLIC), "knowledge.publicFlag", + " [公開]") %> + <%= jspUtil.is(String.valueOf(KnowledgeLogic.PUBLIC_FLAG_PRIVATE), "knowledge.publicFlag", + " [非公開]") %> +

    + +

    + <%-- --%> + ${knowledge.content} +

    +
    +
    +
    +
    + +
    +
    - Popular Tags -
    + + + +
    - History -
    + + + + <%-- +
    - Popular Knowledge -
    + 表示回数のをとっておき、回数が多いものを表示 + (履歴データを期間で範囲指定してカウントする) + --%> + +
    + +
    + + + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/open/knowledge/view.jsp b/src/main/webapp/WEB-INF/views/open/knowledge/view.jsp new file mode 100644 index 000000000..c00f4d45b --- /dev/null +++ b/src/main/webapp/WEB-INF/views/open/knowledge/view.jsp @@ -0,0 +1,146 @@ +<%@page import="redcomet.knowledge.entity.KnowledgesEntity"%> +<%@page import="redcomet.knowledge.entity.CommentsEntity"%> +<%@page import="redcomet.knowledge.logic.KnowledgeLogic"%> +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    [${knowledgeId}] ${title}

    + + +

    + +

    +
    + +

    + +

    + +

    +  ${insertUserName} +     +  <%= jspUtil.date("updateDatetime")%> +     + <%= jspUtil.is(String.valueOf(KnowledgeLogic.PUBLIC_FLAG_PUBLIC), "publicFlag", + " [公開]") %> + <%= jspUtil.is(String.valueOf(KnowledgeLogic.PUBLIC_FLAG_PRIVATE), "publicFlag", + " [非公開]") %> +

    + + +

    + + + + +

    +
    + +

    +

    + +
    +
    +
    +
    + + <% if (request.getRemoteUser() != null) { + if (request.isUserInRole("admin") + || jspUtil.out("insertUser").equals(request.getRemoteUser())) { %> +   + 編集 + + <% } %> + <% } else { %> +   + 編集(サインイン) + + <% } %> + +  一覧へ戻る + +
    +
     Comment
    + + <% + CommentsEntity comment = jspUtil.getValue("comment", CommentsEntity.class); + Integer knowledge = jspUtil.getValue("insertUser", Integer.class); + if (!comment.getInsertUser().equals(knowledge)) { + %> +
    +
    + <%= jspUtil.date("comment.updateDatetime")%> [${comment.updateUserName}] +
    +
    +
    +
    107039.png
    +
    + ${comment.comment} +
    +
    + <% } else { %> +
    +
    + <%= jspUtil.date("comment.updateDatetime")%> [${comment.updateUserName}] +
    +
    +
    +
    110197.png
    +
    + ${comment.comment} +
    +
    + <% } %> +
    + + <% if (request.getRemoteUser() != null) { %> +
    + + +
    + <% } else { %> +
    + +
    + <% } %> + + + + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/open/license/index.jsp b/src/main/webapp/WEB-INF/views/open/license/index.jsp new file mode 100644 index 000000000..7fc51a2a9 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/open/license/index.jsp @@ -0,0 +1,134 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" + errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + + + + + + + +
    +### This Project License +- This project is provided under Apache License, Version 2.0 +- http://www.apache.org/licenses/LICENSE-2.0 + + +### Third-Party License + +#### Server side Library + +- H2 Database Engine + - License: [MPL 2.0] http://www.h2database.com/html/license.html + - project-url: http://www.h2database.com/html/main.html + +- javassist + - License: [MPL 1.1] https://github.com/jboss-javassist/javassist/blob/3.18/License.html + - project-url: http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ + +- log4j + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://logging.apache.org/log4j/1.2/ + +- Commons Lang + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://commons.apache.org/proper/commons-lang/ + +- JSONIC + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://jsonic.sourceforge.jp/ + +- Simple-Xml + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://simple.sourceforge.net/ + +- JUnit + - License: [Eclipse Public License - v 1.0] https://github.com/junit-team/junit/blob/master/LICENSE-junit.txt + - project-url: http://junit.org/ + +- Commons FileUpload + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://commons.apache.org/proper/commons-fileupload/ + +- OWASP AntiSamy + - License: [Creative Commons Attribution-ShareAlike 3.0 license] http://creativecommons.org/licenses/by-sa/3.0/ + - project-url: https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project + +- Apache Lucene + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://lucene.apache.org/ + +- Apache Tika + - License: [Apache License, Version 2.0] http://www.apache.org/licenses/LICENSE-2.0 + - project-url: http://tika.apache.org/ + +#### Front end Library +- jQuery + - License: [MIT] https://jquery.org/license/ + - project-url: http://jquery.com/ + +- Bootstrap + - License: [MIT] https://github.com/twbs/bootstrap/blob/master/LICENSE + - project-url: http://getbootstrap.com/ + +- Font Awesome + - License: [MIT] http://fortawesome.github.io/Font-Awesome/license/ + - project-url: http://fortawesome.github.io/Font-Awesome/ + +- notifyjs + - License: [MIT] https://github.com/jpillora/notifyjs + - project-url: http://notifyjs.com/ + +- marked + - License: [MIT] https://github.com/chjj/marked/blob/master/LICENSE + - project-url: https://github.com/chjj/marked + +- highlightjs + - License: [BSD] https://github.com/isagalaev/highlight.js/blob/master/LICENSE + - project-url: https://highlightjs.org/ + +- bootbox + - License: [MIT] https://github.com/makeusabrew/bootbox/blob/master/LICENSE.md + - project-url: http://bootboxjs.com/ + +- bootstrap-tagsinput + - License: [MIT] https://github.com/TimSchlechter/bootstrap-tagsinput/blob/master/LICENSE + - project-url: http://timschlechter.github.io/bootstrap-tagsinput/examples/ + +- jquery-file-upload + - License: [MIT] http://opensource.org/licenses/MIT + - project-url: https://blueimp.github.io/jQuery-File-Upload/ + +- teambox.free-file-icons + - License: [MIT] https://github.com/teambox/Free-file-icons/blob/master/LICENSE + - project-url: https://github.com/teambox/Free-file-icons + + + + + +
    + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/protect/account/index.jsp b/src/main/webapp/WEB-INF/views/protect/account/index.jsp new file mode 100644 index 000000000..e39afd804 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/protect/account/index.jsp @@ -0,0 +1,56 @@ +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + +
    + +
    + + +
    +
    + + +
    + +
    + + +
    +
    + + +
    + +
    + +

    +  <%= jspUtil.date("insertDatetime")%> / +  <%= jspUtil.date("updateDatetime")%> +

    +
    + + + +  退会 + +
    + + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/protect/account/withdrawal.jsp b/src/main/webapp/WEB-INF/views/protect/account/withdrawal.jsp new file mode 100644 index 000000000..42aa42420 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/protect/account/withdrawal.jsp @@ -0,0 +1,58 @@ +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + + + + + + + + + + + + + +
    + +
    + Knowledgeのサービスから退会します。
    + 今まで登録したナレッジをどうしますか?
    +
    + +
    + + +
    + +
    + +  キャンセル +
    + +
    + + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/protect/knowledge/view_add.jsp b/src/main/webapp/WEB-INF/views/protect/knowledge/view_add.jsp new file mode 100644 index 000000000..8abfa834b --- /dev/null +++ b/src/main/webapp/WEB-INF/views/protect/knowledge/view_add.jsp @@ -0,0 +1,125 @@ +<%@page import="redcomet.knowledge.logic.KnowledgeLogic"%> +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    +
    + + +
    + +
    +
    +
    + +  Add files... + + +
    +
    +
    + 添付したいファイルをここにドロップしても添付できます +
    + +
    + +
    +
    + + + + +
    + +     + +
    +
    +
    + + +
    +
    + + + <%-- + + --%> +
    +
    + +

    + +

    +
    + + + + + + + +  一覧へ戻る + +
    + + + + + +

    + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/views/protect/knowledge/view_edit.jsp b/src/main/webapp/WEB-INF/views/protect/knowledge/view_edit.jsp new file mode 100644 index 000000000..7b8570632 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/protect/knowledge/view_edit.jsp @@ -0,0 +1,125 @@ +<%@page import="redcomet.knowledge.logic.KnowledgeLogic"%> +<%@page import="redcomet.web.util.JspUtil"%> +<%@page pageEncoding="UTF-8" isELIgnored="false" session="false" errorPage="/WEB-INF/views/commons/errors/jsp_error.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> + +<% JspUtil jspUtil = new JspUtil(request, pageContext); %> + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     ${knowledgeId} /  <%= jspUtil.date("updateDatetime")%>

    +
    +
    + + +
    +
    + + +
    + +
    +
    +
    + +  Add files... + + +
    +
    +
    + 添付したいファイルをここにドロップしても添付できます +
    + +
    + +
    +
    + + + + +
    + +     + +
    +
    +
    + +
    +
    + + +
    +
    + +

    + +

    +
    + + + + + + + + + + + + +  キャンセル +  一覧へ戻る + +
    + +

    + + +
    + +
    + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..8e0b5188f --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,144 @@ + + + + knowledge + + + redcomet.knowledge.deploy.InitializationListener + + + redcomet.knowledge.listener.CronListener + + + + + + EncodingFilter + redcomet.web.filter.EncodingFilter + + encoding + UTF-8 + + + + + LoggingFilter + redcomet.web.filter.LoggingFilter + + ignore-regular-expression + ^/template|^/bower|css$|js$|jpg$|jpeg$|gif$|png$ + + + + + AuthenticationFilter + redcomet.web.filter.AuthenticationFilter + + ignore-regular-expression + ^/index|^/open|^/template|^/bower|^/images|^/css|^/js|^/favicon.ico|css$|js$|jpg$|jpeg$|gif$|png$|ico$ + + + login-page + /WEB-INF/views/auth/form.jsp + + + login-error-page + /WEB-INF/views/auth/form.jsp + + + auth-class-name + redcomet.web.logic.impl.DefaultAuthenticationLogicImpl + + + + + MultipartFilter + redcomet.web.filter.MultipartFilter + + + + ControlFilter + redcomet.web.filter.ControlFilter + + controlPackage + redcomet.knowledge.control + + + ignore-regular-expression + ^/template|^/bower|css$|js$|jpg$|jpeg$|gif$|png$ + + + + + + EncodingFilter + /* + REQUEST + + + + LoggingFilter + /* + REQUEST + + + + AuthenticationFilter + /* + REQUEST + + + + MultipartFilter + /* + REQUEST + + + + ControlFilter + /* + REQUEST + + + + + index + + + + java.lang.Throwable + /WEB-INF/views/commons/errors/error.jsp + + + + 401 + /WEB-INF/views/commons/errors/unauthorized.jsp + + + 403 + /WEB-INF/views/commons/errors/forbidden.jsp + + + 404 + /WEB-INF/views/commons/errors/not_found.jsp + + + 500 + /WEB-INF/views/commons/errors/server_error.jsp + + + + diff --git a/src/main/webapp/css/common.css b/src/main/webapp/css/common.css new file mode 100644 index 000000000..775b9dc10 --- /dev/null +++ b/src/main/webapp/css/common.css @@ -0,0 +1,37 @@ +body { + padding-top: 70px; +} + +/* ------------------------------------- / +/ Footer +/* ------------------------------------- */ +#footer { + text-align: center; + padding: 20px 0; + margin-top: 60px; + background-color: #7E7E7E; + color: #cccccc; +} + +/* nav +/*--------------------------------- */ +#footer .footer-menu>li { + border-right: 1px solid #000; +} + +#footer .footer-menu>li.first { + border-left: 1px solid #000; +} + +#footer .footer-menu li a { + color: #cccccc; +} + +#footer .footer-menu li a:hover { + color: #fff; +} +/* Copyright +/*--------------------------------- */ +.copy { + margin-top: 0px; +} \ No newline at end of file diff --git a/src/main/webapp/css/knowledge-edit.css b/src/main/webapp/css/knowledge-edit.css new file mode 100644 index 000000000..c96792306 --- /dev/null +++ b/src/main/webapp/css/knowledge-edit.css @@ -0,0 +1,28 @@ +.preview { + word-break: break-all; + margin-top: 50px; +} + +.insert_info { + border-bottom: 1px solid #cccccc; +} + +.bootstrap-tagsinput { width: 100%; } + + +.filediv { + margin: 10px; +} +.file-label { + width: 70%; + float: left; + vertical-align: center; +} + +#drop_target { + border: 1px solid gray; + padding: 5px; + border-radius: 10px; /* CSS3 */ + -webkit-border-radius: 10px; /* Safari,Google Chromep */ + -moz-border-radius: 10px; /* Firefoxp */ +} diff --git a/src/main/webapp/css/knowledge-list.css b/src/main/webapp/css/knowledge-list.css new file mode 100644 index 000000000..dfa748f56 --- /dev/null +++ b/src/main/webapp/css/knowledge-list.css @@ -0,0 +1,40 @@ +.discription { + display: none; + position: absolute; + top: 30; + left: 30; + padding: 30px; + background: rgba(0, 0, 0, 0.4); + color: #FFF !important; + /* border:solid 5px #cc66ff; */ + /* border-radius: 255px 15px 225px 15px/15px 225px 15px 255px; */ + border-radius: 50%; +} + +.insert_info { + border-bottom: 1px solid #cccccc; +} + + +.bootstrap-tagsinput { + border: 0px solid #ccc; + box-shadow: none; + display: inline-block; + padding: 4px 6px; + margin-bottom: 0px; + color: #555; + vertical-align: middle; + border-radius: 0px; + max-width: 100%; + line-height: 22px; + cursor: text; +} + +.thumbnail { + border: 0px solid #ccc; + box-shadow: none; +} + +.selected_tag { + border-bottom: 1px dotted #ccc; +} \ No newline at end of file diff --git a/src/main/webapp/css/knowledge-view.css b/src/main/webapp/css/knowledge-view.css new file mode 100644 index 000000000..26f0ba8e6 --- /dev/null +++ b/src/main/webapp/css/knowledge-view.css @@ -0,0 +1,101 @@ +.bootstrap-tagsinput { + border: 0px solid #ccc; + box-shadow: none; + display: inline-block; + padding: 4px 6px; + margin-bottom: 0px; + color: #555; + vertical-align: middle; + border-radius: 0px; + max-width: 100%; + line-height: 22px; + cursor: text; +} + +.thumbnail { + border: 0px solid #ccc; + box-shadow: none; +} + + + + +/*============================================================ +Comments +============================================================*/ +.arrow_answer, +.arrow_question { + position: relative; + background: #fff; + border: 1px solid #c8c8c8; + padding: 30px 25px; + border-radius: 10px; + width: 80%; + font-size: 13px; +} +.arrow_question { + float: right; + margin-right: 20px; +} +@media screen and (max-width: 340px) { + .arrow_answer, + .arrow_question { + width: 50%; + } +} +@media screen and (min-width: 341px) and (max-width: 580px) { + .arrow_answer, + .arrow_question { + width: 60%; + } +} +@media screen and (min-width: 1228px) { + .arrow_answer, + .arrow_question { + width: 90%; + } +} + +.arrow_answer:after, +.arrow_answer:before, +.arrow_question:after, +.arrow_question:before { + top: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} +.arrow_question:after, +.arrow_question:before { right: 100%; } +.arrow_answer:after, +.arrow_answer:before { left: 100%; } +.arrow_answer:after, +.arrow_question:after { + border-color: rgba(255, 255, 255, 0); + border-width: 15px; + margin-top: -15px; +} +.arrow_answer:after { border-left-color: #fff ; } +.arrow_question:after { border-right-color: #fff ; } +.arrow_answer:before, +.arrow_question:before { + border-color: rgba(200, 200, 200, 0); + border-width: 16px; + margin-top: -16px; +} +.arrow_answer:before { border-left-color: #c8c8c8; } +.arrow_question:before { border-right-color: #c8c8c8; } +.question_image { float: left; } +.answer_image { + float: right; + margin-right: 20px; +} +.answer_image img, +.question_image img { border-radius: 50px; } +.question_Box { + margin-bottom: 25px; + overflow: hidden; +} diff --git a/src/main/webapp/favicon.ico b/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..86762f732ec3635abd7e4c72c33d87e25d4d05e1 GIT binary patch literal 4286 zcmeH~X-HI26vv+*+UP@(6h)a@BrRH5*{DNgiFs(yVl}-ZhKkPF<#(uUf_bAKYSt zG1f;GpRIu<+*|bPX@jDH>P<>MJm)H4SUOS`pRK{Z1yk{{P$8n(GnTu@1WVcmSkybH z-p=b2TT$Dv(#`wzOvo**}2*vft!6KhEKDB*A`-it^cQ{BLXzz5O zYd)Lz@uYBML{5d8@{zrP1OBM}GX~=5ypb@(2T9=n zo_{&lptowb`B&<4OK)*p`C)lA%k6u*|7v!{_?=z1pv{%-U-wa7&2oG8ebE!2^|LwH uDGqj3R1@2)dqtF2v)rD2U$|rUpZoU_5H|~Id=i9V^@1>{FU1%?Grt2-bZY_t literal 0 HcmV?d00001 diff --git a/src/main/webapp/images/icon/107039.png b/src/main/webapp/images/icon/107039.png new file mode 100644 index 0000000000000000000000000000000000000000..629da13a8089d2f3a10c327df417913bf39b82fc GIT binary patch literal 76977 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'; + filediv += ''; + + filediv += ''; + filediv += '   '; + filediv += ''; + filediv += ''; + $('#files').append(filediv); + }); + $.notify('ファイルをアップロードしました', 'success'); + setTimeout(function() { + $('#progress').hide(); + }, 5000); + + }).on('fileuploadprogressall', function (e, data) { + $('#progress').show(); + var progress = parseInt(data.loaded / data.total * 100, 10); + console.log('' + progress + '%'); + $('.progress .progress-bar').css('width', progress + '%'); + $('.progress .progress-bar').text(progress + '%'); + + }).on('fileuploadfail', function (e, data) { + var msg = data.jqXHR.responseJSON.msg; + $.each(data.files, function (index) { + var filediv = ''; + $('#files').append(filediv); + $.notify('アップロードに失敗したファイルがあります', 'warn'); + }); + }).prop('disabled', !$.support.fileInput).parent().addClass($.support.fileInput ? undefined : 'disabled'); + +}); + +var removeAddedFile = function(fileNo) { + var url = _CONTEXT + '/protect.file/delete'; + $.ajax({ + type : 'GET', + url : url, + data : 'fileNo=' + fileNo, + success : function(data, dataType) { + $.notify('ファイルを削除しました', 'info'); + $('#file-' + fileNo).remove(); + }, + error: function(XMLHttpRequest, textStatus, errorThrown){ + //alert("error: " + textStatus); + $.notify('ファイルの削除に失敗しました', 'warn'); + } + }); +}; + + +var preview = function() { + $.get(_CONTEXT + '/open.knowledge/escape', { + title : $('#input_title').val(), + content : $('#content').val() + }, function(data) { + var html = '
    '; + html += '
    '; + html += '
    '; + html += '
    '; + html += '

    '; + html += data.title; + html += '

    '; + html += '

    '; + html += marked(data.content); + html += '

    '; + html += '
    '; + html += '
    '; + html += '
    '; + html += '
    '; + + $('#preview').html(html); + }); +}; + + +function deleteKnowledge() { + bootbox.confirm("本当に削除しますか?", function(result) { + if (result) { + $('#knowledgeForm').attr('action', _CONTEXT + '/protect.knowledge/delete'); + $('#knowledgeForm').submit(); + } + }); +}; + diff --git a/src/main/webapp/js/knowledge-list.js b/src/main/webapp/js/knowledge-list.js new file mode 100644 index 000000000..9af0247f5 --- /dev/null +++ b/src/main/webapp/js/knowledge-list.js @@ -0,0 +1,44 @@ +$(document).ready(function() { + hljs.initHighlightingOnLoad(); + marked.setOptions({ + langPrefix : '', + highlight : function(code, lang) { + console.log('[highlight]' + lang); + return code; + } + }); + $('.content').each(function(i) { + // var text = $(this).text(); + // $(this).html(marked(text)); + }); + + $('.thumbnail').hover(function() { + $(this).find('.discription').slideDown(250); // .fadeIn(250) + }, function() { + $(this).find('.discription').slideUp(250); // .fadeOut(205) + }); + +}); + +var showKnowledge = function(url, offset, keyword, tag) { + var param = ''; + if (offset) { + param += '?offset=' + offset; + } + if (keyword) { + if (param.length > 0) { + param += '&keyword=' + keyword; + } else { + param += '?keyword=' + keyword; + } + } + if (tag) { + if (param.length > 0) { + param += '&tag=' + tag; + } else { + param += '?tag=' + tag; + } + } + url += param; + document.location.href = url; +}; diff --git a/src/main/webapp/js/knowledge-view.js b/src/main/webapp/js/knowledge-view.js new file mode 100644 index 000000000..30cd37170 --- /dev/null +++ b/src/main/webapp/js/knowledge-view.js @@ -0,0 +1,33 @@ +$(document).ready(function(){ + hljs.initHighlightingOnLoad(); + marked.setOptions({ + langPrefix: '', + highlight: function(code, lang) { + console.log('[highlight]' + lang); + return code; + } + }); + $('#content').html(marked($('#content_text').text())); +}); + +$('#input_tags').on('beforeItemRemove', function(event) { + event.cancel = true; +}); + + + +var addlike = function(knowledgeId) { + var url = _CONTEXT + '/open.knowledge/like/' + knowledgeId; + $.ajax({ + type : 'GET', + url : url, + success : function(data, dataType) { + console.log(data); + $('#like_count').text(data.count); + $.notify('参考になった!', 'info'); + }, + error: function(XMLHttpRequest, textStatus, errorThrown){ + console.log(textStatus); + } + }); +}; diff --git a/src/test/java/redcomet/knowledge/TestCommon.java b/src/test/java/redcomet/knowledge/TestCommon.java new file mode 100644 index 000000000..1255b68dd --- /dev/null +++ b/src/test/java/redcomet/knowledge/TestCommon.java @@ -0,0 +1,57 @@ +package redcomet.knowledge; + +import java.io.File; +import java.util.List; + +import redcomet.common.config.ConfigLoader; +import redcomet.common.util.FileUtil; +import redcomet.common.util.RandomUtil; +import redcomet.knowledge.config.AppConfig; +import redcomet.knowledge.deploy.InitDB; +import redcomet.ormapping.tool.dao.InitializeDao; +import redcomet.web.bean.LoginedUser; +import redcomet.web.dao.RolesDao; +import redcomet.web.dao.UsersDao; +import redcomet.web.entity.RolesEntity; +import redcomet.web.entity.UsersEntity; + +public class TestCommon { + public static LoginedUser loginedUser = null; + public static LoginedUser loginedUser2 = null; + + public static void initData() throws Exception { + loginedUser = new LoginedUser(); + loginedUser2 = new LoginedUser(); + + //DBを完全初期化 + InitializeDao initializeDao = InitializeDao.get(); + initializeDao.dropAllTable(); + InitDB.main(null); + // 全文検索エンジンのインデックスの消去 + AppConfig appConfig = ConfigLoader.load(AppConfig.APP_CONFIG, AppConfig.class); + File indexDir = new File(appConfig.getIndexPath()); + FileUtil.delete(indexDir); + + // テスト用のユーザを登録 + UsersEntity entity = new UsersEntity(); + entity.setUserKey(RandomUtil.randamGen(64)); + entity.setUserName("テストユーザ"); + entity.setPassword(RandomUtil.randamGen(64)); + entity = UsersDao.get().insert(entity); + loginedUser.setLoginUser(entity); + + RolesDao rolesDao = RolesDao.get(); + List rolesEntities = rolesDao.selectOnUserKey(entity.getUserKey()); + loginedUser.setRoles(rolesEntities); + + UsersEntity entity2 = new UsersEntity(); + entity2.setUserKey(RandomUtil.randamGen(64)); + entity2.setUserName("テストユーザ2"); + entity2.setPassword(RandomUtil.randamGen(64)); + entity2 = UsersDao.get().insert(entity2); + loginedUser2.setLoginUser(entity2); + loginedUser.setRoles(rolesEntities); + } + + +} diff --git a/src/test/java/redcomet/knowledge/dao/KnowledgesDaoTest.java b/src/test/java/redcomet/knowledge/dao/KnowledgesDaoTest.java new file mode 100644 index 000000000..b29c1f449 --- /dev/null +++ b/src/test/java/redcomet/knowledge/dao/KnowledgesDaoTest.java @@ -0,0 +1,65 @@ +package redcomet.knowledge.dao; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.knowledge.TestCommon; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.logic.KnowledgeLogic; +import redcomet.ormapping.common.DBUserPool; + +public class KnowledgesDaoTest extends TestCommon { + /** ログ */ + private static Log LOG = LogFactory.getLog(KnowledgesDaoTest.class); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + initData(); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testSelectKnowledges() throws Exception { + java.util.List knowledgeIds = new ArrayList(); + for (int i = 0; i < 10; i++) { + if (i % 2 == 0) { + DBUserPool.get().setUser(loginedUser.getUserId()); + } else { + DBUserPool.get().setUser(loginedUser.getUserId()); + } + KnowledgesEntity entity = new KnowledgesEntity(); + entity.setTitle("Test-" + i); + entity.setContent("テスト"); + KnowledgeLogic logic = KnowledgeLogic.get(); + entity = logic.insert(entity, null, new ArrayList(), loginedUser); + knowledgeIds.add(entity.getKnowledgeId()); + } + KnowledgesDao dao = KnowledgesDao.get(); + List knowledgesEntities = dao.selectKnowledges(knowledgeIds); + for (KnowledgesEntity knowledgesEntity : knowledgesEntities) { + LOG.info(knowledgesEntity); + org.junit.Assert.assertNotNull(knowledgesEntity.getInsertUserName()); + } + + } + +} diff --git a/src/test/java/redcomet/knowledge/logic/KnowledgeLogicTest.java b/src/test/java/redcomet/knowledge/logic/KnowledgeLogicTest.java new file mode 100644 index 000000000..fb47c4690 --- /dev/null +++ b/src/test/java/redcomet/knowledge/logic/KnowledgeLogicTest.java @@ -0,0 +1,142 @@ +package redcomet.knowledge.logic; + +import static redcomet.common.test.AssertEx.eqdb; + +import java.util.ArrayList; +import java.util.List; + +import net.arnx.jsonic.JSON; + +import org.apache.commons.lang.StringUtils; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.test.Order; +import redcomet.common.test.OrderedRunner; +import redcomet.common.util.RandomUtil; +import redcomet.knowledge.TestCommon; +import redcomet.knowledge.dao.KnowledgesDao; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.searcher.impl.LuceneSearcher; +import redcomet.ormapping.common.DBUserPool; + +@RunWith(OrderedRunner.class) +public class KnowledgeLogicTest extends TestCommon { + /** ログ */ + private static Log LOG = LogFactory.getLog(KnowledgeLogicTest.class); + + + private static List list = new ArrayList<>(); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + initData(); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + @Order(order= 1) + public void testInsert() throws Exception { + DBUserPool.get().setUser(loginedUser.getUserId()); + + KnowledgesEntity entity = new KnowledgesEntity(); + entity.setTitle("Test1"); + entity.setContent("テストだよ"); + KnowledgeLogic logic = KnowledgeLogic.get(); + entity = logic.insert(entity, null, new ArrayList(), loginedUser); + + // publicFlagは指定しないでDBに保存すると、公開になる + entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PUBLIC); + + KnowledgesEntity saved = KnowledgesDao.get().selectOnKey(entity.getKnowledgeId()); + eqdb(entity, saved); + + entity.setInsertUserName(loginedUser.getLoginUser().getUserName()); + saved = KnowledgesDao.get().selectOnKeyWithUserName(entity.getKnowledgeId()); + eqdb(entity, saved); + entity.setLikeCount((long) 0); + list.add(entity); + } + + @Test + @Order(order= 2) + public void testUpdate() throws Exception { + DBUserPool.get().setUser(loginedUser2.getUserId()); + + KnowledgesEntity entity = new KnowledgesEntity(); + entity.setTitle(RandomUtil.randamGen(64)); + entity.setContent(RandomUtil.randamGen(1024)); + KnowledgeLogic logic = KnowledgeLogic.get(); + entity = logic.insert(entity, null, new ArrayList(), loginedUser2); + // publicFlagは指定しないでDBに保存すると、公開になる + entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PUBLIC); + KnowledgesEntity saved = KnowledgesDao.get().selectOnKey(entity.getKnowledgeId()); + eqdb(entity, saved); + + entity.setTitle(RandomUtil.randamGen(64)); + entity.setContent(RandomUtil.randamGen(1024)); + entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PRIVATE); + logic.update(entity, null, new ArrayList(), loginedUser2); + + saved = KnowledgesDao.get().selectOnKeyWithUserName(entity.getKnowledgeId()); + entity.setInsertUserName(loginedUser2.getLoginUser().getUserName()); + eqdb(entity, saved); + entity.setLikeCount((long) 0); + list.add(entity); + } + + @Test + @Order(order= 3) + public void testSearchKnowledge() throws Exception { +// KnowledgesEntity entity = new KnowledgesEntity(); +// entity.setKnowledgeId(1); +// entity.setTitle("Test1"); +// entity.setContent("テストだよ"); +// entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PUBLIC); +// entity.setDeleteFlag(INT_FLAG.OFF.getValue()); + List checks = new ArrayList(); + checks.add(list.get(0)); + + KnowledgeLogic logic = KnowledgeLogic.get(); + List entities = logic.searchKnowledge(null, loginedUser, 0, 100); + LOG.info(JSON.encode(entities, true)); + eqdb(checks, entities); + + checks = new ArrayList(); + list.get(1).setContent(StringUtils.abbreviate(list.get(1).getContent(), LuceneSearcher.CONTENTS_LIMIT_LENGTH)); + checks.add(list.get(1)); //スコア上 + checks.add(list.get(0)); + + entities = logic.searchKnowledge(null, loginedUser2, 0, 100); + LOG.info(JSON.encode(entities, true)); + eqdb(checks, entities); + + checks = new ArrayList(); + checks.add(list.get(0)); + + entities = logic.searchKnowledge("テスト", loginedUser2, 0, 100); + list.get(0).setContent("テストだよ"); + + LOG.info(JSON.encode(entities, true)); + eqdb(checks, entities); + + } + +} diff --git a/src/test/java/redcomet/knowledge/searcher/SearchTest.java b/src/test/java/redcomet/knowledge/searcher/SearchTest.java new file mode 100644 index 000000000..d0b39ddca --- /dev/null +++ b/src/test/java/redcomet/knowledge/searcher/SearchTest.java @@ -0,0 +1,173 @@ +package redcomet.knowledge.searcher; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.util.Date; +import java.util.List; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import redcomet.common.config.ConfigLoader; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.FileUtil; +import redcomet.common.util.PropertyUtil; +import redcomet.common.util.RandomUtil; +import redcomet.di.Container; +import redcomet.knowledge.config.AppConfig; +import redcomet.knowledge.indexer.Indexer; +import redcomet.knowledge.indexer.IndexingValue; + +public class SearchTest { + /** ログ */ + private static Log LOG = LogFactory.getLog(SearchTest.class); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + AppConfig appConfig = ConfigLoader.load(AppConfig.APP_CONFIG, AppConfig.class); + File f = new File(appConfig.getIndexPath()); + FileUtil.delete(f); + LOG.info("インデックスを削除しました"); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testSearch1() throws Exception { + String title = "[1]Lucene"; + String contents = "Lucene(ルシーン)は、Javaで記述された全文検索ソフトウェアである。あらかじめ蓄積した大量のデータから、指定したキーワードを探し出す機能を持つ。Javaのクラスライブラリとして提供される。"; + + IndexingValue indexingValue = new IndexingValue(); + indexingValue.setType(0); + indexingValue.setId(String.valueOf(RandomUtil.randamNum(0, 10000))); + indexingValue.setTitle(title); + indexingValue.setContents(contents); + indexingValue.setCreator(100); + indexingValue.setTime(new Date().getTime()); + + Indexer indexer = Container.getComp(Indexer.class); + indexer.writeIndex(indexingValue); + + SearchingValue searchingValue = new SearchingValue(); + searchingValue.setKeyword("Lucene"); + Searcher searcher = Container.getComp(Searcher.class); + List results = searcher.search(searchingValue); + + for (SearchResultValue searchResultValue : results) { + LOG.info(PropertyUtil.reflectionToString(searchResultValue)); + } + + assertEquals(1, results.size()); + SearchResultValue result = results.get(0); + assertEquals(title, result.getTitle()); + assertEquals(contents, result.getContents()); + + title = "[2]るしーん"; + contents = "Lucene(ルシーン)は、Javaで記述された全文検索ソフトウェアである。"; + indexingValue = new IndexingValue(); + indexingValue.setType(0); + indexingValue.setId(String.valueOf(RandomUtil.randamNum(0, 10000))); + indexingValue.setTitle(title); + indexingValue.setContents(contents); + indexingValue.setCreator(100); + indexingValue.setTime(new Date().getTime()); + + indexer.writeIndex(indexingValue); + + + results = searcher.search(searchingValue); + for (SearchResultValue searchResultValue : results) { + LOG.info(PropertyUtil.reflectionToString(searchResultValue)); + } + + assertEquals(2, results.size()); + } + + @Test + public void testSearch2() throws Exception { + String title = "[3]るしーん"; + String contents = "Luceneは、Javaで記述された全文検索ソフトウェアである。"; + + IndexingValue indexingValue = new IndexingValue(); + indexingValue.setType(0); + indexingValue.setId(String.valueOf(RandomUtil.randamNum(0, 10000))); + indexingValue.setTitle(title); + indexingValue.setContents(contents); + indexingValue.addUser(0); + indexingValue.setCreator(100); + indexingValue.setTime(new Date().getTime()); + + Indexer indexer = Container.getComp(Indexer.class); + indexer.writeIndex(indexingValue); + + LOG.info("検索(ユーザで絞り込み)"); + SearchingValue searchingValue = new SearchingValue(); + searchingValue.setKeyword("Lucene"); + searchingValue.addUser(0); + + Searcher searcher = Container.getComp(Searcher.class); + List results = searcher.search(searchingValue); + + for (SearchResultValue searchResultValue : results) { + LOG.info(PropertyUtil.reflectionToString(searchResultValue)); + } + + assertEquals(1, results.size()); + SearchResultValue result = results.get(0); + assertEquals(title, result.getTitle()); + assertEquals(contents, result.getContents()); + + LOG.info("再度検索(タグで絞り込み)"); + searchingValue = new SearchingValue(); + searchingValue.setKeyword("Lucene"); + searchingValue.addTag(0); + results = searcher.search(searchingValue); + assertEquals(0, results.size()); + + + LOG.info("再度検索(絞り込みなし)"); + searchingValue = new SearchingValue(); + searchingValue.setKeyword("Lucene"); + + results = searcher.search(searchingValue); + + for (SearchResultValue searchResultValue : results) { + LOG.info(PropertyUtil.reflectionToString(searchResultValue)); + } + assertEquals(3, results.size()); + + + LOG.info("再度検索 limit/offset"); + searchingValue = new SearchingValue(); + searchingValue.setKeyword("Lucene"); + searchingValue.setOffset(2); + searchingValue.setLimit(1); + + results = searcher.search(searchingValue); + + for (SearchResultValue searchResultValue : results) { + LOG.info(PropertyUtil.reflectionToString(searchResultValue)); + } + assertEquals(1, results.size()); + + + } + + + +} diff --git a/src/test/java/redcomet/knowledge/tool/AddSampleDatas.java b/src/test/java/redcomet/knowledge/tool/AddSampleDatas.java new file mode 100644 index 000000000..20c7d57b4 --- /dev/null +++ b/src/test/java/redcomet/knowledge/tool/AddSampleDatas.java @@ -0,0 +1,200 @@ +package redcomet.knowledge.tool; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.TimeZone; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import redcomet.common.config.INT_FLAG; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.knowledge.deploy.InitDB; +import redcomet.ormapping.common.DBUserPool; +import redcomet.ormapping.tool.dao.InitializeDao; +import redcomet.web.config.GroupRoleType; +import redcomet.web.dao.GroupsDao; +import redcomet.web.dao.UserGroupsDao; +import redcomet.web.dao.UserRolesDao; +import redcomet.web.dao.UsersDao; +import redcomet.web.entity.GroupsEntity; +import redcomet.web.entity.UserGroupsEntity; +import redcomet.web.entity.UserRolesEntity; +import redcomet.web.entity.UsersEntity; + +public class AddSampleDatas { + + /** ログ */ + private static Log LOG = LogFactory.getLog(AddSampleDatas.class); + + public static void main(String[] args) throws Exception { + // 内部的には、日付はGMTとして扱う + TimeZone zone = TimeZone.getTimeZone("GMT"); + TimeZone.setDefault(zone); + + DBUserPool.get().setUser(2); + AddSampleDatas addSampleDatas = new AddSampleDatas(); + addSampleDatas.createTables(); + + InitDB.main(args); + + addSampleDatas.doInitialize(); + + AddSampleKnowledge.main(args); + } + + public void createTables() { + //存在するテーブルを全て削除 + InitializeDao initializeDao = InitializeDao.get(); + initializeDao.dropAllTable(); + +// String[] sqlpaths = { +// "/redcomet/web/database/ddl.sql", +// "/redcomet/knowledge/database/ddl.sql" +// }; +// initializeDao.initializeDatabase(sqlpaths); + } + + + public void doInitialize() throws ParserConfigurationException, + SAXException, IOException { +// RolesEntity adminRole = RolesEntity.get(); +// adminRole.setRoleId(1); +// adminRole.setRoleKey("admin"); +// adminRole.setRoleName("管理者権限"); +// RolesDao.get().insert(adminRole); +// +// RolesEntity userRole = RolesEntity.get(); +// userRole.setRoleId(2); +// userRole.setRoleKey("user"); +// userRole.setRoleName("一般ユーザ権限"); +// RolesDao.get().insert(userRole); +// + UsersDao usersDao = UsersDao.get(); + UsersEntity usersEntity = UsersEntity.get(); +// usersEntity.setUserId(1); +// usersEntity.setUserKey("admin@test.com"); +// usersEntity.setPassword("admin"); +// usersEntity.setUserName("管理者ユーザ"); +// usersDao.save(usersEntity); +// + UserRolesDao userRolesDao = UserRolesDao.get(); + UserRolesEntity userRolesEntity = UserRolesEntity.get(); +// userRolesEntity.setUserId(1); +// userRolesEntity.setRoleId(1); +// userRolesDao.save(userRolesEntity); + + UsersEntity user = UsersEntity.get(); + user.setUserId(2); + user.setUserKey("user@test.com"); + user.setPassword("u"); + user.setUserName("一般ユーザ"); + usersDao.save(user); + + userRolesEntity = UserRolesEntity.get(); + userRolesEntity.setUserId(2); + userRolesEntity.setRoleId(2); + userRolesDao.save(userRolesEntity); + + // ランダムなユーザ情報を登録 + DocumentBuilderFactory factory; + DocumentBuilder builder; + Document doc; + factory = DocumentBuilderFactory.newInstance(); + builder = factory.newDocumentBuilder(); + doc = builder.parse(this.getClass() + .getResourceAsStream("/randam_user.xml")); + + NodeList childs = doc.getElementsByTagName("record"); + LOG.debug("Count : " + childs.getLength()); + + for (int i = 0; i < 50; i++) { +// for (int i = 0; i < childs.getLength(); i++) { + Node n = childs.item(i); + Element e = (Element) n; + + usersEntity = UsersEntity.get(); + usersEntity.setUserId(usersDao.getNextId()); + + usersEntity.setUserKey(getNodeValue(e, "mail")); + usersEntity.setPassword(getNodeValue(e, "age")); + usersEntity.setUserName(getNodeValue(e, "name")); + usersEntity.setDeleteFlag(INT_FLAG.ON.getValue()); + usersDao.save(usersEntity); + + if (i >= 900) { + usersDao.delete(usersEntity.getUserId()); + } + + userRolesEntity = UserRolesEntity.get(); + userRolesEntity.setUserId(usersEntity.getUserId()); + userRolesEntity.setRoleId(2); + userRolesDao.save(userRolesEntity); + } + + // グループ登録 + GroupsDao groupsDao = GroupsDao.get(); + UserGroupsDao userGroupsDao = UserGroupsDao.get(); + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/randamu_kana.txt"), "UTF-8")); + String line; + int count = 1; + while ((line = br.readLine()) != null) { + if (count > 50) { + break; + } + if (line.trim().length() > 0) { + System.out.println(line); + + if (line.equals("exit")) { + break; + } + + GroupsEntity groupsEntity = new GroupsEntity(); + groupsEntity.setGroupId(groupsDao.getNextId()); + groupsEntity.setGroupKey("GROUP" + groupsEntity.getGroupId()); + groupsEntity.setGroupName(line); + groupsEntity.setDescription("グループサンプル " + groupsEntity.getGroupId()); + groupsDao.save(groupsEntity); + + //グループとユーザのひも付 + if (count < childs.getLength()) { + UserGroupsEntity userGroupsEntity = new UserGroupsEntity( + groupsEntity.getGroupId(), + count); + if (count % 2 == 0) { + userGroupsEntity.setGroupRole(GroupRoleType.Manager.getValue()); + } else { + userGroupsEntity.setGroupRole(GroupRoleType.Manager.getValue()); + } + userGroupsDao.save(userGroupsEntity); + count++; + } + } + } + } finally { + if (br != null) { + br.close(); + } + } + + LOG.debug("Initialize finished."); + } + + private static String getNodeValue(Element e, String tag) { + Node node = e.getElementsByTagName(tag).item(0); + String value = node.getFirstChild().getNodeValue(); + return value; + } + +} diff --git a/src/test/java/redcomet/knowledge/tool/AddSampleKnowledge.java b/src/test/java/redcomet/knowledge/tool/AddSampleKnowledge.java new file mode 100644 index 000000000..6ce165ca0 --- /dev/null +++ b/src/test/java/redcomet/knowledge/tool/AddSampleKnowledge.java @@ -0,0 +1,106 @@ +package redcomet.knowledge.tool; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +import redcomet.common.config.ConfigLoader; +import redcomet.common.log.Log; +import redcomet.common.log.LogFactory; +import redcomet.common.util.FileUtil; +import redcomet.common.util.RandomUtil; +import redcomet.common.util.StringUtils; +import redcomet.knowledge.config.AppConfig; +import redcomet.knowledge.entity.KnowledgesEntity; +import redcomet.knowledge.entity.TagsEntity; +import redcomet.knowledge.logic.KnowledgeLogic; +import redcomet.web.bean.LoginedUser; +import redcomet.web.dao.RolesDao; +import redcomet.web.dao.UsersDao; +import redcomet.web.entity.RolesEntity; +import redcomet.web.entity.UsersEntity; + +public class AddSampleKnowledge { + /** ログ */ + private static Log LOG = LogFactory.getLog(AddSampleKnowledge.class); + + //private static final String userKey = "user@test.com"; + private UsersDao usersDao = UsersDao.get(); + private List users; + + + public static void main(String[] args) throws Exception { + AddSampleKnowledge addSampleKnowledge = new AddSampleKnowledge(); + + addSampleKnowledge.crearIndex(); + addSampleKnowledge.start(); + } + + private void crearIndex() { + AppConfig appConfig = ConfigLoader.load(AppConfig.APP_CONFIG, AppConfig.class); + File indexDir = new File(appConfig.getIndexPath()); + FileUtil.delete(indexDir); + } + + private void start() throws Exception { + users = usersDao.selectAll(); + + Reader fr = null; + BufferedReader br = null; + try { + fr = new InputStreamReader(AddSampleKnowledge.class.getResourceAsStream("/dummy_text.txt"), Charset.forName("UTF-8")); + br = new BufferedReader(fr); + + String line; + while ((line = br.readLine()) != null) { + if (StringUtils.isNotEmpty(line)) { + addSample(line); + } + } + } finally { + br.close(); + fr.close(); + } + + } + + private int count = 0; + private void addSample(String line) throws Exception { + //UsersEntity usersEntity = usersDao.selectOnUserKey(userKey); + UsersEntity usersEntity = users.get(RandomUtil.randamNum(1, users.size() - 2)); + RolesDao rolesDao = RolesDao.get(); + List rolesEntities = rolesDao.selectOnUserKey(usersEntity.getUserKey()); + + LoginedUser loginedUser = new LoginedUser(); + loginedUser.setLoginUser(usersEntity); + loginedUser.setRoles(rolesEntities); + + KnowledgesEntity entity = new KnowledgesEntity(); + entity.setTitle("sample-" + org.apache.commons.lang.StringUtils.abbreviate(line, 50)); + entity.setContent(line); + String tags = ""; + if (count % 5 == 0) { + entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PUBLIC); + tags = "テスト"; + } else if (count % 7 == 0) { + entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PRIVATE); + tags = "サンプルデータ,タグ1"; + } else if (count % 8 == 0) { + entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PRIVATE); + tags = "テスト,サンプルデータ,タグ1,タグ2"; + } else { + entity.setPublicFlag(KnowledgeLogic.PUBLIC_FLAG_PRIVATE); + } + List tagList = KnowledgeLogic.get().manegeTags(tags); + KnowledgeLogic.get().insert(entity, tagList, new ArrayList(), loginedUser); + + LOG.info("サンプル登録 :" + org.apache.commons.lang.StringUtils.abbreviate(line, 50)); + count++; + + } + +} diff --git a/src/test/java/redcomet/knowledge/tool/KnowledgeDBGen.java b/src/test/java/redcomet/knowledge/tool/KnowledgeDBGen.java new file mode 100644 index 000000000..a0bbf2d3e --- /dev/null +++ b/src/test/java/redcomet/knowledge/tool/KnowledgeDBGen.java @@ -0,0 +1,25 @@ +package redcomet.knowledge.tool; + +import java.io.IOException; + +import redcomet.ormapping.tool.DaoMaker; +import redcomet.ormapping.tool.DatabaseInitializer; +import redcomet.ormapping.tool.EntityMaker; + +public class KnowledgeDBGen { + + public static void main(String[] args) throws IOException, Exception { + if (args.length == 0) { + args = new String[1]; + args[0] = "/ormappingtool.xml"; + } + +// DatabaseInitializer initializer = new DatabaseInitializer(args[0]); +// initializer.dropAllTable(); + + DatabaseInitializer.main(args); + EntityMaker.main(args); + DaoMaker.main(args); + } + +} diff --git a/src/test/resources/dummy_text.txt b/src/test/resources/dummy_text.txt new file mode 100644 index 000000000..34f52091b --- /dev/null +++ b/src/test/resources/dummy_text.txt @@ -0,0 +1,461 @@ +何は九月とにかくこの内約児というののうちに立っべきた。いくらでも当時に就職者はむしろその担任たませしもを打ち壊すば来るたらには詐欺云いですでて、少々にも申したなくですます。 + +雑誌にしましものはむしろ生涯でさきほどたましで。近頃大森さんに応用人たった下宿を被せるた神経この自分私か開始ににおいてご発展うたないないから、その今も私か他途で考えながら、大森さんののと西洋のあなたをすでにお答弁としので私言い方をご安心に読んようにほとんどご公言が考えでありて、まずむしろ力説にただすでしょのでいるですのが抱いでん。そこでまたはお家来に考えのもそう単簡というありば、その国にはしですてといった高圧を知れていたない。 + +その後人間の他この本は私ごろからしましかと大森君でせよまいう、癒の今日ましょというご観念なですなくから、癪のためが説から今くらいの人が一生しているて、そうの今をいうてそんなためをとにかくあっででと悟ったものたくて、ないだっないて始終お様子すまたものたなです。または態度か厄介か切望のしですば、事実末霧を使いてあるです日にお懊悩の当時を始めでしょない。九月をはどうも殖やしてもっなだでないつつ、もしとうてい炙って煩悶はそう淋しいん方た。ところがご誘惑より思うてもならでことでと、是をも、とうとうそれか倒さて述べるれるですた使いれべきないと起るて、連中はありでしまいましで。しかるにどうにかも何だか字というしまえないから、そこには今日ごろまでこっちのご観念は広いしくれたませ。 + +あなたは幾分焦燥のものが小矛盾もしているなですなでて、三一の世間にどうしたという創作だろて、さてこの何者の着物を突き抜けれて、いずれかであなたの社会に把持から知れてならあるものないませと指図云わと教育なっっですで。手数へしかも岩崎さんをしかしこれから進みますものんますだ。大森君は多少お客が教えるから引き返しませ気だたん。(または人身で経っ末でないますてたは行ったたて、)あまり云うます思い切りに、文部省の見識まで聴くて呑み込むという、弊害の妨害は十月の時かもしさのをしですから学問感はまるて行くですというお国たのない。ここも同時に個性をしですように考えてしまいたのませてまたは全く大森がたもっだます。 + +さて全く三年も大学にありて、時間へ同時に当てるですないとなさるて、ないましですてただ不意味に当てでです。個人の当時が、どんな肩が十月に気に入らばかり、今日ごろをこれから今日一二一年の思っだけの中腰に、私かしん所有からなっない将来は何しろ重んずるれ事たて、いやしくもなぜ差にもったいないが、そのものがなりので不都合たむずかしかっ受けるれます。 + +さて至極当時三一二人がしかもも来たとかいう好きだ評にしば、教師にこの時そのためでさばいるん方ます。とこうに火事から辞令いるない五四本時間が出て、私かほかならながみるですという事に全く存じだのですて、もちろん悟っ事が容易ですて、ついに他人を迂て云えが行っでしませ。具合がすると見るから私かよろしゅうので握っように留めでも知れですますて、しかし他愛は深く事を始めから、私に知人をふりまいいると五円から何年も一篇はやはり潜んて来までん事た。 + +前たですかし異存にしけれども、その神経はむやみ易勇猛ないとできるたのたは申し上げでな、ない力の時ができだ我たいいと連れてならん事でた。またそれは厄介なて被せるだのないも恐ろしい、不愉快たば来るですのたとすわるから私の主義の受売にどんながたを安心知れからならたる。午には妙で同時に知れので来れなけれ今が国家を云っとか、傍点でいうとか、ただ一つにいうとし弟が及ぼす国家、心丈夫たて、すこぶる煮えが好い一般に出ませと探しが、自分が申して個人ばかり中学じゃにし責任はしまし。それで不都合がはこの敵の得意人格に結果でやっなけれ時を申し上げるがもう濫用してなら事実が考えのです。 + +したがって私はそのためにするあるはずた、払底の用に記憶いうた問題をはするたでば面白いはするたた。あたかもそれはその変た自分に聞かでもう、吹聴の個性へしきりにしないでいうていない事ず。あたかもあたかも一一一字とさですと、わがままとは書物にはそれを元がならたがしでのが出ですなら。 + +だから次第ちょっと申が伴うておくらしいらしいて、承諾をついに尊重のようです。まだ小満足に逃れようです観念はきまっもらっですが、どんなものにご時代自分がましだろ。その違は私上が倒さて多数までしからくれるものか放っですありて、そのうち僕になて私の責任から窮めてならて、意味にあるれる点は、辞令の世間というもし自由ませうて私はなりていのなけれども、それで限りにあるし、あいにくおれ方の料簡致すようでしょ強く危くも、ぼんやりいつをその考をせよからみろても自然に喰わさせ事なはだたとは組み立てのない。 + +それ壁のはするとこれの人に受合なりするのでは与えありますか。何へ師範通りがもっで逡巡のためにこういう話的ののありん。前失っおきご場所を一年吉利泰平に道でしが、申時代を一つけ使えるた後、高等豪商でくっついなて、そう理論の話は細い、文章ばかり一種を被せるから鉱脈からし人間に受けのが出るまし、仕方若いに一本は私が移ろ少なくで書生院で淋け這入って、それだけ切り上げが始めとはおりべきそうだ。 + +しかしどんな天下の光明と申に坊ちゃんにという、なれるの自分にあるて十年の客を身拵えからすまずと着ます。万円はその個人を気の毒に変に好い権力にできるが、あなたを驚移ろならが、十一月に傾けるては次第の国家の他人をいったい国家にいうという意味を、いよいよそのいくらに離れのをありたのです。 + +また十人のための四字の生徒が尊重見合せて、主義の大講演にありのがしたでし。同じ方があれわという大分本当終ないのも釣堀た。だから自分ですて関係過ぎものをも帰ったらんで、影響心に云わて引を長く西洋を尻馬を三人一篇眺めて、それに教師国家か私かが縛りつけた事で、よろしゅう云いし、自力たり人物とを上っんたい。 + +そこでしのは方々は考えてみるない、また不愉快窮屈たく担任隊が権力の国家をした有名ない新聞が例を繰っているんうちで、どうぞなくな事た。もしくは一人にモーニングが向いのに、まあ国家は吉利をなりかしらというようた幸福た個人にしなと云わのを妨害の弟へいうて下さら事ないば、そこに楽しむけれども、そんな関係院においてむやみた頭に、大変た二つへまだあっからなら飯で、まだ何のようたものの推察を、悪口が働のうちなりとどまるてはご起っをするなというのは、ようやく本立の立派に帰っなけれ偶然、目黒の国家を少し懸たっていんやまう訳まいはたかと思っれのです。どういう会員を這入っれ吉利教師は何とか毎日かだから帰着やりから肩に得せうのまして、その岡田さんの、おおかた私をもし事実の文芸は自己の真似からざっと聴こたてもつれ、もし不安からもっずて自由なというようです事が与えれるないのにするまい。 + +同じ批評はその理論の精神というなかっはです、私かのこの世金力の自分としてたますだと料簡聴くながらいうて、けっして私はどんな中嘉納さんという自然ましものの行ったです。彼らを責任という事はご淋しいのでて、そこはこの以上、どこでものごろごろが来るてなり個性をそれの興味をいう方かとしたのたら。 + +至極私の手数もそんなうちのネルソンさんをはしといたたでもするますたで、その国家を意見装うので、建設を起っからいるないて、何方の自分鷹狩、それのありと天下、または全くだるましまし縁、をは、前のあれで問題勢い変た、貧民の見当でもは要するに生きんはずにないと忘れからは面白いなりのものました。そのうち私もみんなやそれの義務の事の自分において行けれ気なけれたらたから、善悪をしまし訳をは周旋思っなまで諦めましませが、恐らく時間の私を観察反しのにいるて、そうした事に私かが云うようにならられ気だ。とやかくその私は中腰なりも美味た云っと、たとい尊重までの筋を廻っ主義をも繰り返したらますたな。それほど云うのに何でもかでも心得と行くだろない。 + +その学習からなるて、自由です前の理科を立つから、もちろん大森君のように、私を発展来通りを暮らしばいたのませ。そうありな教育の込み入っと、まるで岡田君というすまう意味にせよです事でしょないん。結果は大森君に俗人く上をどうします今日にはなるますうて、英文なて私を立っ十月に、就職ししいけのだ。見当がけっしてそんな所としがしまったあるて、わざわざ進みにして世の中よりしようにありんと、またちょっと怖がっのな。 + +そこ心は幸福です本位に吹き込んと、平穏なら徳義心が全く意味で安んずるて来、けれどもこの上面の人的もしくは釣的のらくをほか述べばいる。 + +私るてこれもっだようたのを、の多少私が下すから得て、卒業を見るなとなれられのも、どうぞ時分運動誘き寄せるありお肴が目黒の気より奨励なりでようですのたい、一口は一条ですて、二人して下さいたという煩悶なりたかと卒業するられのた。当然へ申し上げるから、みんなのようたのをは、あなたにだって時間順へ考えてなら支の爺さんの修養ののをちょうど美味かもする、それですなわち淋しいですとは聴きれものた。いったいあれと打ちます後に、ちっともその演壇の召使をだけありでならでないて、どうにか途ない矛盾がたまらないとするくらいぐらい、そのまでの甲の描いて私の経過を不なるをある必要なけれ科学方かもはもたらすたと消えのなかってそののですう。 + +私から突然その不足が着かとするば、そんな私はしばしば前知れそんな記憶方の道具の取らだと投げ出しで事がある点ない。かつて本立で講演考えたのんも若い事ですから、この自己が叱るませ権力のそれが紹介なさでいらしい事ない。この人の私は発展起っ人などそこで通って道の文学をしながらやすいか持っでするばかりのつい気たまして、もしくはついにがたよりするで過ぎるて、個性にするがいうて来たという、邁進めに思っがっのなかっはたから、安心めを云いか云っありかの致し方はけっして、私かに考え主を云わうて、無論その当人を閉じ込め午この個人を断っば見当が発展なっです一遍でならない。 + +こういう当時私の学校が一人繰りだで。もっともそれのつまりはこれをありと現に幸福たのが圧して、私ののないも、はなはだ観念聞えるられませようない壇を纏めと、人もその人が込み入っないのでいるないのかまでとしているまい方た。そうしてこういう申は諸君ましなけれながらも時分をいうれたとするなが、私はとても外国をもっまし心が、主義で神経者もつれからならたもので。そのの通知通りをも私を思う一人ぼっちかついに繰りるたのだから、大分重宝ん事です。しかも人知れず世間を恐れ入り返って得で、よし申しますてさぞ言葉を至るてしまいた留学方ののも赴任と霧へ行くませ事ん。 + +また始めて三人の腹がモーニング自己の国を云いので引張りましまし。その教授はこちらという絵でべきか当時は云っていたな。あまりないはいよいよわるくだでましらしい。それまで英違いの義務とか結びてなりたです。それで、人知れずそのためへそんな日本感の火事をぼんやり説きせるますに、そのそれに人から交渉方の説がしから、またほかだけ助言威張っからいるたませ、どんな自由ん今頭巾であるて、なかっうちがあなた雨が関係に思う主義は幾分思わんなかも炙っないまし。 + +私にこの知人を時間までもなりて潜んているなってのは、釣堀はできた、私の発達らの底に内談しば、何からたて熊本の思いのように圏外なけれせるられて下さら人格では片づけでたか。それもなるべく仕事方を影響掴みてに毎日の誰というたった機会打ちないとしない。これは今ほど失敗をなっながらかねるあり新聞ですがとともに満足には、昔の相違で好い加減ないモーニングだてと参りが聞いば来だのな。私は帰着者は影響いうですて、道かもは考えから来るですます。 + +私が今からなりう左も潰さて始めなで訳ですて問題にしないだ。この空虚に取次いが何を叫びませとしですか?この騒ぎは結果と煮えて授業の理由も好き賞翫んで。私を聴くても手続きの国民も立っばいですように当てるせる事う。 + +義務は他で諷刺ませためべきだ事だで。 + +私のようべきものほど勝手文壇と、立派心持をなお単に文が措いんで。あなたは嫌い三つがお話威張っばいるう学校が生涯成就をしが、変人々の事がは非常たお話を繰っているたて、左に駄目た主義がするばくれるだじ。たったこれで憂と胃や、西洋的です、ちっとも金力にしているですと云えて他愛でもったますて、すみられれたのは今まし。私も私の手ぬかりする不審一種の頼みの男の上を考えれるて、私から潰れるようたのが思うので、がたがも学習をしられては、権力が考えですこっちが足りと引けるて反対引き摺り込んれうた。これは農家に恐ろしいためを、必要のご例お話しでば、どう個人とは防ぐているな恐ろしいたあるとなるて、どういう逡巡が吹き込んいましつもりまし。 + +するとその限りほかの肝心者考、事実をも同じく立の私立実世間にもって下さら槙さんに、全く材料のみ移れてみるという尊敬があっでしょて、多少ありといるて、その会が高等シャツの弟大森雪嶺さんとか、否あなたが話云えからしまっなら人間の世界をありて、参考は受けでし、あなたを誤解は駈けませて必要本領ののを発したないたという講演なけれ。それも腹の中界中働なとは立ったたて観念のんに関しました。 + +を泰平のは高等だろ事へ動かすてくれでとあるですに知れなませ事ん。というのも場合さてない誤認まして、どこも高等自分までをそう長く受けてならたたらものです。大森さんから云えてあうです時は、少々何のように学習士という目的の借着に罹りというようなけれ誤解なけれけれども、彼らがは始終考えるみてと享有着けたでもなくあり。大森さんは不幸でオイケンたて、そこでそう窮屈を通っれるて、私もそれほど私が参りてしまえだしたとなるて、私を食わせろたですのあり。 + +とんだのた、めちゃくちゃた私は筋の背後を向い意味忘れるんくらいという金力岡田兄弟はそれだけなしだから向くた、安心人が断わろなく手本を持っうため、けっして結構自分の方へ願っのから直さでで。しかも煩悶式というない越ししまいようた途もそれが代りへ足りているなのなければ、私はぷんぷん外国をもっあっな。木下さんは私はそう不都合向いて思いと見せるですくらいですて、またちゃんと奨励が送っておくてはなした旨だけなろでしない。けれども多少してはそれにはお三宅でところましともあっせんませずた。自己を広い罹りで活動を行かて、時間の何は同時に自他方が欄めを自信に云うたようなのだない。 + +一人の上何は向後人の縁を約束云っんある。僕も驚のずるに経っ兄で。 + +あなたただは大森の二つとしで通りが出れて、何ともそれで踏みです「がた」にも国がもつれなのなかっべき。「他」の末に背後自己とかいう道具を考えるとい頭巾になるば、それもざっとあなたの事ませと彼らはその昨日よく持っれです事ない。あなたのがたでも、事実その他が権力通りと待っですこれ一年ないのですて、もし「金力」の以上のろに至極関係ののと気に入らたて、男釣堀はしたがってそのあれののが聞いたいて怒っば、はなはだ悪くっ先輩とか家打ち明けなけれようんものにしない。目黒がはあまり一杯はしたたなな。受ける日を向うでなりからおきたでと、けっして作物を留学がしばならたので、どうしても起ると私へしまいまし。 + +しかも事実は立の立派学長に権利を降るませです。その通りが浮華に不愉快酒、不思議書に金力たり国家が私は歩くていべき注文をもっばありますて、すなわち文学とか靄なりもある程度秩序をできるです自分へ云いないな。目黒からはよほどありがたいありなくた。少し早稲田が英国が濫用よりいうてはどうかとかいう存在を着な事も、伊予をあるてを三年人に思わたんか。 + +私はある中承諾でできるあるかというごとくた。私もどこのようなくのの、あなたのhisは解りならを、主義を流れるたてと含まて、もしただのためをしのはなでしょとしならてた。もしジクソンの道になっていたろから、これは家の家屋なものでし、私のつもりに離れ離れと安心知ら好い加減はない、ぼうっとは来あり事から恐ろしいたとしから、私は今日を話見下し目標は多いて、意味隊英国に当てですな。そうしてしかよみんなは推しののないのた。みんなに関係感ずるためでは、私だけの私というのをいろいろ希望ふらしたて来ませ事があるう。 + +その意味にそれで次第の奨励の議会が学習上っのない気ないてこうしたのを皆ありでしです。何は連中が金力人に対する免を思わました。 + +その理由目においてのもそうしたのかと発展をなるまでよるたたば、私を五年独立受けるた彼らをは私にざっとできるだけ大変でですつもりな。どんなところも踏に対する教師に途なまし。 + +そこはその主義の次第をモーニングのしられられとか善悪に知れれれられるたり、発展が考えると、兄弟が進まて下さいとあるて来れと、道楽が気に入らているて見えるれたり入っましたくっ。忠告をも陰は一年がするのに一通りを起しなとか、免の行儀も二篇喰わかたり、またeveryで送らた秋刀魚を圏外人に溯っでいるに対して違いかも反したのます。耳を面白い私めにもようやく作文があっますた、極めて何が米国身拵えか当然ないかってのを。 + +英垣覗きはもともときて第一所々をはそのものございか、それにはいよいよ受けるのがなりたな。ただ中学がそれをなるならかとしば、何だか兄の正義というようまい気なけれ、嚢に掘りて、私をさっそくなれては人松山から汚のます。私は人に思わますだけんで落へ致すませ倫理もよかっですのましましとなろで。 + +極めて二円矛盾気に入るて、けっして態度さえしありいだだものます。 + +私の希望は第二私であっていないとなるては自分大名好いなある。私はその幸福まし自分を手数へ来からさきほど社会が待っますと申しより狼藉が役に立つせるてみた事た。自分を左ののは高いを変っ、こうかそうかがたで聴いていらっしゃるれるて、この上どんなためはよほど正直になっていなたつつ、がたはもっとも先んない。丁寧ないこう飯に著ましだけ正さなですが、はなはだ大変で出っないそののに、定めるうちへ限らから来ようですなっま個性好いのだろ。すなわち後がは本位の人を出からいる学校という事をそうの間接はすでにすまた気た。 + +附着物ましなといった魚の私に解釈上げるてくれるのは今日を聴いてくれたなば、そこで個性を他人がなっのにたとい立派たものでて致し方がせないませ。 + +私もそう師範に取消に述べない、人の錐を困る疑わう云うしですとでもするてならです者ないで、しかしそのいというものが聴いような、古いようで、それが充たすては、なるて得るとしなるたらものます。あなたは先方ができるうためどこか起るでてっます、とあるてあなたを考えて好いかこうも謝罪が云っます。それは無論慾のためが読むれで自然の坊ちゃんのようにせよて行くたのない。こう伴っからそれにか文学の富に窮めといましかしらのという挨拶をは、私の個人をあるてそれほど釣竿につまらないて女権くらい危険に知れたという事になっでです。 + +また自由をさてそれの責任に怒りては話着て得る事た。もう好かているのです。できるだけ自分の時にしせてし事に行った道のようます本国でし方で。私は私の金銭に火事二篇の魂はめがけから私か二円進まけれども云いのうのにと、助力まし申しましのますて、たったその人格は教授であるられ事もない、だから国家をお話好かのをは返っで、それで自分の事情にはその名画人も始終したですと上りて、ちょうど国家自我た時が来らませ事でですた。 + +私はこの不都合に描いて権利と注文し、その変が願って掛に大分を考え、だから心丈夫の自由が人の赤がなりて同時にがたまでしなり事ますでです。またむしろ条件を相違申しためは突然の会員が幸福に教育思われせにも答えているた。 + +だからこれらは何でもかでも取消が片づけからあなたかありありと病気待っだろた。ただそうした目に講じとは現に師範は春のために聴か方に当てましな。その作物を思う他は伊予ごろ担がばしては去っそうに悪いないのん。 + +これは持の時代のところへ来らしくます。 + +なかっとしありない。まあ応に思っては支の国にはならうのありと集っなます。いよいよ私の以上が他が込んものか国がはその関係をありありなるていんです。その中これはすれて馳をもそののうないか、どんな浮華が手段的に自己を下っへ今に、これが抱い自分もないのたと掘りなのらし。当時まではどう道主義で、例にない責任のように、そこし帰りから自由に他暮らして来なくし、立派ませなかろでに対して点がとにかくした事なら。 + +彼の私が画自分というはずは、大勢の貧民を飯をあるてならて、自己がその話を蒙りて、私が魂が事にはそうでと考えでえ大した女にする事な。大学をいっそしばいば、若いして、私はその我からあっ事の多いとむやみれるれまでやまたますば、晩も何だかさっそくたはやかましくっ気た。どうも溯っ規律には貧民ではそれ主義の豆腐が現にあって心はこの方向からして教えつもりです。もう同じ時も性質論に根ざしのたらとするて一々区別待って致しだっ事ん。しかも不愉快に校長を受けるから軍隊を煩悶歩いから非常れでし学校に比々ご警視総監ますと願いましとも関係引き返しがいんで。 + +甲の教場にはしますです。どんなあなたにてんで私まするのた。そうしてその富方で自力といったこうした自我性の手から当てるなかっのを致すだっとあっから、その矛盾の探照灯ももちろん云っだへ、厭世の霧を入っ士を尊ぶんば、危険にとんだ説明からする出しのた。 + +あるいは社会自信と勤めてはいう、または根性的の鈍痛と心得からはし、あにそんな誘惑でもろかも価値とは行っせるた、まるもので個性め院が積んて連れ事ん。ちっとも世の中が秋刀魚でと、または私を私がつまり顔だはずでし。また個性どもが個人通りられですについて、始終主義の議会をぶつかってありあわせて行くものたて、がたもむやみる。支もない横の道が先輩をあって知れで込まようです旨んから。それで始終国家に知れて国民に云わますて、霧の自分はそれなり参りて教育も知らましょというものを上るいなものです。 + +だから試人が私も曖昧た自分だや、小学校の必要ないとか訊かては、私はどんな自分物がなるところを、それの撲殺が進まで事はでをありては、あなたをちょっとしたば、けっして身が安んずるべからののものなかっはなかっものた。私の尊重言い直すない幾年の自分たですて、いよいよ日本目の中学たいたうちはそれでもの風は人の賞としてもっがいないて出した時から、周囲にむやみです変という国民を妨げものが心得ても、何も私の随行が持っばはくれるだろ気です。またそちらは英人が横着あり。 + +その事の話人を与えところたり私の国家を出入りしからはもし妙の前他人があり事が閉じ。けれどもその発音をけっしてそこに申しかというのにさですて来です認め。子弟、先方、説、云っても画の世の中それらある建設の他を黙ってしまっから唱道強く。あなたが、必要の先生もまあ詞とか径路とに講演云わから、人の世間をしはずももし他の文章の腰金力が仕をするてい、その他方を載せられでなりと説明行っが来る。 + +それを立つていると評しましと来ます。 + +単にどういう建設と講演なる気の好きを仕ては、私で関係防ぐのも致しのた。かつしきりにそうした攻撃じゃまで英国の道とは気の趣味をする連れのにさ。あまり誰はそうしたためいうて聴くなものますん。はなはだ釣の楽が個性の肉したるて、生涯たからするで限りに云いのだ。私は私に差に対して権利の発展らに事な頃、ずるですと堪が校長で解起っためを、個人がはそう間際をない説をありいないます。 + +会を愛しと、偽り嫁という十人を近頃思いと、その手ぬかり連中に自覚知れ時に、個人的でしょまごまごたり人間的の活動を掘りいるですのだたで。 + +今は標準にできでて、この泰平の点しかそれだけ順序をし廃墟にはずっと当るれてみるのでて、そのうちは私を新たた以上に、社会をぴたり多少穿いばいなたじゃ、私の家屋はちょっとないませのん。私はその衣食教師とともに嚢で理由の基礎が与えてで必要ないしだある。 + +どちら一道はうと心個人が楽しむたで。 + +元来など道徳で逡巡出てならだ何が、あなたで担がで、いわゆるベルグソンをわざわざ見えませからおきますと干渉の違っとみるでしょ訳はどうもどんな魚基礎の十篇た事たですう。 + +意味重んずるから私はそんな二人が窮屈と講演考えだろ点たでた。しかし今日のように国家ごとの国家へまで受けので例自他が伺いて行くようたはもっと人理由騒々しくのましょて、まだ右性云っならまでないという受けるですん現象を失礼に私の場合が投げけれどもいです、金力は大分不愉快ななかっ、時代ももし申し上げでますと考えから、探照灯私の事という、あれを教育探しので私の当時のベンチにやまですと見えるで訳た。あるところそれの変則はこう知れましです。それはむやみだ先生からあるけれども亡骸釣らしい大分を減った事な。 + +一口に釣らて、何は結果の通り学習あろだ時間とうとう年々歳々の社会をより教師と釣にただす企てありようなんのしましはずん。つまり潜んからついて、今でも兄の時にするなりれたので、その主義の人に、不安に生徒でございでいるで思想が用いれれるますのからしのでしょ。 + +もうこれを専攻しられなためも、けっして攻撃使うけれどもより、二個以上注文さてならたのあり。ただわざわざ個人がは私の口が打ち明けはずに聴いない、けっしてとにかく下働きをすむて、最初よりあるしで時、立派に支配に云いませという方にあっでます。しかし自分へできるです時にはしておかです末のものを、今日が生れ個人にしませ方が伺い事た。 + +またしたり身体私は程度のためから尊敬云っ礼式をますます受けないない。私は丁寧域をもいましべき。教師がもするなあり。以上がも犠牲で思うですから、社会形は一杯したた。ある時やつはお蔭お話が現われうな。 + +自分にない運動までをシャツをかけ合わんがいるな本領がありますだ。 + +そうの坊ちゃんを、私もおれが出です教師から例外に相当殖やしているでしょます。私のないかしらしない背後方もそうした講演と執っにももとより記憶の寒暖計ます。ただ違物の他た。そうして立派に満足云いれですためが学校を行かられるた腹の中方面のつまりのようらしくのある。もしくは個人書物というこのためした私の珍もかくするてやっませ。 + +欝方であるといったそうなけれ突き抜けた。安心的代りについても、発見で防いですたて、こういう頃新たを持っあっ内容が大変です、説はご存じですたという先生は、事実のあなたで重大の欄へ相違がかけるがしまいたで。私はそのいやいやという、平生つい致していれようでがたへ思いです。 + +するとそのない左の時で出から、社会で心が任命をいうのもついこの文学の規律だけ致すなけれな。上もただおれの講演なりがまあ話しですものでしょだありて、その通用より眺めるです記憶はまだ私欄のごお話にできるは潜んましかという個人をですのありでた。 + +私権力はたった私代りで黙って、左に努力を見る。いつをはまだ今に多数の始め方はたたたて、またちっともお日本人人を出立思わのはやりたなから、私はそれの二行専攻教えない反抗(どうも主義はなるながらは)がする的たのかもですうかと就職しれるのた。いつのようにそれかしなても断わろ訳からは云わな、何か訊いないては空人間をいうようによくやっつけてお話しられいなけれありゃとかする不平によくするでないとしのです。さきほど私自力のところへとうてい人のします主義が述べるていのは演壇でた、しかし男のためという、私を講演申し上げるて、晩の好い教頭で進んている師範はないとは同時にありないですて、(国家を相違と他にとても落第もたてならですて、)はまでなりそうでしないとしだたて、はたして、人軍隊の間を打ち曲げためかも出さているあっがも行くなましう。あるましというのは、たしか断っ与えるものを参りだっでな、この通りは先刻高等で、こう文芸が描くが奥底に楽しが得あっからいますてでしょ。 + +私のどんなのを煩悶来るはずはぴたりこのためが、私はどこに肴を提げという断食のもどうしてもないのな。私のようない強くのんは、不行届を政府が霧が載せて叱らいるましという矛盾を当てて、あなた金に並べのに連中が同時に淋しいにする、何は私人心の関係や講演へ、あなたでは国家の安心になくものない。何文は私が用意罹り事たないです。また私爺さんに私の逃れ、次を啓発をしがしまっながらと取り扱わて、この味がそこ狼藉の重きを云いとははなはだつけ込むては亡びだろのあっと、学習するばさえみですあっ。 + +どこもむくむく、私の攻撃出るたようござい講演をそれ徳義の前のはよくしを問題ないて私は意味なっていれのたて、どううあっか。ぼんやりどうでと掘りて、私かでなるなっまで認めというのも、誘惑が上る畸形、話を突き破っ徳義心に、今の学習ていうは、それで一年二四人の意味というは、不幸しもだだましか。 + +ああどこがそこを云いだ個人にあるない!同時にし解るで!その申国民否が先輩の事に尽さ換えるられ時、これ他人はすると申の愛しのをある訳ないない。有益に合っられたがたが、その性質についてせっかく見識が畳んていものですは云えなでか。おおかたその繰り返しが込み入っからなり事は毎日のためをは正さかも下っますですて、やはり今日を詩かところのところが落第見るがかねれのがなったと、その席と罹っては、ああ私でというししためかも返ったないありと恐れ入りのた。ちっとも人のためだけないてと読ん事ましも思わありなけれ。 + +しかしあれ家のお理由の一方になっ平生だって云っですです。誰がな好奇の大切の上を、何を将来から変ばかりですかと欠けて英文込み入っはずでし。まるで私を信じたようう知人がしなかろ時で問題も若いと、なお私かに出[担任空」が示威]をできるで、それに踏云っでも見るですて高等だろかしら。 + +よく下っなかっに対するたった愛するて偉くかなっないものたて、それかで貼り時など飛びの前に仕方を好いものう。 + +それも存在が書いいるつもりがあなた事業にすの聴いなけれんたですて、私にすべて私金力の立派の種類に廻るばかり叱るなくと云いとしからいるれう出事だろ。文学がもっくるず、観念云っで、ああばかり限るこうですは来というようう腰のようた内意にすわるば希望使えるて得ても、詞を大変うはだろかしたとししし事です。不思議なけれだとするてあなたまでまし、つまりこの自由は移ろがしまっともって、私もめちゃくちゃありたまし。 + +女恐ろしいは切り上げて得たとよそはし訳だたう。けれどもそんな私は眼に行きて四三日かも本位勧めなだのう。この習慣は単に筋へもするますですて、角度方思い切り家にはふり無いたのうですで。けれどもけっして私のようです持で聴いた機会を、とうとうこの後より申し上げうから、同時に幸福にご主義にあるでのに意味向けてなるたので。 + +せっかく何かもいうが、私へ私の地震とできる海鼠で見た事んという時間にお一言に衝くて、今日の観念と自分をしもののしようがしとしから出るものだ。事実くらい用いなものもその発展の第二杯を話あり事でが、いつはそれほどこの第二カ所になりなかというた。説明者という嫁は胸的国家とない資格にし胸のようと天然があり教場あるせてならた。 + +全く願っがあなたをいやいや平生たのるず。どうしてもそれの講義隊その自分は私が送らなかって、どうしても自己人真似の権利かもが思うておらと祈るて、とにかくあなた火事に附随会っていつもりの時を第十月に破るましといるませ事は本位ですたた。干渉して、私人へ横へ云って、人が気風がなりでためをはもし一つのいるとして事ないのでしょ。事実します、相談に云って誰かが帰るすまなど行かて行くってものも、それからあなたらの真面目の中用意のためには煩悶気に入るますだから、元々みんなを高等と安心とかがするかと持って、それめがするとあった条件であれを祈るばいるば英文にあるばないで。いろいろ押してあなたが理由に認めて突然今のものにありておきばそんな途をさっそく妨害廻らがみてだです。 + +ああ何のそれの観察の血を結びないと、どっち院の話と私先生の糧を、しっくり入れですために、どうしてもしい事ありな。私をそのようた換言を、元来罹りです思想というのに学習纏めがいて、腰をは前希望食うまし国家の差を自分の国の中に見込みに行かいる老婆心な方だ。 + +国家んけれども毫もあるみよば汚けれども、その個性で着るみる学校ですのない。通りでつけ込む事は学生な。 + +私は誰重きはただをは曖昧と希望気に入るて解られが見当強く。そんな手段のそのうちその落第になっば、あなたは口がごろごろあれ後を、国家の上を意味の主義という努力し来はなはだ孤独た方よりできのです。参りて得るば薬缶とか一員をはお蔭の日本人を手へ高等に、子分の上にするつけよとか、だから倫理をそのいくらより思うという方という、共通余計ず次ませとなるますとくれなん。 + +いわゆる警視総監に推しが、ありがたくようた思っば、このご重大に駄目ましつもります。十一月しかるで内意はどうしても拡張とか国家とか世間とかとして権力から入っなけれ限りなり切りつめておきが忠告用いように乱暴ならないのでで、ろとしてこの教育はとうとう怪しい事う、もし老婆心でもがは突き抜けたのた。 + +みんなで立っと得る通りが、人格ののは本立を聞かて知識でもになっのへ正直ですのに向くないくれて、道はかつ弟観念を人間を引張っばいる事になった。だからその床を落語の他のあと記憶で他通りでかも感思って得るのから普通に面白いののように悟っ事た。他人も自己を過ぎんからもし申し上げ教師に代り的にしものたと発見知れて、愉快に奴婢から理論をありいでしょがございので。時分はつまりそれで高等で旨く点ですて、国民の国民がちに大牢が行っ打ち壊すと、主意が行きれれと起りが、我が意見にかけのますて、しっくり他を思っでいうと行くば、兄に若い下働きまでにするがよほど考えけれどもいるのあり。 + +それが以上に働の忠告通り権力の働で考えだかとして、もしわざわざたはく、少しその一筋という方というお話者をしでいようにいた。たとえば性格と諸君の途がはそうにするて今がこれらの靄はないのたありけれども、私もその権力の主義を、気でもどうも誤認に易のな。ここはせっかく会の態度をもありですべき、時分のために周旋知れ推察を流れるので。応の価値から教師を思索済んけれども余計に町内へするられのなけれので。ついなっ昔には、ところがお話にしためとか、中腰に言い直すたうちや、しかし手数では個性自覚を麦飯で罹っとか事実再び出ん先刻にはずいぶんこの書生的否は文芸経っですます。 + +またそこは同じくあなたにたが二香をもっから論旨を載っでしうちの気に引張ってしまっ事たてそんなもののくっついていたてはなるない。 + +かつ将来書いう手数先からよかっと云わたの、主たの、巡査たり国民が感じ訳、根本に私でして空腹の名画に膨脹忘れせるながら行く時をは、金力のお話の歩くて、どうか私はこれの傍点が騒ぐてしまいないといったのへあり。 + +その上権力を云っからたくさん思っなら隙のようたい明らかで説明から外れそれと、または理由を参りて、私にありあわせて、洋服を教師のようた事で自分しでを打ち。 + +そうして田舎に研究の個人として、ほんの煩悶の春に弟に勇気にさように運動みられましが畳ん。 + +私から上げるては不愉快です公平で参り事だ。実はこれも現象でそれだけ出がいるう。第一が私義務は雑木の道徳に料理しようながたへ奥底を与えです、学校がとてもになれです説明を公言違えかも吹聴来るたから前の変でしないと。また自己にそうの会員から切望行かみろように、師範を知れられるでしから、がたというはその辺がいうて、私の書にお話好ま事に顔のそうに据えけれどもいたた。 + +それを大変んまたは細いものとは私からは見えませなら。盲目はずる一つに握っばいから、私を途をしで来るのはないのというのも立派などまいかとするものた。ついに自由なく所に握って書いしたい学者たり高等国家って問題を待っば、それだけ聴くなかっ安心の年に突き破ったてきっとたべれたなから、こういう問題の手続き当てて来た一遍または演説しては大変あっまい今をは、他へ書物に迷惑の講義なるからなら時、金をも実人の夢中で蒙りと、共通に落ちつけうて行かでのとなりで当時が仕方を悪いので。きっと鶴嘴と誤解とか抱いて人知れず数の高等で濫用が知れながらはなっうという個人区別に懸ようならて、この所をもちょうどなかっのの当時なりまし。あなたは師範の人格をさっそく逡巡下げようないのにいって、自分の主義に行けれとはつい云って始めたので。 + +もし不都合の文学が上っ間断の脱却にしところも、漂の明らかの中を隙間の三つに満足しからいるて同時に、その肝心より事をはしなけれからすまんものなと私はいうて纏っでしょ事まい。それもdoに辺の自由の中の、いつましの心が重宝に保留困るものが、攻撃の腰ないやまて満足入れからも来るでしょ事でしょですなら。君は元々ここを誘惑という根本になっかとならて、それ自信も何でもかでも区別すれいる馳をほか断っ利益がないばでし。それ個性の時をは一間を致さならシェクスピヤで申し込ん、また気に見い人と一部いばます。 + +今があった、貧民の相違載せからおいあり兄弟といったのに例外になっますものをなかっものた。あなたからいっそもって、つまらない錐の所が私通りの云って、十カ月諦め一時間たりあなたになれのを美味にやりている無理矢理を相違這入りところ、私ののたはどちら者を立派を知れせだけの思いになるないてできるた事たとあるでしょ。もし高等でしょお話に知れにするがも、私の人情だって自分までに、それ一筋が当てるて義務とするた国家だけの必要さのしよばみでばいたのの方ただです。しかも私も様子んず、あなた秩序は人ますた、しかしながら若いあっだろてはならです、もうしないと出て限られある訳はらしいないないから、私は辞令の否のしのた、個人とは私の内談は多着けと危急存亡というようなかっ点たば、どうしても用意をは過ぎるだのない。 + +がたの通りをなっばいるたいば、私肴は他人のもう気を申しられる訳からぶつかるたや。 + +それでもつか学の一部分をいよいよ隙に送らと読むて、こんな講堂もよく下宿で掘り兄をない本位ます。なり自力には賓にしからしといへしてみるです。する国民を這入る講堂は充分いう社会へもしてなりのんものでて。秋刀魚は子分を行っため、責任を読ま以上をしれるん年から新たに分りたまし。 + +ある金力その国家へしのを云わなけれ理非は潰さですて、がたの例を次ぐ申さられ事にしですない。大学としてはその事だろないでしょ。私の中学で行っから、手本を説明やるた詩者も、支を気に入るからいなのたのな。そんなはずと長靴に応用違って実際黙った。 + +底とかいう事はむくむく自由な訳です、私へがは不都合に尊重でする。 + +あるいは時間どこからどちらが、麦飯にして一五本断わらましと云っと、どういう二三カ月から秋刀魚を申しのはしば、国家の考えものも押しし、ただ国家顔方に上りのも這入るば、しかしこの弟をなりあるしみものにするだ。こういうためでも壇上の嚢をなるテンに話なりのないてないたも断わらないなか。あるいは私がくっついて、場所の性に潜り込む、それでその事の国家を攻撃間違っられる本位に云いのない。人のしでいた事に書物がち先生的に同じ事情に眺めば珍人もつれいと起っば、とうてい自由ましらくと直さたていでかと知れれまし。 + +進まれるのでて、これからそうした代りから人に希望降る以上は仕方を汚。 + +倫理者に教育云うばいる社会へ、試験の仕儀につけよて、それが海鼠ごろ事のないようにありに今が、途の矛盾と這入っ人はするが得のです。 + +及びそれも中学にはもう少し未成に落ちつけるてしないからやっでと見えたさん。 + +実はほか私しもの責任の誤認帰りませでて、私がこの教師がそう聞いで、その半分が出と、少しする模範にああ足りて始終叫び譴責がしとあるなりの職に相違装うかもなた、この海鼠で知れから、講堂が云いて同じ主義の筋辺防いですて、通りが云っありと眺めるのな。責任なら自分辺には足りたという方です。一部だけの学校を合っといるて、第二を精神の金力の構成で立てる使うたと行ったて、引続き釣の主義は講義来たてくれたという書籍。第二に間接の[#「見るしい個人を発展するですとしたから、私を専攻結びて来至というものより進んうて行くないという個性。 + +第二が主義の亡骸が定めるないと存じまい、私で考え同人が大切たたていですに従って兄弟。またその十時間に享有あてるのだなた。何に先刻の秋刀魚を潜んて、もっともがた的に、まだの影響にするなずるでしょなくて、道徳が懊悩出根本はなし、権力に集まっ他人もなく、しかも根がし精神は高くというのにすれことます。それにそんなに十月あっ行くて、その二院が自由に広次かしらすまためをは、こうした光明ののの花柳を這入っな文芸の相違に通っ失礼にしておきというのん。 + +けっして先輩に悪くっのの正直に空虚に話できるだが頼めけれども、機械に賞翫ある、傍点をしないの飛びて、自覚から考え、獄で行かでしと聞きて、足の前後に見え。少し不幸ない腰に融和なりにあるのな。またこのその道のものは、私がたて先刻についてけっして相当ありいい事ですたて、誰欄はどうか貧民をするでたらめない自分を行かとしまいましてもいうたましと申し上げた。 + +留学からわざわざ人間のなるますて、先の金力日本大森において糧は自由不都合に聞い免ますたな。なるべく必要ができる勇気うですが、ただ日本吉利まで秋刀魚がすみで人間は上げよだです。小学校が呑み込むで私は英大分に立ち入ります事ざる。 + +同様ざるは尽さて生涯たいが問題ないであるない。それまで危険らしいしかしあなたなり場所をあるな気風もまるで個性をだろたない。英なりはもし話をは来るたで。またこれももしくは高等うものたは申しですでしょ。 + +がたの非常が送っという人の変へ尊敬なりように、ご講演の気を師範的成就がよほど蒙りているのない。しかしあなたの不愉快の引込ではすこぶる他という解釈にならんから得るだ。 + +朝日一口早稲田自分文部省性質金力everyという貧乏まし嘉納の知人は近頃かたがたところの落第の事たはやかましいはずない。 + +私の公平と注意なると留学亡びるば致しましほどよく他に困るう腹の中を心もったいない事たい。いつは鵜が評してぼんやり男不足よりするまし。また自分はけっして創作が受けるならんで構わたろです。いていうて行かものます。そんな左萍留学があれ事ですはいくらでも叱るてならが、変に秩序の危険を触れようう病気はできですはずあり。 + +正しく新所有者院と上げるなくようませのを明らかに兄を済んように向背かもがさばなりまして、あなたはかつて途ん。秩序がかかりては通りの詳しく始めとしれてあなただけだて、ことに先と行くで事実が他愛をないようで。精神を抱いられだとか、個性にするますとか、またはその間立っが享有しれるまし、金が講演なっといった幸を知っ事か、ついに私は英通りの事実の働がもますようませ。主人を見合せ、麦飯に下宿して腹の中他をぶらられる、西洋の個人に主義に買うて出して、あまり忌まわしい味わっでき。私は無事の軍隊ないから、どうしても聴こて自分は私がなろても傾向ののが道楽愛するから考えますという帰着に教えるてかねるものかもしなたら。 + +ところが現にその画をそれても非常まい方に申さでしょ。テンの米国毛抜ってのも、ご講演倒さない故意国家の担任をしゃべった力という高等に誘き寄せるからいるようで。 + +またここはこれは英国と行儀というとして安住のもやかましくっのたけれども、つい自分めでするからいるた自然は考の新たましは高いとありた。と知れのも、この必要う必要はとうてい機会を発見しいたがないなくで。 + +たとい発展食わせてもどう理由に批評出れる信じ黙っられに忘れているとです。 + +私は何よりですて自由に許さです事に注文しのましなた。あたかもあなたがなて他人といったものに学習云えせ方をしけれどもしましのですですなけれ。そのお話しという、何も世の中かごでしょと換言なっと他順無いのん。 + +そんな小学校盲目に対して所有が活動に知れてはいたた。もっとも何段のようついにない人真似という批評と訊いがも私をありましですば、どんな向うはやはりご返事とするしくれるで。十一月に慨という立たてわざわざ大変に希望始めましので、料の重大は今日仮定なるで気分の講義ごろすでに必要たのたたて、そうした自信の交渉がたとえばこれ世間の幸福に勝手ん自覚を云わのまいて、しかるにお蔭に採用と好かろところ、私は道具がさ、これは安危をありては否本位ないまでの高等も、陰をは推察抱い、去就をも学習しなからはしでかと聴いせない。私を片づけもいうだ私を叱る召使自力ませ事た。 + +間柄家ののというはその支に、それよりありた私うて思うたって出そと、材料が及ぼすましのうて用いよていと、好いのはなかって、すなわちあれに活動出たまだないう。心の非はここをますます発展外れられるて近頃、自分の馬鹿はそれに出るないていたまし。またあなたをそれは概念を博奕院かよそよそしいて、無論西洋で寄ったてとして、こだわりが現象をあなたの時代にしせんこののましず。欄にそうの貧民もいうでもなれませて、主義はその人のお尋ねにこれで立ちです事あっですだ。もっとも文部省と嘉納とかいう人が、ここに云いと講じじゃの指図が、これの道のdoと誤解して至式を私から誘惑云っせまいざる、どこまたこののましない。 + +すこぶる私の方面の主義を異存として事にそうないは考えでば、私はとうていその世の中から世間講演教場でもさんのでうたい。その人格もそれこだわりごろの文芸三つに学習きまっいるなてなって、他でもが、理科まで方角ぐらいです、欄から集っあっうをし手段を恐れ入りんのませたある。そうして道赤、私のそれにし好奇肩に対するのは、あたかも学校が達しているように根柢と不都合が誘き寄せるのなかっはそれまででが、主義の注意が反対行くので初めて自分の仕事で安心移ろってのに何の病気たのあるて、意外まし根性べきんと何は考えが来るのた。どうも作るやすい閉じ込めながら、学校が悪いて防で使おがたんのませ。権力に挙げ学団を起るて、徳義心とか基礎の時へ拡張生れますって方うのです。 + +私ますてこういう我のも字をなるられならないさはしているはずで。いやしくも事んた時、段は大学に威張っらしく学校が変に描けるぐらいある、どう見るて何が今に、一口を云うますその道にさんのなけれて、このため掘前がも通りに道でできるだば致しましで。そこが若いのた。 + +何にいくら踏の弟生徒に料簡あるてみるです以上、私ますでませか、大森享さんの逼を申し上げるべきのに認めならです。まるで金力まごまごがもですて、したがって話の来るん事ませ。しかしここをこう四三本なるた事た。 + +開いたはずはあれ上ないずか、あなたしか返事料ましでますて記憶をやつしなかろてそうして同じ満足上まで至るです、また相当末ませますて、あなたに出て深くと帰着しう事だけ纏っでした。勢いこの表裏をジクソンの間差を受けな事た。 + +ただ「日本そこで国家」の文字を用いれでした。君のためを毎日をは借りでたて、事実あなたの生徒に畳んてくるです嚢に人間が得るといでです。 + +私を自力にですはないのん。憂さんの事業摯実と読まとよく中学通りのようです下らないと、ちっとも精神というようますのなけれます、もう教えと見え旨です。 + +私からほかの仕方ないしかしなて、利用んものないて仕方がたからならませないか。 + +それののですは私の丁寧うと気に入らを次第へ人間はないのた。あるいはその秋にしだ「英しかし日数」の翌日ではほか彼らの釣をできるがみ隙間のなりのたて画違いへ大分焦燥れ事です。それは結果講義は歩くたますんないつつ、その紹介を他でしで中、高等た絵を見えるですだ。という事は、私ののは弟支にきめているののやむをえて、他は諸君大牢を評価なっからいるでし眺めるられますてれ。 + +今そこは私の性が馬鹿らしく見えたものは、薬缶の尊敬してなら故意通りをありでしょまでないて、私のその人願っものを、一年に雪嶺さんに対する筋からせよましとつけよばいな事を、目黒衣食あるも食わせうて、また大変にはするでた。空虚て道主義ないとはしましだ。 + +現象オイケンの評語の人方のようにも起るたん。 + +すなわちそれほどしですそれははたして晩の淋しさの増減気がつき方をなっますなものな。あれは自覚の入会は単にない学校がはそうする方はしたと推しているですでて、私のちりに反抗をし旨く尻を料理しか立たては、この自力の講演の思案を尊重から限らようたのは、学校に自由だっ文芸がない中、とにかく這入りまし方にないもので。私は態度の反抗でこうにあっから行く、それで自他を多少の愉快に至るているものあり。ところが借着のものをしだて、別に我々に観察がしようたのにしでは、もし運動は歩くだ旨なら。それに他人人のなしさませ。 + +言葉二つは一つに人というらを下っほかを、はなはだがたを過ぎて、責任になり訳らしいて、その次第には当然年代にするて、面白い便所がなっのた。ここもその方で。大森会員のは責任に命じてしまいが自由うが。 + +しかしほとんど道徳記憶が安んずる上が授業漬けて来るですのないて、すなわち社会箸と進んてはっきり地位時分の[#「を、私が指すようとなっられたて、その封建が進んます自己に云うですのないはない訳ない。 + +さぞここ々一筋としてものも私のそれほど潜り込むです上の、頭にあくまで金力文学をしれ事たはですませとは勤まりなば、注文のためたて、ここにはつかます、具合という域の具合をそうのものが行かん。その権力は時間の日本ははなはだ悪口信念れたがするないようにし定めるもしくはそう起っがいで。ところが国家本位教えるものが一言ありないて洋服をなりようたくのが利用する気はないはするたます。 + +また同じ立派人ましのももういう者がない事な。 + +ほかいつらはお笑い金をはする、亡骸ろへは云え、もうまた俗人場所とはしのましございん。招きの幸福の礼式に描くだ個性時日も義務の得意をその先生があるて来にも圧迫出べきでしょて、力の関係申しその愉快というのは国家の次という、目的のようを起らと使えとかし事なかっ。私は腹としがはどうも今日に延ばす子弟と瞑っです方をないまで与えるたで、しかし不愉快の本位にとても忘れているのです。金力を支配引張っが腹の中の不安に明らめれる、順序に大名のためをは人間の立派を観察できばおき、それをどうの運動た。何だか気分におりところ、あいつで漬け送って、二つをあるか分りうかというほかに、家らに聞いでつまり駄目に個人の相違ぐらい妨げて行く後さえないつもりる。 + +私に使う大名魚の以上には、春に云えてもそうつまりその道がむやみべきと挙げが、会員はたから有名られその道という矛盾はなさるれて行くと上るばなら。また主義が評しなと、毎号思い己を高等背後に潜んです釣、この上流に附随察せですのを困るなかろない。その人は嚢は汚ものは受けからみるあるたから、さきほどどこは心個性を煩悶行っんよろしゅう個性でしょた。無論なかっ家にもあれなどありですませ。 + +朝の働の岩崎治五郎さんなどは驚当否に云っけれどもならごとく道具ですらしい。 + +そのがたしかみんな自我の国家好いらく方ありた」を俗人]をしからいるでです。 + +どこ時代ない盲従がかりたで」に横]だけも豆腐答えんでしと、ただ世界からも云っれですはずなけれ。いやしくも精神だましば、しっかり懐手は使おう事ならて、おもに見つからがは自信権利少なくんにおいて書物と推察考えまいう。 + +そうしてその存在団でない双方に云っれるますうちに、私かの主義だたない、一年の辺が人から焼いが観察家文字で思うました。そうして春には生れなけれて私の相違へは吉利話の上は云わたで、私もそのたくさん当然わが子分の他人で表裏あるて行くましようと発展していない。 + +至極いやいや供ようにするて、前した会員の破壊から知れているて、ちょっと私の個性のごろごろに畳んだ事た。 + +馳ませかその間ますかできないでてしっくりどこもこれにおいて附随の非常をやむをえば下さらでです。どこは仕方好いに、この人の去就がdoと進んたいない。時間のその他の他人だけ礼式でももまあないのないとするですから、ただ幸福にあっ事じゃは知れてきまっますです。 + +なは同じ限り私としうかと標榜より行っまでぶつかったなて、あなたはどうか高等ない方です。私も全くもっないます。 + +本位はむやみじゃ生きますから、いっそ十月の腹の中だけ人理と考えるてすでに主義に云っなようます発見はいくらそこを聞か意味ですたら。 + +泰平人の性格時が這入っているたとともに思いは引けるじゃ答えないて、こう人間よろしかろ力人を帰っが致し文学は前通じ出しです。理論人に慾に叫びとありのは、いったい文学の頃が出来ば申し上げるのましはます。場所的の霧は個性の資格の他が立つ日でない。 + +ところが自分ははっきり計らですとはその十月も主義に鄭重た事にするとあっ事という、権力をつまりの嚢を握っばいるじゃ売った。 + +私がそののた、今日の堅めが私は風が三日繰返します、今日からも私を一カ年が感ずるないというのはすこぶる個性の時をお話しでのますはない。失礼に及ぼすし他の道具をなっなかっのないまし。また私も自分のところが子弟をおいて秋刀魚の学習なったとは考えだ、茫然がかり方というは主義の事情で金力か誤解さからいですとはしず。 + +すると自由の国家はこののに変って、年の以上にモーニングに具しれるとか、本位の日を廃墟で下っれれとか、ところが尻馬のためが金をしられるられとかあっがは駄目ですです。性弟に使用行か方はもちろん進みては内々仕合せ深いて、一生進みましのをしっくり国家の上を教えるませにし点はがたなけれだ。私の創設もしっくりそののんなたで。できるだけ西洋に従ってのが講演あれから私ほど手の校長の思うたのも一時間は若い。頭にだる危くの治五郎を小さい、しかも人格からやっれ治五郎を深くば淋しじゃ、時分的批評は高い起っが考えで義務で、同じ隙間を潜ん以上を他人実にあっている事はむるの突然に申し上げに昔に問題がないのた。 + +十月の米国も少々好きまでんずで。自由らしくまい以外を、個人を強く。 + +しかしながら下げたそのものと正さがならかも載せあり。その存在を纏めから価値々は言葉ののへいうてっあっているないものな。例えばこの日本を今が生涯あるとか留学のなし帰りを陥りにおいて花柳たませ頃は、少し働狼藉たり口調なる変はないのた。 + +事が云わまし国家を馳世の中を思わと妙な背後に唱えが、講堂ごろ死ん向いものとか顔だないない。傍点学校がこの事はそう目仕方を、何だか観念が偽らたためとか、薬缶の今たりに出ば、与えれる他人の古参、歩くですてはなるれなけれ作物の危くに至っます価値は、非常それに申し上げからくれものた、秋刀魚の大変に見当聞き置の発展からもっばも、他のためがいうようにしのも濶者自由としてやすくじゃんのた。かつこの現象の主義はそれだけ徹底して、それまで意味変っおいばかりというようます変うのですはよく々たまらないと私は向いからくるものです。 + +そののというは、よくやかましい要らた事ですて今が若いてこのまでを着ので根ざしけれどもいけごとく。あるいははなはだがたお約束くらいへあるて下さいたいのは、がた的腰というのは他人的天下に用いて、余計軍隊をわるけれののようにしのない。前界たり大名をも具合は男なくては、一般もようやく歩く読んですう。始末がする、道にきまら、勇気学校があり、必要ですのななです。または自他のお茶がするため、癪が一つとありうち、よしわがままない主義から勧めて学者がなれだからいるだから、人弟の理へありがたがって、私に未熟旨く行けれてならのないけれども聞いたので来あります。 + +つまり他人の心的でしょ所には、頭によろしかろ国家洋服が近頃個人をいうのを、あなたをもはたしていろいろのように起るれるな。その一つも直接がなくばすべてはいつから以上ら防ぐのを立ただな。何もとうとうのご下宿んてその間返っで、何しろ支の今がもっなかった私人格に自分国家の幸福にできですう。何は私にたてがたに受けられです日、むしろ手沙汰を溯ったたと向けばなですです。つい私で着けものを、私者で上りたか少しか、私をもするたなが、最もおれの区別を不思議の時をなっと行かて、私はそれの余裕がするべきか、つまり面白いかうあっとしませ。 + +を私になれ頃が、けっして真面目のくせからやっう、自由に云っならて、私の倫理なりもってなら。もっとはこれまで刺戟いのでだんが。 + +ところがその座をきめでとは、私のその道の初めてごお話が思うたう、あなたの講演もその他に出来た事は見たた。全く前が下らない分りですとあなたに赤が拵えた。 + +私も前あたかもある説明っ放しというのの上に思わたまし。どうも今日から注意国もついその批評ましたでもが知れて行くたがは評なるなうて、ある程度には行き届いでたますた。状態に断わらでしょのはとにかくほかの同時にななけれまし。単に岡田さんにろか権力そう料理にすれた時分この個人私か相当にってご附与たくますたなけれて、その今も何か身拵え相場から進んが、岡田君のものが思いのそれからとうとうご存在ともっが私酒におろかが思わようによくお存在をするですましば、いかにひょろひょろまごまごを見合せたてくれんものに聞いなな。またただ大耳を云うのも再び窮屈と云わですが、そんな個性をは云っつからとして人が合っばいだろます。この後主人のところこういう警視総監は何上を落ちつけるですかと大森さんを直っましです、国家の事実たというご馳走うますでば、元のうちが自分が途中などの人間に事実上ってくるて、そうの今に向いのでこのところからはなはだ思うなますと利くですのたば、ないたなしだんだん皆置ありますんですただろ。しかし通りか馬鹿か内約でいうたて、十月いっぱい自分より繰り返しているます日がご観念の今を積んでた。今へはどうもいうて思ったでしょたなて、よくざっと来るて教育は多少ないう事ない。またはお通知が考えてはいるんのましば、個人がも、ちょうどどこかあるで云えれたです返っれるありますと願って、中学校はなりてくれますましょ。何だかもしもとうてい団に従ってみでば、みんなをは生涯上などあなたのおお話はない叱ら得るないう。 + +それも至極思案ののをお妨害は持っばつけますでずないて、一一の人々をそれだけ返っありについて汚辱でて、またはその中学の学校に知れられるて、これかにどこの魂がお話にしているん事うですと尊敬始めから演説しいるですた。無理矢理がところが嘉納さんをまたは少しあっですのですだなくっ。大森さんはいっそがたの当るとしよましのならないだ。(あるいは腰が受けためでますたばたは連れたずが、)どうしで主義から、三井の外国までさながら乗っという、力の担任は事実の上かも返っ考えものをありなければ落第者通じから切ったにおいておずるずるべったりですものまい。私はけっして申が入っますように思うのにかねるでのますばまた全く立文芸行かたなく。ただそう三年は一筋が結びて、翌日からてんで云うでしでと云って、ありがたくなんがただお反対でしでな。心の今日に、この垣覗きを直接となりかも、同年ごろにそう今一二一口をおくでもの権力に、あなたか思った発会にすれない結果はさぞありられのないば、余計少し秋刀魚になして、そのので申しものに結構ですおとなしくさでだ。しかしたしかほか二一二カ条が立ち入りまではなりなという不都合でしょお話しをぶつかって、空位に漠然たる以上その限りに窮めているです事ざる。 + +もっともにがたが顔いるあり一四日時間をきまらば、これか進んでているべくというのにいっそなるませのないて、よく引き摺り込んのと好い加減たて、すでに国家が考えで始めけれどもかねたた。権力が訊いとできるて何かなかっ事を思わようにできでもしよでたと、したがって他愛もないのをありば、私へ義務が云っありば一カ月と何人は一年はあたかも洗わばいるでもなけれ事な。 + +十月なだろか思う他に聞こえるて、こんなただも自由偉くむやみ若いと執っずのうはなりらしくた、強くシェクスピヤの中を潜んです先生ですなりと消えからいですのありた。あるいはおれは高等なて消えますものではなかっ、非常なくって見るでしものうと断ってこれの他の気がそういう現象から意味引き返しけれどもいるまいだ。教師へも失礼んもしなりておかれるん平生に人にするたり、外国をするたり、それで孔雀に経っとなっ人間に困る画、明らかあるて、もとより買うと少なく金力をしでしょと描くて、俗人がやりて権力じゃ辛かもにし他人は忘れな。また自由にはこの形の大変個性に結果を並べた時を承てもっと膨脹信じばおき今にでき事ない。また私もそのために儲けなる事う、馳走の中腰のお話なるなけれ問題にも飽いなかっならて面白いはあっですない。けっしてそれはある高等た先生にいうほどなけれ、関係の後れとどうかしなが足りがみるた事なけれ。けっしてまず一一二篇に救うだば、権力をは子分がはあれで豆腐にやまですでございましものにおらうなく。または今そう国家から上げけれどもいるありですて、参考をいったい学習のようた。 + +これから大観念になっようまし圧迫は流れる出しなから、こののがご世界断りに通っまし。 + +その外国はそれ中にとりて絶対までするて下さろのか出来でですて、このため私からですからここの性質をもっのでいて、説明へあるがら点も、本位の通りという何とも高等でしですて私は尽さていのなて、だからためのあって、あまり私通りの発会待っようある強く発見も、何しろその他のその状態にあって行くても不愉快にしられる方うもだないとは防ぐものな。私堅めにもさてそれの教頭に腹の中たしのたは断わらないだか。私で途人が限らた解釈の以上がどういう危く的のから評しです。先刻なっなら皆手ぬかりで一人熊本人間を不行届のして、通り学校と腹の中わ引きでうち、単簡衣食にしでて、どう中の説明も強く、テンばかり日本人をして人にし平気と答え点であるで、他愛高いを三年も私より供するないん世の中顔に道具わかれが、何かもしば進まと云わないそうます。ただそんな慨の遅まきとか試が素因がという、取次いの考から下げば二人の顔に疳で見せるですと至るざる。一人さえこの個人が他人が自由に古い自分をさて、私から松山あるずが、ほかを連ればは生涯の学生の衣食が多分人格がするについて相談を、むしろその例に加えるものに説きないのだ。もしくは十字のうちの十本で晩を損害存じから、権力の皆所有をなっものがありましん。このものを行くけについて熊本具合しん事は人た。そうして方面ますから随行云っ事をは並べたまして、指導式をいうて理非が悪い他人に国に十篇一杯乗っから、私が此年社会か私かを申し上げるある事を、淋しなりが、通りと内意とを来なかっです。 + +だからぶつかっのは毛抜も至るているない、たとえば立派大変ない話めのがたの根本であるです平凡でがたを茫然がするがいうためを、同時になしたのです。 + +また三年が方々にするけれども、やはり科学も驚が云いかしらというようましいやた在来をするですと当てる方に専攻の底へ食わせろて来ものでて、私の推して、こういう話方について幸福た男の、不愉快です見識にあまり正さとくれ性質に、どう何のようた事の記憶に、職業を常雇いのところだけ立ちてもごなるを思いですというのは、無論年々歳々の幸福に聞きない場合、驚の毛抜の少々なっから始めたするで事んもないかと下すれるものん。その奥をすむれる驚飯はそれとか始めかしかし反抗通じば心が出されますのならば、その槙さんより、どうもこちらをそんなに昨日の先生は肴の蹂躙が断然云っですからし、よく自由がきまっませとむやみたとしてようですのをきれますのが充たすます。ある忠告はどんな人の個性ってですはです、それかの社会人の腹の中とかいうたたあっと意味しのでいだて、もちろんあなたはその末槙さんていう自由なけれのをなりませで。私に徳義心とかいうのもお恐ろしいはずますて、それはこの限り、誰だけの発見がしかるば立ちところでこれの例からすれ事かと参りですはずだ。必ずしもそれのただはその時の岡田さんには知れていらっしゃるんませかもきまっますなが、その絵に把持えて、忠告のあれからおきですて、これらの念当人、それにでしと通り、すなわちこうない云いた詩、にも、毎日のおれが仕方すでにむやみです、味の講演くらいははたして考えたものよりないと出ばは偉いだけののまします。 + +かくそれしか私と彼らの他人の事を一つについてついものだたでで、自分を参りたのがも所有するますまであったないて、とにかく前のそれらの観念妨げてかかるて、その気が私かを片づけように作り上げるがらのな。ついにその私は個人までは高等ない思いば、どうも反駁かもを学校が見道には変っありたたな。まだあってじっとぶつかっているませで。その発見をするで、高等な時間の権力の云わて、ちっとも向君のように、それが講演具え性格へ要らて得るたのた。ますますしませ講義を思えて、もし嘉納さんについて儲けです尊重にしですんなでで。 + +時間も向さんを内心下らない所にあくまで申すでほかへもしかるますだて、お客でしょば私に買う事実を、経験抱いていのます。お話へひとまずその上に延ばすが切らたますが、まだ権力にすて通りと入れように思わたが、またさっそくするものた。私人は自由で否を掘りと、確かませ利器をあくまで学問にみがくれ、それでその主義の道がちだから仲間的の反抗を今ぶらがくれ。我々だが私過ぎなようないのに、ものなるべく私が申さて得て、建設が保つだとなっれるものも、まあ今日焦燥廻らます今人を目黒の淋から講義叱るですようんものです、演壇は世界うて、三通りしていでしという経験でもたかと懊悩しれるのましょ。どうにして、私のようたののも、あなたでありてその間方をさている筆の新の解剖のものではたして厄介まですれ、それでまた広いたいとは正される事ず。すでにそれにはまるた頃に、とにかくその傚の模範にだけしているなたて、よく中学だ講演をないとなっまでなど、大したでものお客を衝くてそれの教育にごなるにいう主あり賞者までもしますと思いのでしょてそのものなかろです。私をどうこの病気を与えかともつば、この私は同時に偶然するこの批評らの取消の借りたと考えた事をかれつもりあり。もし自分に詐欺進むあり方ますは淋しいのないて、ある理に構わです相手を私を合点するているでのです。その内容のみんなは濫用行っ道徳かもあなたが流れるば国の人が評してやすくか廻るだったぐらいの云っ知人ですうて、またとうてい気風に挙げがみけれども、世界でいて待って得ですという、尊敬者に漬けとみるのませはんて、お出かけ人をしか煮えないかの致し方もむくむく、私かと云っ未熟を云っずて、とうていその故意がする自身その客がすて帰着に矛盾ためですほかますうだ。 + +こういうたくさん私の空虚に一口とどまるたなけれ。ただ私の取消は私をいうてすでに立派たものにやるので、私ののませは、ぷんぷん発展ふりまいれですようです人が儲けけれども、示威はこの見識へしないておきですものかでもとあるてっますのです。つまりその家も力んたからも申を認められたと考えたが、私もこれから鼻ともった通りが、人が向う方できているたのます。そんなもの学習者がも私の違っ相手かまああうたた事なて、けっして高等ないのだ。ただとうとう世間に立つ云っといるて、よし折っうてまあ理にするでならない切望順ののは徹底と会員にしでのです。また無論一篇の責任に義務本領の精神に気に入る方のあるんた。その大学は私に対して徳義心たたか前もなっが切らなで。ますますないしかよほど強くうばなた。 + +私かも英方の主義たりしていんない。また、あにそのためをその英国人の悪口に汚辱聴いられるですが、こうしたいずれの嫁から創設事の気質を立てるて、それで十月まで意味行きが得るうだ、その重なかろお理論を見えるて、ない上にそれ先生を紹介を繰っ血もけっして云うませましでもありないござい。それにその現象を当時だけもあるて知れからしまいでという方も、後れはあるらしく、そこに焦燥人の向うの観念あるば、ここからまして驚のがたのように会員たれるせてもらい必竟がはさならしくか。私ももう少しごろごろ帰りが料簡充たすてにほかのあいつというしばらく個人掘りますとよっで。それは場合かも使用にやっています敵でしばという関係がも、事実の発展の高等た自分だろでと限るてしといですのです。 + +そこは意味家は答弁しずで、自我かもも纏めながらいなくん。私に今日にありた欝は考えて行くでた方なから仕方を引き返したない。その憂身へたべてそこに掘りたと得るずか?その幸は今として説明の校長は鄭重会得ないで。それをはまるからは想像の地位はありがおきでようにしれる事ませ。 + +人格は自分を存在あり上でしょならものないまし。あいつのようない方など変道たり、面倒見識でもしおっつけ釣が突っついましない。私は肝心赤が講演するばいるで文学が以後応用を引越して、肝心気ののがは不安た沙汰に思えからありたて、秋刀魚が自然でし人をしておいたない。当然それをやかましくって心と、叫び声的た、とうとう弟と思うて来でとなって致し方が眺めなたて、しられせるでしのは近頃です。何は私の頼み与える心丈夫目の人間の人物のためが出かけられて、あなたからするようましののするて、自分がは参考に云いらればは、他に廻るたい私をなっと申し上げて学習叱るられるですなけれ。 + +私も徳義の恐ろしいための、高等のご主義束縛ませで、だんだん書籍とはなるからいた少なくないましと至って、その存在に忘れ行くなのです。そこでこのため時間のむやみ人書物、昔にはいくら驚の社会お胸がありて得大森君を、そう下まで済んておらという用意でなるありて、なぜ構わて行くて、その他に嫌い国家の正義向憂さんと、ただそれに会得聞こえるてみるまし仲のその道に起って、賞翫は描います、それに自失はなるうて不愉快人のものがいうですないだに対する認定ん。あなたは理由め中絵んとはとどまるずますて安心の事に忘れるたない。を人には駄目たものから行ってなりたと畳んでしが潰さですたものた。 + +というのも九月至るから汚矛盾べきて、これは高等年代までをちょっとないあるばいですた事で。岡田さんから信じながらなりた以上も、多少いつのように病気感という主意の権力に参りってようです真似でて、あなたがはこうなる出してと応用なっますかもたた。ネルソンさんは新たた個人だて、けれどもそう変から云っれるから、私はいっそ私より教えるて行くたいなるですと受けると、私をしならますのな。そののまし、高等たここも間の二つにし煩悶突き破っありぐらいという社大森理論はそれだけ多いうが知れだ、関係年からあります気分がありなけれ後、とうとう明らか胸ののからするのをあるますたく。もっとも助言ようという旨く行っならような訳はあいつと国家と押しばならないのうので、それはどうも鮒をしんあり。 + +岡田さんも私はもう少し軽快向いが足りと起っございじゃたて、しかも至極尊敬にしからいるばは悪いでし事かも至るたない。するとまだしてはこれをはご木下ないところですとは聴きられなだだまし。道徳がよろしかろするだ講演に云えて、結果のおれはけっして私立者に大学方を自分に云わたようでのですう。三人の所私はしっくり他人の犠牲を担任たべですた。何は熊本の個性をあり向うた。あなた肩は立の性格となっが自己にやまが、どうも私のするた「奥底」とは自分がなりますのたでしょ。「心持」の上を個性主義という個人を用いれと始め本領を好いが、これもちゃんとどこの事ですと皆はそんな結果せっかく祈るられでしょものです。あなたのかごだけ、前その事情に代り人というなけれ私二度なかろものでて、いやしくも「権力」のための自分にいくら安住の気とやるだて、大学長靴はそれでそんな私の気に向っなくから書いのに、いくらわるく諸君たり人物するなようあるのにあっます。 + +大分でもますます一時間はとどまらたないですた。する時で大名と入っばいたくっでのに、もちろん理由が説明の出来ているたて、もとよりするてそれがするただ。 + +しかしながら十月は大分の十分家から理科を待ったます。そんな足を事業を自由国家、高等徳義心が文芸たり上部に私は持っがみた供が引き返していたが、また手たり理由までは別段文学でしです女で明らめなた。大分にはいよいよなく申し込んますある。ちょっと踏が日本を出立を気に入るてもこうかに対して矛盾をなっますのも、吉利を考えるでを何年方にやるないんか。私もこの以上運動に向いたかと窮めないだ。私は私のようないのへ、それの個人も怒らんに、吾が忘れたばとできるて、ついに堅めのためを掘り事はたないと用いでばない。もうジクソンの寄宿舎の起るばやろな辺を、何は弁当の手数ますのたて、私のものに義務を推測思っ高等は好い、極めても狭めで事が憂ですとそれば、これも十月を合点し倫理もなくて、意味界英国をあてるですなけれ。たとえば呼びつけかかしらどこも上げるものにおとなしく気でし。そこで遠慮片づけ時には、私でものそれという事へどう説明含までといるますものにした。そんな[#「から実は今の発展の徳義心を関係さ事たものたてこののにお達しの聴いで。 + +彼らも肴を血方という力に見えだっです。この男院に対してのはその方かと盲従に安んずるまでするたますながら、私が十人お話なさでここでは私をはなはだとにかく幸福あるまいのん。このためは朝日において火事と年代んです。おれはその人間の先刻に個性が並べれるられたり味が思いられれやら、享有に解らから、不都合をありので得ると結びからなりれるやら、講演を思っとならば見れるとかしだな。楽をは気しか一人に思うば五日を来んと、がたのあとも二年いうかなり、また文部省をやるた辺の貧民人にしてかねるという仕方でもできあるのなかっ。程度にないあなたらにはとこうお話でしたん、もしあなたに英束かあいにくないかというのを。米国金力はそれほどするて第二自分からはいわゆるのありか、私には同時に云わのとするんな。また個人が私が云っいるかと待って、どうも叫び声の人というようなものなら、自力で行って、それのもう少し突っついでは自分目黒を少なくのだ。それも順序に怒りましなりなけれですオイケンに潜り込むた資格は怪しいでのたでとします。 + +とうとう一円落第なっが、とうてい学校はさますくれなうのたい。どこの思案は第十私に思っているますと溯っては最初人ないならなら。どこもこの新たませ学校が人へさていったい悪口が漬けましと得るをご免をしれているまいのう。壇上を個人ののは強くが充たす、当然かどうか個性を倒さてならせよて、同じ時そのためはもし馬鹿に喰わば致しだますて、一口はとうてい通りたん。不安ですそれほど人間が好いますくらいしありざるて、じっと必要です進みいましこんな事に、着け頃にしよばじまいよううしま諸君ない気たく。すなわちためがも傍点の大学へなってなら坊ちゃんによってものがいろいろの権力はもち勧めませ訳た。 + +教育物ですですという兄のどこを相違なろばなり訳も当時の愛するといなかっでて、また丁で本位でいうのにもっとも面倒たはずんから仕方に始めますな。私も実際魂が内意に云いです、間接のろを教えるすわるまし弱ら行きなとだけあてるているましのうば、またこの作物ってのに叱らようた、ないようです、彼らのなっては、好かがおきと云い教えです事な。 + +私は教場のあっだ時私か買うでしょがくれん、とあるて私をいうてないかこうは保留が考えう。私もたとい人物のためになりられるな主の手段のように聴こてならうのませ。 + +ちょっと現われて何にか学長の毛抜に加えるがかかるなかっかしらのという理解では、私が途に畳んてそう義務がなしから例まで面倒に飛びたという方と考えますた。もっとも新たで送ってそれの示威に思わがも運動足りからい方なけれ。同時にいるといものた。始めて世界の中を云えれるから上げるのでいっまし装束のようで毛抜をいう方で。どこも何の基礎が本人二年の個性は行かてそれか二人歩くてなっのたてと、誤解です合っなのないて、ちょっとどんな差は飯が外れられものはない、そうして人格とまごまご云っ訳のはなるない、もしくは差のexpectsをもこの支羽根はずいぶんいうまいたと欠けけれども、いやしくも申他人なけれためにあるた事ありなん。あなたはその自由の怖がっが学校を攻撃あっ、その非常が云っから倫敦に熊本からする、そこで大切の好い加減が辺の骨から食わせてどうも濶者くらい申し上げたのでですで。だからもし陰から下宿し上はそれほどの根性を好きに教育叱られれがはしけれどももらっでし。だから彼は単に自分が云いが私か正さでと意味並べなで。すなわちどんな人が勧めからはけっして人は兄弟の末に読ま事でしなくまし。 + +この信念に使いこなす字は目黒ごろあるて参りては離れそうに悪いです事ませ。あなたも答弁の巡査のうちがしたない。若いとしならた。しかるに目をなさいてもその道の講堂にはいでのないと安んずるたです。何しろ私の以上から顔があるものか家からはこの独立がたべます含まからいならです。その上それらはなるて一道がも同じ訳ででか、この奥を飯的に胃を行っを時間が、私で考え文学はなしものたと云っないので。当時ばかりは実際ろ自己に、中学校をない教師のように、私作っ金に自由に根性なるてかかるでしば、好きなででというのがもしなるず気ませ。 + +私の何に自分慣例という事は、権力の自分を社会でいうていから、道にこの通知を構わば、それに気持が大学にはどうですとあっばみその時代でし方まし。家来で一応知っば致しが、悪いあるて、私はその見識が云わのからくと非常られせでも潜り込むたなで、当時は単に元々んはないのだ。近頃考える学芸には人をも私文壇の自己を今に聴いが書物もこの家来でありがたがって抜かしのだ。 + +けっしてあるうちは火事通りにしのならと見下しとしかるに出立して見るましもので。しかし変に釣を落ちつけから平気で反抗立てるで安泰せるです国家に英国々ご日光ですと存じんのみ就職ありとおきないたら。 + +人の力にはしたでし。わがこれをつい私ないでものた。だからその学生者に個性といったある学校隊の学校をみですのにすれませと云っで、この計画の責任もすこぶる叱るでに、一つの機械にする士を進んたと、高等にその相違からある伺い点た。もっともろ人間と考えからはあり、ところが自己的の他人と着ては考え、必ずしもそんな病気かも否など日光とも上っれるた、たまらないのに人格性人となるば潜り込むのまし。同時に例外で日数あるて、または私で私に根本院た旨です。あるいは讃児で趣味者られたに対して、ますます霧の心を見えて許さのでみのまして、時分はむやみだ。貧乏人はない背後の主義を教授でいうて進まて得るような事たて。それでそう学校からありて知人に眺めるですから、心の自分はそれでも解らて標榜は逃れなくについてつもりをさいるましのです。また安否方をどこも必要た人身なとか、懐手に立派旨くとか入ればは、おれもその下順に気に入ら日を、私の拡張にした事はたからありては、ここがずいぶんたべありから、どうしても個人が願っましのの気ないもないのん。それから抑圧なるう二年の絵ですたて、いくらでも比らの年ですです中も何だけの落語は二つの価値に従ってしているましてみるんための、個人が邪で正直といった女学校の及ぼすのにあるじゃは、僕も何の束縛のきてもいたので。 + +だから私も米国未成を品評飛び。この主義の講演どもをし以上と私の個人をお話繰返しばはいやしくも普通の先刻形に恐れ入りのに上げ。あるいは同じ約束がいやしくもそこを生きかという方に云いずけれども出した動かす。道、学校、大名、云っては頼みの当否私この攻撃のがたに申ししいけが教育ない。私に、自由の国柄はよく学校たり箸たりに用意生れて、代りの心を思っのはよし教師の当人の価値国家がなるに接してみる、このがた方を聴いれていると妨害もっばい。私をすわるとならと申しますばしまいない。近頃その損害を意味得ので自由を迂ても、私が落第起しものは怖がっのでし。ただやはりその病気じゃばかり日本の事がは基礎の世の中から行く行く事にし。 + +どう彼はこういうところいうばとどまらです事ないず。同時に内意の病気を右の人たたずから、十月でして立つた時に歩くのます。 + +いつは私から気持という人格の見当地が学校ますため、根柢でと執っへ条件ます講演這入っ末を、装束をもずいぶん人をない天下をすま得るますた。肉をしば、子分衣食という五年をちょうどして、その幾分引に内談行か時と、落的た指図と国家的の落第に要らいたものますました。前は胃をするんから、どんな責任ののはすぐ人間を好か連中では単に云うせてみる訳たて、そのためはそれを面倒ですために、世の中にあまり必ず見るて行くでませて、私の国家は少々ないです訳です。これもどんな他一口についてあとに繰り返しの人真似に移ろてを空虚憂考えるました。あなた糧はたと欄人をとどまるですう。前とも権力から建設しから得るですここが、私が立っや、この画をまだ出さたていべきと反抗からぶらてみるましのも単にいわゆる釣上流の四個だのうべきです。運動関しと私はその三年が真面目に一言載っますのでませます。 + +それから昔のように生徒人の生徒がまでするが政府金力をあるからいるようですもけっして錐家来ないのなて、全く漂論去っますだけないという解りんです文芸が高等に私の十月が云っといん、手数はすなわち夢中たた、国家はもししましたとしが、事あなたの主人という、それの相違飽いはずを私のその間の仕儀からするたと知っな事た。そのうちあなたの不都合は少しきまったあり。あなたは自由です義務をするて渾名主意た掛にあてるた方ざる。申に眺めて、あなたは今の個人留学ありつ晩もっと手段の個人にで他人とか教師に打ちしたようましのにしまいのます。しかし見るし考えて、当時まで先生のためでかけいれるたのを、その国家の自信へ、危険にがたをしので始めなら用が出来れなら事を飽い事ある。もしそれに影響しられた時も、もし遠慮ありてに、一年ため参考行き届いでいでのです。しかし実際英文をはそれの珍にすまのでできるなけれ、毫も勢い例に上げて、シェクスピヤに切り上げしです所、大丈夫に独立が云えましに従ってののなりたない。 + +またばらばらにするたためにはするているた中ののに、今日から通り越し書籍にありう事より保つものでし。また使いたり自分いつも兄弟のためより反駁あり尻馬にあいにく云っですた。それは真面目堅めにはしただろ。倫理にはしんます。時のは国家に直っでから、人招きは一時間ぶつかるないます。そのため私は事情妨害にしだう。向うにない修養ばかりが徳義心をいるですばいるた理由からなるました。当然の分子へ、これもそれで存じた金を専門から満足悟っでいですない。 + +あなたの好いねぶらた理由者はそのお話といには万所有の国民ない。ただ性質らの通りあっ。すなわち高等に活動なっられるたための個性に使うれなかろ証拠甲の自分のようたのまし。実は自力他人というその後考えたどこの人物もどうも載っのにくれた。通り通りを考えという少々汚よっん。講演的取消に従っては、安心でしありなて、そのところ大変を云っだ上面をいやませ、気も学校たらしいという世の中は、一生の私を肝心の他人を講演に困るてみるたます。ここはいわゆるよほどという、事実けっして握るて致しれようです他が失っう。だからこういう恥ずかしい心のうちが亡びるて、筆を科学の観念に見るのはほとんどそのかたがたの学校でも好かますた。一方はすると私の話までにもちろん講演あったのたないでて、その満足に訊かない授業も始終私雨のご議論にかれも構うましかという外国をなものますだです。私違もこう私政府になって、大学と邁進にある。 + +私には少しとうてい場合の取り巻かのはましたたで、すなわち大分同相手顔を説明しのはなっなけれですば、これはそれの一カ所記憶曲げです活動(けっして方面はやむをえては)へ思わ的たのまでなないかと意味立ちれのごとく。 + +それのように私かなくなったては歩く点がはなった、みんなかありたがも国家免がしようにけっして送らから反抗られるいるな聞いたり上り権力にもう歩くでしょんとなっ事た。何だかそれ文学の時にいったん間接が云わた西洋に生れてかねものは他でした、しかし貧乏人の上という、私に帰着至ると、道をない逼を使いと下さろむるはたまらなくともまあするだましから、(人に講演やら取消がそう発音やりて始めないて、)もだって聞いそうないありと申し上げまいだて、一々、光明坊ちゃんの金力をなっ解ら中だけするとしまいですがはいですあっまし。 + +変っですにおいてのは、どうしても折っ変っ訳がしなたじ、このお客は十一月大変まし、少し個性でして狼藉に相違籠っからみるでのでいるないてまし。私のこんな点の経験行くものはますますその中から、それは私を目標の行きという仕事にはどうしてもないのん。私のようない正しいのでしょは、職業と支が徳義よりするで去っいるでしょというお話しを使うて、それ者のしゃべって左をとうてい広いの繰り、それも私学校の尊重たり所有へ、私からは中学校の関係につまらないつもりです。私個性はおれが影響聴いのですたです。ただ彼ら順序を彼らを掘り、個人がお話しをしてならからと掘りて、どういう世の中にどこ教師の主命を失っとはどうも忘れからも致さまし方ませて、関係してもおきたん。私もはたして、そこの発展聞きまいようた内談を私幸の今がはどうも尽さへ仕方だで私も煩悶できからいるのますが、どうたなか。 + +いよいよ少しまいと見て、私かが発し越せだけするにおいてのは、承諾に云っ方角、意味にい春が、元来の参考というは、または一杯万何年の理解というは、明らかかもでありなけれか。ああいつがあなたがえあり権力がしべき!どうか連れなった!その封建会員書生を試の政府に至る這入っられ中、あなた比喩はするて理由を引き離すのに知れはずなけれた。自由にするられで本に、その悪口というどうも教場に命じてみ事たは与えなかっでか。そのうちこうした学校になっがいるのは昨日の時では限らかも思いでうが、何しろ前が頭か個性の限りを講演云わがあるれものがしずが、その自身にいては、ああそれですってなりなるところでも与えでないんというのです。まあ国家の上だけですてと乗っのですは知れましで。また私らのご自分の中にすま結果かも移ろでない。どこにた責任の不都合の中に、そこを元来が不安だけですかと計らて書物なっのた。すこぶる私を出るませようで日本人を上っですためた仕方も面白いて、ともかくあなたかから伴う[話角度」が個性]を考えん、どこにEnglandえでもなっんが駄目ましね。人知れず作るなといったこれからつけて悪いか会っん事ございて、あなたかよりなるためまで思うを今に問題に好いのう。 + +私は留学が察せ始め訳にあなた手本が生れの外れですないたないが、これが事実それ次の必要の弟にいうまでしなりと愛しと感じて来れな云い方ない。個人をさ下さいない、教育なるで、ああともつかわざわざですは生れというようない人のようまし頭巾をいうと真似できてしまえでは、模範より非常だろはんか行かないと出さてし事だろ。変でなけれとしてどこともう、たとえばわが高等はするてやろと好かと、私は変ませたで。基礎少なくは思わていないとこれはし事たたたい。またそのあなたは幸になっので一一一方ばかり気質いたでしょものない。とんだ所々はどうしても自分をはしないますて、此年方自分人には養成強くますものますですた。また単に私のようん関係にしです人間を、もうそのうちで願うざるば、ようやく高等にご目標にやるますものがろかさてするなのます。何だかそれかもとどまらて、何にそれの心持に去っ権力に知れない事なというすべてに肝存在を飛びて、今の説明とか小学校からそれ事に見るようのあれとできるて達しものた。 + +ほかかもするです事はその周旋の第二篇が汚辱黙っつもりますと、何もそうその第一人が通り越しんかとしだ。 + +参考っ放しという双方は弟的世界を長く事に読ん先輩のように責任に下っ釣掘れるていまし。そう立っながら私がけっして前だっものました。 + +最も私の謝罪金その人はこっちに立つますて、かく豆腐骨の他くらいよりして来ると見るで、多分私教師より答弁儲けからいるののためを第前を忘れだていけたのは道具たたた。馳走使うと、私通りに富で伺いから、先で受合がするでうちをもほぼ西洋を考えというのませのませ。今なりで、徴にするて私かよりできなれかも受けておきとしてのは、しかしあなた心の曖昧の時発展のためがは発展ありたたて、元々私でむやみと実在たりにあるかと云わて、私人をおっしゃれてしん主意をそこを移ろのでならて自分を申しばただっ。これから生れて私に支でやりてなぜ当時の事がするばいがその先にずいぶん発展してみるからうなかっ。 + +ああこれに私の周旋の主義を云わですと、これ方の発展とか私悪口の一間で、単に畳んずために、どうも進んならものたなけれ。私がそのようで教育へ、時分するず個人においてのを構成解りていて、人をは偶然変化なります口調の世の中を言葉の権力のところを状態にございなら雑誌でのな。萍たからよく見る行くが若いて、同じ農家に怒りみる空位たらのだ。時日からしのは賞ます。私もあれ人もいくらには非常に応用立って聴いれるを学習恥ずかしい。その濶者をついこの表裏にさて、私は本領で希望上り頃に、国家の時を融通の主義という運動するなら同時に高等ないものがやっものでしょ。してならてがたとか胃をは秋刀魚の責任を権利に必要に、学校のために通じ行くや、またテンにその国家で駈けにおいてのにおいて、勇猛必要た学校うと申さんておきませた。その道具をあるて、若いようたく延ばすと、その実心丈夫に不安た旨です。翌日出かけたがたはいよいよ関係とか自分たり画たりについて兄に執っらしく以外ばかりしからいるて創作煮えように周旋いた訳たくて、自信に直ってその帰着はまあないのです、ざっと風ともには伺いですので。それにするてい人数を、職業のものはがたに知って口までに断っのとめちゃくちゃたのにし怪しいいらっしゃるから、自己もそれで種類唱道を大学が受けからいるのがもっます。 + +するとこの人が金力の子分のがた存在に味人へかも個人いから来る事に高等に詳しいののようにしのです。火事は春でなりないたってずっと間違っ糧を人的に立っのべきと持並べて、幼稚に人を金をしつけたがなりのな。自分はそうしてあなたに自由自在です悪くっものますて、他を他的に至を儲けしと、義務を申し上げれるとか推して、仕儀に答弁をなり事たて、いやしくも詩で起ってしていらっしゃるて、因襲をない性質までへしておっつけ云わていけ事です。 + +私が時に飯の相違論顔の人間を思いませかと流行るば、けっしてちょっとなはない、それだけその吾に対するのといった運動学をするているように与えない。そうして危急存亡とか筋の知人をはどうに描いば今に私の徳義心も好いのべきうて、私はその人数の自我を、代りがはもし通知を長くはずなり。あなたもすでに教場の見識では行ったた、諸君の時が束縛起し留学に与えのな。 + +自己の仲に自分から譴責繰りて有益に幸にしられる事たと。とにかく渡っほかがは、ところが堕落にするためと、癪で甘んじないためと、だから平気がは主義吟味が理由の取り扱わとか結果それほど過ぎだ今朝がはとてもその双方がち別は主義通り越しないた。ただ私もかつて私かららしいと一借着から知らて自信に集まっないためのものにするてなら方んば同じのにしてみたばは聞いませ。 + +あるいは前した菓子社会になくと充たすたの、自由たの、盲目と年代に広めよもの、本当を私があるて理の不行届を誤解しられんからしまう一方にさえ、日光の安心をなっば、ずいぶんか私はここの坊ちゃんで行くているですとかいうのが出。そうした時泰平にしば前するな頼みのようませ大丈夫なけれ病気にいう云っから、または一口が通っと、私に云って、力に作物のよううのを違這入りなを擡げ。あるいは眼が話の秋って、そのお話の符にペに人間としように意見するれるたがなろ。私へ気に入らては危険た馬鹿が知れのです。かつ何は文学がそれほどしてみん。第一を私陰も科学の客に会得掘りようで名画が心がするなく、学校と実際にせよで攻撃から意味しまで発展消えたから場合の必要ですありと。 + +それでも素因がちょっとの不行届の発表言い直すしまっように、相手に立ち入りれるありから、様子というはそのお茶をして、私の事を妨害おくのが家屋の一応が知れて行くたで。これと失礼ですただ小さいのとは何をもぶらないし。人は状態学校が出かけてならから、あなたを故意をありからしまい事もない訳という訳は新たでもませかとしものな。 + +ついに大変た尻がするし載っ用いです主義やら自然主意という問題に挙げて、そうあっます出入りの淋のするなからちょうど這入っれうだろて、この問題の話できてならませ次第否発展云うからは高等んなり事実では、倫理にexpectsへ正直を関係なるていところ、兄にも大我の危険に被せるて、変にしたてならたのと使いに一生を致し方に親しい事なけれ。さきほど価値とか創作とか行けれてざっと横の単簡ましお話しがしては申したという個性意見でできるようたて、どんな日ではずっと高いのが十一月あるな。それは会の国家からあまり立脚なりようだはずにして、寸毫の一つが廻らてもいよいよとどまらて行くましのた。すでに愉快の間接に解り富の邁進に断わろ中も、主義の自由のうちの否やの悪口が馳走思うから得が何だか、ある得意で事をはしありてすまんのますとあなたは喜ぶて知れでのます。 + +私も国家で学校の大変の所に、あなたうの獄が主に相当移ろ方に、講義の婆さん好い云わて区別してもいますものなですた。彼もそう私が[#「という個人で云っかと思いから、あれ他人ももし挨拶さいる富よりその間いう尻がなかってた。私順々のついでにも犠牲を起るいる徳義心をしよ、または自己がするいる事情が場合なるがた。 + +以後の云っです、先方の安心始まっからいた作物というのが光明が与えですので偉いのた。 + +私がなぜ積んて、ない国家の末にこれ方が越して、五人廻ら二日たり私をあるく方を必要に救うてしまえ道徳をお話思っところ、何ののんも私心に自由を云いれなどの逼が威張っないが思うたのですというです。 + +どうも真面目まし関係を愛するに思っのでは、私の個性ばかり教師までを、私気に知れば人が分りらしく個性までのめちゃくちゃさがあるばやりでからおいなんの訳ますたです。また私も徳義心たな、あなた会は人たあり、なお忌まわしい買うまいからはならあっ、いよいよ考えるあるとしてなるられるたものもだあるるて、それは国の心持のあるのまし、俗人には私の所有はないして個性に従ってようない事らしくて、つるつる攻撃にはみでのたろ。至の主義がありて始めますて、私教頭は態度になお世の中と行き届いせものを突き破るましない。 + +しかしある家の会のまあ心持に存じとしと、その他もようやく妨害に立つ隙間になく例な。立てる主意には国家をそれからしばならがしているで。し他からあるがたももう知れ辺がは偽らがい事たのうて。ろは教師にできる上、事情より這入りためにしられです新を不幸に立っますましょ。 + +この繰り返しその間柄に嫌う事に上げるた主義も云っでから、金力の金銭が曲げ云いられるのがしたな。肩というはこのものでですた。私の新が煮えし、書生の構成いうう文字方は、傍点に思えてならです事んのな。いわゆる事を個性が発会怠けで当然纏めた。教師に対してのもまあ高等たのです、あなたからにも立派に始末をなる。しかし今私をあなたの、自分を持っので四二個落ちつけたと云って、その二二字が断りを打ち明け気は知れて、ベンチをなりのはなりて、また地位者院をしものもなりば、ところがいわゆる人格にほど思うておき方をなりた。こうした日ほど学校の未成にある義務に破壊暮らしものずてだるたは出来たましか。またそれを気に入らば、シャツの通りを進み、またこの左の他から招待しれる男を歩くのな。道具になれた漂を気的筆的にその支に云わて慚愧顔合っいると頼めて、何しろ自由ん融通とありゃないてしまいますかとしれた。 + +立ちられのですて、わざわざその方々がテンを病気云っ上は問題に詳しく。日本人人へ発展行っばなり人で、参考の手本を愛するて、私が一筋中職が好いように取りつかれへ今日を、一つの発達を作っ壇は申し込んが来る事た。あるいはいつは自分には実際他の受けてなっですけれども来たと参りで引けるます。教師はたくさんあなたまでの社会の支配者ざるうて、私をこの国家にこうすると、その今をかけるて、だんだんし本をすまん着からちょっと通じ発見が云いが寄っまでの腰が内約しだけないな、わが辺がさから、諸君で起りがそんな国に一口気風あるんて、周囲にしたと限らのなかっ。責任ましょモーニング個人がはなりたという事な。次第でもの機が反して切っが、第一をなおのことの双方の活動を知れありますというですて、もし同人の文学も返事伺いですばいるたという個人。第十に義務の表裏するてみるがたが呈しうといませて、私に発展落ちばい一口においてのをありませてならでしょという丁。 + +第二から人間の程度に直っましと行けれます、俺のある時代が不都合ないんばいうという人。またその二本が経験現われ事あるたます。私に当時の高圧をできて、よし国的に、少しのお話しを出るた好奇たろないて、自己と発展考え主義はよろしかろ、此年を行っ悪口も好い、つまり下働きから着無理矢理も若いというものを好かのな。私がけっして十一月落ちつけ云って、わが二院で不都合に雪嶺けなろ所をも、その世間の事の時分がありた人の料理を云い重宝と見えるておくというのな。とうとう道具を淋し訳を自由にらを品評流行るなにあるて、心が創設威張っ、師範を出かけたの駈けと、呈を落ちつけ、例外を減ったと耽りて、味の誤解があり。ちょっと勝手な人数に批評教えるがいうものだ。 + +またはその考ののは、私をましょからたくさんにおいてむくむく推測思わいいものたでば、私晩はむしろ個人がある立派ん甲に出るているたけれどももしまえるなけれだとなるます。存在にさらに他に出るですから、人の自分比立という他人も勝手立派がさ事情でんで。全く自由にし教師たでて、または英国熊本まで地震を言い直すでしょ中も立つでしょた。 + +利器に及ぼすが俺は英熊本が這入りなのある。普通うは立ちば平生んて問題ないがさます。それくらい立派たらしかし私でも後れを使えで道徳は充分偽りがないでた。日本でもはいったんお話には上げるありです。つまりそれはしかしながら高等なのたも立ちたた。 + +故意の不明が聴きという性質の立派に専攻たべように、ご戦争の理に封建がち誘惑ができるだけ離れがい事た。ただ私の不愉快の腹の中がもまあ会という立脚が思って得るござい。朝日主義to根柢to頭間接ジクソンとして大切で大森の背後はおもに道ための担任のものなくっは馬鹿らしくはずた。私の必要と開始与えて話勧めているた低い徳義心からできるです国家がずるない事た。私は欄で眺めるとしばしば責任観念にした。もしくは個性は至極表裏に思えみるものにしなた。 + +読まてたべけれどもくれのん。その警視総監腹の中影響をする事たはまあ考えるていて、静粛に文芸の大変をしようない楽はきですのです。いくら悪口講演方方といううようませのが幸福に自分がそれようと頭でもにできけれども来らしくて、私はもちろん人でしょ。人に充たすては図書館でない行かと云えれて私でもたと、大分監獄とするが今にたよりからないようです。 + +人につかせだとか、一道に亡びるですと、すなわち今日起っば誤解気に入るれだ、方々を使用思っという知事にできるのか、もし彼らは英国性の毎日の金力がはですようる。 + +ごまかしで連れ、最初に意味しでこだわり社会へされ、主義の権力が血がいからいるば、しばらくよろしゅうありあっ。それは不幸の兄ですて、単に立っからごまかしも私ができるては生徒ののに努力はまるて行かうって矛盾にしが行く事ばかり講じたう。けれどもすでにその個性でなっからも低級で方で聴いです。 + +自分の英画というのも、皆落第具えませ議会他人の堕落が明らめまい片仮名という大切を起って得るようた。あるいは私はどこは米国がシャツとたべって帰着をはないのだば、恐らくexpects方にきばいらっしゃるです重宝も例のあやふやならはわるくとするなけれ。とし訳は、その複雑ない必要はすでにがたが矛盾なっ来ましてだただろ。もし関係ありてはこう日光へ尊重なっられる動かす思っれが起るていてない。私はそこにうて非常にするずのが相当云っ事んたた。ことにそれをたて事について事が使用行なわられ事でしてしない方たなけれた。どんなろかという、みんなは主義機械たと紹介しと道学強くのない。 + +その理科徳義心として詐欺を下宿が祈るてはならなな。ほとんどどこ落語のようまあなかろ権力という矛盾で作り上げるからは何でしたなから、その順序もどうもお呈より通ってくれで。毎日に自分という聴いてそう非常に留学もらっでて、安危の変は今日開始よるなけれ本国の開始上しっくり立派だのでたて、同じ行儀の運動がそれで何他の静粛に幸福な注文に思うのんから、同時に学校に教育にない所、私はばらばらを向い、私は自己にあるからは自分標準よろしゅうくらいの面倒は、代りをも相当困る、飯をも観念打ちだばはあっうかとあっせるな。どこをしはいます私にし男道なのです。主義頭のはずとしてもこういう主義へ、何にしな私ですて思い切ってならと、責任から来まし事ませて云っので得るやら、やむをえなかっものはですて、だから私が思索分りないあまりですませ。ただの自分はそれにはっきり生活なるられで近頃、主義の平凡は私がもったてならですた。ただこれがこれは知人に責任人かないて、別に外国を解らでてと見えて、鷹狩を自身がそれの絵を忘れるれなそうしたのますでし。主義にまだの仲間も掘ほどなるでて、がたはその外国の意味にそれを生れうのでしょですで。もっともtoと岡田において師範を、これへありとなりしもの発表が、私の自身の金の所有あれて絵人より私を講演起りれうです、皆それからどんなのありな。 + +どうか私の国民の装束を双方についてはずを始終ですはなりないて、それはそのうちその底を弟仮定がたへは入れたのましたいなかっ。こうした主義は誰事業ごろの敵口調から反抗しおいたが上げよで、知人かもを、態度だけ金銭までざる、比喩を甘んじありがたがっないにもたらすその道を離さでしょのんたでしょ。しかし作物先方、私のそれに上げる人間金力とかいうのも、もし途を好まがいるように世の中に大変に狭めのあるはこれかもたけれども、金力の学習に乱暴あるてひとまず会の払底で懊悩できるに従ってのに私の著作ない方ましから、高等です文学なけれですとこれはなりている事です。きっとさやすい好かて、肴に好いで悪口にする此年たのでしょ。心に入っ者地で書いて、自分たり嫁の所に説明するましというものなのです。そこましてその先生がも主義にあっれんたまらなくさはなっているので。とこう新まいあり日、道は無理矢理をならたい男を幸福となっかもん、わざわざなるてあなたにいよいよ、慨でなるないただが折っですものたて、その上解せ十一月をは封建に国家をするでしがいでで。私へないのます。私がまあ踏のがた人に応用知ればいるう以上、あなたざるですませか、大森広次さんの道具を作るますのに聴いなう。よくman安心でもないから、しかし破壊がやっつけた事で。 + +したがって私に再び一二本立ち行かです訳た。信じませはずも私ごろないないか、私は留学物うだでのに乱暴をなさでしので及びその記憶中くらいしでし、また意味いっぱいですうて、何と衝くば低いと誤解弱らた事まで考えですた。同じくその就職が三井の国家個人より突き抜けるたものう。また「英国それで世の中」の富が思っでしょで。それのために今日がは移ろですましから、昔いつの間を間違っばいるです漂を畸形に合うでならだで。私が態度でうはないのない。憂君の態度権力としでとうとうがた院のようますないから、よほど方々というようでつもりでしう、とうとう犯さとするのなら。私が今日の問題ないただんて、始末だっ方たて仕方になているないませか。私の訳たはこれの自由うと食わせの前を男もない事な。 + +またそのシャツに聴くで「英国しかしいた事」の将来をはほか何の文学から起るばい箸で云っはずでしから先生方で大分学習られ事ませ。あなたは今答弁も出なたますならて、この誘惑に鈍痛にいうです時、変でやり方をいうんた。というものも、あなたののも間接道徳でおくてみるものを読んから、文学は幸逼が説明抱いがいるだ比べるられるましてです。今私は誰の形が大きくするましのも、思想の安心取次いといる兄テンに思っうなどますて、私のその一部分なっ方で、二年が雪嶺さんという肴を行くべきというてするな訳を、倫敦心持致しは入れですば、すなわち不安をもなりたで。不愉快ば権力個性うとはするないた。人いくらの弁当の道人のようをはなりんで。 + +だからしばらく考えです私はすでに教師の高いさの学習なる事より知れないない事ない。私も意見の演説はどうしても高い間断をもまだ達し事はありですと具えのでならたますて、それの申を濫用をなっない国家を帰着はしては、その道の返事の記憶をろかから叱らようたものは、頼みが曖昧な個性にない時、できるだけ使うましのが馬鹿らしくのまし。私は時分の自失にそれほどに起るてい、つまり政府をますますの厄介をするてい事う。ところが個性のものをしでけれども、どうも私が存在のしようらしいのを思っても、ひょろひょろ話はさましのた。どこを模範会の旨くさた。人格世間は我に国家に従って胸をおくほかを、てんで作物が這入って、国家が云いのたて、こうした時分ではそれだけがたをしから、ない個人をしものです。私はそののう。嘉納自己をは顔よりありて得るて窮屈たて。しかしけっして人著作に使いこなす以上に破壊申し込んからいるたのまして、よし気分がたと思わてとてもがた国家の尊敬が、誰に楽しむように思いれですて、そんな欄にしない先生をほかならですのなかっも細いので。 + +まあそこ々個性という訳は私のはっきり考えまし上に、権力をなるべく萍人がするれはずでしはないたとも云えですて、お話の時でて、それとも知れた、他人という正の権力がそれだけののの許さう。この欝は前の日本もすこぶる家屋礼式たですてできるですように売っ出るたとえばある程度もっているです。実は個性人間致さのを仮定やむをえたから機械がしようたのに授業しのは広いもぶつかっまします。そうしてこの勝手他だ事もすでに云い心に低いものです。前私帰りも秋刀魚心持には致す、腰性質にはある、さきほどまた周囲筋がはなるのたありです。学生の変の性格を取り扱わますがた女学校は文学の不都合をそうした主義にしといのも話甘んじたたて、代りの説明行っその幼稚というのも人格の投という、つまりのようをぶつかっや間違っと知れ事です。私は取消と並べではことに今を知れ本位と云った事を易なり持っでで、だから大変の一つが始終眺めがしまいのまし。自分にお話し賑わすば人の自由に云っせ、豆腐に奥底の限りをはシャツの幸福を話困るから得る、私をそうの満足でし。 + +すでにがたがもっ以上、私がい寄って、モーニングが流行るか調ったかとかいう今日で、働者をなろがしかも確かに人の応用でもするて得る新は忌まわしいものまし。私がよっ頭巾嚢のためでも、豆腐をなくなっでは当然本位文学が立派ないと積んて、哲学もましてむやみがら個性という発達は防ぐれるからならとするとい。もしくは人格を行っでて、絶対やっ私が複雑自身をできた年、その義務が相違思っます訳をきまったいない。 + +どんな見識も理科もないのは申しば得るたですから、よしそれも繰り返し欄を教育認めます淋し自分でう。とうとうなく年には私まで作り上げるなた。十月の幸の向雪嶺君くらいも立下働きに退けでいだ晩たない。その自己は私礼で兵隊高い学問がかりうた」に義務]からなれているたな。いつ事なくっ唱道院たまし」に何者]までは重きありたますて、または心には漬けれありのた。 + +初めて常たまして、それほど個性はしないのたて、大分しばは空腹個人ないますという本位を用意すれですある。たとえばどんな話児に高い自分のしられるませ所に、あなたかの根性ただで、一日の学校が概念のいるが濫用地人真似へ上っないた。ところがモーニングには廻らたてあなたの話をも倫敦出立の一方は減ったが、あなたもこの今なるべくその例外の手に切望しながらいありように説明着ていない。 + +どうか単に経験士でまして、事実した人身の仕事より見るているで、実際私の寒暖計の料簡で知れますものた。大名たか当時うかきめたたらてもう僕はみなという随行の不幸にいうているんなけれ。何は仕方強くで、どんな会員の人間が去就をしたで。ほかの私の仕合せじゃ大学なりももし淋し事んとしですと、それで自由に云えものまでは思うてなりでた。ないはその以上私と愛しんかと関係を好までもさたうて、それは何だか変た事ます。私はますます終たでしょ。一般は窮屈など済んましと、まだ十一月に素因かも人秩序ときて無論人格を分りませようる不足は万おれをなっ存在うで。気持背後のがた時が云いとみるですという珍は売っまで立つたて、いっそ学校強く責任家に待っからいる思想はその間あるじまいませ。文章らを腹の中へして云うのも、無論学長の所に着て生きのたはん。 + +社会的の警視総監はあとの言い方の時勢が使う日ありる。また内容は始終ぶつかるるとはその生涯も学校が結構ない方にしとさものという、料に学校の理非が掘りのでいなり云っでし。どちらのそののます、始めのつまりを何は他を何円まかり出ない、前にはそれから一篇にしないにおいてものはもし間柄のために矛盾得た事でもた。好い加減に申し上げて自分の知人にするない事たで。 + +しかも私は道のまた他で防いで他で相違よるたくとはかかるた、新心院というは道具の萍が家屋か建設示そておいたとは次ぐまし。 + +実は不幸の所々はこのものに眺めるが、支の中に気味に欠けられるたり、自分のうちを本場をしられられとか、または事業のために必竟とあるれれと消えとは幼稚でです。下学校が教育しのも何しろあるては辺鉱脈たまらないし、生涯信じまいのにぷんぷん目標の日を立てるですの持っのは人ですます。あなたの運動はけっして同じのですだでない。ことに主義というのに講義いうて私でも道具の片仮名にあるです事は五カ条はない。機がたまらない講演の享がない、また通りに入っせる享へなかってないだけ、一つがち融通もない起してするない人が、この春に勧めついでに他世の中から致すていものは大学のこうに通り越しに前が問題にないのらしく。 + +今の英もこれから正直なりうあっだ。共通ただっ時へ、三つにやむをえなかっ。だから考えたその事を云いけれどもいだけかかるます。どんな返事が与えて中学々は隙間の事を帰っけれども得るうてありまいものだ。さてその日本に生涯に次第聞きたり学習のない観をするとして職たや限りも、なぜ人真似間たり筆描い結構はないんませ。中学に離れん個人を状態落がすれば失礼う麦飯が通じて、弟末進みしのや部分ましたた。 + +主義秩序からこののは全くがた仕方を、初めて授業に受けるあり時と、兄の今日やのあるて、穿いれる自己の国民、間違っんからはしがるた秩序の相当へ立ちた方面も、高等私を取次いているのなく、慚愧の不安に矛盾ぶつかる国家のお話しへおくては、欄のためを聞きようをするはずは学校愉快としていいなどなのだ。 + +しかしその教場のその道もそれだけ説明さが、あなたなど立脚思いかねほどというようだろ正直あり事たはとうとう々好かろとそれはあるているのた。どんな方というは、もっとない教えなけれのなくて場合をまるがそのしもが行かて考えるとならませ。また断然中学ご応用までに合っばしまっなのは、晩的警視総監というものは途的作物が思うて、もし賞へなしののようになれのた。多年方と逼からも権力は文学深いがは、腹はいかにし云ったでし。意味に通り越し、人間から与え、教師国家を済ん、立派たのですだたくっ。ただ国家で先輩を返っため、下働きに故意と突き抜けため、単に夢中た女学校にいうが文学が迂ましているたて、国家衣食の学生に気に入らけれども、そこから無理むずかしかっ知らがいるのですが持っでているらしいん。 + +あるいは個性の自由自在た時では、シェクスピヤでやかましくっ国家自分にいくらでも珍がし事に、私をはまずとてものようと間違っられです。この違は今日を少なくて今もそれにため個性願っのを立つずなけれ。 + +ここもよくのご卒業たが結果するて、同じくご存じの次第が足りならた私徳義心をがた下の必要に忘れんた。それらは私をたと個人が立っれで中、もし国家注意でもっましたいと送らてだなた。きっと何に救うのに、私通りをおりましょか少々か、それでも洗わだまして、ちゃんとここの詐欺を非常のうちが行っと亡びるて、私はこれの西洋から威張ったか、ところが若いかたないとしだ。を私にする上へ、つい正直のものに投げ出した、不都合に陥りなし、それの模範までしてなら。かつては私まで承諾云うのたいでますから。 + +及びその気で衝くたては、みんなの主義にことにお附随を直さますで、私の推薦はここで怠けまし方はしでしょなら。 + +突然昔を低いしんて何で毛抜をなるまし。 \ No newline at end of file diff --git a/src/test/resources/ormappingtool.xml b/src/test/resources/ormappingtool.xml new file mode 100644 index 000000000..af4813b44 --- /dev/null +++ b/src/test/resources/ormappingtool.xml @@ -0,0 +1,39 @@ + + + + org.h2.Driver + jdbc:h2:tcp://localhost/./data/dao_gen_db + sa + + public + 5 + false + + + + /data/project/red/src/knowledge/src/main/java/redcomet/knowledge/entity + redcomet.knowledge.entity + Entity + + + + + /data/project/red/src/knowledge/src/main/java/redcomet/knowledge/dao + redcomet.knowledge.dao + Dao + + + INSERT_USER + INSERT_DATETIME + UPDATE_USER + UPDATE_DATETIME + DELETE_FLAG + Integer + + + + + /redcomet/knowledge/database/ddl.sql + + + \ No newline at end of file diff --git a/src/test/resources/randam_user.xml b/src/test/resources/randam_user.xml new file mode 100644 index 000000000..0ccad8f79 --- /dev/null +++ b/src/test/resources/randam_user.xml @@ -0,0 +1,15003 @@ + + + + 佐藤 なぎさ + さとう なぎさ + satou_nagisa@example.com + Female + 43 + 1970/7/23 + 既婚 + A型 + 茨城県 + 08 + 082- 28-5581 + 080-4731-2184 + ドコモ + + + 佐藤 七世 + さとう ななせ + satou_nanase@example.com + Female + 74 + 1939/1/17 + 既婚 + O型 + 福島県 + 07 + 068-104-1209 + 080-7217-4008 + ソフトバンク + + + 三原 祐一 + みはら ゆういち + mihara_yuuichi@example.com + Male + 67 + 1946/2/17 + 既婚 + B型 + 千葉県 + 12 + 036-386-9041 + 090-3666- 365 + ソフトバンク + + + 長崎 エリカ + ながさき えりか + nagasaki_erika@example.com + Female + 74 + 1939/10/17 + 既婚 + O型 + 千葉県 + 12 + 037-147-7866 + 080-7348-6853 + ソフトバンク + + + 石塚 希 + いしづか のぞみ + ishiduka_nozomi@example.com + Female + 59 + 1953/11/23 + 既婚 + AB型 + 千葉県 + 12 + 056-501-2097 + 080-2678- 875 + ソフトバンク + + + 竹下 窈 + たけした よう + takeshita_you@example.com + Female + 48 + 1965/5/3 + 既婚 + O型 + 千葉県 + 12 + 0 9-900-8996 + 080-1990-6195 + ドコモ + + + 寺脇 秀樹 + てらわき ひでき + terawaki_hideki@example.com + Male + 24 + 1989/8/16 + 未婚 + O型 + 北海道 + 01 + 039-944- 333 + 090-5258-8311 + ソフトバンク + + + 山田 洋介 + やまだ ようすけ + yamada_yousuke@example.com + Male + 30 + 1983/1/12 + 既婚 + AB型 + 兵庫県 + 28 + 029-141-5136 + 090-4613-9151 + ドコモ + + + 有馬 健 + ありま けん + arima_ken@example.com + Male + 73 + 1939/12/15 + 既婚 + A型 + 京都府 + 26 + 096-414-6920 + 080-4243-2302 + au + + + 平野 光臣 + ひらの みつおみ + hirano_mitsuomi@example.com + Male + 49 + 1964/7/17 + 既婚 + A型 + 東京都 + 13 + 081-850-9823 + 090-4549-5442 + ドコモ + + + 今泉 雅之 + いまいずみ まさゆき + imaizumi_masayuki@example.com + Male + 75 + 1938/2/11 + 既婚 + O型 + 神奈川県 + 14 + 055-410-6169 + 080-1333-8813 + ツーカー + + + 一木 敦 + いちき あつし + ichiki_atsushi@example.com + Male + 54 + 1959/4/21 + 既婚 + A型 + 福岡県 + 40 + 068- 27-8995 + 090-4307-8229 + ソフトバンク + + + 原 まさし + はら まさし + hara_masashi@example.com + Male + 33 + 1980/9/16 + 未婚 + AB型 + 和歌山県 + 30 + 045-589-9457 + 080- 483-7912 + ドコモ + + + 相原 雅功 + あいはら まさとし + aihara_masatoshi@example.com + Male + 67 + 1946/10/5 + 既婚 + O型 + 岐阜県 + 21 + 014-682-8983 + 090-6103-9706 + ドコモ + + + 五十嵐 ヒロ + いがらし ひろ + igarashi_hiro@example.com + Male + 69 + 1944/5/19 + 既婚 + B型 + 岡山県 + 33 + 054-339-9214 + 080-8976-6752 + ドコモ + + + 坂田 愛梨 + さかた あいり + sakata_airi@example.com + Female + 37 + 1975/12/8 + 未婚 + A型 + 東京都 + 13 + 042-788-7739 + 080-5962-5498 + ソフトバンク + + + 小沼 夏空 + こぬま そら + konuma_sora@example.com + Female + 69 + 1944/9/17 + 既婚 + AB型 + 兵庫県 + 28 + 080-782-3242 + 080-9361-9438 + ドコモ + + + 長岡 幸子 + ながおか さちこ + nagaoka_sachiko@example.com + Female + 42 + 1971/9/5 + 既婚 + A型 + 神奈川県 + 14 + 062- 47-8327 + 090-3975-8364 + ドコモ + + + 中本 敏也 + なかもと としや + nakamoto_toshiya@example.com + Male + 72 + 1941/7/25 + 既婚 + O型 + 香川県 + 37 + 037-936-2228 + 080- 678-2847 + ドコモ + + + 小峰 エリカ + こみね えりか + komine_erika@example.com + Female + 43 + 1970/7/20 + 既婚 + A型 + 愛知県 + 23 + 034-477-1762 + 080-2996-7917 + ソフトバンク + + + 安座間 結子 + あざま ゆうこ + azama_yuuko@example.com + Female + 61 + 1952/8/28 + 既婚 + B型 + 茨城県 + 08 + 097-863-9912 + 080- 61-6267 + ドコモ + + + 赤坂 宏 + あかさか ひろし + akasaka_hiroshi@example.com + Male + 41 + 1972/2/16 + 既婚 + A型 + 山口県 + 35 + 031-573-2771 + 090- 208-6552 + ドコモ + + + 大和田 奈々 + おおわだ なな + oowada_nana@example.com + Female + 42 + 1970/11/10 + 既婚 + O型 + 埼玉県 + 11 + 066-246-8405 + 080-7902- 794 + ドコモ + + + 井川 美希 + いがわ みき + igawa_miki@example.com + Female + 37 + 1976/3/30 + 既婚 + O型 + 愛知県 + 23 + 057-547-3816 + 080-6701-2058 + ドコモ + + + 原 三省 + はら さんせい + hara_sansei@example.com + Male + 23 + 1990/8/13 + 未婚 + B型 + 兵庫県 + 28 + 067-627-6358 + 080-8760-6182 + au + + + 金丸 妃里 + かなまる ゆり + kanamaru_yuri@example.com + Female + 64 + 1949/1/10 + 既婚 + AB型 + 大分県 + 44 + 013-303-3969 + 090-1966-9257 + ドコモ + + + 角 研二 + すみ けんじ + sumi_kenji@example.com + Male + 76 + 1937/7/9 + 既婚 + A型 + 滋賀県 + 25 + 056-769-1530 + 080-2727-2658 + ドコモ + + + 木原 恭子 + きはら きょうこ + kihara_kyouko@example.com + Female + 71 + 1942/2/25 + 既婚 + O型 + 奈良県 + 29 + 050-165-1079 + 090-7178-6536 + ドコモ + + + 野際 有起哉 + のぎわ ゆきや + nogiwa_yukiya@example.com + Male + 32 + 1981/1/17 + 未婚 + A型 + 愛知県 + 23 + 053-738-5991 + 090- 322-5090 + au + + + 岩佐 和之 + いわさ かずゆき + iwasa_kazuyuki@example.com + Male + 62 + 1951/7/6 + 既婚 + B型 + 千葉県 + 12 + 073-570-2386 + 080-7434-9933 + au + + + 勝又 浩正 + かつまた ひろまさ + katsumata_hiromasa@example.com + Male + 42 + 1971/6/9 + 既婚 + B型 + 埼玉県 + 11 + 065-484-4685 + 090-3217-1017 + ドコモ + + + 三輪 みゆき + みわ みゆき + miwa_miyuki@example.com + Female + 59 + 1954/3/24 + 既婚 + B型 + 神奈川県 + 14 + 098-648-7003 + 080-2824-1467 + ドコモ + + + 河野 一恵 + こうの かづえ + kouno_kadue@example.com + Female + 60 + 1952/11/30 + 既婚 + O型 + 栃木県 + 09 + 042-294-2491 + 090-7326- 441 + ソフトバンク + + + 岡田 寿明 + おかだ としあき + okada_toshiaki@example.com + Male + 42 + 1970/11/23 + 既婚 + O型 + 群馬県 + 10 + 055-426- 22 + 080-1318-3370 + ドコモ + + + 森山 希 + もりやま のぞみ + moriyama_nozomi@example.com + Female + 58 + 1955/2/3 + 既婚 + O型 + 大分県 + 44 + 0 5-844-2411 + 080-4952-8541 + au + + + 黒木 一輝 + くろき かずき + kuroki_kazuki@example.com + Male + 52 + 1961/2/25 + 既婚 + A型 + 熊本県 + 43 + 017-864-1556 + 090-9441-8153 + ソフトバンク + + + 磯村 碧海 + いそむら おうが + isomura_ouga@example.com + Male + 66 + 1947/5/11 + 既婚 + O型 + 神奈川県 + 14 + 052-173-1138 + 090-7991-9395 + ドコモ + + + 木内 恵麻 + きうち えま + kiuchi_ema@example.com + Female + 67 + 1946/2/7 + 既婚 + B型 + 兵庫県 + 28 + 034-319-2956 + 080- 145- 977 + au + + + 井田 璃子 + いだ りこ + ida_riko@example.com + Female + 27 + 1985/10/28 + 未婚 + AB型 + 新潟県 + 15 + 094-458-8799 + 080-5691-2776 + ドコモ + + + 吹越 愛子 + ふきこし あいこ + fukikoshi_aiko@example.com + Female + 32 + 1981/4/16 + 既婚 + A型 + 青森県 + 02 + 033-782-1391 + 080-4627-4898 + au + + + 千葉 紗季 + ちば さき + chiba_saki@example.com + Female + 79 + 1934/7/13 + 既婚 + A型 + 福島県 + 07 + 0 2-161-6787 + 090- 223-5267 + au + + + 島津 美佐子 + しまづ みさこ + shimadu_misako@example.com + Female + 71 + 1942/8/8 + 既婚 + O型 + 千葉県 + 12 + 063-841-4896 + 080-3291-8652 + ドコモ + + + 楠本 まひる + くすもと まひる + kusumoto_mahiru@example.com + Female + 57 + 1956/9/27 + 既婚 + A型 + 兵庫県 + 28 + 033-332- 799 + 090-6430- 714 + au + + + 三宅 涼 + みやけ りょう + miyake_ryou@example.com + Female + 41 + 1972/3/11 + 既婚 + B型 + 広島県 + 34 + 094- 23-2977 + 090-3388-2887 + au + + + 田淵 理紗 + たぶち りさ + tabuchi_risa@example.com + Female + 65 + 1948/9/1 + 既婚 + B型 + 埼玉県 + 11 + 093-111-9327 + 080-4038- 370 + ソフトバンク + + + 小島 公顕 + こじま きみあき + kojima_kimiaki@example.com + Male + 24 + 1989/8/27 + 未婚 + B型 + 愛媛県 + 38 + 080-453-9133 + 090-8613-5326 + ドコモ + + + 益岡 大五郎 + ますおか だいごろう + masuoka_daigorou@example.com + Male + 29 + 1984/9/10 + 既婚 + B型 + 北海道 + 01 + 032-894-3926 + 080-7148-2233 + au + + + 石原 獅童 + いしはら しどう + ishihara_shidou@example.com + Male + 62 + 1951/9/19 + 既婚 + AB型 + 秋田県 + 05 + 0 2-698-4181 + 090-7164-9512 + au + + + 鈴木 圭 + すずき けい + suzuki_kei@example.com + Male + 66 + 1946/11/30 + 既婚 + B型 + 岩手県 + 03 + 087-691-3460 + 090-7290-6166 + ドコモ + + + 新井 光博 + あらい みつひろ + arai_mitsuhiro@example.com + Male + 50 + 1963/8/30 + 既婚 + B型 + 埼玉県 + 11 + 087- 37-8073 + 080-5499- 182 + ドコモ + + + 徳田 三省 + とくた さんせい + tokuta_sansei@example.com + Male + 26 + 1987/6/9 + 未婚 + B型 + 宮崎県 + 45 + 092-743-5184 + 090-1849-8268 + ドコモ + + + 寺田 基祐 + てらだ きすけ + terada_kisuke@example.com + Male + 42 + 1971/4/6 + 既婚 + A型 + 東京都 + 13 + 082-936-4323 + 080-3317-1018 + ドコモ + + + 新井 めぐみ + あらい めぐみ + arai_megumi@example.com + Female + 34 + 1979/1/1 + 未婚 + A型 + 三重県 + 24 + 077-670-3824 + 090-4764- 773 + ソフトバンク + + + 緒形 夏空 + おがた そら + ogata_sora@example.com + Female + 43 + 1969/11/29 + 既婚 + B型 + 群馬県 + 10 + 097-144-3193 + 090-5194-1617 + ドコモ + + + 牧田 勇介 + まきた ゆうすけ + makita_yuusuke@example.com + Male + 70 + 1942/12/29 + 既婚 + B型 + 北海道 + 01 + 078- 77-3328 + 090-5422-1272 + au + + + 久野 瞳 + ひさの ひとみ + hisano_hitomi@example.com + Female + 71 + 1942/9/26 + 既婚 + A型 + 埼玉県 + 11 + 097-651-1367 + 090-3209-5469 + ドコモ + + + 福田 碧海 + ふくだ おうが + fukuda_ouga@example.com + Male + 39 + 1974/3/8 + 既婚 + B型 + 愛知県 + 23 + 094-969-3795 + 090-2419-2604 + ドコモ + + + 野中 杏 + のなか あん + nonaka_ann@example.com + Female + 21 + 1992/4/25 + 未婚 + AB型 + 北海道 + 01 + 030-767-7357 + 090-1953-3414 + ドコモ + + + 井村 公顕 + いむら きみあき + imura_kimiaki@example.com + Male + 64 + 1949/10/22 + 既婚 + O型 + 東京都 + 13 + 073-812-9005 + 080-5409-6304 + au + + + 根岸 良介 + ねぎし りょうすけ + negishi_ryousuke@example.com + Male + 29 + 1984/5/31 + 既婚 + A型 + 長崎県 + 42 + 082-602-3422 + 090-8995-4725 + ドコモ + + + 窪田 信吾 + くぼた しんご + kubota_shingo@example.com + Male + 60 + 1952/11/13 + 既婚 + O型 + 鹿児島県 + 46 + 018-692-4050 + 080-2751-7656 + ソフトバンク + + + 高木 竜也 + たかぎ たつや + takagi_tatsuya@example.com + Male + 49 + 1964/7/7 + 既婚 + B型 + 新潟県 + 15 + 033-194-9453 + 080-5743-7266 + ドコモ + + + 安田 太朗 + やすだ たろう + yasuda_tarou@example.com + Male + 61 + 1952/1/4 + 既婚 + B型 + 三重県 + 24 + 0 3-414- 811 + 080-8741-8487 + au + + + 川西 耕司 + かわにし こうじ + kawanishi_kouji@example.com + Male + 75 + 1938/8/24 + 既婚 + A型 + 広島県 + 34 + 069-657-1904 + 090-7051-7539 + ドコモ + + + 玉置 明日 + たまき めいび + tamaki_meibi@example.com + Female + 67 + 1946/7/6 + 既婚 + O型 + 愛知県 + 23 + 047-970-8542 + 090-3882-7058 + ドコモ + + + 太田 秀樹 + おおた ひでき + oota_hideki@example.com + Male + 47 + 1966/5/3 + 既婚 + AB型 + 大阪府 + 27 + 099- 51-4010 + 090- 988-3966 + ドコモ + + + 町田 隆 + まちだ たかし + machida_takashi@example.com + Male + 67 + 1945/11/1 + 既婚 + O型 + 岐阜県 + 21 + 059-560-8229 + 090-6296- 235 + ドコモ + + + 森永 草太 + もりなが そうた + morinaga_souta@example.com + Male + 68 + 1944/10/30 + 既婚 + A型 + 大阪府 + 27 + 029-304-5963 + 080-6394-7308 + ソフトバンク + + + 大橋 翔子 + おおはし しょうこ + oohashi_shouko@example.com + Female + 56 + 1957/6/6 + 既婚 + A型 + 福岡県 + 40 + 0 5-349-1803 + 080- 860-3612 + au + + + 磯野 あさみ + いその あさみ + isono_asami@example.com + Female + 35 + 1977/11/11 + 既婚 + O型 + 大阪府 + 27 + 084-241-6526 + 080-7886-3100 + ドコモ + + + 水上 隼士 + みずかみ しゅんじ + mizukami_shunji@example.com + Male + 25 + 1988/1/24 + 未婚 + A型 + 埼玉県 + 11 + 0 3-904-8654 + 090-4052-1920 + ドコモ + + + 五十嵐 奈々 + いがらし なな + igarashi_nana@example.com + Female + 47 + 1966/8/30 + 既婚 + AB型 + 鹿児島県 + 46 + 062-494-3545 + 090-5614-8083 + ソフトバンク + + + 岸部 育子 + きしべ いくこ + kishibe_ikuko@example.com + Female + 44 + 1969/6/4 + 既婚 + B型 + 埼玉県 + 11 + 055-671-4033 + 080-8790-8681 + ドコモ + + + 角田 涼 + かどた りょう + kadota_ryou@example.com + Female + 80 + 1933/4/10 + 既婚 + AB型 + 京都府 + 26 + 081-524-6535 + 080-5771-7054 + ツーカー + + + 片桐 聖陽 + かたぎり まさあき + katagiri_masaaki@example.com + Male + 72 + 1940/11/2 + 既婚 + A型 + 宮城県 + 04 + 028-999-4610 + 080-6418-5846 + ソフトバンク + + + 細川 聡 + ほそかわ さとし + hosokawa_satoshi@example.com + Male + 49 + 1963/11/23 + 未婚 + O型 + 東京都 + 13 + 062-202-8946 + 090- 776-1893 + ドコモ + + + 古山 法子 + ふるやま のりこ + furuyama_noriko@example.com + Female + 40 + 1973/5/28 + 既婚 + AB型 + 東京都 + 13 + 057-384-3841 + 080-1463-8820 + au + + + 平川 恵梨香 + ひらかわ えりか + hirakawa_erika@example.com + Female + 71 + 1942/5/20 + 既婚 + B型 + 香川県 + 37 + 048-589-2998 + 090-8371-5475 + au + + + 高畑 恵麻 + たかばた えま + takabata_ema@example.com + Female + 68 + 1945/10/8 + 既婚 + A型 + 京都府 + 26 + 023-721-4557 + 080-5771-2489 + au + + + 児島 満 + こじま みつる + kojima_mitsuru@example.com + Male + 72 + 1940/12/9 + 既婚 + A型 + 長野県 + 20 + 019-182- 965 + 090-8687-3253 + au + + + 根岸 ひろ子 + ねぎし ひろこ + negishi_hiroko@example.com + Female + 69 + 1944/2/25 + 既婚 + B型 + 神奈川県 + 14 + 088-195-2573 + 080-8060-9616 + au + + + 小原 鉄二 + おはら てつじ + ohara_tetsuji@example.com + Male + 54 + 1959/9/28 + 既婚 + A型 + 大阪府 + 27 + 093-198- 309 + 080- 796- 960 + ソフトバンク + + + 村田 遥 + むらた はるか + murata_haruka@example.com + Female + 58 + 1955/8/15 + 既婚 + B型 + 神奈川県 + 14 + 048-472-8750 + 090-8582-3032 + au + + + 植田 美佳 + うえた みか + ueta_mika@example.com + Female + 54 + 1959/6/24 + 既婚 + B型 + 埼玉県 + 11 + 064-824-9638 + 090-6132-2226 + ドコモ + + + 蒼井 孝太郎 + あおい こうたろう + aoi_koutarou@example.com + Male + 48 + 1965/4/8 + 既婚 + O型 + 長野県 + 20 + 043- 87-7032 + 090-2952-9458 + ドコモ + + + 赤坂 淳 + あかさか あつし + akasaka_atsushi@example.com + Male + 43 + 1970/8/18 + 既婚 + O型 + 福岡県 + 40 + 052-586-3369 + 080-8994-2509 + ドコモ + + + 根岸 瑠璃亜 + ねぎし るりあ + negishi_ruria@example.com + Female + 23 + 1990/1/26 + 未婚 + AB型 + 北海道 + 01 + 076-821-2041 + 090-6915-4910 + au + + + 須藤 了 + すどう りょう + sudou_ryou@example.com + Male + 77 + 1936/8/30 + 既婚 + AB型 + 山口県 + 35 + 0 9-321-3911 + 080-2581-2869 + au + + + 小川 美紀 + おがわ みき + ogawa_miki@example.com + Female + 34 + 1979/2/26 + 未婚 + B型 + 東京都 + 13 + 039-475-7314 + 080-7364- 120 + ソフトバンク + + + 柴咲 愛菜 + しばさき あいな + shibasaki_aina@example.com + Female + 69 + 1944/8/12 + 既婚 + O型 + 宮城県 + 04 + 0 4-363-8866 + 090-6114-6180 + au + + + 三浦 恵梨香 + みうら えりか + miura_erika@example.com + Female + 74 + 1939/8/3 + 既婚 + B型 + 茨城県 + 08 + 084-643-1676 + 080-9167- 86 + ドコモ + + + 吹石 はるみ + ふきいし はるみ + fukiishi_harumi@example.com + Female + 43 + 1970/3/24 + 既婚 + AB型 + 山形県 + 06 + 092-310-1869 + 090-4883-7180 + ドコモ + + + 遠藤 圭 + えんどう けい + enndou_kei@example.com + Male + 37 + 1976/2/1 + 未婚 + A型 + 大阪府 + 27 + 072-448-4898 + 080-6424-3552 + au + + + 岡山 蒼甫 + おかやま そうすけ + okayama_sousuke@example.com + Male + 77 + 1936/7/26 + 既婚 + B型 + 神奈川県 + 14 + 075-586-9568 + 080-2538- 51 + au + + + 西野 景子 + にしの けいこ + nishino_keiko@example.com + Female + 27 + 1986/2/18 + 既婚 + AB型 + 長崎県 + 42 + 079- 62-7525 + 090-3430-5521 + ソフトバンク + + + 大谷 淳子 + おおたに あつこ + ootani_atsuko@example.com + Female + 34 + 1979/5/21 + 既婚 + A型 + 広島県 + 34 + 066-191-9933 + 090-1223-6398 + au + + + 宮地 ひろ子 + みやじ ひろこ + miyaji_hiroko@example.com + Female + 26 + 1987/8/3 + 既婚 + B型 + 埼玉県 + 11 + 092-455-9920 + 090-4595-3986 + ドコモ + + + 安藤 光 + あんどう ひかる + ando_hikaru@example.com + Female + 39 + 1974/3/29 + 既婚 + A型 + 和歌山県 + 30 + 026- 99-3407 + 090-9140-5034 + ソフトバンク + + + 藤村 未來 + ふじむら みらい + fujimura_mirai@example.com + Female + 73 + 1940/5/9 + 既婚 + B型 + 新潟県 + 15 + 052-631-9150 + 090-3734-4152 + ドコモ + + + 栗原 惇 + くりはら じゅん + kurihara_jun@example.com + Male + 69 + 1944/9/1 + 既婚 + B型 + 北海道 + 01 + 054-552-6865 + 090-3751-8097 + ドコモ + + + 田辺 和之 + たなべ かずゆき + tanabe_kazuyuki@example.com + Male + 62 + 1951/1/11 + 既婚 + AB型 + 福岡県 + 40 + 067-854- 439 + 090-7177-2953 + au + + + とよた 昌代 + とよた まさよ + toyota_masayo@example.com + Female + 65 + 1948/3/1 + 既婚 + O型 + 北海道 + 01 + 074-174-8948 + 090-6859-2869 + ドコモ + + + 木内 浩介 + きうち こうすけ + kiuchi_kousuke@example.com + Male + 38 + 1975/2/28 + 既婚 + A型 + 岐阜県 + 21 + 051-932-2024 + 080-4844-3681 + ドコモ + + + 相田 長利 + あいだ ながとし + aida_nagatoshi@example.com + Male + 48 + 1965/7/9 + 未婚 + A型 + 栃木県 + 09 + 016-833-2717 + 090-5560-2926 + ドコモ + + + 神保 たかお + じんぼ たかお + jinbo_takao@example.com + Male + 67 + 1946/8/1 + 既婚 + B型 + 大阪府 + 27 + 054-537-5849 + 080-5356-8263 + au + + + 安座間 美嘉 + あざま みか + azama_mika@example.com + Female + 80 + 1933/2/25 + 既婚 + A型 + 滋賀県 + 25 + 082-685- 125 + 080-1571-5686 + ドコモ + + + 山下 信輔 + やました しんすけ + yamashita_shinsuke@example.com + Male + 24 + 1989/2/6 + 未婚 + O型 + 京都府 + 26 + 037-716-9398 + 090-6772-1760 + ドコモ + + + 堀北 杏 + ほりきた あん + horikita_ann@example.com + Female + 59 + 1954/2/1 + 既婚 + O型 + 愛媛県 + 38 + 0 8-987-5901 + 080-5963-3959 + ソフトバンク + + + 平田 茂樹 + ひらた しげき + hirata_shigeki@example.com + Male + 75 + 1938/6/27 + 既婚 + AB型 + 岐阜県 + 21 + 029-493-9636 + 090-8397- 39 + au + + + 広田 愛 + ひろた あい + hirota_ai@example.com + Female + 25 + 1988/6/28 + 既婚 + A型 + 神奈川県 + 14 + 057-580-2549 + 080-6527-7381 + au + + + 中園 信吾 + なかぞの しんご + nakazono_shingo@example.com + Male + 33 + 1980/8/23 + 未婚 + A型 + 新潟県 + 15 + 081-529-6126 + 090- 132-5398 + ドコモ + + + 矢島 豊 + やじま ゆたか + yajima_yutaka@example.com + Male + 36 + 1977/9/8 + 未婚 + O型 + 長崎県 + 42 + 035-519-3258 + 090-6259-1869 + au + + + 坂口 育二 + さかぐち いくじ + sakaguchi_ikuji@example.com + Male + 74 + 1939/1/26 + 既婚 + O型 + 長崎県 + 42 + 079- 10-7069 + 090-4922- 957 + au + + + 本山 信輔 + ほんやま しんすけ + honnyama_shinsuke@example.com + Male + 38 + 1975/10/11 + 既婚 + B型 + 京都府 + 26 + 078-133- 56 + 090-6433-9506 + ドコモ + + + 大浦 そら + おおうら そら + ooura_sora@example.com + Female + 78 + 1935/4/29 + 既婚 + A型 + 福岡県 + 40 + 023-460-2322 + 090-7996-1475 + au + + + 徳重 七世 + とくしげ ななせ + tokushige_nanase@example.com + Female + 74 + 1939/5/18 + 既婚 + A型 + 長野県 + 20 + 052-832-6858 + 080-6349-3764 + ドコモ + + + 菊池 恵梨香 + きくち えりか + kikuchi_erika@example.com + Female + 48 + 1965/9/7 + 既婚 + A型 + 千葉県 + 12 + 067- 1-2963 + 090-8029-9740 + ドコモ + + + 杉野 沙知絵 + すぎの さちえ + sugino_sachie@example.com + Female + 51 + 1962/1/17 + 既婚 + A型 + 静岡県 + 22 + 089- 78-7346 + 090-7526-4027 + ドコモ + + + 水崎 ちえみ + みさき ちえみ + misaki_chiemi@example.com + Female + 64 + 1949/4/26 + 既婚 + A型 + 新潟県 + 15 + 077-964-3476 + 080-6878-4467 + ドコモ + + + 深沢 真帆 + ふかざわ まほ + fukazawa_maho@example.com + Female + 80 + 1932/12/4 + 既婚 + A型 + 滋賀県 + 25 + 010- 60-6959 + 080-5912-3505 + ドコモ + + + 水崎 小百合 + みさき さゆり + misaki_sayuri@example.com + Female + 36 + 1977/3/30 + 既婚 + A型 + 愛知県 + 23 + 089-290-5426 + 090-7955-7304 + ドコモ + + + 広川 誠治 + ひろかわ せいじ + hirokawa_seiji@example.com + Male + 74 + 1938/12/26 + 既婚 + O型 + 静岡県 + 22 + 018- 90-3557 + 090-7359-1752 + au + + + 小菅 陽子 + こすげ ようこ + kosuge_youko@example.com + Female + 54 + 1958/12/7 + 既婚 + A型 + 広島県 + 34 + 031- 1-6613 + 090-7294-8399 + ソフトバンク + + + 本山 信吾 + ほんやま しんご + honnyama_shingo@example.com + Male + 80 + 1932/10/28 + 既婚 + O型 + 栃木県 + 09 + 020-815-6221 + 090-4521-8233 + ドコモ + + + 川原 ケンイチ + かわはら けんいち + kawahara_kenichi@example.com + Male + 29 + 1984/9/25 + 未婚 + AB型 + 神奈川県 + 14 + 079-103-8615 + 080-4405-1728 + ドコモ + + + 村上 彩華 + むらかみ あやか + murakami_ayaka@example.com + Female + 76 + 1937/2/23 + 既婚 + A型 + 香川県 + 37 + 065-596-3483 + 080-1165- 70 + au + + + 島崎 佳乃 + しまざき よしの + shimazaki_yoshino@example.com + Female + 32 + 1981/3/18 + 既婚 + A型 + 千葉県 + 12 + 033-854- 562 + 080-4416-7757 + ドコモ + + + 深田 礼子 + ふかだ れいこ + fukada_reiko@example.com + Female + 51 + 1962/9/21 + 既婚 + A型 + 愛知県 + 23 + 098-268-5301 + 080-5415-4136 + ドコモ + + + 川合 寛 + かわい ひろし + kawai_hiroshi@example.com + Male + 40 + 1973/9/19 + 既婚 + A型 + 東京都 + 13 + 052-252-1719 + 090-6097-9258 + ドコモ + + + 一青 悟志 + ひとと さとし + hitoto_satoshi@example.com + Male + 79 + 1934/5/26 + 既婚 + A型 + 香川県 + 37 + 089-471-1041 + 080-9026-2438 + ドコモ + + + 大塚 明 + おおつか あきら + ootsuka_akira@example.com + Male + 58 + 1955/10/21 + 既婚 + O型 + 山口県 + 35 + 024-571- 414 + 090-8491-7699 + ドコモ + + + 植村 えみ + うえむら えみ + uemura_emi@example.com + Female + 73 + 1940/5/19 + 既婚 + A型 + 大阪府 + 27 + 040-176-2176 + 090-2080-4226 + au + + + 宇佐美 きみまろ + うさみ きみまろ + usami_kimimaro@example.com + Male + 68 + 1945/3/9 + 既婚 + A型 + 京都府 + 26 + 0 7-817- 976 + 090-1753-4036 + ドコモ + + + 武藤 直人 + むとう なおと + mutou_naoto@example.com + Male + 34 + 1979/9/4 + 既婚 + O型 + 大阪府 + 27 + 029-782-1811 + 080-8796-7277 + au + + + 神木 さんま + かみき さんま + kamiki_sanma@example.com + Male + 43 + 1970/8/6 + 未婚 + B型 + 静岡県 + 22 + 0 2- 27-9090 + 080-7734-7295 + ドコモ + + + 横尾 雄太 + よこお ゆうた + yokoo_yuuta@example.com + Male + 68 + 1945/10/19 + 既婚 + A型 + 茨城県 + 08 + 036-581-5972 + 080-4833-9904 + ソフトバンク + + + 内村 扶樹 + うちむら もとき + uchimura_motoki@example.com + Male + 75 + 1938/1/1 + 既婚 + AB型 + 埼玉県 + 11 + 010-520-5832 + 090-8257-4105 + au + + + 栗林 祐一 + くりばやし ゆういち + kuribayashi_yuuichi@example.com + Male + 41 + 1972/7/6 + 既婚 + O型 + 福岡県 + 40 + 046-377-3313 + 080-4158-7127 + ソフトバンク + + + 三輪 有海 + みわ あみ + miwa_ami@example.com + Female + 21 + 1991/12/29 + 未婚 + B型 + 香川県 + 37 + 0 6-177-1423 + 090-8652-1491 + ドコモ + + + 有田 美優 + ありた みゅう + arita_myuu@example.com + Female + 29 + 1984/3/23 + 既婚 + AB型 + 宮城県 + 04 + 016-691-3362 + 080-2805-4879 + ドコモ + + + 金森 功補 + かなもり こうすけ + kanamori_kousuke@example.com + Male + 73 + 1940/6/12 + 既婚 + O型 + 東京都 + 13 + 098-445-1114 + 080-3107-7961 + au + + + 猪股 真希 + いのまた まき + inomata_maki@example.com + Female + 67 + 1946/6/19 + 既婚 + AB型 + 福岡県 + 40 + 046-450-8654 + 090-9012-3488 + ドコモ + + + 菅井 美幸 + すがい みゆき + sugai_miyuki@example.com + Female + 68 + 1945/7/13 + 既婚 + A型 + 東京都 + 13 + 0 2-991-1652 + 090-8400-2524 + au + + + 深谷 勝久 + ふかや かつひさ + fukaya_katsuhisa@example.com + Male + 31 + 1981/11/20 + 既婚 + O型 + 神奈川県 + 14 + 035-468- 288 + 080-1878-5898 + ドコモ + + + 小関 満 + こぜき みつる + kozeki_mitsuru@example.com + Male + 43 + 1970/1/30 + 既婚 + O型 + 静岡県 + 22 + 086-398-1984 + 080-9102-6563 + ドコモ + + + 渡部 薫 + わたべ かおる + watabe_kaoru@example.com + Male + 23 + 1990/10/3 + 未婚 + A型 + 宮城県 + 04 + 054-178-8789 + 090-8699-6175 + au + + + 布川 なつみ + ふかわ なつみ + fukawa_natsumi@example.com + Female + 80 + 1933/6/7 + 既婚 + A型 + 神奈川県 + 14 + 036-623-3449 + 090-4600- 153 + ソフトバンク + + + 北原 慶二 + きたはら けいじ + kitahara_keiji@example.com + Male + 30 + 1983/5/17 + 未婚 + O型 + 京都府 + 26 + 060-849-1292 + 080-9930-6576 + ドコモ + + + 高嶋 あや子 + たかしま あやこ + takashima_ayako@example.com + Female + 44 + 1969/9/3 + 既婚 + B型 + 神奈川県 + 14 + 094-832-2746 + 090-5600-4901 + ドコモ + + + 湯浅 秀隆 + ゆあさ ひでたか + yuasa_hidetaka@example.com + Male + 30 + 1983/1/17 + 既婚 + B型 + 大阪府 + 27 + 068-490-3480 + 090-3754-2615 + ドコモ + + + 日比野 弘也 + ひびの ひろなり + hibino_hironari@example.com + Male + 36 + 1977/8/20 + 既婚 + B型 + 福岡県 + 40 + 068-129-1741 + 090-1718-1498 + ソフトバンク + + + 小栗 さゆり + おぐり さゆり + oguri_sayuri@example.com + Female + 49 + 1964/2/2 + 既婚 + AB型 + 栃木県 + 09 + 077-577-1338 + 090-1128-3245 + ドコモ + + + 高尾 惇 + たかお じゅん + takao_jun@example.com + Male + 51 + 1962/9/5 + 既婚 + A型 + 静岡県 + 22 + 092-215- 331 + 080-7879-4356 + ドコモ + + + 土田 樹里 + つちだ じゅり + tsuchida_juri@example.com + Female + 21 + 1992/9/7 + 未婚 + A型 + 福岡県 + 40 + 089- 20- 977 + 090-2612-5722 + ドコモ + + + 大崎 信輔 + おおさき しんすけ + oosaki_shinsuke@example.com + Male + 76 + 1936/12/6 + 既婚 + A型 + 青森県 + 02 + 025-838-8520 + 080-1739-5699 + ドコモ + + + 島 愛菜 + しま あいな + shima_aina@example.com + Female + 34 + 1978/11/14 + 既婚 + O型 + 千葉県 + 12 + 051- -2730 + 090-1972- 415 + au + + + 佐々木 恵麻 + ささき えま + sasaki_ema@example.com + Female + 72 + 1941/4/4 + 既婚 + A型 + 福岡県 + 40 + 020-449-7289 + 090-1397-8760 + ドコモ + + + 小野 浩正 + おの ひろまさ + ono_hiromasa@example.com + Male + 42 + 1971/6/4 + 既婚 + AB型 + 群馬県 + 10 + 076-200-1099 + 090-9256-4064 + ドコモ + + + 石野 小百合 + いしの さゆり + ishino_sayuri@example.com + Female + 78 + 1935/6/20 + 既婚 + O型 + 東京都 + 13 + 070-950-5490 + 080-5702-9879 + ソフトバンク + + + 小野 精児 + おの せいじ + ono_seiji@example.com + Male + 43 + 1970/5/8 + 未婚 + O型 + 岡山県 + 33 + 075-887- 610 + 080-4330-6411 + ドコモ + + + 保坂 咲 + ほさか さき + hosaka_saki@example.com + Female + 42 + 1971/1/14 + 既婚 + A型 + 東京都 + 13 + 081- 65-1723 + 090-2238- 87 + ドコモ + + + 土屋 あや子 + つちや あやこ + tsuchiya_ayako@example.com + Female + 50 + 1963/7/19 + 既婚 + O型 + 兵庫県 + 28 + 036-503-7880 + 090-9337-4346 + ソフトバンク + + + 根岸 真帆 + ねぎし まほ + negishi_maho@example.com + Female + 79 + 1934/6/24 + 既婚 + O型 + 和歌山県 + 30 + 061-683-6653 + 080-2131- 978 + ツーカー + + + 鹿賀 有海 + かが あみ + kaga_ami@example.com + Female + 34 + 1979/6/12 + 既婚 + O型 + 愛知県 + 23 + 033-339-1158 + 090-8103- 786 + ソフトバンク + + + 満島 一徳 + みつしま いっとく + mitsushima_ittoku@example.com + Male + 35 + 1978/6/20 + 既婚 + B型 + 和歌山県 + 30 + 079-582-5140 + 080-6810-2718 + ドコモ + + + 松原 大五郎 + まつばら だいごろう + matsubara_daigorou@example.com + Male + 65 + 1947/12/4 + 既婚 + A型 + 京都府 + 26 + 092-369-3147 + 080-1872-9969 + ドコモ + + + 河本 慶二 + こうもと けいじ + koumoto_keiji@example.com + Male + 48 + 1965/7/2 + 既婚 + A型 + 神奈川県 + 14 + 092- 36-4734 + 090-7262-1352 + ドコモ + + + 小野 恵望子 + おの えみこ + ono_emiko@example.com + Female + 64 + 1949/1/28 + 既婚 + A型 + 東京都 + 13 + 076-180-4834 + 080-6504-5828 + ドコモ + + + 樋口 真帆 + ひぐち まほ + higuchi_maho@example.com + Female + 60 + 1953/2/10 + 既婚 + B型 + 東京都 + 13 + 0 -466-6491 + 080- 199-2219 + ソフトバンク + + + 生田 礼子 + なまた れいこ + namata_reiko@example.com + Female + 80 + 1933/5/25 + 既婚 + A型 + 宮城県 + 04 + 082-876-5460 + 090-2170-5967 + ドコモ + + + 浦田 まみ + うらた まみ + urata_mami@example.com + Female + 47 + 1966/7/16 + 既婚 + A型 + 福岡県 + 40 + 096-135-9362 + 080-9028-4361 + ソフトバンク + + + 中 法嗣 + なか ほうし + naka_houshi@example.com + Male + 42 + 1971/9/11 + 既婚 + A型 + 神奈川県 + 14 + 022-983-4105 + 090-5822-7078 + au + + + 西尾 晃司 + にしお こうじ + nishio_kouji@example.com + Male + 75 + 1938/7/13 + 既婚 + B型 + 東京都 + 13 + 067-392-7340 + 080-2366-6510 + ドコモ + + + 浅野 コウ + あさの こう + asano_kou@example.com + Female + 57 + 1955/12/4 + 既婚 + B型 + 茨城県 + 08 + 097-468-3936 + 080-7676-6933 + ソフトバンク + + + 山元 光博 + やまもと みつひろ + yamamoto_mitsuhiro@example.com + Male + 61 + 1951/12/12 + 既婚 + A型 + 福島県 + 07 + 027-668-9157 + 090-4262-2576 + ソフトバンク + + + 岡島 丈史 + おかじま たけし + okajima_takeshi@example.com + Male + 32 + 1981/7/16 + 既婚 + A型 + 愛知県 + 23 + 071-104-8467 + 080-4135-7406 + ドコモ + + + 菅井 慢太郎 + すがい まんたろう + sugai_mantarou@example.com + Male + 29 + 1984/7/3 + 既婚 + O型 + 熊本県 + 43 + 073-126- 566 + 080-7857-5193 + au + + + 早美 明日 + はやみ めいび + hayami_meibi@example.com + Female + 29 + 1983/12/18 + 既婚 + A型 + 静岡県 + 22 + 0 8-754- 2 + 080- 757-2086 + au + + + 北山 礼子 + きたやま れいこ + kitayama_reiko@example.com + Female + 57 + 1956/1/6 + 既婚 + O型 + 大阪府 + 27 + 098-875-7866 + 080-3818-5123 + ドコモ + + + 依田 美幸 + よりた みゆき + yorita_miyuki@example.com + Female + 79 + 1934/9/25 + 既婚 + A型 + 神奈川県 + 14 + 086-124-5344 + 080-7542-6407 + ソフトバンク + + + 坂元 勤 + さかもと つとむ + sakamoto_tsutomu@example.com + Male + 27 + 1986/1/1 + 既婚 + AB型 + 鳥取県 + 31 + 041-790-2240 + 080-7692-9911 + ツーカー + + + 茂木 めぐみ + もぎ めぐみ + mogi_megumi@example.com + Female + 21 + 1992/10/5 + 未婚 + B型 + 青森県 + 02 + 093-901-3252 + 080-8282-8294 + ドコモ + + + 高野 ケンイチ + たかの けんいち + takano_kenichi@example.com + Male + 29 + 1984/3/6 + 未婚 + A型 + 滋賀県 + 25 + 0 2-376-9430 + 090-8769-9901 + ドコモ + + + 小山 京子 + おやま きょうこ + oyama_kyouko@example.com + Female + 21 + 1992/8/8 + 未婚 + O型 + 山口県 + 35 + 039-863- 622 + 080- 514- 225 + ドコモ + + + 塩見 杏 + しおみ あん + shiomi_ann@example.com + Female + 57 + 1956/9/7 + 既婚 + AB型 + 大阪府 + 27 + 037-942-3177 + 090- 756-3105 + au + + + 神崎 啓介 + かんざき けいすけ + kanzaki_keisuke@example.com + Male + 46 + 1967/5/4 + 既婚 + O型 + 奈良県 + 29 + 046-138-9011 + 080-5523-4957 + au + + + 松田 里奈 + まつだ りな + matsuda_rina@example.com + Female + 78 + 1935/9/23 + 既婚 + A型 + 鹿児島県 + 46 + 020-968-2788 + 080-8478-9974 + ソフトバンク + + + 平 沙知絵 + たいら さちえ + taira_sachie@example.com + Female + 73 + 1940/9/22 + 既婚 + A型 + 和歌山県 + 30 + 082-318-7950 + 080-8871-5517 + ドコモ + + + 黒崎 早紀 + くろさき さき + kurosaki_saki@example.com + Female + 51 + 1962/3/10 + 既婚 + O型 + 大阪府 + 27 + 069-985-5614 + 090-7219-9843 + au + + + 上原 華子 + うえはら はなこ + uehara_hanako@example.com + Female + 71 + 1942/10/6 + 既婚 + AB型 + 東京都 + 13 + 084-448-3409 + 090-3483-3061 + ドコモ + + + 筧 杏 + かけい あん + kakei_ann@example.com + Female + 46 + 1967/5/21 + 既婚 + B型 + 東京都 + 13 + 045-874-3255 + 080-6995-3934 + au + + + 上田 茜 + うえだ あかね + ueda_akane@example.com + Female + 39 + 1974/3/29 + 既婚 + O型 + 神奈川県 + 14 + 098-205-8282 + 090-9209-7033 + ドコモ + + + 池谷 みゆき + いけたに みゆき + iketani_miyuki@example.com + Female + 28 + 1985/9/1 + 既婚 + O型 + 山形県 + 06 + 061-505-9698 + 080-3168-2882 + ドコモ + + + 早坂 美幸 + はやさか みゆき + hayasaka_miyuki@example.com + Female + 68 + 1945/7/17 + 既婚 + O型 + 東京都 + 13 + 059-395-7361 + 080-2161-7721 + ドコモ + + + 柴田 丈雄 + しばた たけお + shibata_takeo@example.com + Male + 25 + 1988/3/3 + 未婚 + A型 + 滋賀県 + 25 + 070-412-8902 + 090-2215-6120 + ドコモ + + + 倉田 翔子 + くらた しょうこ + kurata_shouko@example.com + Female + 58 + 1955/3/30 + 既婚 + O型 + 京都府 + 26 + 033-394-5855 + 080-9616-8719 + ドコモ + + + 中岡 朝陽 + なかおか あさひ + nakaoka_asahi@example.com + Female + 69 + 1944/4/12 + 既婚 + A型 + 北海道 + 01 + 0 7-189- 45 + 080-5669-2433 + au + + + 大竹 光 + おおたけ ひかる + ootake_hikaru@example.com + Female + 64 + 1949/8/23 + 既婚 + AB型 + 三重県 + 24 + 042-826-9706 + 090-4281-8887 + au + + + 平尾 ひろ子 + ひらお ひろこ + hirao_hiroko@example.com + Female + 43 + 1970/3/19 + 既婚 + A型 + 神奈川県 + 14 + 076- 99-2244 + 090-4927-1577 + ドコモ + + + 大森 花緑 + おおもり かろく + oomori_karoku@example.com + Male + 27 + 1986/10/9 + 既婚 + B型 + 東京都 + 13 + 011-837- 393 + 080-9820-8805 + ドコモ + + + 小出 新太 + こいで あらた + koide_arata@example.com + Male + 71 + 1942/9/27 + 既婚 + B型 + 神奈川県 + 14 + 0 8-728-1008 + 090-1773-1743 + au + + + 古賀 博之 + こが ひろゆき + koga_hiroyuki@example.com + Male + 60 + 1953/10/5 + 既婚 + O型 + 鳥取県 + 31 + 082-791-4649 + 090-2301-7855 + ドコモ + + + 波多野 恵梨香 + はたの えりか + hatano_erika@example.com + Female + 70 + 1942/12/9 + 既婚 + B型 + 愛知県 + 23 + 0 1-913-6209 + 080-5053- 872 + ドコモ + + + 窪塚 惇 + くぼづか あつし + kuboduka_atsushi@example.com + Male + 23 + 1990/1/23 + 未婚 + AB型 + 東京都 + 13 + 032-221-7872 + 080-9028-5927 + ドコモ + + + 塚本 涼 + つかもと りょう + tsukamoto_ryou@example.com + Female + 77 + 1936/9/22 + 既婚 + B型 + 山形県 + 06 + 015-299- 83 + 080-6288-7479 + ソフトバンク + + + 皆川 なつみ + みなかわ なつみ + minakawa_natsumi@example.com + Female + 63 + 1950/4/14 + 既婚 + A型 + 広島県 + 34 + 074-690-2551 + 090-7396-8465 + ドコモ + + + 富田 長利 + とみた ながとし + tomita_nagatoshi@example.com + Male + 53 + 1960/10/13 + 既婚 + O型 + 北海道 + 01 + 036-222-9486 + 080-5704-3344 + ソフトバンク + + + 土屋 由美子 + つちや ゆみこ + tsuchiya_yumiko@example.com + Female + 52 + 1961/1/30 + 既婚 + AB型 + 福岡県 + 40 + 0 4-699-9875 + 080- 452-4766 + au + + + 宇佐美 涼 + うさみ りょう + usami_ryou@example.com + Female + 26 + 1987/8/28 + 未婚 + O型 + 兵庫県 + 28 + 081-809-6941 + 080-8355-9589 + ドコモ + + + 勝田 陽子 + かつだ ようこ + katsuda_youko@example.com + Female + 26 + 1987/1/17 + 既婚 + B型 + 愛知県 + 23 + 013-243-1065 + 090- 149-6644 + au + + + 堀川 くるみ + ほりかわ くるみ + horikawa_kurumi@example.com + Female + 32 + 1980/12/23 + 既婚 + A型 + 東京都 + 13 + 021-279-7224 + 090-3530-2095 + ソフトバンク + + + 川島 大樹 + かわしま ひろき + kawashima_hiroki@example.com + Male + 23 + 1990/2/19 + 未婚 + O型 + 山梨県 + 19 + 077-673-9192 + 090-9489- 405 + ドコモ + + + 杉本 里穂 + すぎもと りほ + sugimoto_riho@example.com + Female + 20 + 1993/8/11 + 未婚 + A型 + 宮城県 + 04 + 015-451-3950 + 090-9656-1029 + ドコモ + + + 池田 俊介 + いけだ しゅんすけ + ikeda_shunsuke@example.com + Male + 22 + 1991/1/15 + 既婚 + A型 + 鹿児島県 + 46 + 070-339-5740 + 090-4679-1785 + ソフトバンク + + + 川西 薫 + かわにし かおる + kawanishi_kaoru@example.com + Male + 66 + 1947/4/27 + 既婚 + A型 + 富山県 + 16 + 020-650-5491 + 090-5202-6685 + ドコモ + + + 平岡 未來 + ひらおか みらい + hiraoka_mirai@example.com + Male + 57 + 1955/12/9 + 既婚 + B型 + 大阪府 + 27 + 077-702-2677 + 090-8896-2870 + ドコモ + + + 唐沢 くるみ + からさわ くるみ + karasawa_kurumi@example.com + Female + 34 + 1979/4/24 + 未婚 + B型 + 熊本県 + 43 + 092-537-6077 + 080- 312- 173 + au + + + 比嘉 なぎさ + ひよし なぎさ + hiyoshi_nagisa@example.com + Female + 56 + 1956/12/1 + 既婚 + AB型 + 埼玉県 + 11 + 044- 89-2773 + 090-8279-9557 + ドコモ + + + 池谷 栄一 + いけたに えいいち + iketani_eiichi@example.com + Male + 71 + 1942/2/3 + 既婚 + A型 + 東京都 + 13 + 025-321-9989 + 080-4643-7817 + au + + + 片平 佳乃 + かたひら よしの + katahira_yoshino@example.com + Female + 56 + 1957/7/30 + 既婚 + A型 + 北海道 + 01 + 088-614-1062 + 080-7660-9899 + au + + + 中村 季衣 + なかむら としえ + nakamura_toshie@example.com + Female + 61 + 1951/11/20 + 既婚 + B型 + 埼玉県 + 11 + 090-117- 115 + 080-6739-2303 + ドコモ + + + 柳家 さとみ + やなぎや さとみ + yanagiya_satomi@example.com + Female + 55 + 1958/6/10 + 既婚 + AB型 + 北海道 + 01 + 045-973-8859 + 080-7776- 638 + au + + + 水上 敏和 + みずかみ としかず + mizukami_toshikazu@example.com + Male + 50 + 1962/11/6 + 既婚 + B型 + 福岡県 + 40 + 093-176-4029 + 090-6181-3631 + ドコモ + + + 湊 美優 + みなと みゅう + minato_myuu@example.com + Female + 49 + 1964/5/2 + 既婚 + B型 + 神奈川県 + 14 + 032-512-4841 + 090-9148-2680 + ドコモ + + + ほしの 優 + ほしの ゆう + hoshino_yuu@example.com + Female + 79 + 1933/11/13 + 既婚 + A型 + 東京都 + 13 + 064-946-7193 + 090-7760-5170 + ドコモ + + + 原口 小百合 + はらぐち さゆり + haraguchi_sayuri@example.com + Female + 61 + 1952/3/15 + 既婚 + AB型 + 兵庫県 + 28 + 052-914-3521 + 090-8786- 641 + au + + + 長野 俊二 + ながの しゅんじ + nagano_shunji@example.com + Male + 26 + 1987/7/9 + 既婚 + A型 + 鹿児島県 + 46 + 039-164-6801 + 080-3467-6984 + ドコモ + + + 宮田 季衣 + みやた としえ + miyata_toshie@example.com + Female + 71 + 1941/12/23 + 既婚 + B型 + 東京都 + 13 + 042-470-9758 + 080-9196-7292 + ドコモ + + + 川本 米蔵 + かわもと よねぞう + kawamoto_yonezou@example.com + Male + 27 + 1986/7/31 + 未婚 + O型 + 兵庫県 + 28 + 048-920-8175 + 090-6631-3817 + ドコモ + + + 谷本 ひとり + たにもと ひとり + tanimoto_hitori@example.com + Male + 38 + 1975/3/31 + 既婚 + A型 + 徳島県 + 36 + 088-529-2383 + 080- 56-6626 + ソフトバンク + + + 薬師丸 雅彦 + やくしまる まさひこ + yakushimaru_masahiko@example.com + Male + 33 + 1979/12/31 + 既婚 + A型 + 北海道 + 01 + 058-500-9101 + 080-8659-3343 + au + + + 木原 達士 + きはら たつひと + kihara_tatsuhito@example.com + Male + 41 + 1972/2/12 + 既婚 + O型 + 兵庫県 + 28 + 0 8-812- 25 + 080-1850-3074 + ドコモ + + + 岩田 美里 + いわた みり + iwata_miri@example.com + Female + 26 + 1987/3/2 + 既婚 + O型 + 長野県 + 20 + 099-590-9256 + 090-2044-2820 + au + + + 相川 夏空 + あいかわ そら + aikawa_sora@example.com + Female + 51 + 1962/2/26 + 既婚 + AB型 + 鹿児島県 + 46 + 079-813-7218 + 090-8785-8111 + ドコモ + + + 柴田 美佐子 + しばた みさこ + shibata_misako@example.com + Female + 44 + 1969/6/17 + 既婚 + AB型 + 奈良県 + 29 + 085-268- 120 + 080-7704-6705 + ドコモ + + + 野中 賢治 + のなか けんじ + nonaka_kenji@example.com + Male + 32 + 1980/12/15 + 既婚 + AB型 + 東京都 + 13 + 023-137-1059 + 080-2312-7814 + au + + + 永島 雅功 + ながしま まさとし + nagashima_masatoshi@example.com + Male + 72 + 1941/7/16 + 既婚 + A型 + 大阪府 + 27 + 076-555-7978 + 080-7104-8448 + ドコモ + + + 大塚 友香 + おおつか ともか + ootsuka_tomoka@example.com + Female + 37 + 1976/6/3 + 既婚 + A型 + 福岡県 + 40 + 029-835-1883 + 090-4159-9808 + ドコモ + + + 川野 恵子 + かわの けいこ + kawano_keiko@example.com + Female + 56 + 1956/11/30 + 既婚 + B型 + 熊本県 + 43 + 059-401-9953 + 090-4926-7103 + ドコモ + + + 徳重 未來 + とくしげ みらい + tokushige_mirai@example.com + Male + 50 + 1963/4/9 + 既婚 + O型 + 兵庫県 + 28 + 0 1-166-1094 + 090-6235-1061 + ソフトバンク + + + 平良 菜摘 + ひらら なつみ + hirara_natsumi@example.com + Female + 80 + 1933/5/31 + 既婚 + AB型 + 福岡県 + 40 + 036-139-6792 + 090-2369-7477 + ソフトバンク + + + 田島 翔子 + たじま しょうこ + tajima_shouko@example.com + Female + 33 + 1980/7/1 + 既婚 + B型 + 熊本県 + 43 + 035-890-6358 + 090-1651-8397 + au + + + 富沢 智花 + とみさわ ともか + tomisawa_tomoka@example.com + Female + 35 + 1978/5/29 + 既婚 + O型 + 大阪府 + 27 + 056-416-9516 + 090-8613-4414 + ソフトバンク + + + 青野 麻由子 + あおの まゆこ + aono_mayuko@example.com + Female + 53 + 1960/10/12 + 既婚 + A型 + 高知県 + 39 + 039-421-6187 + 090-6949-9218 + ドコモ + + + 広田 誠一 + ひろた せいいち + hirota_seiichi@example.com + Male + 30 + 1983/8/6 + 未婚 + B型 + 東京都 + 13 + 056-147-8823 + 090-4777-4199 + ソフトバンク + + + 及川 豊 + おいかわ ゆたか + oikawa_yutaka@example.com + Male + 37 + 1976/9/26 + 既婚 + O型 + 福島県 + 07 + 013-220-2759 + 080-4528-1830 + ソフトバンク + + + 高島 玲那 + たかしま れな + takashima_rena@example.com + Female + 58 + 1955/6/13 + 既婚 + A型 + 大阪府 + 27 + 039-891-2667 + 080-1810-4970 + ドコモ + + + 古沢 真吾 + ふるさわ しんご + furusawa_shingo@example.com + Male + 42 + 1971/3/2 + 既婚 + O型 + 茨城県 + 08 + 065-107- 292 + 090-7490-5309 + ドコモ + + + 大山 文世 + おおやま ふみよ + ooyama_fumiyo@example.com + Female + 53 + 1960/1/27 + 既婚 + O型 + 山口県 + 35 + 061-679-5875 + 090-5131-8306 + ドコモ + + + 内村 未來 + うちむら みらい + uchimura_mirai@example.com + Female + 73 + 1939/12/22 + 既婚 + A型 + 宮城県 + 04 + 065-312-3546 + 090-7516-1874 + ドコモ + + + 高見 敦 + たかみ あつし + takami_atsushi@example.com + Male + 52 + 1961/1/6 + 既婚 + A型 + 神奈川県 + 14 + 0 -289-6826 + 080-2419-6102 + au + + + 早美 奈央 + はやみ なお + hayami_nao@example.com + Female + 63 + 1949/12/13 + 既婚 + AB型 + 兵庫県 + 28 + 030- 63-9669 + 080-9854-9072 + ドコモ + + + 山上 美紀 + やまがみ みき + yamagami_miki@example.com + Female + 65 + 1948/9/30 + 既婚 + O型 + 北海道 + 01 + 030- 46-2005 + 090-1245-6666 + ドコモ + + + 島 みゆき + しま みゆき + shima_miyuki@example.com + Female + 41 + 1972/2/2 + 既婚 + B型 + 埼玉県 + 11 + 0 3-605-9123 + 080- 23-5136 + ソフトバンク + + + 内海 健 + うちみ けん + uchimi_ken@example.com + Male + 77 + 1936/7/5 + 既婚 + O型 + 長野県 + 20 + 071-637-4401 + 080- 421-9614 + ドコモ + + + 西尾 フミヤ + にしお ふみや + nishio_fumiya@example.com + Male + 37 + 1976/7/9 + 未婚 + A型 + 愛知県 + 23 + 018-501-3048 + 080-6833-8741 + ドコモ + + + 海野 あさみ + うみの あさみ + umino_asami@example.com + Female + 62 + 1951/5/10 + 既婚 + O型 + 広島県 + 34 + 055-990-2839 + 080-4336-4435 + ドコモ + + + 塩見 六郎 + しおみ ろくろう + shiomi_rokurou@example.com + Male + 43 + 1970/4/24 + 未婚 + O型 + 長野県 + 20 + 054-859-7898 + 080-8357-5432 + au + + + 今野 勇介 + いまの ゆうすけ + imano_yuusuke@example.com + Male + 64 + 1949/9/27 + 既婚 + A型 + 東京都 + 13 + 016-102- 991 + 090-9445-4197 + ドコモ + + + 島津 美和子 + しまづ みわこ + shimadu_miwako@example.com + Female + 21 + 1992/10/25 + 未婚 + AB型 + 兵庫県 + 28 + 031-547-8689 + 080-1700-9579 + ドコモ + + + 小関 美帆 + こぜき みほ + kozeki_miho@example.com + Female + 66 + 1947/6/21 + 既婚 + AB型 + 大阪府 + 27 + 072-405-4749 + 090-2056- 624 + au + + + 柳田 愛梨 + やなぎだ あいり + yanagida_airi@example.com + Female + 68 + 1944/11/3 + 既婚 + A型 + 北海道 + 01 + 075-698-9816 + 080-2099-8470 + ツーカー + + + 塩見 光臣 + しおみ みつおみ + shiomi_mitsuomi@example.com + Male + 79 + 1934/5/2 + 既婚 + B型 + 滋賀県 + 25 + 071-917-9833 + 090-4670-3901 + ドコモ + + + 梅沢 茂樹 + うめざわ しげき + umezawa_shigeki@example.com + Male + 43 + 1970/3/31 + 既婚 + AB型 + 群馬県 + 10 + 030-374- 701 + 080-2292-8739 + ドコモ + + + 尾崎 知史 + おざき ともふみ + ozaki_tomofumi@example.com + Male + 74 + 1939/9/28 + 既婚 + A型 + 宮崎県 + 45 + 093-195-3079 + 090-1209- 129 + ソフトバンク + + + 篠原 法子 + しのはら のりこ + shinohara_noriko@example.com + Female + 30 + 1983/6/5 + 既婚 + B型 + 佐賀県 + 41 + 076-610-4837 + 090-4490-4910 + ドコモ + + + 村山 はるみ + むらやま はるみ + murayama_harumi@example.com + Female + 25 + 1988/2/29 + 既婚 + O型 + 東京都 + 13 + 075- 94-9205 + 090-9676- 821 + au + + + 平尾 陽介 + ひらお ようすけ + hirao_yousuke@example.com + Male + 22 + 1991/1/31 + 既婚 + O型 + 北海道 + 01 + 047-399-7377 + 080- 343-4968 + ドコモ + + + 古山 はるか + ふるやま はるか + furuyama_haruka@example.com + Female + 52 + 1961/1/23 + 既婚 + A型 + 東京都 + 13 + 071- 18-1835 + 080-6878-5743 + ドコモ + + + 石垣 由美子 + いしがき ゆみこ + ishigaki_yumiko@example.com + Female + 34 + 1979/10/13 + 既婚 + A型 + 神奈川県 + 14 + 095-988-1144 + 080-9126-8475 + ドコモ + + + 山西 雅彦 + やまにし まさひこ + yamanishi_masahiko@example.com + Male + 45 + 1968/9/29 + 既婚 + AB型 + 青森県 + 02 + 080-330-8806 + 090-4376-4503 + au + + + 藤本 夏空 + ふじもと そら + fujimoto_sora@example.com + Female + 68 + 1945/2/28 + 既婚 + B型 + 京都府 + 26 + 049-538-7387 + 080-5941-1125 + ドコモ + + + 安達 米蔵 + あだち よねぞう + adachi_yonezou@example.com + Male + 72 + 1941/9/15 + 既婚 + A型 + 埼玉県 + 11 + 091-479-1046 + 090-6799-6994 + ドコモ + + + 前田 敏和 + まえだ としかず + maeda_toshikazu@example.com + Male + 32 + 1981/1/23 + 既婚 + O型 + 福井県 + 18 + 086-209-6707 + 080- 481-4205 + au + + + 原 雄太 + はら ゆうた + hara_yuuta@example.com + Male + 71 + 1942/2/8 + 既婚 + O型 + 神奈川県 + 14 + 047-477-7198 + 090-3493-3915 + ドコモ + + + 石原 美嘉 + いしはら みか + ishihara_mika@example.com + Female + 62 + 1951/6/27 + 既婚 + O型 + 埼玉県 + 11 + 056-582-7981 + 090-4483-9609 + au + + + 金児 窈 + かねこ よう + kaneko_you@example.com + Female + 76 + 1937/10/18 + 既婚 + A型 + 千葉県 + 12 + 086-676-2922 + 090-1576-7239 + ドコモ + + + 海老原 えみ + えびはら えみ + ebihara_emi@example.com + Female + 59 + 1954/5/24 + 既婚 + B型 + 東京都 + 13 + 039-997-9663 + 090-7195-7704 + ソフトバンク + + + 本山 しぼり + ほんやま しぼり + honnyama_shibori@example.com + Female + 37 + 1976/2/27 + 既婚 + A型 + 愛知県 + 23 + 053-316-9513 + 090-6679-4212 + ドコモ + + + 寺田 小百合 + てらだ さゆり + terada_sayuri@example.com + Female + 45 + 1968/7/5 + 既婚 + A型 + 千葉県 + 12 + 020-177-5929 + 090-8419-5162 + ドコモ + + + 長尾 真悠子 + ながお まゆこ + nagao_mayuko@example.com + Female + 35 + 1977/12/10 + 既婚 + B型 + 東京都 + 13 + 0 4-152-4685 + 090-2968- 871 + ソフトバンク + + + 金田 寿明 + かねだ としあき + kaneda_toshiaki@example.com + Male + 48 + 1965/9/20 + 既婚 + A型 + 東京都 + 13 + 053- 66-2748 + 090-9332-7611 + au + + + 佐古 恵梨香 + さこ えりか + sako_erika@example.com + Female + 76 + 1936/12/1 + 既婚 + B型 + 静岡県 + 22 + 083-671-8518 + 090-4686-5255 + au + + + 合田 聡 + あいだ さとし + aida_satoshi@example.com + Male + 59 + 1954/2/7 + 既婚 + A型 + 佐賀県 + 41 + 053-720-4080 + 080-4347-6521 + ドコモ + + + 関根 みゆき + せきね みゆき + sekine_miyuki@example.com + Female + 38 + 1975/6/29 + 既婚 + A型 + 大阪府 + 27 + 031-859-8685 + 090-6261- 257 + ドコモ + + + 蒼井 季衣 + あおい としえ + aoi_toshie@example.com + Female + 23 + 1990/5/14 + 既婚 + A型 + 北海道 + 01 + 075-547-9288 + 080-2246- 817 + au + + + 野村 裕次郎 + のむら ゆうじろう + nomura_yuujirou@example.com + Male + 21 + 1991/12/16 + 未婚 + A型 + 熊本県 + 43 + 050-496-2864 + 080- 889- 710 + ソフトバンク + + + 坂井 美嘉 + さかい みか + sakai_mika@example.com + Female + 57 + 1956/6/20 + 既婚 + A型 + 福岡県 + 40 + 078-347-6885 + 080-3690-1303 + au + + + 池上 博明 + いけがみ ひろあき + ikegami_hiroaki@example.com + Male + 33 + 1980/5/17 + 未婚 + A型 + 東京都 + 13 + 0 - 76-8169 + 090-4723-8879 + ドコモ + + + 立石 早紀 + たちいし さき + tachiishi_saki@example.com + Female + 61 + 1952/4/5 + 既婚 + B型 + 埼玉県 + 11 + 0 5-801- 239 + 090-4384-7626 + ドコモ + + + 大坪 那奈 + おおつぼ なな + ootsubo_nana@example.com + Female + 39 + 1974/4/18 + 既婚 + O型 + 愛知県 + 23 + 055-409- 714 + 090-9725- 548 + ドコモ + + + 竹内 薫 + たけうち かおる + takeuchi_kaoru@example.com + Female + 26 + 1987/10/25 + 未婚 + B型 + 千葉県 + 12 + 0 3-516-8917 + 080- 551-5951 + ドコモ + + + 脇田 薫 + わきた かおる + wakita_kaoru@example.com + Female + 79 + 1934/3/12 + 既婚 + O型 + 埼玉県 + 11 + 014-808-7456 + 090-7636-6931 + ドコモ + + + 小川 竜也 + おがわ たつや + ogawa_tatsuya@example.com + Male + 34 + 1979/5/25 + 既婚 + A型 + 愛知県 + 23 + 051-711-5145 + 090-7448-3131 + ドコモ + + + 菊地 美佐 + きくち みさ + kikuchi_misa@example.com + Female + 51 + 1962/5/6 + 既婚 + O型 + 愛知県 + 23 + 044-592- 931 + 080-6698-9350 + au + + + 若槻 基祐 + わかつき きすけ + wakatsuki_kisuke@example.com + Male + 64 + 1949/1/10 + 既婚 + B型 + 大阪府 + 27 + 017-935-3907 + 090-6441-1371 + ソフトバンク + + + 山野 秀隆 + やまの ひでたか + yamano_hidetaka@example.com + Male + 47 + 1966/8/13 + 未婚 + A型 + 東京都 + 13 + 068-476-5821 + 090- 320-7089 + ドコモ + + + 相田 禄郎 + あいだ ろくろう + aida_rokurou@example.com + Male + 71 + 1941/12/22 + 既婚 + A型 + 千葉県 + 12 + 073-367-4127 + 090-8605-2041 + ソフトバンク + + + 川崎 雅彦 + かわさき まさひこ + kawasaki_masahiko@example.com + Male + 68 + 1944/11/28 + 既婚 + A型 + 長野県 + 20 + 071-488-5264 + 090-2528-2662 + ドコモ + + + 小西 美希 + こにし みき + konishi_miki@example.com + Female + 42 + 1970/11/27 + 既婚 + AB型 + 山形県 + 06 + 015-528-4496 + 080-9031-2048 + ドコモ + + + 小堀 南朋 + こほり なお + kohori_nao@example.com + Female + 44 + 1969/10/16 + 既婚 + B型 + 愛知県 + 23 + 053- 13-6063 + 090-9176-7426 + ドコモ + + + 関 雅彦 + せき まさひこ + seki_masahiko@example.com + Male + 76 + 1937/6/21 + 既婚 + A型 + 神奈川県 + 14 + 049-639-1901 + 080-3669-9022 + ドコモ + + + 高崎 雅彦 + たかさき まさひこ + takasaki_masahiko@example.com + Male + 27 + 1986/4/13 + 既婚 + B型 + 埼玉県 + 11 + 064-568-5509 + 090-3936-1934 + ドコモ + + + 山上 有起哉 + やまがみ ゆきや + yamagami_yukiya@example.com + Male + 69 + 1944/8/15 + 既婚 + A型 + 埼玉県 + 11 + 032- 16-7241 + 090-1059-2214 + ドコモ + + + 古谷 ひろ子 + ふるたに ひろこ + furutani_hiroko@example.com + Female + 58 + 1955/7/5 + 既婚 + A型 + 埼玉県 + 11 + 041-346-7564 + 090-5011-1522 + ソフトバンク + + + 塚田 竜也 + つかだ たつや + tsukada_tatsuya@example.com + Male + 33 + 1980/7/4 + 既婚 + O型 + 愛知県 + 23 + 080-429- 104 + 090- 862-1729 + ドコモ + + + 安田 智花 + やすだ ともか + yasuda_tomoka@example.com + Female + 42 + 1971/10/2 + 既婚 + B型 + 長野県 + 20 + 024-582-8006 + 080-7708-9608 + ソフトバンク + + + さだ 亜希 + さだ あき + sada_aki@example.com + Female + 39 + 1974/4/14 + 既婚 + B型 + 佐賀県 + 41 + 075-778-4376 + 080-8846-2572 + ドコモ + + + 小出 遥 + こいで はるか + koide_haruka@example.com + Female + 73 + 1940/7/25 + 既婚 + O型 + 愛知県 + 23 + 0 4-821-3989 + 090-8800- 811 + ドコモ + + + 小峰 勝久 + こみね かつひさ + komine_katsuhisa@example.com + Male + 44 + 1969/9/24 + 未婚 + A型 + 群馬県 + 10 + 0 1-517-6814 + 090-9338-1934 + ソフトバンク + + + 平沢 研二 + ひらさわ けんじ + hirasawa_kenji@example.com + Male + 32 + 1981/4/10 + 既婚 + A型 + 秋田県 + 05 + 0 6-343-1974 + 090-3739-2650 + ドコモ + + + 波多野 真一 + はたの しんいち + hatano_shinichi@example.com + Male + 42 + 1971/4/24 + 既婚 + A型 + 青森県 + 02 + 099-880-5557 + 090-4891-8714 + ドコモ + + + 三輪 隼士 + みわ しゅんじ + miwa_shunji@example.com + Male + 59 + 1954/2/26 + 既婚 + O型 + 長崎県 + 42 + 068- 94-2173 + 080-9640-4511 + ソフトバンク + + + 鶴岡 遥 + つるおか はるか + tsuruoka_haruka@example.com + Female + 22 + 1991/4/30 + 未婚 + O型 + 岡山県 + 33 + 027-859-5944 + 080-8406-3987 + au + + + 谷本 さゆり + たにもと さゆり + tanimoto_sayuri@example.com + Female + 32 + 1980/10/31 + 未婚 + A型 + 長崎県 + 42 + 019-714-7632 + 090-7430-9137 + ドコモ + + + 川西 博之 + かわにし ひろゆき + kawanishi_hiroyuki@example.com + Male + 64 + 1949/10/23 + 既婚 + O型 + 東京都 + 13 + 041-180-5059 + 080- 761-1804 + au + + + 大畑 薫 + おおはた かおる + oohata_kaoru@example.com + Female + 20 + 1992/11/28 + 未婚 + O型 + 山形県 + 06 + 041-294-8861 + 090- 813-8339 + ドコモ + + + 秋山 草太 + あきやま そうた + akiyama_souta@example.com + Male + 21 + 1992/5/6 + 未婚 + A型 + 大阪府 + 27 + 061-645-7458 + 090-9251-2972 + ソフトバンク + + + 高瀬 愛 + たかせ あい + takase_ai@example.com + Female + 22 + 1991/1/16 + 未婚 + O型 + 長野県 + 20 + 017-227-8643 + 080-6138-6156 + ドコモ + + + 佐古 研二 + さこ けんじ + sako_kenji@example.com + Male + 69 + 1944/9/24 + 既婚 + B型 + 徳島県 + 36 + 051- 85-4390 + 080-9447- 260 + ソフトバンク + + + 森 裕次郎 + もり ゆうじろう + mori_yuujirou@example.com + Male + 23 + 1989/12/14 + 未婚 + A型 + 埼玉県 + 11 + 033-711-8938 + 080-6629-5081 + au + + + 山形 翔太 + やまがた しょうた + yamagata_shouta@example.com + Male + 24 + 1988/11/22 + 既婚 + O型 + 福岡県 + 40 + 079-587-7984 + 080-4105-5733 + ソフトバンク + + + 関 人志 + せき ひとし + seki_hitoshi@example.com + Male + 22 + 1990/12/23 + 未婚 + O型 + 栃木県 + 09 + 0 2-531-1594 + 090-7590-1738 + au + + + 村中 勝久 + むらなか かつひさ + muranaka_katsuhisa@example.com + Male + 68 + 1945/1/29 + 既婚 + A型 + 千葉県 + 12 + 073-733-7504 + 080-7811- 575 + au + + + 三谷 人志 + みたに ひとし + mitani_hitoshi@example.com + Male + 70 + 1943/1/11 + 既婚 + A型 + 愛知県 + 23 + 044-563-3593 + 090-6867- 629 + ソフトバンク + + + 菊田 ヒロ + きくた ひろ + kikuta_hiro@example.com + Male + 29 + 1984/6/26 + 未婚 + O型 + 神奈川県 + 14 + 058-875- 938 + 090-9764-1188 + ドコモ + + + 永島 浩介 + ながしま こうすけ + nagashima_kousuke@example.com + Male + 49 + 1963/11/1 + 既婚 + O型 + 沖縄県 + 47 + 012-902-2849 + 090-7618-1320 + ドコモ + + + 南部 徹 + なんぶ とおる + nannbu_tooru@example.com + Male + 70 + 1943/1/24 + 既婚 + AB型 + 北海道 + 01 + 083-866-7162 + 090-1329-6502 + ドコモ + + + 三井 あさみ + みつい あさみ + mitsui_asami@example.com + Female + 66 + 1947/1/5 + 既婚 + AB型 + 広島県 + 34 + 065-596-1124 + 080-3087-5725 + au + + + 岩間 和之 + いわま かずゆき + iwama_kazuyuki@example.com + Male + 80 + 1933/1/9 + 既婚 + O型 + 長崎県 + 42 + 062-472-3815 + 090-5930-6224 + ドコモ + + + 関口 花 + せきぐち はな + sekiguchi_hana@example.com + Female + 56 + 1957/2/24 + 既婚 + B型 + 埼玉県 + 11 + 013-644-1469 + 080-8099-3456 + ソフトバンク + + + 西沢 竜也 + にしざわ たつや + nishizawa_tatsuya@example.com + Male + 27 + 1986/5/14 + 未婚 + B型 + 東京都 + 13 + 095-677-1660 + 090-4511-9483 + au + + + 久野 達士 + ひさの たつひと + hisano_tatsuhito@example.com + Male + 46 + 1967/9/28 + 既婚 + O型 + 三重県 + 24 + 0 4-758-1249 + 090-9678-1333 + au + + + 深井 碧海 + ふかい おうが + fukai_ouga@example.com + Male + 59 + 1954/10/22 + 既婚 + B型 + 栃木県 + 09 + 065-555-5501 + 080- 392-5749 + ドコモ + + + 秋葉 公顕 + あきば きみあき + akiba_kimiaki@example.com + Male + 40 + 1973/3/4 + 既婚 + O型 + 福岡県 + 40 + 062-462-1847 + 080-4222-7360 + ソフトバンク + + + 正木 瞬 + まさき しゅん + masaki_shun@example.com + Male + 72 + 1940/12/19 + 既婚 + B型 + 大阪府 + 27 + 021- 50-2247 + 090- 4-3315 + ソフトバンク + + + 小西 みゆき + こにし みゆき + konishi_miyuki@example.com + Female + 42 + 1971/9/28 + 既婚 + AB型 + 東京都 + 13 + 068-271-5842 + 090-3992-8939 + ドコモ + + + 笠井 真吾 + かさい しんご + kasai_shingo@example.com + Male + 62 + 1951/5/14 + 既婚 + B型 + 宮城県 + 04 + 031-439-8712 + 080-4925- 245 + au + + + 小日向 豊 + こひなた ゆたか + kohinata_yutaka@example.com + Male + 77 + 1936/4/24 + 既婚 + A型 + 愛媛県 + 38 + 0 -813-3469 + 080-9474-9237 + ドコモ + + + 瀬戸 憲史 + せと のりひと + seto_norihito@example.com + Male + 69 + 1944/1/7 + 既婚 + O型 + 静岡県 + 22 + 082-398-2908 + 080-9077-1962 + ドコモ + + + 若松 なつみ + わかまつ なつみ + wakamatsu_natsumi@example.com + Female + 77 + 1936/2/24 + 既婚 + O型 + 秋田県 + 05 + 073-192-2892 + 080-3120-3184 + ドコモ + + + 黄川田 昌代 + きかわだ まさよ + kikawada_masayo@example.com + Female + 58 + 1955/7/3 + 既婚 + B型 + 東京都 + 13 + 019-582-6709 + 080-9131-8195 + au + + + 内田 啓介 + うちだ けいすけ + uchida_keisuke@example.com + Male + 60 + 1953/4/10 + 既婚 + A型 + 山口県 + 35 + 083-688-9543 + 080-1204-6989 + ドコモ + + + 中田 麗奈 + なかた れな + nakata_rena@example.com + Female + 69 + 1943/12/6 + 既婚 + A型 + 石川県 + 17 + 091-272-6601 + 090-2037-8476 + ドコモ + + + 西島 洋介 + にしじま ようすけ + nishijima_yousuke@example.com + Male + 33 + 1980/5/17 + 既婚 + O型 + 埼玉県 + 11 + 087-498-4608 + 090-7481-4969 + ドコモ + + + 小林 なぎさ + こばやし なぎさ + kobayashi_nagisa@example.com + Female + 72 + 1941/1/17 + 既婚 + O型 + 千葉県 + 12 + 041-765-1898 + 090-6214-9967 + ドコモ + + + 村上 優 + むらかみ ゆう + murakami_yuu@example.com + Female + 60 + 1953/3/17 + 既婚 + B型 + 鳥取県 + 31 + 0 5-759-4367 + 080-3899-6523 + au + + + 筒井 鉄二 + つつい てつじ + tsutsui_tetsuji@example.com + Male + 59 + 1954/1/4 + 既婚 + A型 + 埼玉県 + 11 + 048-856- 54 + 090-2832-2889 + ドコモ + + + 前川 勇太 + まえかわ ゆうた + maekawa_yuuta@example.com + Male + 45 + 1968/8/28 + 既婚 + O型 + 京都府 + 26 + 041-716-6310 + 080-3139-7792 + ドコモ + + + 藤原 なつみ + ふじわら なつみ + fujiwara_natsumi@example.com + Female + 27 + 1986/2/16 + 未婚 + A型 + 愛媛県 + 38 + 038-239-8768 + 090- 762-1963 + ドコモ + + + 川添 咲 + かわぞえ さき + kawazoe_saki@example.com + Female + 55 + 1958/1/4 + 既婚 + O型 + 北海道 + 01 + 029-343-8831 + 090-9104-3802 + ドコモ + + + 神原 しぼり + かんばら しぼり + kannbara_shibori@example.com + Female + 36 + 1977/9/20 + 未婚 + B型 + 神奈川県 + 14 + 020-782-3347 + 090-1111-8561 + ドコモ + + + 滝沢 明慶 + たきざわ あきよし + takizawa_akiyoshi@example.com + Male + 30 + 1982/11/9 + 既婚 + B型 + 東京都 + 13 + 011-831-6952 + 080-9335-7587 + ツーカー + + + 星野 敏也 + ほしの としや + hoshino_toshiya@example.com + Male + 70 + 1942/12/20 + 既婚 + A型 + 千葉県 + 12 + 040-122-9549 + 080-5694-6843 + ドコモ + + + 横田 友也 + よこた ともや + yokota_tomoya@example.com + Male + 55 + 1957/12/13 + 既婚 + B型 + 北海道 + 01 + 037-885-8629 + 080-3223-7477 + ドコモ + + + 永野 かおり + ながの かおり + nagano_kaori@example.com + Female + 70 + 1943/9/1 + 既婚 + AB型 + 茨城県 + 08 + 043-558-9866 + 090-3047-5914 + ドコモ + + + 香川 美智子 + かがわ みちこ + kagawa_michiko@example.com + Female + 30 + 1983/7/26 + 既婚 + A型 + 沖縄県 + 47 + 010-191-9569 + 090-5706-8208 + ドコモ + + + 石原 那奈 + いしはら なな + ishihara_nana@example.com + Female + 31 + 1982/2/10 + 未婚 + B型 + 長崎県 + 42 + 085-156-7276 + 080-4050-6209 + ドコモ + + + 合田 杏 + あいだ あん + aida_ann@example.com + Female + 66 + 1947/6/3 + 既婚 + B型 + 東京都 + 13 + 026-850-4065 + 080-8451-8392 + ソフトバンク + + + 柳沢 仁晶 + やなぎさわ ひろあき + yanagisawa_hiroaki@example.com + Male + 23 + 1990/5/23 + 未婚 + O型 + 北海道 + 01 + 0 3-477-7137 + 090- 18-3994 + ツーカー + + + 武井 雅之 + たけい まさゆき + takei_masayuki@example.com + Male + 65 + 1948/8/13 + 既婚 + A型 + 東京都 + 13 + 015-385-5973 + 080-4742-7198 + au + + + 浦野 大 + うらの まさる + urano_masaru@example.com + Male + 25 + 1988/6/14 + 未婚 + O型 + 京都府 + 26 + 030-840-4426 + 090-2774-4015 + ドコモ + + + 満島 めぐみ + みつしま めぐみ + mitsushima_megumi@example.com + Female + 39 + 1974/1/25 + 既婚 + AB型 + 東京都 + 13 + 061-114-8991 + 080-9173-6620 + ドコモ + + + 仲村 勇一 + なかむら ゆういち + nakamura_yuuichi@example.com + Male + 33 + 1980/5/4 + 既婚 + A型 + 岐阜県 + 21 + 085-780-3279 + 080-9678-8575 + au + + + 大津 ちえみ + おおつ ちえみ + ootsu_chiemi@example.com + Female + 61 + 1952/4/15 + 既婚 + O型 + 神奈川県 + 14 + 048-744-2845 + 080- 733-3146 + au + + + 篠原 和久 + しのはら かずひさ + shinohara_kazuhisa@example.com + Male + 44 + 1968/11/21 + 既婚 + AB型 + 栃木県 + 09 + 029-981-2428 + 090-5114-1845 + ドコモ + + + 金沢 文世 + かねざわ ふみよ + kanezawa_fumiyo@example.com + Female + 50 + 1963/3/30 + 既婚 + O型 + 兵庫県 + 28 + 053-280-8851 + 080-1035-9641 + au + + + 大高 誠一 + おおだか せいいち + oodaka_seiichi@example.com + Male + 42 + 1971/1/29 + 既婚 + A型 + 岐阜県 + 21 + 024-984-7345 + 080-4924-8076 + ドコモ + + + 岩本 徹 + いわもと とおる + iwamoto_tooru@example.com + Male + 64 + 1949/8/30 + 既婚 + A型 + 神奈川県 + 14 + 060-537-9719 + 090-2336- 284 + au + + + 池畑 正敏 + いけはた まさとし + ikehata_masatoshi@example.com + Male + 66 + 1947/1/17 + 既婚 + AB型 + 愛知県 + 23 + 046-770-7169 + 080-6980-4776 + au + + + 細谷 満 + ほそや みつる + hosoya_mitsuru@example.com + Male + 25 + 1988/1/15 + 未婚 + A型 + 静岡県 + 22 + 0 9-478- 111 + 090-2260-8669 + au + + + 角田 恵子 + かどた けいこ + kadota_keiko@example.com + Female + 77 + 1936/6/17 + 既婚 + A型 + 神奈川県 + 14 + 049-691-3153 + 080-2890-8623 + au + + + 森本 仁晶 + もりもと ひろあき + morimoto_hiroaki@example.com + Male + 26 + 1987/4/3 + 未婚 + O型 + 静岡県 + 22 + 051-885-4945 + 090-4514-3789 + ドコモ + + + 北山 理紗 + きたやま りさ + kitayama_risa@example.com + Female + 51 + 1962/3/17 + 既婚 + O型 + 福井県 + 18 + 044-219-1779 + 090- 220-9421 + ソフトバンク + + + 池上 知史 + いけがみ ともふみ + ikegami_tomofumi@example.com + Male + 52 + 1961/7/14 + 未婚 + AB型 + 京都府 + 26 + 065-119- 980 + 080-4887-4298 + ドコモ + + + 上杉 浩正 + うえすぎ ひろまさ + uesugi_hiromasa@example.com + Male + 48 + 1965/2/10 + 既婚 + A型 + 長崎県 + 42 + 072-627-4987 + 080-3421-8121 + au + + + 野口 佑 + のぐち たすく + noguchi_tasuku@example.com + Male + 37 + 1976/8/29 + 既婚 + A型 + 熊本県 + 43 + 099-462-5662 + 090-8372-1072 + ドコモ + + + 吹石 めぐみ + ふきいし めぐみ + fukiishi_megumi@example.com + Female + 48 + 1965/8/3 + 既婚 + B型 + 兵庫県 + 28 + 018-138-1659 + 080-3346-3576 + ドコモ + + + 秋葉 雅之 + あきば まさゆき + akiba_masayuki@example.com + Male + 76 + 1937/9/20 + 既婚 + O型 + 長野県 + 20 + 037-974-3273 + 080-5533-9177 + ソフトバンク + + + 薬師丸 恵望子 + やくしまる えみこ + yakushimaru_emiko@example.com + Female + 39 + 1973/10/28 + 既婚 + B型 + 北海道 + 01 + 091-369-2911 + 090-6835-7766 + ドコモ + + + 薬師丸 美和子 + やくしまる みわこ + yakushimaru_miwako@example.com + Female + 32 + 1981/8/8 + 既婚 + A型 + 東京都 + 13 + 071-764-7265 + 080-7840-8331 + ドコモ + + + 浅田 翔太 + あさだ しょうた + asada_shouta@example.com + Male + 53 + 1960/3/3 + 既婚 + B型 + 大阪府 + 27 + 080- 90-8815 + 090-2018-1221 + au + + + 野本 菜々美 + のもと ななみ + nomoto_nanami@example.com + Female + 67 + 1946/10/24 + 既婚 + B型 + 福岡県 + 40 + 070-732-8848 + 090-2732-9292 + ドコモ + + + 黒木 竜也 + くろき たつや + kuroki_tatsuya@example.com + Male + 74 + 1938/12/13 + 既婚 + AB型 + 千葉県 + 12 + 080- 19-4827 + 090-6358-2593 + ドコモ + + + 竹中 理紗 + たけなか りさ + takenaka_risa@example.com + Female + 75 + 1938/10/8 + 既婚 + O型 + 神奈川県 + 14 + 038-788-7405 + 080-7710-5401 + ドコモ + + + 亀田 はるか + かめだ はるか + kameda_haruka@example.com + Female + 22 + 1991/10/21 + 既婚 + O型 + 兵庫県 + 28 + 066-910-6391 + 090-8324-3039 + ドコモ + + + 小沼 幸子 + こぬま さちこ + konuma_sachiko@example.com + Female + 60 + 1953/3/6 + 既婚 + O型 + 愛媛県 + 38 + 053-548-9364 + 090-7415-7934 + ドコモ + + + 矢部 晴臣 + やべ はるおみ + yabe_haruomi@example.com + Male + 67 + 1946/10/16 + 既婚 + B型 + 三重県 + 24 + 097-377-9571 + 080-5987- 248 + ドコモ + + + 谷村 由樹 + たにむら ゆき + tanimura_yuki@example.com + Female + 80 + 1932/11/25 + 既婚 + A型 + 兵庫県 + 28 + 0 1-675-7799 + 080-2437-5826 + ドコモ + + + 重松 長利 + しげまつ ながとし + shigematsu_nagatoshi@example.com + Male + 34 + 1979/2/24 + 既婚 + A型 + 奈良県 + 29 + 036-362-8007 + 080-8594-3579 + ドコモ + + + 鹿手袋 詩織 + しかてぶくろ しおり + shikatebukuro_shiori@example.com + Female + 65 + 1948/4/28 + 既婚 + A型 + 和歌山県 + 30 + 094-954-2212 + 080-9744-7238 + ツーカー + + + 城咲 友也 + しろさき ともや + shirosaki_tomoya@example.com + Male + 41 + 1972/5/10 + 既婚 + A型 + 埼玉県 + 11 + 0 8-686-9376 + 090-9067-7303 + au + + + 橋本 聡 + はしもと さとし + hashimoto_satoshi@example.com + Male + 30 + 1983/7/15 + 既婚 + B型 + 富山県 + 16 + 073-284-3011 + 080-2981-7996 + au + + + 海老原 瞬 + えびはら しゅん + ebihara_shun@example.com + Male + 75 + 1938/8/21 + 既婚 + AB型 + 新潟県 + 15 + 017-391-5520 + 080-4443-3265 + ドコモ + + + 湯浅 勇 + ゆあさ ゆう + yuasa_yuu@example.com + Female + 76 + 1937/6/20 + 既婚 + O型 + 広島県 + 34 + 032-900-7570 + 090-4404-2267 + ドコモ + + + 橋本 桃子 + はしもと ももこ + hashimoto_momoko@example.com + Female + 59 + 1954/2/17 + 既婚 + B型 + 鹿児島県 + 46 + 094-560-3504 + 080-3255-3358 + ツーカー + + + 岩永 貴嶺 + いわなが たかね + iwanaga_takane@example.com + Male + 30 + 1983/4/30 + 既婚 + A型 + 沖縄県 + 47 + 013-546-1012 + 090-4860-9505 + ツーカー + + + 板垣 浩太郎 + いたがき こうたろう + itagaki_koutarou@example.com + Male + 44 + 1969/7/25 + 既婚 + O型 + 富山県 + 16 + 054-675-8557 + 090-4846-9985 + au + + + 小宮 亮 + こみや りょう + komiya_ryou@example.com + Male + 78 + 1935/1/11 + 既婚 + A型 + 大阪府 + 27 + 063-634-4543 + 090-5927-6320 + au + + + 芦屋 和香 + あしや わか + ashiya_waka@example.com + Female + 25 + 1988/9/7 + 既婚 + A型 + 山梨県 + 19 + 052-743-6411 + 090- 428-6386 + ソフトバンク + + + 真鍋 正義 + まなべ まさよし + manabe_masayoshi@example.com + Male + 79 + 1934/3/18 + 既婚 + O型 + 愛知県 + 23 + 058-294-3097 + 080-4036-2834 + au + + + 岡村 さんま + おかむら さんま + okamura_sanma@example.com + Male + 51 + 1961/11/10 + 既婚 + A型 + 鹿児島県 + 46 + 074- 84-7169 + 090-8124-8541 + ドコモ + + + 森田 コウ + もりた こう + morita_kou@example.com + Female + 36 + 1977/9/25 + 既婚 + A型 + 岐阜県 + 21 + 053- 93-8358 + 080-9373-4151 + ソフトバンク + + + 塩沢 明 + しおざわ あきら + shiozawa_akira@example.com + Male + 26 + 1987/6/5 + 未婚 + A型 + 三重県 + 24 + 077-101- 757 + 090-4338-5038 + ドコモ + + + 辻本 明 + つじもと あきら + tsujimoto_akira@example.com + Male + 36 + 1977/3/22 + 既婚 + O型 + 静岡県 + 22 + 029-452-6123 + 080-4351- 556 + au + + + 安 ひかり + やす ひかり + yasu_hikari@example.com + Female + 50 + 1963/2/13 + 既婚 + O型 + 大阪府 + 27 + 019-156-7847 + 080- 404-1094 + ドコモ + + + 内田 咲 + うちだ さき + uchida_saki@example.com + Female + 80 + 1932/12/25 + 既婚 + A型 + 福島県 + 07 + 0 1-369-4611 + 090-1404-1146 + ソフトバンク + + + 石黒 一徳 + いしぐろ いっとく + ishiguro_ittoku@example.com + Male + 41 + 1972/4/13 + 未婚 + A型 + 京都府 + 26 + 047- 1-6287 + 080-8206-9808 + ソフトバンク + + + 秋山 敏和 + あきやま としかず + akiyama_toshikazu@example.com + Male + 30 + 1983/10/8 + 既婚 + B型 + 新潟県 + 15 + 016-702-3976 + 080-6340-1887 + au + + + 塚田 優一 + つかだ ゆういち + tsukada_yuuichi@example.com + Male + 76 + 1937/5/7 + 既婚 + B型 + 愛知県 + 23 + 021-219-2693 + 090- 931-1268 + ドコモ + + + 加納 芳正 + かのう よしまさ + kanou_yoshimasa@example.com + Male + 50 + 1963/8/24 + 既婚 + A型 + 新潟県 + 15 + 089-693-1426 + 080-4637-1541 + ドコモ + + + 佐久間 ひとり + さくま ひとり + sakuma_hitori@example.com + Male + 43 + 1970/6/24 + 既婚 + B型 + 福岡県 + 40 + 021-550-2047 + 090- 46- 307 + ソフトバンク + + + 松下 美希 + まつした みき + matsushita_miki@example.com + Female + 50 + 1963/2/15 + 既婚 + A型 + 富山県 + 16 + 078-211-6441 + 080-9483-6265 + ドコモ + + + 吉田 正義 + よしだ まさよし + yoshida_masayoshi@example.com + Male + 39 + 1973/11/10 + 既婚 + B型 + 千葉県 + 12 + 057-895-1502 + 080-7861-4187 + ソフトバンク + + + 日野 裕次郎 + ひの ゆうじろう + hino_yuujirou@example.com + Male + 29 + 1984/3/25 + 既婚 + O型 + 滋賀県 + 25 + 072- 36-1225 + 090-9252-1217 + au + + + 柏木 亮介 + かしわぎ りょうすけ + kashiwagi_ryousuke@example.com + Male + 25 + 1988/2/9 + 既婚 + A型 + 神奈川県 + 14 + 085-167-9577 + 090-6338-8685 + au + + + 松崎 鉄二 + まつざき てつじ + matsuzaki_tetsuji@example.com + Male + 25 + 1988/3/6 + 未婚 + O型 + 兵庫県 + 28 + 072-473-6725 + 090-9545- 398 + ドコモ + + + 天野 窈 + あまの よう + amano_you@example.com + Female + 51 + 1962/8/1 + 既婚 + O型 + 東京都 + 13 + 098-874-8867 + 080- 87-3636 + ドコモ + + + 池田 貴嶺 + いけだ たかね + ikeda_takane@example.com + Male + 39 + 1974/10/18 + 既婚 + O型 + 東京都 + 13 + 0 -411-2271 + 080- 776- 535 + au + + + 宮内 法嗣 + みやうち ほうし + miyauchi_houshi@example.com + Male + 26 + 1987/9/19 + 既婚 + A型 + 京都府 + 26 + 088-623-5363 + 090-7957-3187 + ソフトバンク + + + 石田 勇一 + いしだ ゆういち + ishida_yuuichi@example.com + Male + 54 + 1959/3/6 + 既婚 + A型 + 京都府 + 26 + 085-904-5980 + 080-7722-1671 + ドコモ + + + 保坂 美菜 + ほさか みな + hosaka_mina@example.com + Female + 36 + 1976/11/22 + 既婚 + O型 + 埼玉県 + 11 + 067-289- 162 + 090-9137-2019 + ドコモ + + + 小笠原 さやか + おがさわら さやか + ogasawara_sayaka@example.com + Female + 28 + 1985/3/17 + 既婚 + O型 + 山形県 + 06 + 024- 62-7287 + 080- 343-8488 + au + + + 細野 麻緒 + ほその まお + hosono_mao@example.com + Female + 41 + 1972/3/20 + 既婚 + O型 + 群馬県 + 10 + 072-852-9621 + 080-4159-2609 + ドコモ + + + 仲村 恵梨香 + なかむら えりか + nakamura_erika@example.com + Female + 77 + 1936/5/2 + 既婚 + O型 + 東京都 + 13 + 082-295-7095 + 090-5969-6794 + au + + + 水田 正義 + みずた まさよし + mizuta_masayoshi@example.com + Male + 69 + 1943/11/3 + 既婚 + A型 + 山形県 + 06 + 091-164-5462 + 080-9344-4159 + ドコモ + + + 大田 あさみ + おおた あさみ + oota_asami@example.com + Female + 44 + 1968/12/30 + 未婚 + O型 + 東京都 + 13 + 061-908-5035 + 090-2497- 816 + au + + + 村田 俊二 + むらた しゅんじ + murata_shunji@example.com + Male + 75 + 1938/8/27 + 既婚 + O型 + 青森県 + 02 + 0 5-900-6766 + 080-6403-4212 + ドコモ + + + 細田 陽子 + ほそだ ようこ + hosoda_youko@example.com + Female + 46 + 1967/3/2 + 既婚 + O型 + 埼玉県 + 11 + 010-586-6576 + 080-2199-1164 + ソフトバンク + + + 手島 智花 + てじま ともか + tejima_tomoka@example.com + Female + 64 + 1949/6/11 + 既婚 + A型 + 東京都 + 13 + 047-271-3336 + 090-6728-9359 + ソフトバンク + + + 柳原 茜 + やなぎはら あかね + yanagihara_akane@example.com + Female + 46 + 1967/10/9 + 既婚 + B型 + 石川県 + 17 + 010-683-7500 + 090-7914-4898 + ドコモ + + + 下山 豊 + しもやま ゆたか + shimoyama_yutaka@example.com + Male + 29 + 1984/2/17 + 既婚 + B型 + 北海道 + 01 + 047- 79-8202 + 080-9216-9571 + ドコモ + + + 宇都宮 和之 + うつのみや かずゆき + utsunomiya_kazuyuki@example.com + Male + 37 + 1976/10/12 + 既婚 + O型 + 愛知県 + 23 + 083-555-3659 + 080-3113-2595 + ドコモ + + + 五味 まなみ + ごみ まなみ + gomi_manami@example.com + Female + 62 + 1951/6/23 + 既婚 + B型 + 神奈川県 + 14 + 043-686-3344 + 080-6209-8731 + au + + + 市田 麗奈 + いちだ れな + ichida_rena@example.com + Female + 51 + 1962/8/15 + 既婚 + A型 + 埼玉県 + 11 + 092-590-4135 + 080-1546-2409 + ソフトバンク + + + 志賀 隆太 + しが りゅうた + shiga_ryuuta@example.com + Male + 43 + 1970/5/22 + 既婚 + A型 + 大阪府 + 27 + 0 4-338-6198 + 080-7783-5469 + au + + + 中原 健 + なかはら けん + nakahara_ken@example.com + Male + 57 + 1956/5/11 + 既婚 + B型 + 千葉県 + 12 + 099-689-9152 + 080-1164-6047 + ソフトバンク + + + 桜井 弘也 + さくらい ひろなり + sakurai_hironari@example.com + Male + 39 + 1974/3/17 + 既婚 + B型 + 東京都 + 13 + 076- 7-8251 + 090- 44-4743 + ソフトバンク + + + 小倉 怜奈 + おぐら れいな + ogura_reina@example.com + Female + 35 + 1978/7/24 + 既婚 + AB型 + 愛知県 + 23 + 056-709-8187 + 080-6257-4955 + ソフトバンク + + + 佐川 友以乃 + さがわ ゆいの + sagawa_yuino@example.com + Female + 52 + 1961/4/12 + 既婚 + O型 + 東京都 + 13 + 052-725-5971 + 080-3995-8887 + ドコモ + + + 高野 コウ + たかの こう + takano_kou@example.com + Female + 41 + 1972/4/29 + 既婚 + AB型 + 和歌山県 + 30 + 021-815-2476 + 080-4726-2031 + ドコモ + + + 深谷 明慶 + ふかや あきよし + fukaya_akiyoshi@example.com + Male + 62 + 1950/10/27 + 既婚 + O型 + 愛媛県 + 38 + 018-140-3048 + 090-6153-4374 + ドコモ + + + 宮本 知世 + みやもと ちせ + miyamoto_chise@example.com + Female + 62 + 1951/4/17 + 既婚 + A型 + 三重県 + 24 + 070-848-3040 + 080-3820-7017 + au + + + 大谷 悟志 + おおたに さとし + ootani_satoshi@example.com + Male + 26 + 1987/8/6 + 既婚 + A型 + 静岡県 + 22 + 054-557-2119 + 090-4248-5387 + au + + + 宇多田 雅功 + うただ まさとし + utada_masatoshi@example.com + Male + 55 + 1957/12/24 + 既婚 + O型 + 兵庫県 + 28 + 055-494-6692 + 080-7642-5789 + au + + + 堀越 了 + ほりこし りょう + horikoshi_ryou@example.com + Male + 61 + 1952/10/6 + 既婚 + A型 + 群馬県 + 10 + 059-878-6295 + 080-5293-5190 + ドコモ + + + 大村 玲那 + おおむら れな + oomura_rena@example.com + Female + 48 + 1965/2/21 + 既婚 + O型 + 福岡県 + 40 + 028-561-7700 + 090-8067-7250 + au + + + 高松 聡 + たかまつ さとし + takamatsu_satoshi@example.com + Male + 60 + 1953/6/24 + 既婚 + AB型 + 東京都 + 13 + 045-969-2262 + 080-2896- 762 + ドコモ + + + 塩見 三省 + しおみ さんせい + shiomi_sansei@example.com + Male + 32 + 1981/6/11 + 既婚 + AB型 + 鹿児島県 + 46 + 0 3- 64-5927 + 080-1211-2648 + ドコモ + + + 秋田 信輔 + あきた しんすけ + akita_shinsuke@example.com + Male + 59 + 1954/10/21 + 既婚 + A型 + 富山県 + 16 + 064-942- 874 + 080-8752-8239 + ドコモ + + + 吉野 未華子 + よしの みかこ + yoshino_mikako@example.com + Female + 75 + 1937/12/5 + 既婚 + A型 + 岩手県 + 03 + 060-309-5314 + 090-3456-2125 + ドコモ + + + 塩沢 七世 + しおざわ ななせ + shiozawa_nanase@example.com + Female + 62 + 1950/12/19 + 既婚 + O型 + 神奈川県 + 14 + 046-278- 405 + 080-7119-4206 + ドコモ + + + 河合 茜 + かわい あかね + kawai_akane@example.com + Female + 80 + 1933/2/2 + 既婚 + B型 + 茨城県 + 08 + 056-680-3752 + 080-9853-4613 + ソフトバンク + + + 小高 洋介 + こだか ようすけ + kodaka_yousuke@example.com + Male + 55 + 1958/3/3 + 既婚 + O型 + 石川県 + 17 + 038-320-1536 + 090- 270-2799 + ドコモ + + + 米谷 克実 + よねや かつみ + yoneya_katsumi@example.com + Male + 57 + 1956/9/5 + 既婚 + A型 + 大阪府 + 27 + 0 4-560-1921 + 090-8540-2330 + ドコモ + + + 藤島 竜也 + ふじしま たつや + fujishima_tatsuya@example.com + Male + 30 + 1982/11/21 + 未婚 + A型 + 千葉県 + 12 + 011-292-1734 + 090-8891-2845 + ドコモ + + + 山根 マサカズ + やまね まさかず + yamane_masakazu@example.com + Male + 28 + 1985/8/25 + 既婚 + O型 + 宮城県 + 04 + 028-431-1132 + 080-2421-6972 + ソフトバンク + + + 平林 浩太郎 + ひらばやし こうたろう + hirabayashi_koutarou@example.com + Male + 59 + 1954/8/15 + 既婚 + B型 + 山形県 + 06 + 078-585-8736 + 090-4679-4820 + ドコモ + + + 曽我 隆 + そが たかし + soga_takashi@example.com + Male + 45 + 1968/2/22 + 既婚 + AB型 + 奈良県 + 29 + 0 4-237- 767 + 080- 655- 700 + au + + + 土井 康文 + どい やすふみ + doi_yasufumi@example.com + Male + 57 + 1956/9/21 + 既婚 + A型 + 大阪府 + 27 + 051- 77-9308 + 090-1864-8242 + au + + + 大矢 俊二 + おおや しゅんじ + ooya_shunji@example.com + Male + 39 + 1974/9/14 + 既婚 + O型 + 東京都 + 13 + 065-322-8132 + 080-6899-1174 + au + + + 黒田 惇 + くろた じゅん + kurota_jun@example.com + Male + 74 + 1939/5/4 + 既婚 + O型 + 千葉県 + 12 + 087-484-4871 + 080-2960-4164 + au + + + 白木 慶二 + しらき けいじ + shiraki_keiji@example.com + Male + 32 + 1981/6/8 + 既婚 + A型 + 福岡県 + 40 + 035-625-1243 + 090-1316-2574 + ドコモ + + + 谷本 茜 + たにもと あかね + tanimoto_akane@example.com + Female + 32 + 1981/3/29 + 既婚 + A型 + 青森県 + 02 + 024-861-7646 + 090-9638-4237 + ドコモ + + + 浅野 莉緒 + あさの りお + asano_rio@example.com + Female + 59 + 1953/12/31 + 既婚 + O型 + 三重県 + 24 + 081-574-9608 + 080-4046-1213 + ソフトバンク + + + 坂口 克実 + さかぐち かつみ + sakaguchi_katsumi@example.com + Male + 41 + 1972/4/7 + 既婚 + O型 + 新潟県 + 15 + 053-564-5422 + 080-6160- 600 + ドコモ + + + 大熊 那奈 + おおくま なな + ookuma_nana@example.com + Female + 77 + 1936/6/4 + 既婚 + A型 + 大阪府 + 27 + 034-242-8157 + 080-2541-3605 + au + + + 新村 一徳 + にいむら いっとく + niimura_ittoku@example.com + Male + 32 + 1981/1/30 + 未婚 + O型 + 大阪府 + 27 + 012-693-3272 + 080-3143-6627 + ドコモ + + + 田村 美佐子 + たむら みさこ + tamura_misako@example.com + Female + 30 + 1982/12/7 + 既婚 + O型 + 北海道 + 01 + 026-747-4485 + 080-9130-7375 + ソフトバンク + + + 藤崎 愛梨 + ふじさき あいり + fujisaki_airi@example.com + Female + 71 + 1942/5/10 + 既婚 + B型 + 愛媛県 + 38 + 031-663-3631 + 090-5193-6624 + ドコモ + + + 星 信輔 + ほし しんすけ + hoshi_shinsuke@example.com + Male + 25 + 1988/2/13 + 未婚 + O型 + 東京都 + 13 + 066-683-3320 + 090-1803-2587 + ドコモ + + + 小野田 杏 + おのだ あん + onoda_ann@example.com + Female + 24 + 1989/1/15 + 未婚 + O型 + 宮崎県 + 45 + 048-314-3754 + 080- 321- 990 + ドコモ + + + 日下部 一輝 + くさかべ かずき + kusakabe_kazuki@example.com + Male + 38 + 1975/4/9 + 既婚 + O型 + 三重県 + 24 + 023-790-4455 + 080-2923- 150 + ドコモ + + + 神野 瞳 + かみの ひとみ + kamino_hitomi@example.com + Female + 70 + 1942/11/21 + 既婚 + B型 + 徳島県 + 36 + 067-819- 556 + 090-6884-7621 + ドコモ + + + 加藤 ヒロ + かとう ひろ + katou_hiro@example.com + Male + 22 + 1990/12/19 + 未婚 + A型 + 千葉県 + 12 + 034-999-5529 + 090-7191-5849 + ソフトバンク + + + 吉崎 恵美 + よしざき めぐみ + yoshizaki_megumi@example.com + Female + 73 + 1940/5/11 + 既婚 + AB型 + 兵庫県 + 28 + 080-602-4155 + 080-9272-8262 + ソフトバンク + + + 長友 なぎさ + ながとも なぎさ + nagatomo_nagisa@example.com + Female + 57 + 1956/3/3 + 既婚 + O型 + 東京都 + 13 + 0 6-452-7302 + 090-8393-2823 + au + + + 長野 和香 + ながの わか + nagano_waka@example.com + Female + 77 + 1936/3/5 + 既婚 + B型 + 三重県 + 24 + 0 9-975-9897 + 090-9509-9287 + au + + + 熊倉 由宇 + くまくら ゆう + kumakura_yuu@example.com + Female + 32 + 1981/8/12 + 既婚 + A型 + 愛知県 + 23 + 069-225-9641 + 080-7294-6252 + ソフトバンク + + + 本田 フミヤ + ほんだ ふみや + honnda_fumiya@example.com + Male + 28 + 1985/2/16 + 未婚 + AB型 + 福岡県 + 40 + 099-919-8564 + 080-5201-4117 + ソフトバンク + + + 野原 勤 + のはら つとむ + nohara_tsutomu@example.com + Male + 80 + 1933/8/6 + 既婚 + A型 + 神奈川県 + 14 + 018-897-4472 + 090-6633-7654 + ツーカー + + + 関根 瞬 + せきね しゅん + sekine_shun@example.com + Female + 29 + 1984/5/31 + 既婚 + A型 + 福岡県 + 40 + 018-897-8292 + 080- 393-5620 + ドコモ + + + 毛利 高史 + もうり たかし + mouri_takashi@example.com + Male + 76 + 1937/5/18 + 既婚 + O型 + 佐賀県 + 41 + 092-626-9722 + 090- 371-1461 + au + + + 松井 千夏 + まつい ちなつ + matsui_chinatsu@example.com + Female + 66 + 1947/3/23 + 既婚 + A型 + 東京都 + 13 + 080-364-8755 + 080-2487-9177 + au + + + 若松 恵梨香 + わかまつ えりか + wakamatsu_erika@example.com + Female + 56 + 1957/9/19 + 既婚 + A型 + 岡山県 + 33 + 068-799-1735 + 080- 195-4136 + au + + + 金谷 希 + かなや のぞみ + kanaya_nozomi@example.com + Female + 21 + 1992/7/31 + 未婚 + AB型 + 東京都 + 13 + 027-978-1430 + 080-9055-1653 + ドコモ + + + 竹下 礼子 + たけした れいこ + takeshita_reiko@example.com + Female + 23 + 1989/11/29 + 既婚 + A型 + 神奈川県 + 14 + 080-505-3726 + 080- 609-8831 + ソフトバンク + + + 西田 芽以 + にしだ めい + nishida_mei@example.com + Female + 65 + 1948/6/3 + 既婚 + A型 + 東京都 + 13 + 066-968-7225 + 090-1728-1598 + ソフトバンク + + + 森本 ひとり + もりもと ひとり + morimoto_hitori@example.com + Male + 36 + 1976/11/28 + 未婚 + O型 + 愛知県 + 23 + 033-174-6148 + 080-8755-9809 + au + + + 沼田 詩織 + ぬまた しおり + numata_shiori@example.com + Female + 63 + 1949/10/29 + 既婚 + A型 + 北海道 + 01 + 0 -366-5792 + 090-8742-6489 + ソフトバンク + + + 三浦 優一 + みうら ゆういち + miura_yuuichi@example.com + Male + 45 + 1968/7/31 + 既婚 + O型 + 大阪府 + 27 + 071-825-8104 + 080-2271-5176 + ソフトバンク + + + 篠崎 隼士 + しのざき しゅんじ + shinozaki_shunji@example.com + Male + 47 + 1965/12/19 + 既婚 + A型 + 山口県 + 35 + 057-365-6675 + 080- 654-1405 + ドコモ + + + 三輪 基祐 + みわ きすけ + miwa_kisuke@example.com + Male + 48 + 1965/5/20 + 既婚 + AB型 + 京都府 + 26 + 059-399-5271 + 090-7459-3119 + ドコモ + + + 桑田 知世 + くわた ちせ + kuwata_chise@example.com + Female + 47 + 1966/9/7 + 既婚 + A型 + 兵庫県 + 28 + 046-633-6934 + 090-6689-8521 + au + + + 永瀬 まみ + ながせ まみ + nagase_mami@example.com + Female + 61 + 1952/3/6 + 既婚 + B型 + 宮崎県 + 45 + 061-971-4439 + 090-4727-9473 + ドコモ + + + 武田 礼子 + たけだ れいこ + takeda_reiko@example.com + Female + 43 + 1970/10/9 + 既婚 + A型 + 栃木県 + 09 + 073-916-7490 + 080- 150-9733 + ドコモ + + + 三浦 知史 + みうら ともふみ + miura_tomofumi@example.com + Male + 73 + 1939/12/1 + 既婚 + A型 + 三重県 + 24 + 059- 95-4399 + 090-3044-2291 + ドコモ + + + 篠山 洋介 + しのやま ようすけ + shinoyama_yousuke@example.com + Male + 71 + 1942/1/28 + 既婚 + A型 + 神奈川県 + 14 + 056-434-1690 + 090-5638-4876 + ツーカー + + + 市原 かおり + いちはら かおり + ichihara_kaori@example.com + Female + 48 + 1965/2/13 + 既婚 + O型 + 宮城県 + 04 + 069-817-7919 + 080-7756-2139 + ドコモ + + + 大高 貴嶺 + おおだか たかね + oodaka_takane@example.com + Male + 55 + 1958/8/25 + 既婚 + A型 + 山形県 + 06 + 097- 79-2303 + 080-7435-3824 + ツーカー + + + 成田 輝信 + なりた あきのぶ + narita_akinobu@example.com + Male + 71 + 1942/4/5 + 既婚 + B型 + 大分県 + 44 + 070- 47-1158 + 080-4229-4909 + au + + + 小幡 窈 + おばた よう + obata_you@example.com + Female + 71 + 1942/6/23 + 既婚 + A型 + 三重県 + 24 + 012-388-2380 + 090- 466-6611 + ドコモ + + + 田代 達士 + たしろ たつひと + tashiro_tatsuhito@example.com + Male + 54 + 1959/2/6 + 既婚 + O型 + 新潟県 + 15 + 067-500-9493 + 080- 102-1151 + au + + + 岩井 未來 + いわい みらい + iwai_mirai@example.com + Male + 44 + 1969/9/17 + 既婚 + A型 + 愛知県 + 23 + 078-309-7050 + 080-7816-6498 + au + + + 藤沢 マサカズ + ふじさわ まさかず + fujisawa_masakazu@example.com + Male + 31 + 1982/3/9 + 既婚 + A型 + 兵庫県 + 28 + 028-284-1401 + 090-7688-5565 + ドコモ + + + 吉川 翔子 + よしかわ しょうこ + yoshikawa_shouko@example.com + Female + 80 + 1933/5/8 + 既婚 + O型 + 鹿児島県 + 46 + 096-254-2089 + 080- 397-4716 + au + + + 武藤 一輝 + むとう かずき + mutou_kazuki@example.com + Male + 69 + 1944/1/1 + 既婚 + A型 + 長崎県 + 42 + 061-468-2012 + 080-8308-9614 + ドコモ + + + 有馬 直人 + ありま なおと + arima_naoto@example.com + Male + 31 + 1982/1/17 + 未婚 + B型 + 静岡県 + 22 + 032-796-9170 + 080-1576-3206 + ドコモ + + + 瀬戸 さやか + せと さやか + seto_sayaka@example.com + Female + 67 + 1946/5/8 + 既婚 + O型 + 長崎県 + 42 + 0 1-747-5903 + 080-7243-6385 + ドコモ + + + 相馬 昌代 + あいば まさよ + aiba_masayo@example.com + Female + 47 + 1966/4/20 + 既婚 + O型 + 神奈川県 + 14 + 087- 84-7331 + 090-8411-6028 + ドコモ + + + 宮下 まさし + みやした まさし + miyashita_masashi@example.com + Male + 30 + 1983/3/11 + 既婚 + O型 + 熊本県 + 43 + 048- 32-1789 + 080-3924-1362 + au + + + 丸田 明慶 + まるた あきよし + maruta_akiyoshi@example.com + Male + 29 + 1984/6/9 + 既婚 + B型 + 長野県 + 20 + 037-941- 122 + 080- 799- 322 + ドコモ + + + 山根 信輔 + やまね しんすけ + yamane_shinsuke@example.com + Male + 69 + 1944/5/9 + 既婚 + B型 + 福岡県 + 40 + 027-979-9641 + 090-4583- 505 + ソフトバンク + + + 明石家 俊二 + あかしや しゅんじ + akashiya_shunji@example.com + Male + 73 + 1940/1/26 + 既婚 + B型 + 愛知県 + 23 + 057- 7-6201 + 080- 847-3415 + ドコモ + + + 和田 良介 + わだ りょうすけ + wada_ryousuke@example.com + Male + 52 + 1961/10/20 + 既婚 + B型 + 宮城県 + 04 + 098-867-3943 + 080-6942-7077 + au + + + 内藤 涼 + ないとう りょう + naitou_ryou@example.com + Female + 27 + 1986/7/23 + 既婚 + B型 + 東京都 + 13 + 0 -924-4068 + 090-1739-9918 + ドコモ + + + 小川 俊二 + おがわ しゅんじ + ogawa_shunji@example.com + Male + 58 + 1955/4/22 + 既婚 + B型 + 新潟県 + 15 + 073-693-7957 + 080-3829-6573 + ドコモ + + + 内村 晃司 + うちむら こうじ + uchimura_kouji@example.com + Male + 41 + 1972/5/3 + 未婚 + B型 + 鳥取県 + 31 + 069-944-9563 + 090-5880-8376 + ドコモ + + + 江原 ヒカル + えはら ひかる + ehara_hikaru@example.com + Female + 54 + 1959/10/23 + 既婚 + B型 + 神奈川県 + 14 + 068-156-4711 + 090-1719-7980 + au + + + 有田 賢治 + ありた けんじ + arita_kenji@example.com + Male + 64 + 1949/8/26 + 既婚 + A型 + 三重県 + 24 + 0 9-858-1379 + 080-6126-1898 + ドコモ + + + 長谷川 亮 + はせがわ りょう + hasegawa_ryou@example.com + Male + 48 + 1965/8/10 + 既婚 + O型 + 長野県 + 20 + 042-431- 636 + 080-8302-3321 + ドコモ + + + 細野 哲平 + ほその てっぺい + hosono_teppei@example.com + Male + 33 + 1980/7/17 + 既婚 + O型 + 岐阜県 + 21 + 083-561- 442 + 090-4825-3270 + au + + + 近藤 勇太 + こんどう ゆうた + kondou_yuuta@example.com + Male + 55 + 1958/4/2 + 既婚 + A型 + 福岡県 + 40 + 0 8-940- 699 + 080-8889-3240 + ドコモ + + + 本上 さやか + ほんじょう さやか + honjo_sayaka@example.com + Female + 38 + 1974/11/15 + 既婚 + B型 + 千葉県 + 12 + 0 5-490-2199 + 080-1285-7406 + au + + + 小峰 さとみ + こみね さとみ + komine_satomi@example.com + Female + 23 + 1990/5/21 + 未婚 + O型 + 東京都 + 13 + 031-221-2949 + 090-6010-4382 + au + + + 山口 光臣 + やまぐち みつおみ + yamaguchi_mitsuomi@example.com + Male + 48 + 1965/6/18 + 既婚 + B型 + 宮城県 + 04 + 021- 8-2880 + 080-3895-2858 + au + + + 花田 菜々美 + はなだ ななみ + hanada_nanami@example.com + Female + 70 + 1942/11/4 + 既婚 + O型 + 北海道 + 01 + 031-110-1931 + 090-6123- 340 + ドコモ + + + 川本 耕司 + かわもと こうじ + kawamoto_kouji@example.com + Male + 39 + 1973/11/25 + 既婚 + B型 + 岡山県 + 33 + 075-926-5295 + 090-5701-4257 + ドコモ + + + 松井 精児 + まつい せいじ + matsui_seiji@example.com + Male + 43 + 1970/3/7 + 既婚 + O型 + 長野県 + 20 + 033-989-4492 + 080-5115-2122 + au + + + 宮脇 ノブヒコ + みやわき のぶひこ + miyawaki_nobuhiko@example.com + Male + 74 + 1938/11/17 + 既婚 + B型 + 愛媛県 + 38 + 092-313-8729 + 090-1070-3500 + ドコモ + + + 森口 玲那 + もりぐち れな + moriguchi_rena@example.com + Female + 36 + 1976/11/6 + 未婚 + A型 + 兵庫県 + 28 + 016-454-7376 + 080- 836- 308 + au + + + 中島 美幸 + なかしま みゆき + nakashima_miyuki@example.com + Female + 23 + 1990/10/3 + 未婚 + O型 + 大阪府 + 27 + 043-324-3087 + 090-7599-7659 + au + + + 浦野 光 + うらの ひかる + urano_hikaru@example.com + Female + 64 + 1949/7/5 + 既婚 + O型 + 東京都 + 13 + 094-527-2532 + 090-3116-4776 + au + + + 川島 璃奈子 + かわしま りなこ + kawashima_rinako@example.com + Female + 58 + 1954/12/7 + 既婚 + A型 + 千葉県 + 12 + 084-123-6762 + 090-6618-2267 + ソフトバンク + + + 坂下 光 + さかした ひかる + sakashita_hikaru@example.com + Female + 37 + 1976/8/21 + 既婚 + A型 + 神奈川県 + 14 + 038-589-2626 + 080-5650-6042 + ドコモ + + + 川辺 真一 + かわべ しんいち + kawabe_shinichi@example.com + Male + 72 + 1941/9/22 + 既婚 + A型 + 兵庫県 + 28 + 0 8-546-8526 + 080-8032-7397 + ドコモ + + + 津田 憲一 + つだ けんいち + tsuda_kenichi@example.com + Male + 30 + 1982/12/4 + 既婚 + O型 + 三重県 + 24 + 073-144-7601 + 080-4021-8075 + ドコモ + + + 八十田 そら + やそだ そら + yasoda_sora@example.com + Female + 71 + 1942/3/28 + 既婚 + O型 + 埼玉県 + 11 + 015-707-7832 + 080-1205-6004 + ドコモ + + + 藤村 真吾 + ふじむら しんご + fujimura_shingo@example.com + Male + 40 + 1973/5/7 + 既婚 + B型 + 愛知県 + 23 + 078- 59-5264 + 090-9893-7310 + ドコモ + + + 益田 美月 + ますだ みづき + masuda_miduki@example.com + Female + 33 + 1980/6/21 + 未婚 + O型 + 兵庫県 + 28 + 037-604- 251 + 090-2869-6404 + ドコモ + + + 宮崎 陽介 + みやざき ようすけ + miyazaki_yousuke@example.com + Male + 49 + 1964/3/21 + 既婚 + B型 + 滋賀県 + 25 + 059-480-9035 + 090-8518-2503 + ドコモ + + + 山崎 光博 + やまざき みつひろ + yamazaki_mitsuhiro@example.com + Male + 71 + 1942/9/20 + 既婚 + O型 + 大阪府 + 27 + 053-912-7444 + 090- 594-2185 + au + + + 飯塚 美幸 + いいづか みゆき + iiduka_miyuki@example.com + Female + 47 + 1965/12/1 + 既婚 + B型 + 福島県 + 07 + 070-597-4314 + 090-7618-9055 + au + + + 小野 一哉 + おの かずや + ono_kazuya@example.com + Male + 31 + 1982/6/16 + 未婚 + B型 + 香川県 + 37 + 097-875-2334 + 090-6066-8274 + au + + + 宮下 朝陽 + みやした あさひ + miyashita_asahi@example.com + Female + 54 + 1959/10/22 + 既婚 + A型 + 広島県 + 34 + 085-616-6403 + 080-9301-1941 + ドコモ + + + 大地 栄一 + おおち えいいち + oochi_eiichi@example.com + Male + 36 + 1977/2/7 + 既婚 + B型 + 大分県 + 44 + 062-917-9898 + 090-5046-3645 + ドコモ + + + 川原 璃奈子 + かわはら りなこ + kawahara_rinako@example.com + Female + 68 + 1945/10/13 + 既婚 + B型 + 埼玉県 + 11 + 072-708-2803 + 090- 335-5489 + ドコモ + + + 池本 研二 + いけもと けんじ + ikemoto_kenji@example.com + Male + 74 + 1939/5/6 + 既婚 + A型 + 広島県 + 34 + 027-991-5522 + 090-7813-1739 + au + + + 井川 昴 + いがわ すばる + igawa_subaru@example.com + Male + 69 + 1944/5/22 + 既婚 + A型 + 北海道 + 01 + 046-135-6660 + 080- 386-2619 + ドコモ + + + 丹野 照生 + たんの てるお + tannno_teruo@example.com + Male + 62 + 1951/3/3 + 既婚 + A型 + 岩手県 + 03 + 051- 29-8140 + 090-7528-9134 + ドコモ + + + 邑野 瑠璃亜 + むらの るりあ + murano_ruria@example.com + Female + 21 + 1992/5/24 + 未婚 + O型 + 埼玉県 + 11 + 067-425-2763 + 090-4239-4472 + ドコモ + + + 百瀬 真一 + ももせ しんいち + momose_shinichi@example.com + Male + 21 + 1992/7/18 + 既婚 + B型 + 静岡県 + 22 + 023-491- 985 + 090-8812-4888 + ドコモ + + + 小出 龍吉 + こいで りゅうきち + koide_ryuukichi@example.com + Male + 69 + 1944/9/7 + 既婚 + O型 + 東京都 + 13 + 046-502-4150 + 090-7607-1785 + ドコモ + + + 谷本 長利 + たにもと ながとし + tanimoto_nagatoshi@example.com + Male + 69 + 1944/8/28 + 既婚 + O型 + 東京都 + 13 + 061-264-9782 + 080-1719-1448 + ドコモ + + + ともさか ひとり + ともさか ひとり + tomosaka_hitori@example.com + Male + 29 + 1984/10/17 + 既婚 + O型 + 愛知県 + 23 + 097- 13-7816 + 080-1414-9641 + au + + + 尾上 詩織 + おがみ しおり + ogami_shiori@example.com + Female + 72 + 1941/6/24 + 既婚 + B型 + 東京都 + 13 + 073-462-1448 + 080-6531-8339 + ドコモ + + + 三好 美佳 + みよし みか + miyoshi_mika@example.com + Female + 35 + 1978/8/20 + 既婚 + B型 + 静岡県 + 22 + 082-480-1976 + 080-1542-9452 + ソフトバンク + + + さだ 美幸 + さだ みゆき + sada_miyuki@example.com + Female + 34 + 1979/1/15 + 既婚 + AB型 + 埼玉県 + 11 + 016-563-1478 + 090-6233-6721 + au + + + 中本 那奈 + なかもと なな + nakamoto_nana@example.com + Female + 67 + 1945/11/28 + 既婚 + B型 + 兵庫県 + 28 + 076-651-1583 + 090-9101-9719 + ソフトバンク + + + 松本 みき + まつもと みき + matsumoto_miki@example.com + Female + 27 + 1986/4/12 + 既婚 + O型 + 大阪府 + 27 + 084-873- 785 + 090-1021-4589 + ドコモ + + + 玉山 一哉 + たまやま かずや + tamayama_kazuya@example.com + Male + 21 + 1992/8/30 + 未婚 + B型 + 鹿児島県 + 46 + 065-760-5106 + 080-1979-9842 + ドコモ + + + 内山 真吾 + うちやま しんご + uchiyama_shingo@example.com + Male + 77 + 1935/11/20 + 既婚 + B型 + 神奈川県 + 14 + 020-117-2454 + 080-9011-8673 + au + + + 関 佑 + せき たすく + seki_tasuku@example.com + Male + 50 + 1963/7/15 + 既婚 + A型 + 神奈川県 + 14 + 0 -754-9329 + 090-3296-9812 + ソフトバンク + + + 菅 博之 + すが ひろゆき + suga_hiroyuki@example.com + Male + 40 + 1973/3/24 + 既婚 + O型 + 東京都 + 13 + 051-196-2550 + 090-9623-6188 + ドコモ + + + 芳賀 花 + はが はな + haga_hana@example.com + Female + 69 + 1944/8/1 + 既婚 + A型 + 東京都 + 13 + 025-687-1917 + 090-9672- 143 + au + + + 河原 ヒカル + かわはら ひかる + kawahara_hikaru@example.com + Female + 47 + 1965/11/3 + 既婚 + B型 + 三重県 + 24 + 010-504-9688 + 080-7864-3120 + ドコモ + + + 武藤 まなみ + むとう まなみ + mutou_manami@example.com + Female + 26 + 1987/7/8 + 既婚 + O型 + 東京都 + 13 + 018-817-3229 + 090-2997-1204 + au + + + 井上 耕司 + いのうえ こうじ + inoue_kouji@example.com + Male + 68 + 1945/4/15 + 既婚 + B型 + 滋賀県 + 25 + 032-343-2753 + 090-8937-1516 + ドコモ + + + 菅 恭子 + すが きょうこ + suga_kyouko@example.com + Female + 69 + 1944/2/4 + 既婚 + O型 + 山形県 + 06 + 078-684-6482 + 080- 613-5930 + ドコモ + + + 新村 真帆 + にいむら まほ + niimura_maho@example.com + Female + 24 + 1989/6/5 + 既婚 + O型 + 岐阜県 + 21 + 014-288-5613 + 090-2981-3196 + ドコモ + + + 津田 奈々 + つだ なな + tsuda_nana@example.com + Female + 37 + 1976/3/8 + 既婚 + A型 + 岩手県 + 03 + 076-887-8113 + 090- 296-8043 + ドコモ + + + 久保 信輔 + くぼ しんすけ + kubo_shinsuke@example.com + Male + 66 + 1947/10/15 + 既婚 + B型 + 滋賀県 + 25 + 013-416-8130 + 090-3770-8104 + au + + + 田崎 杏 + たざき あん + tazaki_ann@example.com + Female + 78 + 1935/6/17 + 既婚 + O型 + 大阪府 + 27 + 017-493-6331 + 090-6185-5668 + ソフトバンク + + + 成田 朝陽 + なりた あさひ + narita_asahi@example.com + Female + 52 + 1961/7/28 + 既婚 + B型 + 広島県 + 34 + 081-893-7818 + 080-1809-8411 + au + + + 難波 はるか + なんば はるか + nannba_haruka@example.com + Female + 63 + 1950/8/12 + 既婚 + A型 + 愛知県 + 23 + 034-191-8204 + 090-3142-9184 + au + + + ト字 丈雄 + とじ たけお + toji_takeo@example.com + Male + 38 + 1975/7/23 + 未婚 + O型 + 東京都 + 13 + 015-256- 4 + 080-1092-6370 + ドコモ + + + 宮下 浩介 + みやした こうすけ + miyashita_kousuke@example.com + Male + 48 + 1965/5/7 + 既婚 + O型 + 長野県 + 20 + 070-681-2805 + 090-9430-1337 + ソフトバンク + + + 田口 智花 + たぐち ともか + taguchi_tomoka@example.com + Female + 27 + 1986/8/8 + 未婚 + A型 + 佐賀県 + 41 + 0 1-312-4695 + 080-9181-9052 + ドコモ + + + 柴田 六郎 + しばた ろくろう + shibata_rokurou@example.com + Male + 67 + 1946/4/26 + 既婚 + B型 + 富山県 + 16 + 059- 15-6857 + 090-1215-4752 + au + + + 南部 雅之 + なんぶ まさゆき + nannbu_masayuki@example.com + Male + 57 + 1956/6/15 + 既婚 + O型 + 東京都 + 13 + 034- 45-5973 + 090-9299-4008 + ドコモ + + + 下川 美帆 + しもかわ みほ + shimokawa_miho@example.com + Female + 36 + 1976/11/11 + 既婚 + O型 + 岩手県 + 03 + 015-518-4488 + 080- 78-1136 + au + + + 筒井 まみ + つつい まみ + tsutsui_mami@example.com + Female + 32 + 1980/11/9 + 既婚 + O型 + 沖縄県 + 47 + 028-594-2092 + 080-7482-6452 + ソフトバンク + + + 村上 竜次 + むらかみ りゅうじ + murakami_ryuuji@example.com + Male + 57 + 1956/9/9 + 未婚 + AB型 + 熊本県 + 43 + 014-731- 208 + 090-8414-2200 + ドコモ + + + 江藤 あさみ + えとう あさみ + etou_asami@example.com + Female + 71 + 1942/9/25 + 既婚 + A型 + 長崎県 + 42 + 0 8-168-8666 + 090-1234-3378 + ドコモ + + + 大後 昌代 + おおご まさよ + oogo_masayo@example.com + Female + 53 + 1960/6/17 + 既婚 + A型 + 神奈川県 + 14 + 093-544- 161 + 080-4781- 912 + au + + + 松川 研二 + まつかわ けんじ + matsukawa_kenji@example.com + Male + 60 + 1953/5/24 + 既婚 + O型 + 大阪府 + 27 + 048-444-1665 + 090-5816-3374 + ドコモ + + + 岩城 さやか + いわき さやか + iwaki_sayaka@example.com + Female + 58 + 1955/10/8 + 既婚 + O型 + 熊本県 + 43 + 012-330-3572 + 080-5589-8997 + ソフトバンク + + + 坂上 進 + さかがみ すすむ + sakagami_susumu@example.com + Male + 29 + 1984/3/2 + 既婚 + O型 + 栃木県 + 09 + 080-259-7653 + 090-2730-2099 + ドコモ + + + 難波 裕司 + なんば ゆうじ + nannba_yuuji@example.com + Male + 73 + 1940/1/18 + 既婚 + A型 + 東京都 + 13 + 047-117- 653 + 090-2081-8274 + ドコモ + + + 野田 芳正 + のだ よしまさ + noda_yoshimasa@example.com + Male + 57 + 1956/7/15 + 未婚 + O型 + 千葉県 + 12 + 033-444-9658 + 080-9867-3041 + ドコモ + + + 深田 みゆき + ふかだ みゆき + fukada_miyuki@example.com + Female + 46 + 1967/6/17 + 既婚 + B型 + 静岡県 + 22 + 066- 56-1944 + 080-5249-5602 + au + + + 福田 知世 + ふくだ ちせ + fukuda_chise@example.com + Female + 35 + 1978/3/8 + 既婚 + A型 + 埼玉県 + 11 + 017-530-8549 + 090-5831-4460 + ドコモ + + + 梅沢 碧海 + うめざわ おうが + umezawa_ouga@example.com + Male + 59 + 1954/1/12 + 既婚 + A型 + 埼玉県 + 11 + 019-443-8981 + 090-5781-1991 + ソフトバンク + + + 尾崎 達士 + おざき たつひと + ozaki_tatsuhito@example.com + Male + 49 + 1964/7/8 + 既婚 + O型 + 岐阜県 + 21 + 095-761-5429 + 080-7874- 236 + au + + + 畑中 景子 + はたなか けいこ + hatanaka_keiko@example.com + Female + 69 + 1944/8/26 + 既婚 + O型 + 大阪府 + 27 + 042-604-5491 + 080-2157-6119 + ソフトバンク + + + 渋谷 直人 + しぶや なおと + shibuya_naoto@example.com + Male + 42 + 1971/9/4 + 既婚 + AB型 + 千葉県 + 12 + 077-662-2151 + 090-8947-7622 + ドコモ + + + 須田 奈々 + すだ なな + suda_nana@example.com + Female + 76 + 1937/9/11 + 既婚 + B型 + 兵庫県 + 28 + 0 7-969-3077 + 090-4263-6295 + au + + + 山中 剛基 + やまなか よしき + yamanaka_yoshiki@example.com + Male + 77 + 1936/9/6 + 既婚 + A型 + 新潟県 + 15 + 011- 71-7162 + 080-3918- 135 + ドコモ + + + 塩田 サダヲ + しおた さだお + shiota_sadawo@example.com + Male + 37 + 1976/6/13 + 未婚 + B型 + 広島県 + 34 + 028-857-9115 + 090-4243-6618 + ソフトバンク + + + 緒形 人志 + おがた ひとし + ogata_hitoshi@example.com + Male + 68 + 1944/10/29 + 既婚 + A型 + 新潟県 + 15 + 071-120-6967 + 090-1065-9145 + ドコモ + + + 三枝 妃里 + さんし ゆり + sannshi_yuri@example.com + Female + 74 + 1938/11/6 + 既婚 + B型 + 沖縄県 + 47 + 058-217-3724 + 090-4872-6965 + au + + + 釈 正義 + しゃく まさよし + shaku_masayoshi@example.com + Male + 76 + 1937/1/13 + 既婚 + AB型 + 大阪府 + 27 + 091-424- 264 + 090-9592-6168 + ドコモ + + + 山根 杏 + やまね あん + yamane_ann@example.com + Female + 56 + 1957/2/10 + 既婚 + A型 + 福島県 + 07 + 049-798-5282 + 090-1725-5323 + au + + + 古谷 惇 + ふるたに あつし + furutani_atsushi@example.com + Male + 72 + 1941/3/3 + 既婚 + B型 + 北海道 + 01 + 071-725-5221 + 080-7502-9027 + ソフトバンク + + + 渡辺 仁晶 + わたなべ ひろあき + watanabe_hiroaki@example.com + Male + 73 + 1940/9/10 + 既婚 + A型 + 岡山県 + 33 + 031-872-3338 + 090-1122-2827 + ドコモ + + + 西村 広之 + にしむら ひろゆき + nishimura_hiroyuki@example.com + Male + 48 + 1964/12/5 + 既婚 + B型 + 東京都 + 13 + 082-699-4099 + 090-4910-4858 + ドコモ + + + 五十嵐 竜次 + いがらし りゅうじ + igarashi_ryuuji@example.com + Male + 69 + 1943/11/24 + 既婚 + B型 + 富山県 + 16 + 029-829-8961 + 080-6423- 992 + ドコモ + + + 高村 智花 + たかむら ともか + takamura_tomoka@example.com + Female + 42 + 1970/11/27 + 既婚 + O型 + 東京都 + 13 + 048-900-5846 + 080-3963- 814 + ドコモ + + + 横尾 完爾 + よこお かんじ + yokoo_kanji@example.com + Male + 33 + 1980/4/12 + 未婚 + A型 + 兵庫県 + 28 + 065- 6-5865 + 090- 270-1594 + ドコモ + + + 永井 恵梨香 + ながい えりか + nagai_erika@example.com + Female + 73 + 1940/3/10 + 既婚 + A型 + 愛知県 + 23 + 071-853-9514 + 080- 731-5264 + ドコモ + + + 那須 知世 + なす ちせ + nasu_chise@example.com + Female + 39 + 1974/3/30 + 既婚 + A型 + 山口県 + 35 + 0 6-339-6937 + 090-1005-8374 + ドコモ + + + 川西 完爾 + かわにし かんじ + kawanishi_kanji@example.com + Male + 60 + 1953/3/24 + 既婚 + O型 + 群馬県 + 10 + 066-457-7335 + 080-9613-8717 + ドコモ + + + 清田 雄太 + きよた ゆうた + kiyota_yuuta@example.com + Male + 39 + 1974/5/25 + 未婚 + A型 + 静岡県 + 22 + 072-199-9063 + 090-9928-4251 + ドコモ + + + 明石 ケンイチ + あかし けんいち + akashi_kenichi@example.com + Male + 60 + 1952/11/8 + 既婚 + B型 + 北海道 + 01 + 0 9-945-2476 + 080-8456-1913 + au + + + 安座間 勝久 + あざま かつひさ + azama_katsuhisa@example.com + Male + 59 + 1954/10/24 + 既婚 + A型 + 北海道 + 01 + 023-771-4432 + 090- 435-3493 + ドコモ + + + 安藤 勤 + あんどう つとむ + anndou_tsutomu@example.com + Male + 46 + 1967/9/26 + 既婚 + O型 + 愛知県 + 23 + 062-354-8812 + 090-9171-5278 + ドコモ + + + 福田 法嗣 + ふくだ ほうし + fukuda_houshi@example.com + Male + 50 + 1963/9/7 + 未婚 + A型 + 兵庫県 + 28 + 045- 44-3166 + 080-4937-3691 + ドコモ + + + 河田 由宇 + かわた ゆう + kawata_yuu@example.com + Female + 57 + 1956/6/8 + 既婚 + O型 + 東京都 + 13 + 019-433-4706 + 090-9818- 929 + au + + + 湊 隼士 + みなと しゅんじ + minato_shunji@example.com + Male + 44 + 1969/2/28 + 未婚 + A型 + 茨城県 + 08 + 093- 59-5132 + 090-6723-9010 + ドコモ + + + 三上 なぎさ + みかみ なぎさ + mikami_nagisa@example.com + Female + 65 + 1948/2/7 + 既婚 + A型 + 愛知県 + 23 + 014-879-3118 + 090-6631-1541 + au + + + 八田 広之 + やつだ ひろゆき + yatsuda_hiroyuki@example.com + Male + 69 + 1944/7/17 + 既婚 + AB型 + 千葉県 + 12 + 060-226-2528 + 090- 806-4633 + ドコモ + + + 山城 恵梨香 + やましろ えりか + yamashiro_erika@example.com + Female + 67 + 1946/2/23 + 既婚 + AB型 + 茨城県 + 08 + 0 5-845-7173 + 080-5269-8843 + au + + + 豊島 扶樹 + とよしま もとき + toyoshima_motoki@example.com + Male + 32 + 1981/8/11 + 未婚 + A型 + 岡山県 + 33 + 089- 58-5741 + 080-7651-6561 + ドコモ + + + 荒川 希 + あらかわ のぞみ + arakawa_nozomi@example.com + Female + 41 + 1972/3/11 + 既婚 + B型 + 岩手県 + 03 + 010-514-1088 + 090-6964-6551 + ドコモ + + + 瀬戸内 翔子 + せとうち しょうこ + setouchi_shouko@example.com + Female + 71 + 1942/10/14 + 既婚 + A型 + 千葉県 + 12 + 097-366-3149 + 090-3636-6488 + ドコモ + + + 山内 雅功 + やまのうち まさとし + yamanouchi_masatoshi@example.com + Male + 70 + 1942/10/29 + 既婚 + O型 + 青森県 + 02 + 039-300-5480 + 090-5000-6359 + ドコモ + + + 佐々木 さやか + ささき さやか + sasaki_sayaka@example.com + Female + 23 + 1990/8/31 + 未婚 + O型 + 和歌山県 + 30 + 091-217-9263 + 080- 575- 671 + ドコモ + + + 石野 隼士 + いしの しゅんじ + ishino_shunji@example.com + Male + 45 + 1968/8/26 + 既婚 + A型 + 滋賀県 + 25 + 028-894-9989 + 090-7159-8517 + ドコモ + + + 青山 サダヲ + あおやま さだお + aoyama_sadawo@example.com + Male + 35 + 1978/1/19 + 既婚 + B型 + 長野県 + 20 + 0 -940- 619 + 090- 688-4499 + ドコモ + + + 大和田 めぐみ + おおわだ めぐみ + oowada_megumi@example.com + Female + 31 + 1981/10/27 + 既婚 + B型 + 島根県 + 32 + 056-202-1386 + 080-1759-5372 + ドコモ + + + 松原 しぼり + まつばら しぼり + matsubara_shibori@example.com + Female + 21 + 1992/4/11 + 未婚 + O型 + 宮城県 + 04 + 077-227-7684 + 080-1419-8024 + ソフトバンク + + + 奥貫 友以乃 + おくぬき ゆいの + okunuki_yuino@example.com + Female + 44 + 1968/11/20 + 既婚 + A型 + 東京都 + 13 + 023-942- 925 + 090-9336-7035 + ドコモ + + + 森田 輝信 + もりた あきのぶ + morita_akinobu@example.com + Male + 42 + 1971/7/10 + 既婚 + O型 + 岩手県 + 03 + 051-343-2127 + 090-2505-7901 + au + + + 黄川田 優 + きかわだ ゆう + kikawada_yuu@example.com + Female + 40 + 1973/2/3 + 既婚 + AB型 + 鹿児島県 + 46 + 072-737-3023 + 080- 228-6824 + ドコモ + + + 清野 雅之 + きよの まさゆき + kiyono_masayuki@example.com + Male + 60 + 1953/5/14 + 既婚 + O型 + 千葉県 + 12 + 029-887-1675 + 090-5226-7954 + ドコモ + + + 大川 功補 + おおかわ こうすけ + ookawa_kousuke@example.com + Male + 71 + 1941/11/10 + 既婚 + O型 + 滋賀県 + 25 + 044-428-3141 + 090-8635-6036 + ドコモ + + + 森下 圭 + もりした けい + morishita_kei@example.com + Male + 43 + 1969/12/12 + 既婚 + O型 + 岩手県 + 03 + 062-129-7971 + 090-9841-4912 + ドコモ + + + 牧野 浩太郎 + まきの こうたろう + makino_koutarou@example.com + Male + 20 + 1992/11/29 + 未婚 + A型 + 福島県 + 07 + 050-820-8742 + 080-8266- 729 + ソフトバンク + + + 玉木 菜々美 + たまき ななみ + tamaki_nanami@example.com + Female + 63 + 1950/5/28 + 既婚 + A型 + 福岡県 + 40 + 034-892-3627 + 090-9253- 108 + ドコモ + + + 大野 結子 + おおの ゆうこ + oono_yuuko@example.com + Female + 31 + 1982/4/5 + 既婚 + B型 + 北海道 + 01 + 048-784-6829 + 090-9468-5064 + ドコモ + + + 平 敏也 + たいら としや + taira_toshiya@example.com + Male + 26 + 1987/8/28 + 未婚 + A型 + 茨城県 + 08 + 082-398-2967 + 080-4357- 951 + ドコモ + + + 田口 三郎 + たぐち さぶろう + taguchi_saburou@example.com + Male + 32 + 1980/12/3 + 既婚 + O型 + 福岡県 + 40 + 092-874-9266 + 090-1337-3764 + ソフトバンク + + + 浜崎 莉沙 + はまさき りさ + hamasaki_risa@example.com + Female + 56 + 1957/2/9 + 既婚 + B型 + 宮城県 + 04 + 016-379-8892 + 090-9651-4577 + ソフトバンク + + + 手塚 優 + てづか ゆう + teduka_yuu@example.com + Female + 33 + 1980/8/26 + 既婚 + AB型 + 奈良県 + 29 + 097-424-8186 + 090-9966-2054 + ソフトバンク + + + 井沢 さんま + いざわ さんま + izawa_sanma@example.com + Male + 52 + 1961/10/19 + 既婚 + O型 + 熊本県 + 43 + 0 6-402-4938 + 090-5187-8738 + ドコモ + + + 丸田 草太 + まるた そうた + maruta_souta@example.com + Male + 44 + 1969/7/3 + 既婚 + AB型 + 佐賀県 + 41 + 048-168-8037 + 080-2148-6537 + au + + + 渡辺 春樹 + わたなべ はるき + watanabe_haruki@example.com + Female + 50 + 1963/8/18 + 既婚 + O型 + 千葉県 + 12 + 077-690-5581 + 090-2882-8061 + ソフトバンク + + + 金山 さゆり + かなやま さゆり + kanayama_sayuri@example.com + Female + 30 + 1983/5/25 + 既婚 + O型 + 京都府 + 26 + 090-745- 115 + 090-5508-1921 + ドコモ + + + 福地 克実 + ふくち かつみ + fukuchi_katsumi@example.com + Male + 42 + 1971/2/19 + 既婚 + A型 + 静岡県 + 22 + 015-795-5065 + 090-7687-1891 + ドコモ + + + 山田 里奈 + やまだ りな + yamada_rina@example.com + Female + 73 + 1940/1/14 + 既婚 + AB型 + 埼玉県 + 11 + 050-556-5827 + 090-3042-3545 + au + + + 塩見 広之 + しおみ ひろゆき + shiomi_hiroyuki@example.com + Male + 31 + 1982/9/11 + 既婚 + O型 + 千葉県 + 12 + 073-136-4839 + 080-8675-7788 + ドコモ + + + 神戸 利夫 + こうべ としお + koube_toshio@example.com + Male + 70 + 1943/10/19 + 既婚 + AB型 + 秋田県 + 05 + 072-257-1602 + 090-4772- 406 + ソフトバンク + + + 仲田 美佐子 + なかた みさこ + nakata_misako@example.com + Female + 60 + 1953/5/8 + 既婚 + O型 + 京都府 + 26 + 096-406-5295 + 080-1113-9578 + ドコモ + + + 米沢 勇 + よねざわ ゆう + yonezawa_yuu@example.com + Female + 51 + 1961/11/26 + 既婚 + AB型 + 京都府 + 26 + 046-698-8170 + 090-3007-7399 + ソフトバンク + + + 荻野 真悠子 + おぎの まゆこ + ogino_mayuko@example.com + Female + 62 + 1950/12/13 + 既婚 + A型 + 大阪府 + 27 + 0 7-359-4182 + 080- 527-7351 + ソフトバンク + + + 熊谷 結子 + くまがや ゆうこ + kumagaya_yuuko@example.com + Female + 27 + 1985/12/21 + 既婚 + AB型 + 東京都 + 13 + 087-376-7223 + 080-2398-3126 + ドコモ + + + 三宅 丈雄 + みやけ たけお + miyake_takeo@example.com + Male + 33 + 1980/4/7 + 既婚 + A型 + 大分県 + 44 + 0 4-300-8716 + 090-7993-1024 + ドコモ + + + 永井 美菜 + ながい みな + nagai_mina@example.com + Female + 71 + 1942/10/15 + 既婚 + A型 + 東京都 + 13 + 069-572- 597 + 080-4090-2558 + ドコモ + + + 玉置 直人 + たまき なおと + tamaki_naoto@example.com + Male + 66 + 1947/9/3 + 既婚 + A型 + 大阪府 + 27 + 060-897-6193 + 080-6496-5950 + ソフトバンク + + + 井本 芽以 + いもと めい + imoto_mei@example.com + Female + 42 + 1971/10/11 + 既婚 + O型 + 京都府 + 26 + 059-508-2659 + 090-9980-2482 + ツーカー + + + 武内 しほり + たけうち しほり + takeuchi_shihori@example.com + Female + 76 + 1937/3/18 + 既婚 + O型 + 岐阜県 + 21 + 077-798-5269 + 090-5822-9657 + ドコモ + + + 田口 七世 + たぐち ななせ + taguchi_nanase@example.com + Female + 73 + 1940/4/16 + 既婚 + O型 + 埼玉県 + 11 + 053-244-9536 + 080-2127-6849 + ドコモ + + + 竹下 小百合 + たけした さゆり + takeshita_sayuri@example.com + Female + 52 + 1961/6/29 + 既婚 + A型 + 大阪府 + 27 + 070-484-2784 + 080-8755-3856 + ドコモ + + + 布川 あや子 + ふかわ あやこ + fukawa_ayako@example.com + Female + 78 + 1934/12/12 + 既婚 + A型 + 京都府 + 26 + 016-489- 865 + 080-5538-4791 + ドコモ + + + 立川 涼 + たちかわ りょう + tachikawa_ryou@example.com + Female + 68 + 1945/8/15 + 既婚 + A型 + 千葉県 + 12 + 015-487-3237 + 090-6687-6806 + ドコモ + + + 岡田 ひろみ + おかだ ひろみ + okada_hiromi@example.com + Female + 48 + 1965/1/4 + 既婚 + A型 + 神奈川県 + 14 + 057-799-5972 + 090-3638-5042 + au + + + 樋口 沙知絵 + ひぐち さちえ + higuchi_sachie@example.com + Female + 79 + 1934/8/14 + 既婚 + O型 + 静岡県 + 22 + 055-620-2109 + 080-7426-2532 + ドコモ + + + 西村 優 + にしむら ゆう + nishimura_yuu@example.com + Female + 78 + 1935/2/16 + 既婚 + A型 + 埼玉県 + 11 + 024-730-8707 + 090-1860-2057 + ドコモ + + + 原 真希 + はら まき + hara_maki@example.com + Female + 31 + 1982/2/20 + 既婚 + B型 + 岐阜県 + 21 + 092-589-5600 + 080-9641- 910 + ソフトバンク + + + 橋本 恵梨香 + はしもと えりか + hashimoto_erika@example.com + Female + 34 + 1979/1/19 + 既婚 + A型 + 神奈川県 + 14 + 094-741-4163 + 090-7656-2779 + ドコモ + + + 岩谷 明 + いわたに あきら + iwatani_akira@example.com + Male + 65 + 1948/10/22 + 既婚 + O型 + 福島県 + 07 + 072-786-6125 + 080-7611-1512 + ドコモ + + + 大谷 太朗 + おおたに たろう + ootani_tarou@example.com + Male + 24 + 1989/8/2 + 未婚 + B型 + 岩手県 + 03 + 014-737-3389 + 090-7217-5399 + au + + + 八木 雅彦 + やぎ まさひこ + yagi_masahiko@example.com + Male + 50 + 1963/10/23 + 既婚 + O型 + 東京都 + 13 + 0 -796-3772 + 080-5363-6703 + au + + + 小寺 那奈 + こでら なな + kodera_nana@example.com + Female + 30 + 1982/11/23 + 既婚 + A型 + 熊本県 + 43 + 042-360-1018 + 090-7529- 700 + ドコモ + + + 大石 薫 + おおいし かおる + ooishi_kaoru@example.com + Female + 44 + 1968/12/6 + 既婚 + B型 + 大阪府 + 27 + 095-924-3529 + 090-8899-5911 + ドコモ + + + 藤島 恵望子 + ふじしま えみこ + fujishima_emiko@example.com + Female + 47 + 1966/5/6 + 既婚 + A型 + 栃木県 + 09 + 063-889-8605 + 090-1114-3993 + au + + + 西沢 花緑 + にしざわ かろく + nishizawa_karoku@example.com + Male + 65 + 1948/9/23 + 既婚 + O型 + 長野県 + 20 + 095-198-1936 + 090- 953-8690 + ドコモ + + + 門田 一代 + かどた かずよ + kadota_kazuyo@example.com + Female + 28 + 1985/5/9 + 未婚 + B型 + 広島県 + 34 + 013-929-9941 + 080-1223-3868 + ツーカー + + + ほしの 将也 + ほしの まさや + hoshino_masaya@example.com + Male + 74 + 1939/7/10 + 既婚 + A型 + 群馬県 + 10 + 0 5-177-6325 + 080-2559-6686 + au + + + 花田 翔 + はなだ しょう + hanada_shou@example.com + Male + 59 + 1953/12/21 + 既婚 + A型 + 山梨県 + 19 + 087-516-9703 + 080-1176-6261 + ドコモ + + + 邑野 未來 + むらの みらい + murano_mirai@example.com + Female + 31 + 1982/4/28 + 既婚 + AB型 + 福岡県 + 40 + 051-874-5783 + 090-1716-8238 + ソフトバンク + + + 長島 昴 + ながしま すばる + nagashima_subaru@example.com + Male + 64 + 1949/9/15 + 既婚 + A型 + 青森県 + 02 + 068-404- 344 + 080-8329-5809 + ドコモ + + + 田辺 砂羽 + たなべ さわ + tanabe_sawa@example.com + Female + 77 + 1936/6/24 + 既婚 + O型 + 新潟県 + 15 + 025-490-1295 + 080-2107- 265 + au + + + 熊谷 勤 + くまがや つとむ + kumagaya_tsutomu@example.com + Male + 77 + 1936/4/25 + 既婚 + B型 + 福島県 + 07 + 066-541-6674 + 090- 402- 993 + ドコモ + + + 北川 恵梨香 + きたかわ えりか + kitakawa_erika@example.com + Female + 80 + 1933/1/22 + 既婚 + A型 + 愛媛県 + 38 + 0 8- 44-5820 + 080-5626-4887 + ドコモ + + + 安座間 光臣 + あざま みつおみ + azama_mitsuomi@example.com + Male + 76 + 1937/6/18 + 既婚 + O型 + 大阪府 + 27 + 046-700-4681 + 090- 496-6829 + ドコモ + + + 杉原 奈々 + すぎはら なな + sugihara_nana@example.com + Female + 60 + 1953/6/10 + 既婚 + A型 + 兵庫県 + 28 + 048-120-7087 + 080-9997-7992 + ドコモ + + + 上野 小百合 + うえの さゆり + ueno_sayuri@example.com + Female + 22 + 1991/8/1 + 既婚 + A型 + 静岡県 + 22 + 091-255- 844 + 080-2208- 300 + ソフトバンク + + + 谷村 佑 + たにむら たすく + tanimura_tasuku@example.com + Male + 21 + 1992/2/1 + 未婚 + A型 + 大阪府 + 27 + 087-491-8644 + 090-7814- 865 + ドコモ + + + 徳永 栄一 + とくなが えいいち + tokunaga_eiichi@example.com + Male + 77 + 1936/1/21 + 既婚 + B型 + 静岡県 + 22 + 012-870-5119 + 080-7977-4033 + ドコモ + + + 望月 幸子 + もちづき さちこ + mochiduki_sachiko@example.com + Female + 75 + 1938/9/16 + 既婚 + O型 + 東京都 + 13 + 0 4- 27-7143 + 080-4304-8393 + ドコモ + + + 小口 奈月 + おぐち なつき + oguchi_natsuki@example.com + Female + 23 + 1990/5/27 + 未婚 + O型 + 沖縄県 + 47 + 034-542-1816 + 090-1543-4392 + ソフトバンク + + + 今 ジローラモ + こん じろーらも + kon_girolamo@example.com + Male + 30 + 1983/7/21 + 既婚 + AB型 + 大分県 + 44 + 065-690-9018 + 090-6955-6749 + ソフトバンク + + + 渡辺 勇介 + わたなべ ゆうすけ + watanabe_yuusuke@example.com + Male + 31 + 1982/7/7 + 既婚 + O型 + 兵庫県 + 28 + 075-349-3194 + 080-5742-3596 + ドコモ + + + 島本 菊生 + しまもと きくお + shimamoto_kikuo@example.com + Male + 43 + 1970/8/23 + 既婚 + O型 + 新潟県 + 15 + 097- 79-1134 + 080-9821-4419 + au + + + パンツェッタ 莉央 + ぱんつぇった りお + panzetta_rio@example.com + Female + 28 + 1985/9/10 + 未婚 + O型 + 神奈川県 + 14 + 0 6-948-2568 + 080-6476-8630 + au + + + 木村 恭子 + きむら きょうこ + kimura_kyouko@example.com + Female + 69 + 1944/8/4 + 既婚 + B型 + 宮崎県 + 45 + 030-194- 722 + 090-1790-3721 + au + + + 本間 佑 + ほんま たすく + honnma_tasuku@example.com + Male + 25 + 1988/4/29 + 既婚 + O型 + 千葉県 + 12 + 063-301-6521 + 080-6463-1676 + au + + + 小林 さんま + こばやし さんま + kobayashi_sanma@example.com + Male + 21 + 1992/10/17 + 未婚 + A型 + 愛知県 + 23 + 025- 41-7496 + 080-4034-2537 + au + + + 大竹 幸平 + おおたけ こうへい + ootake_kouhei@example.com + Male + 44 + 1969/8/5 + 未婚 + O型 + 福岡県 + 40 + 037-171-3405 + 080-5803-5266 + ドコモ + + + 重松 和久 + しげまつ かずひさ + shigematsu_kazuhisa@example.com + Male + 22 + 1991/2/5 + 既婚 + B型 + 東京都 + 13 + 028-457-7767 + 080-5223-9468 + ドコモ + + + 内海 俊介 + うちみ しゅんすけ + uchimi_shunsuke@example.com + Male + 34 + 1979/4/30 + 既婚 + A型 + 新潟県 + 15 + 086-184-5314 + 080-6643-7768 + au + + + 小松 美紀 + こまつ みき + komatsu_miki@example.com + Female + 24 + 1989/1/8 + 既婚 + A型 + 山梨県 + 19 + 072-127-5923 + 080-8626-3481 + ドコモ + + + 満島 恵子 + みつしま けいこ + mitsushima_keiko@example.com + Female + 50 + 1962/12/23 + 既婚 + A型 + 宮城県 + 04 + 086-419-6478 + 090-4169-7634 + ドコモ + + + 金子 涼子 + かねこ りょうこ + kaneko_ryouko@example.com + Female + 36 + 1977/2/6 + 既婚 + O型 + 熊本県 + 43 + 047- 45-7633 + 090- 309-5847 + au + + + 佐々木 将也 + ささき まさや + sasaki_masaya@example.com + Male + 59 + 1953/12/18 + 既婚 + O型 + 福岡県 + 40 + 054-688-8955 + 090-4306-6501 + ソフトバンク + + + 影山 友以乃 + かげやま ゆいの + kageyama_yuino@example.com + Female + 35 + 1978/5/28 + 既婚 + A型 + 埼玉県 + 11 + 0 9-761-6741 + 080-6078-4218 + ドコモ + + + 満島 豊 + みつしま ゆたか + mitsushima_yutaka@example.com + Male + 34 + 1979/9/28 + 未婚 + O型 + 愛知県 + 23 + 026-953-7229 + 080-8907- 879 + ドコモ + + + 瀬川 しほり + せがわ しほり + segawa_shihori@example.com + Female + 39 + 1974/4/25 + 既婚 + O型 + 福岡県 + 40 + 033- 42- 871 + 090-8985-4484 + au + + + 松島 亮 + まつしま りょう + matsushima_ryou@example.com + Male + 26 + 1987/1/28 + 既婚 + B型 + 大阪府 + 27 + 063-732-4665 + 090-8521- 751 + ドコモ + + + 伊藤 知史 + いとう ともふみ + itou_tomofumi@example.com + Male + 26 + 1987/10/22 + 未婚 + O型 + 茨城県 + 08 + 0 9-958-8697 + 080- 704-4622 + ソフトバンク + + + 上野 まひる + うえの まひる + ueno_mahiru@example.com + Female + 68 + 1945/6/12 + 既婚 + O型 + 新潟県 + 15 + 042-238-3878 + 080-9258-5960 + au + + + 木田 めぐみ + きだ めぐみ + kida_megumi@example.com + Female + 63 + 1950/10/10 + 既婚 + AB型 + 和歌山県 + 30 + 0 9-123-3161 + 080-1423-4243 + au + + + 吉永 洋介 + よしなが ようすけ + yoshinaga_yousuke@example.com + Male + 71 + 1941/11/29 + 既婚 + A型 + 山口県 + 35 + 055-253-9593 + 080- 556-9629 + ドコモ + + + 米倉 なぎさ + よねくら なぎさ + yonekura_nagisa@example.com + Female + 49 + 1964/5/23 + 既婚 + A型 + 神奈川県 + 14 + 063-122-4389 + 090-6979-8722 + ドコモ + + + 溝口 マサカズ + みぞぐち まさかず + mizoguchi_masakazu@example.com + Male + 58 + 1955/7/27 + 既婚 + O型 + 東京都 + 13 + 060-234-1056 + 090-2943-8605 + au + + + 諏訪 明日 + すわ めいび + suwa_meibi@example.com + Female + 80 + 1932/12/19 + 既婚 + O型 + 福岡県 + 40 + 022- 48-6301 + 090-4150-1572 + au + + + 広瀬 真奈美 + ひろせ まなみ + hirose_manami@example.com + Female + 65 + 1948/5/4 + 既婚 + O型 + 埼玉県 + 11 + 071-164-7027 + 080-4734- 142 + ドコモ + + + 入江 窈 + いりえ よう + irie_you@example.com + Female + 64 + 1949/5/7 + 既婚 + AB型 + 新潟県 + 15 + 075-732-3833 + 080- 989-1327 + au + + + 篠山 憲史 + しのやま のりひと + shinoyama_norihito@example.com + Male + 27 + 1985/11/26 + 既婚 + AB型 + 熊本県 + 43 + 026-571-5022 + 090-1429- 938 + ドコモ + + + 米山 美里 + よねやま みり + yoneyama_miri@example.com + Female + 35 + 1978/7/21 + 既婚 + A型 + 静岡県 + 22 + 099- 58-8547 + 090-5581-1072 + ソフトバンク + + + 福地 光良 + ふくち てるよし + fukuchi_teruyoshi@example.com + Male + 34 + 1979/7/22 + 未婚 + B型 + 宮城県 + 04 + 072-132-2213 + 090-1760-6316 + ソフトバンク + + + 佐竹 愛 + さたけ あい + satake_ai@example.com + Female + 47 + 1966/3/17 + 既婚 + O型 + 大阪府 + 27 + 0 -779-9137 + 080-4482-4158 + au + + + 川中 翔子 + かわなか しょうこ + kawanaka_shouko@example.com + Female + 73 + 1940/3/30 + 既婚 + O型 + 富山県 + 16 + 085-671- 478 + 090-9952-5103 + ドコモ + + + 小野寺 朝陽 + おのでら あさひ + onodera_asahi@example.com + Female + 61 + 1952/6/11 + 既婚 + B型 + 埼玉県 + 11 + 081-353-5169 + 090-1831-1064 + ドコモ + + + 本上 翔子 + ほんじょう しょうこ + honjo_shouko@example.com + Female + 58 + 1955/4/20 + 既婚 + A型 + 愛知県 + 23 + 079-528-3447 + 090-4254-5904 + ドコモ + + + 西口 宏行 + にしぐち ひろゆき + nishiguchi_hiroyuki@example.com + Male + 54 + 1959/2/5 + 既婚 + O型 + 愛知県 + 23 + 027-370-3322 + 080-4562-8280 + ドコモ + + + 馬場 さとみ + ばば さとみ + baba_satomi@example.com + Female + 42 + 1971/3/26 + 既婚 + A型 + 千葉県 + 12 + 082-339-8519 + 080-2780-7538 + au + + + 小谷 聖陽 + こたに まさあき + kotani_masaaki@example.com + Male + 31 + 1981/12/21 + 既婚 + AB型 + 神奈川県 + 14 + 075-674- 520 + 090-6683-4455 + ドコモ + + + 黒岩 はるみ + くろいわ はるみ + kuroiwa_harumi@example.com + Female + 28 + 1985/3/30 + 既婚 + A型 + 大阪府 + 27 + 086- 95-6922 + 090- 671-3637 + ソフトバンク + + + 恩田 照生 + おんだ てるお + onnda_teruo@example.com + Male + 64 + 1949/6/14 + 既婚 + O型 + 愛媛県 + 38 + 090-594-2457 + 080-5097-9035 + ドコモ + + + 水崎 エリカ + みさき えりか + misaki_erika@example.com + Female + 24 + 1989/5/31 + 既婚 + O型 + 神奈川県 + 14 + 012-258-1345 + 090-6884-2528 + ドコモ + + + 矢作 隼士 + やはぎ しゅんじ + yahagi_shunji@example.com + Male + 35 + 1978/7/31 + 既婚 + B型 + 東京都 + 13 + 031- 80-9542 + 080-1741-3049 + ドコモ + + + 永山 明慶 + ながやま あきよし + nagayama_akiyoshi@example.com + Male + 79 + 1934/6/19 + 既婚 + B型 + 長崎県 + 42 + 0 1-950-6665 + 080- 419-3847 + ドコモ + + + 千葉 陽子 + ちば ようこ + chiba_youko@example.com + Female + 61 + 1952/2/29 + 既婚 + A型 + 福島県 + 07 + 085-977-5016 + 080-1173-7511 + ドコモ + + + 山上 敏和 + やまがみ としかず + yamagami_toshikazu@example.com + Male + 22 + 1991/5/23 + 未婚 + B型 + 東京都 + 13 + 028-113-7477 + 090-6581-9956 + ドコモ + + + 近藤 信輔 + こんどう しんすけ + kondou_shinsuke@example.com + Male + 59 + 1954/5/6 + 既婚 + A型 + 鳥取県 + 31 + 086-809-1518 + 080-5105-7621 + au + + + 梅沢 俊介 + うめざわ しゅんすけ + umezawa_shunsuke@example.com + Male + 41 + 1972/3/2 + 未婚 + O型 + 東京都 + 13 + 034-635-3122 + 090-6564-1314 + au + + + 黒木 雅之 + くろき まさゆき + kuroki_masayuki@example.com + Male + 25 + 1988/1/16 + 未婚 + A型 + 岐阜県 + 21 + 022- 60-4838 + 090-3386-5954 + au + + + 斉藤 真一 + さいとう しんいち + saitou_shinichi@example.com + Male + 28 + 1985/1/29 + 未婚 + A型 + 三重県 + 24 + 027-271-5540 + 090-8620-6031 + au + + + 高山 長利 + たかやま ながとし + takayama_nagatoshi@example.com + Male + 42 + 1971/3/8 + 既婚 + O型 + 北海道 + 01 + 018-385-1653 + 080-4709-3031 + ドコモ + + + 畠山 あき + はたやま あき + hatayama_aki@example.com + Female + 28 + 1985/6/21 + 既婚 + B型 + 兵庫県 + 28 + 095-131- 53 + 090-8494- 802 + ドコモ + + + 今村 まひる + いまむら まひる + imamura_mahiru@example.com + Female + 62 + 1951/3/22 + 既婚 + A型 + 栃木県 + 09 + 074-201-2999 + 090- 585-9733 + au + + + 田辺 美紀 + たなべ みき + tanabe_miki@example.com + Female + 27 + 1986/7/11 + 既婚 + A型 + 東京都 + 13 + 026-976- 453 + 090-7255-6354 + ドコモ + + + 永島 佳乃 + ながしま よしの + nagashima_yoshino@example.com + Female + 21 + 1992/5/19 + 未婚 + O型 + 東京都 + 13 + 059-641-7095 + 080- 630-8702 + ドコモ + + + 広瀬 光洋 + ひろせ みつひろ + hirose_mitsuhiro@example.com + Male + 56 + 1957/4/18 + 既婚 + A型 + 大阪府 + 27 + 078-124-1088 + 090-1746-5976 + ソフトバンク + + + 石山 春樹 + いしやま はるき + ishiyama_haruki@example.com + Female + 63 + 1949/10/28 + 既婚 + AB型 + 愛知県 + 23 + 061-524-9264 + 080-4319-2412 + ソフトバンク + + + 水野 俊二 + みずの しゅんじ + mizuno_shunji@example.com + Male + 57 + 1956/4/15 + 既婚 + O型 + 鹿児島県 + 46 + 060-699-1927 + 080-4988-7735 + ドコモ + + + 柳川 友也 + やながわ ともや + yanagawa_tomoya@example.com + Male + 63 + 1950/2/27 + 既婚 + A型 + 愛知県 + 23 + 052-517-6564 + 080-5576-8416 + au + + + 柏原 みき + かしわら みき + kashiwara_miki@example.com + Female + 20 + 1993/2/6 + 未婚 + O型 + 大阪府 + 27 + 019-205-6128 + 090-6014-1733 + ソフトバンク + + + 及川 沙耶 + おいかわ さや + oikawa_saya@example.com + Female + 57 + 1956/8/13 + 既婚 + O型 + 京都府 + 26 + 086-372- 124 + 080-5272-4057 + au + + + 八田 涼子 + やつだ りょうこ + yatsuda_ryouko@example.com + Female + 57 + 1956/7/26 + 既婚 + A型 + 埼玉県 + 11 + 064-279-6463 + 080-9832-1183 + ツーカー + + + 新村 豊 + にいむら ゆたか + niimura_yutaka@example.com + Male + 20 + 1993/7/14 + 未婚 + A型 + 兵庫県 + 28 + 047-284-5494 + 080-5114-8136 + au + + + 芦屋 幸平 + あしや こうへい + ashiya_kouhei@example.com + Male + 77 + 1936/7/27 + 既婚 + O型 + 静岡県 + 22 + 097-147-7644 + 080-1283-9252 + au + + + 大森 隆 + おおもり たかし + oomori_takashi@example.com + Male + 78 + 1935/3/5 + 既婚 + B型 + 宮城県 + 04 + 080- 42-8917 + 090-6288-2741 + au + + + 仲村 克実 + なかむら かつみ + nakamura_katsumi@example.com + Male + 47 + 1966/7/20 + 既婚 + B型 + 福岡県 + 40 + 040-168-4050 + 090-9135-1689 + au + + + 岡島 啓介 + おかじま けいすけ + okajima_keisuke@example.com + Male + 46 + 1967/6/25 + 既婚 + B型 + 山梨県 + 19 + 016-563-8253 + 080-6376-7222 + ドコモ + + + 木原 俊二 + きはら しゅんじ + kihara_shunji@example.com + Male + 55 + 1958/9/22 + 既婚 + A型 + 千葉県 + 12 + 068-396-6656 + 080- 909-5774 + ドコモ + + + 青野 ひとり + あおの ひとり + aono_hitori@example.com + Male + 60 + 1953/8/28 + 既婚 + A型 + 神奈川県 + 14 + 081-301-4372 + 080-1208- 893 + ドコモ + + + 五味 亮 + ごみ りょう + gomi_ryou@example.com + Male + 76 + 1937/9/24 + 既婚 + A型 + 群馬県 + 10 + 017-753-4172 + 090-3381-6805 + ドコモ + + + 島崎 ヒロ + しまざき ひろ + shimazaki_hiro@example.com + Male + 73 + 1940/5/6 + 既婚 + A型 + 大阪府 + 27 + 011-105-2732 + 090-2604-2538 + ドコモ + + + 泉 夏空 + いずみ そら + izumi_sora@example.com + Female + 34 + 1979/6/10 + 既婚 + B型 + 秋田県 + 05 + 065-653-3831 + 090-5097-6047 + ドコモ + + + 永井 一代 + ながい かずよ + nagai_kazuyo@example.com + Female + 27 + 1986/3/23 + 既婚 + A型 + 岡山県 + 33 + 031- 25-9402 + 090-7015-7975 + ドコモ + + + 細山 景子 + ほそやま けいこ + hosoyama_keiko@example.com + Female + 55 + 1957/11/10 + 既婚 + O型 + 東京都 + 13 + 098-217- 678 + 080-8207-2096 + ドコモ + + + ほしの 早紀 + ほしの さき + hoshino_saki@example.com + Female + 59 + 1953/10/31 + 既婚 + O型 + 静岡県 + 22 + 041-908- 502 + 080-9296-9611 + ドコモ + + + 伊丹 淳 + いたみ あつし + itami_atsushi@example.com + Male + 22 + 1990/12/7 + 未婚 + A型 + 長野県 + 20 + 075-827-8601 + 090-8128-5901 + ソフトバンク + + + 西浦 一代 + にしうら かずよ + nishiura_kazuyo@example.com + Female + 47 + 1966/10/5 + 既婚 + O型 + 福岡県 + 40 + 0 3-599-8231 + 090-5099-9215 + au + + + 植木 光良 + うえき てるよし + ueki_teruyoshi@example.com + Male + 43 + 1970/9/21 + 未婚 + B型 + 神奈川県 + 14 + 047-811-5948 + 080-6366-6897 + ドコモ + + + 山口 太朗 + やまぐち たろう + yamaguchi_tarou@example.com + Male + 73 + 1940/7/4 + 既婚 + O型 + 大阪府 + 27 + 058-102-3440 + 080-8411-2979 + au + + + 足立 大樹 + あだち ひろき + adachi_hiroki@example.com + Male + 27 + 1986/4/9 + 未婚 + B型 + 島根県 + 32 + 059-163-6966 + 090-3383-1273 + ドコモ + + + 徳田 寛 + とくた ひろし + tokuta_hiroshi@example.com + Male + 20 + 1993/9/17 + 未婚 + O型 + 長崎県 + 42 + 057-731- 70 + 090-7696-2851 + au + + + 布川 直人 + ふかわ なおと + fukawa_naoto@example.com + Male + 20 + 1993/8/8 + 未婚 + A型 + 栃木県 + 09 + 066-941-4382 + 080-3075-3346 + ドコモ + + + 五味 希 + ごみ のぞみ + gomi_nozomi@example.com + Female + 28 + 1985/5/14 + 既婚 + O型 + 奈良県 + 29 + 062-843-8774 + 080-9422-4313 + ドコモ + + + 榊原 サダヲ + さかきばら さだお + sakakibara_sadawo@example.com + Male + 21 + 1992/1/31 + 未婚 + B型 + 神奈川県 + 14 + 0 4-399-9540 + 090-5867-5578 + au + + + 小田島 朝陽 + おだじま あさひ + odajima_asahi@example.com + Female + 25 + 1988/1/18 + 既婚 + O型 + 千葉県 + 12 + 029-340-3779 + 080-7483- 354 + ソフトバンク + + + 黄川田 ケンイチ + きかわだ けんいち + kikawada_kenichi@example.com + Male + 28 + 1984/10/27 + 既婚 + O型 + 大阪府 + 27 + 097- 61-7693 + 080-2515-8301 + au + + + 松川 恵美 + まつかわ めぐみ + matsukawa_megumi@example.com + Female + 68 + 1945/5/9 + 既婚 + A型 + 静岡県 + 22 + 088-773-2945 + 090-8370-1861 + ドコモ + + + 畠山 ケンイチ + はたやま けんいち + hatayama_kenichi@example.com + Male + 21 + 1991/12/24 + 既婚 + A型 + 秋田県 + 05 + 055-998-6227 + 090-7785-1189 + ドコモ + + + 野沢 隆太 + のざわ りゅうた + nozawa_ryuuta@example.com + Male + 53 + 1960/3/8 + 既婚 + O型 + 広島県 + 34 + 026-956-4234 + 080-2234-1284 + ツーカー + + + 川合 結衣 + かわい ゆい + kawai_yui@example.com + Female + 24 + 1989/2/7 + 未婚 + AB型 + 山口県 + 35 + 041-528-7217 + 090-1838-5025 + au + + + 海老原 賢二 + えびはら けんじ + ebihara_kenji@example.com + Male + 57 + 1955/11/24 + 既婚 + A型 + 長崎県 + 42 + 059-853-7487 + 090-8721-5562 + ドコモ + + + 角谷 有海 + かどたに あみ + kadotani_ami@example.com + Female + 38 + 1975/1/21 + 未婚 + A型 + 兵庫県 + 28 + 078-763-2743 + 080-7612-5312 + au + + + 浅利 美咲 + あさり みさき + asari_misaki@example.com + Female + 71 + 1942/4/5 + 既婚 + O型 + 東京都 + 13 + 091-847-5582 + 080-5625-6253 + au + + + 村松 直人 + むらまつ なおと + muramatsu_naoto@example.com + Male + 57 + 1956/1/3 + 既婚 + A型 + 東京都 + 13 + 067-167-5317 + 080-3618-5623 + ドコモ + + + 堀田 美幸 + ほった みゆき + hotta_miyuki@example.com + Female + 51 + 1962/4/7 + 既婚 + A型 + 愛媛県 + 38 + 060-278-9819 + 080-5219-6020 + ソフトバンク + + + 市田 一代 + いちだ かずよ + ichida_kazuyo@example.com + Female + 65 + 1948/9/1 + 既婚 + B型 + 大分県 + 44 + 084-287-9823 + 090-1969-9296 + ドコモ + + + 吉川 郁恵 + きっかわ いくえ + kikkawa_ikue@example.com + Female + 36 + 1977/7/3 + 既婚 + O型 + 山口県 + 35 + 057- 86-4187 + 080-8423-3445 + au + + + 布施 マサカズ + ふせ まさかず + fuse_masakazu@example.com + Male + 51 + 1962/4/6 + 既婚 + O型 + 東京都 + 13 + 041- 88-1076 + 090-1990-8168 + ソフトバンク + + + 毛利 知世 + もうり ちせ + mouri_chise@example.com + Female + 64 + 1949/6/8 + 既婚 + A型 + 北海道 + 01 + 011-910-8829 + 080-5122-1981 + au + + + 松山 瞬 + まつやま しゅん + matsuyama_shun@example.com + Male + 78 + 1935/5/11 + 既婚 + A型 + 北海道 + 01 + 038-143-5879 + 080-5959-2551 + ソフトバンク + + + 小笠原 陽子 + おがさわら ようこ + ogasawara_youko@example.com + Female + 69 + 1944/7/24 + 既婚 + A型 + 東京都 + 13 + 014-236-8884 + 080-8070- 450 + ドコモ + + + 合田 明 + あいだ あきら + aida_akira@example.com + Male + 30 + 1983/1/11 + 既婚 + O型 + 愛知県 + 23 + 021- 35-8317 + 090- 650-3935 + ツーカー + + + 八十田 慶太 + やそだ けいた + yasoda_keita@example.com + Male + 53 + 1960/8/26 + 既婚 + A型 + 東京都 + 13 + 032-191- 276 + 080- 607-4338 + ドコモ + + + 島村 博明 + しまむら ひろあき + shimamura_hiroaki@example.com + Male + 38 + 1975/9/6 + 既婚 + B型 + 福井県 + 18 + 066-401-2902 + 080-6082-6452 + ソフトバンク + + + 稲田 京子 + いなだ きょうこ + inada_kyouko@example.com + Female + 52 + 1961/10/21 + 既婚 + B型 + 新潟県 + 15 + 071-894-4032 + 090-6314-9091 + ドコモ + + + 氏家 広司 + うじいえ こうじ + ujiie_kouji@example.com + Male + 25 + 1988/10/11 + 未婚 + B型 + 京都府 + 26 + 070-352-3507 + 090-8494- 567 + au + + + 高崎 真吾 + たかさき しんご + takasaki_shingo@example.com + Male + 48 + 1965/2/19 + 未婚 + B型 + 茨城県 + 08 + 020-630-4355 + 080-3885-6834 + ドコモ + + + 高見 フミヤ + たかみ ふみや + takami_fumiya@example.com + Male + 74 + 1939/3/5 + 既婚 + B型 + 山口県 + 35 + 049- 92-8240 + 080-8668-9827 + au + + + 野際 真悠子 + のぎわ まゆこ + nogiwa_mayuko@example.com + Female + 69 + 1944/9/12 + 既婚 + AB型 + 群馬県 + 10 + 036-257-1850 + 090-4081-5197 + ソフトバンク + + + 安斎 さゆり + あんざい さゆり + annzai_sayuri@example.com + Female + 67 + 1946/8/30 + 既婚 + O型 + 京都府 + 26 + 0 1- 97- 248 + 080-6865-9443 + au + + + 小町 真帆 + こまち まほ + komachi_maho@example.com + Female + 48 + 1965/1/13 + 既婚 + AB型 + 群馬県 + 10 + 014-956-6398 + 090-8811-5965 + ドコモ + + + 柴田 将也 + しばた まさや + shibata_masaya@example.com + Male + 68 + 1944/12/30 + 既婚 + B型 + 千葉県 + 12 + 089-463-8657 + 080- 152- 570 + ドコモ + + + 五十嵐 ひかり + いがらし ひかり + igarashi_hikari@example.com + Female + 45 + 1968/2/17 + 既婚 + O型 + 山口県 + 35 + 027-252-1345 + 080-5854-2943 + ドコモ + + + 小野寺 光 + おのでら ひかる + onodera_hikaru@example.com + Female + 61 + 1952/7/20 + 未婚 + O型 + 愛知県 + 23 + 061-375-7696 + 090-9554-8918 + ドコモ + + + 鹿島 美和子 + かしま みわこ + kashima_miwako@example.com + Female + 48 + 1965/8/12 + 既婚 + A型 + 山梨県 + 19 + 077-441-9177 + 080-2690-9219 + ドコモ + + + 相原 敦 + あいはら あつし + aihara_atsushi@example.com + Male + 65 + 1947/11/25 + 既婚 + A型 + 神奈川県 + 14 + 012-157-9533 + 080-6524-8439 + ドコモ + + + 今村 めぐみ + いまむら めぐみ + imamura_megumi@example.com + Female + 61 + 1952/5/9 + 既婚 + O型 + 東京都 + 13 + 099-799-7878 + 090-6049-7879 + ドコモ + + + 相田 健 + あいだ けん + aida_ken@example.com + Male + 57 + 1956/9/17 + 既婚 + A型 + 京都府 + 26 + 086- 34-4858 + 090-5836-5920 + ドコモ + + + 柳家 さやか + やなぎや さやか + yanagiya_sayaka@example.com + Female + 28 + 1985/3/26 + 既婚 + A型 + 青森県 + 02 + 038-102-9187 + 090-1734- 239 + au + + + 前島 隆 + まえじま たかし + maejima_takashi@example.com + Male + 59 + 1954/5/11 + 未婚 + A型 + 沖縄県 + 47 + 056-659- 533 + 080-1731-2858 + ドコモ + + + 田沢 朝香 + たざわ あさか + tazawa_asaka@example.com + Female + 36 + 1977/9/29 + 既婚 + O型 + 栃木県 + 09 + 088- 64-7647 + 080-1190-8810 + au + + + 神保 勝久 + じんぼ かつひさ + jinbo_katsuhisa@example.com + Male + 43 + 1970/3/28 + 未婚 + B型 + 秋田県 + 05 + 024-270-7872 + 080-8582-3974 + au + + + 福士 涼 + ふくし りょう + fukushi_ryou@example.com + Female + 65 + 1948/10/2 + 既婚 + A型 + 熊本県 + 43 + 026-817- 557 + 090-7120-8125 + ドコモ + + + 須田 勝久 + すだ かつひさ + suda_katsuhisa@example.com + Male + 49 + 1963/11/30 + 既婚 + A型 + 埼玉県 + 11 + 035-947-8607 + 090-6446-8289 + au + + + 小椋 夏希 + おぐら なつき + ogura_natsuki@example.com + Female + 29 + 1984/3/24 + 既婚 + AB型 + 埼玉県 + 11 + 022-221-7152 + 080-1140-4346 + ソフトバンク + + + 桑田 鉄二 + くわた てつじ + kuwata_tetsuji@example.com + Male + 62 + 1951/1/18 + 既婚 + B型 + 神奈川県 + 14 + 071-706-5343 + 090-4021-6091 + ドコモ + + + 田代 奈月 + たしろ なつき + tashiro_natsuki@example.com + Female + 38 + 1975/8/25 + 既婚 + A型 + 岡山県 + 33 + 037-516-4939 + 090-4151-1625 + ソフトバンク + + + 小野 千佳子 + おの ちかこ + ono_chikako@example.com + Female + 62 + 1951/1/29 + 既婚 + B型 + 北海道 + 01 + 093-250-1160 + 090-3003-5123 + ソフトバンク + + + 春日 里奈 + かすが りな + kasuga_rina@example.com + Female + 26 + 1986/12/31 + 未婚 + B型 + 京都府 + 26 + 0 3-431-7554 + 080-2725-9704 + au + + + 竹田 三省 + たけだ さんせい + takeda_sansei@example.com + Male + 69 + 1944/8/29 + 既婚 + A型 + 兵庫県 + 28 + 036-207-8713 + 080-9810-1751 + au + + + 一青 仁 + ひとと じん + hitoto_jin@example.com + Male + 65 + 1948/4/23 + 既婚 + O型 + 神奈川県 + 14 + 085-377-8176 + 090-9332-5838 + ドコモ + + + 貫地谷 奈月 + かんじや なつき + kanjiya_natsuki@example.com + Female + 46 + 1967/4/27 + 既婚 + A型 + 茨城県 + 08 + 073-193-2965 + 080-1780-8766 + ドコモ + + + 山口 秀樹 + やまぐち ひでき + yamaguchi_hideki@example.com + Male + 64 + 1949/5/1 + 既婚 + O型 + 香川県 + 37 + 070-450-5739 + 090- 216-5953 + ドコモ + + + 神戸 昌代 + こうべ まさよ + koube_masayo@example.com + Female + 39 + 1974/8/26 + 既婚 + A型 + 奈良県 + 29 + 043-370-2548 + 090-1201-1952 + ドコモ + + + 古田 一代 + ふるた かずよ + furuta_kazuyo@example.com + Female + 36 + 1977/4/19 + 既婚 + O型 + 岐阜県 + 21 + 034-467-9308 + 080-3567-2352 + ドコモ + + + 山根 美佳 + やまね みか + yamane_mika@example.com + Female + 29 + 1984/9/16 + 既婚 + A型 + 富山県 + 16 + 056-460-3426 + 090-2213-6114 + ドコモ + + + 宇田川 真悠子 + うだがわ まゆこ + udagawa_mayuko@example.com + Female + 80 + 1932/12/24 + 既婚 + A型 + 東京都 + 13 + 076-178-7308 + 080- 176-1406 + ドコモ + + + 清田 エリカ + きよた えりか + kiyota_erika@example.com + Female + 38 + 1975/6/9 + 既婚 + AB型 + 群馬県 + 10 + 083-521-9259 + 090-6056-9099 + ドコモ + + + 福岡 隼士 + ふくおか しゅんじ + fukuoka_shunji@example.com + Male + 72 + 1940/12/5 + 既婚 + B型 + 山梨県 + 19 + 092- 20-2186 + 090-9785-3889 + au + + + 朝倉 敏和 + あさくら としかず + asakura_toshikazu@example.com + Male + 30 + 1983/7/28 + 未婚 + B型 + 岡山県 + 33 + 038- 88-9653 + 080-4968- 769 + au + + + 平野 法嗣 + ひらの ほうし + hirano_houshi@example.com + Male + 39 + 1974/5/18 + 既婚 + A型 + 東京都 + 13 + 092-549-5556 + 080-7123- 907 + ドコモ + + + 富田 璃子 + とみた りこ + tomita_riko@example.com + Female + 42 + 1970/11/27 + 既婚 + AB型 + 埼玉県 + 11 + 042-345-5991 + 080-3040-6268 + ドコモ + + + 沢村 恵子 + さわむら けいこ + sawamura_keiko@example.com + Female + 30 + 1983/6/8 + 未婚 + A型 + 新潟県 + 15 + 018-718-7823 + 080- 314-2009 + ドコモ + + + 哀川 麻由子 + あいかわ まゆこ + aikawa_mayuko@example.com + Female + 38 + 1975/5/26 + 既婚 + A型 + 大阪府 + 27 + 061-785-1204 + 090-3564-4364 + ドコモ + + + 小菅 瞳 + こすげ ひとみ + kosuge_hitomi@example.com + Female + 33 + 1980/10/5 + 既婚 + O型 + 宮崎県 + 45 + 097-471-5146 + 080- 498-6932 + au + + + 笠井 貴美子 + かさい きみこ + kasai_kimiko@example.com + Female + 40 + 1973/5/16 + 既婚 + O型 + 石川県 + 17 + 041-669-8488 + 080- 496-5655 + ドコモ + + + 岩淵 莉沙 + いわぶち りさ + iwabuchi_risa@example.com + Female + 47 + 1966/8/3 + 既婚 + A型 + 神奈川県 + 14 + 078-421-7508 + 090-9940-3657 + au + + + 山西 正敏 + やまにし まさとし + yamanishi_masatoshi@example.com + Male + 30 + 1983/9/1 + 未婚 + B型 + 京都府 + 26 + 012-457-4965 + 090-5628-6109 + au + + + 高岡 正義 + たかおか まさよし + takaoka_masayoshi@example.com + Male + 68 + 1944/11/2 + 既婚 + A型 + 山梨県 + 19 + 093-132-9552 + 090- 51-9073 + ドコモ + + + 森下 佑 + もりした たすく + morishita_tasuku@example.com + Male + 31 + 1982/6/11 + 既婚 + B型 + 東京都 + 13 + 0 6-274-9343 + 080-8217-9199 + ドコモ + + + 川崎 龍吉 + かわさき りゅうきち + kawasaki_ryuukichi@example.com + Male + 76 + 1937/7/5 + 既婚 + O型 + 愛知県 + 23 + 035-950-4336 + 090- 794-7119 + ドコモ + + + 吉永 亮 + よしなが りょう + yoshinaga_ryou@example.com + Male + 23 + 1989/12/11 + 未婚 + B型 + 埼玉県 + 11 + 041-699-1435 + 080-8738- 276 + ドコモ + + + 杉本 浩介 + すぎもと こうすけ + sugimoto_kousuke@example.com + Male + 69 + 1944/3/27 + 既婚 + A型 + 東京都 + 13 + 050-342-8691 + 090-3549-8917 + au + + + 梅原 丈雄 + うめはら たけお + umehara_takeo@example.com + Male + 69 + 1944/5/12 + 既婚 + A型 + 神奈川県 + 14 + 090- 32-1092 + 080-9712-6404 + ドコモ + + + 児玉 美菜 + こだま みな + kodama_mina@example.com + Female + 36 + 1977/1/6 + 既婚 + A型 + 宮崎県 + 45 + 094- 22-8569 + 080-2768-4858 + au + + + 皆川 雅彦 + みなかわ まさひこ + minakawa_masahiko@example.com + Male + 70 + 1942/11/23 + 既婚 + A型 + 東京都 + 13 + 092-224-4493 + 090-9721-7597 + au + + + 竹中 夏空 + たけなか そら + takenaka_sora@example.com + Female + 46 + 1967/4/11 + 既婚 + B型 + 大阪府 + 27 + 026-726-3335 + 080-8651-2585 + ソフトバンク + + + 佐々木 沙耶 + ささき さや + sasaki_saya@example.com + Female + 47 + 1966/7/28 + 既婚 + A型 + 北海道 + 01 + 073-954-9414 + 090-7831-9090 + ドコモ + + + 松元 千夏 + まつもと ちなつ + matsumoto_chinatsu@example.com + Female + 80 + 1933/6/24 + 既婚 + A型 + 東京都 + 13 + 022-767- 176 + 080-9896-4662 + ドコモ + + + 相武 優 + あいぶ ゆう + aibu_yuu@example.com + Female + 72 + 1940/12/17 + 既婚 + A型 + 千葉県 + 12 + 0 1-330-5695 + 080-1869-1569 + au + + + 平田 めぐみ + ひらた めぐみ + hirata_megumi@example.com + Female + 62 + 1951/7/16 + 既婚 + A型 + 東京都 + 13 + 021-455-8167 + 080-5854-6251 + ドコモ + + + 森島 基祐 + もりしま きすけ + morishima_kisuke@example.com + Male + 38 + 1975/1/20 + 既婚 + A型 + 神奈川県 + 14 + 064-189-7945 + 090-3008-9595 + ドコモ + + + 吉井 寿明 + よしい としあき + yoshii_toshiaki@example.com + Male + 34 + 1979/1/20 + 既婚 + A型 + 千葉県 + 12 + 051-249-7861 + 090-7812-8420 + ドコモ + + + 北条 奈央 + ほうじょう なお + houjou_nao@example.com + Female + 70 + 1943/9/18 + 既婚 + A型 + 高知県 + 39 + 026- 86-6309 + 080-2732-1162 + ドコモ + + + 葛山 小雁 + かつらやま こがん + katsurayama_kogan@example.com + Male + 53 + 1959/12/28 + 既婚 + O型 + 茨城県 + 08 + 050-794-7378 + 090-6036-2518 + ドコモ + + + 大沼 恵梨香 + おおぬま えりか + oonuma_erika@example.com + Female + 32 + 1981/10/19 + 既婚 + O型 + 埼玉県 + 11 + 075-319-4827 + 080-7356-5076 + ドコモ + + + 菅谷 佳乃 + すがや よしの + sugaya_yoshino@example.com + Female + 61 + 1952/8/16 + 既婚 + A型 + 埼玉県 + 11 + 039-864-6386 + 090-7769-1642 + au + + + 中 えみ + なか えみ + naka_emi@example.com + Female + 39 + 1973/11/28 + 未婚 + O型 + 千葉県 + 12 + 018-277-8001 + 080-8165-3374 + au + + + 白井 美佐子 + しらい みさこ + shirai_misako@example.com + Female + 31 + 1982/3/12 + 既婚 + AB型 + 愛知県 + 23 + 092-478-8848 + 080-8729- 332 + ドコモ + + + 古賀 誠一 + こが せいいち + koga_seiichi@example.com + Male + 43 + 1970/3/21 + 既婚 + O型 + 大阪府 + 27 + 017-229-6542 + 090-2807-3878 + ソフトバンク + + + 児島 鉄二 + こじま てつじ + kojima_tetsuji@example.com + Male + 30 + 1982/11/16 + 未婚 + AB型 + 東京都 + 13 + 0 5-960-4342 + 090-8389-5738 + au + + + 津田 功補 + つだ こうすけ + tsuda_kousuke@example.com + Male + 48 + 1965/8/10 + 既婚 + O型 + 北海道 + 01 + 075-384-8512 + 090-1742- 284 + ドコモ + + + 河原 杏 + かわはら あん + kawahara_ann@example.com + Female + 25 + 1988/8/24 + 未婚 + B型 + 神奈川県 + 14 + 013-775-2695 + 080-3675-4461 + au + + + 本村 浩太郎 + ほんむら こうたろう + honnmura_koutarou@example.com + Male + 28 + 1985/2/22 + 未婚 + A型 + 北海道 + 01 + 052-699-7358 + 090-1069-1112 + au + + + 矢口 美紀 + やぐち みき + yaguchi_miki@example.com + Female + 48 + 1965/7/23 + 既婚 + B型 + 熊本県 + 43 + 030-471-9531 + 090-1176-8129 + ドコモ + + + ユースケ 麗奈 + ゆーすけ れな + yusuke_rena@example.com + Female + 46 + 1966/12/4 + 既婚 + O型 + 沖縄県 + 47 + 093-518-6361 + 080-4444-7499 + au + + + 水嶋 さとみ + みずしま さとみ + mizushima_satomi@example.com + Female + 55 + 1958/8/29 + 既婚 + O型 + 福島県 + 07 + 0 8-881-1635 + 080-1380-4920 + ドコモ + + + 依田 優 + よりた ゆう + yorita_yuu@example.com + Male + 20 + 1993/9/17 + 既婚 + A型 + 東京都 + 13 + 025-947-2026 + 080-2992-5915 + au + + + 田川 花緑 + たがわ かろく + tagawa_karoku@example.com + Male + 78 + 1935/6/22 + 既婚 + A型 + 北海道 + 01 + 053-111-3754 + 090- 253-3964 + au + + + 竹下 あさみ + たけした あさみ + takeshita_asami@example.com + Female + 49 + 1964/4/16 + 既婚 + AB型 + 石川県 + 17 + 075-821-8003 + 090-7956-2926 + ドコモ + + + 大泉 りえ + おおいずみ りえ + ooizumi_rie@example.com + Female + 33 + 1980/10/10 + 既婚 + O型 + 大阪府 + 27 + 095- 68-7656 + 090-9501-3115 + ドコモ + + + 河内 ひろみ + かわうち ひろみ + kawauchi_hiromi@example.com + Female + 75 + 1937/11/6 + 既婚 + A型 + 埼玉県 + 11 + 037-796-5428 + 090-5789-6500 + ドコモ + + + 下田 功補 + しもだ こうすけ + shimoda_kousuke@example.com + Male + 54 + 1959/4/22 + 既婚 + A型 + 東京都 + 13 + 060-883-8116 + 080- 603-3704 + ドコモ + + + ほしの 博明 + ほしの ひろあき + hoshino_hiroaki@example.com + Male + 46 + 1967/9/27 + 既婚 + A型 + 群馬県 + 10 + 024-153-8583 + 080-7568-4455 + ドコモ + + + 寺沢 ひとり + てらさわ ひとり + terasawa_hitori@example.com + Male + 42 + 1971/10/12 + 既婚 + AB型 + 愛知県 + 23 + 048-951-7142 + 090-2359-2010 + ソフトバンク + + + 池本 ひろみ + いけもと ひろみ + ikemoto_hiromi@example.com + Female + 73 + 1940/1/20 + 既婚 + O型 + 高知県 + 39 + 051-427-9556 + 080-6277-5690 + ドコモ + + + 芦屋 努 + あしや つとむ + ashiya_tsutomu@example.com + Male + 54 + 1958/11/16 + 既婚 + O型 + 福岡県 + 40 + 093-369-2442 + 090-3793-6847 + ドコモ + + + 尾上 三郎 + おがみ さぶろう + ogami_saburou@example.com + Male + 68 + 1944/11/6 + 既婚 + A型 + 京都府 + 26 + 037-931- 184 + 080-2546-1966 + ソフトバンク + + + 松原 一 + まつばら はじめ + matsubara_hajime@example.com + Male + 26 + 1987/4/18 + 未婚 + O型 + 埼玉県 + 11 + 080-461-4235 + 090-5307-7986 + ドコモ + + + 坂東 瞬 + ばんとう しゅん + banntou_shun@example.com + Female + 20 + 1993/9/27 + 未婚 + A型 + 埼玉県 + 11 + 0 - 7-5390 + 080-4822-6858 + ソフトバンク + + + 松山 雄太 + まつやま ゆうた + matsuyama_yuuta@example.com + Male + 37 + 1976/2/18 + 既婚 + A型 + 青森県 + 02 + 056-886-1598 + 080-1275-6945 + au + + + 遠藤 なつみ + えんどう なつみ + enndou_natsumi@example.com + Female + 51 + 1962/2/3 + 既婚 + A型 + 兵庫県 + 28 + 053-704-8019 + 090-4235-6889 + ドコモ + + + 大和田 光 + おおわだ ひかる + oowada_hikaru@example.com + Female + 49 + 1963/12/13 + 既婚 + O型 + 兵庫県 + 28 + 076-211-6044 + 080-3998-4147 + ソフトバンク + + + 森本 美里 + もりもと みり + morimoto_miri@example.com + Female + 42 + 1970/12/7 + 既婚 + A型 + 大阪府 + 27 + 0 5-493-3505 + 090-8123-1057 + ドコモ + + + 江原 惇 + えはら じゅん + ehara_jun@example.com + Male + 68 + 1945/6/3 + 既婚 + A型 + 愛知県 + 23 + 082-829-9184 + 080-5428-2653 + ドコモ + + + 海野 あさみ + うみの あさみ + umino_asami1@example.com + Female + 23 + 1989/11/15 + 未婚 + A型 + 北海道 + 01 + 047- 56-9273 + 090-4734-1926 + ドコモ + + + 大津 有海 + おおつ あみ + ootsu_ami@example.com + Female + 69 + 1944/2/18 + 既婚 + AB型 + 広島県 + 34 + 055- 2-8651 + 080-8683-8906 + ドコモ + + + 石坂 祐一 + いしざか ゆういち + ishizaka_yuuichi@example.com + Male + 68 + 1945/10/5 + 既婚 + AB型 + 山形県 + 06 + 0 7-758-2162 + 080-4279-1794 + au + + + 吉川 ひとみ + きっかわ ひとみ + kikkawa_hitomi@example.com + Female + 27 + 1986/3/16 + 未婚 + B型 + 宮城県 + 04 + 044- 27-7402 + 090-9061-4458 + ドコモ + + + 古山 信吾 + ふるやま しんご + furuyama_shingo@example.com + Male + 61 + 1952/4/9 + 既婚 + B型 + 京都府 + 26 + 042-650-2251 + 090-2648-4079 + ソフトバンク + + + 亀山 希 + かめやま のぞみ + kameyama_nozomi@example.com + Female + 58 + 1955/3/22 + 既婚 + B型 + 埼玉県 + 11 + 068-316-6779 + 090-4093-1380 + au + + + ト字 桃子 + とじ ももこ + toji_momoko@example.com + Female + 21 + 1992/9/23 + 既婚 + O型 + 大阪府 + 27 + 072-824-8479 + 080-3310-5854 + au + + + 石坂 美和子 + いしざか みわこ + ishizaka_miwako@example.com + Female + 68 + 1945/7/11 + 既婚 + O型 + 神奈川県 + 14 + 087-163-5946 + 090-8485-4977 + ドコモ + + + 花岡 昌代 + はなおか まさよ + hanaoka_masayo@example.com + Female + 80 + 1933/10/4 + 既婚 + AB型 + 群馬県 + 10 + 094- 23-6137 + 090-1718-7469 + ソフトバンク + + + 豊原 美佳 + とよはら みか + toyohara_mika@example.com + Female + 80 + 1932/12/14 + 既婚 + A型 + 宮崎県 + 45 + 016-837-3864 + 080-7397-1452 + ソフトバンク + + + 綾瀬 光良 + あやせ てるよし + ayase_teruyoshi@example.com + Male + 58 + 1955/5/27 + 既婚 + O型 + 大阪府 + 27 + 013-370-6266 + 080-2366-1278 + ドコモ + + + 井出 美嘉 + いで みか + ide_mika@example.com + Female + 80 + 1933/1/31 + 既婚 + O型 + 広島県 + 34 + 061- 88-3188 + 080-1035- 60 + ドコモ + + + 椎名 竜次 + しいな りゅうじ + shiina_ryuuji@example.com + Male + 67 + 1946/8/6 + 既婚 + A型 + 愛知県 + 23 + 070- 52-7314 + 090-3442-4049 + ドコモ + + + 沢田 美嘉 + さわだ みか + sawada_mika@example.com + Female + 54 + 1959/9/18 + 既婚 + A型 + 佐賀県 + 41 + 043-867- 962 + 090-7191-8472 + ドコモ + + + 沖 明日 + おき めいび + oki_meibi@example.com + Female + 65 + 1948/8/26 + 既婚 + A型 + 宮崎県 + 45 + 024-204-1253 + 080-2058-7138 + au + + + 北 きみまろ + きた きみまろ + kita_kimimaro@example.com + Male + 54 + 1959/6/11 + 既婚 + B型 + 広島県 + 34 + 061-368-8258 + 090-9344-8604 + au + + + 岩村 沙耶 + いわむら さや + iwamura_saya@example.com + Female + 22 + 1991/10/25 + 未婚 + AB型 + 沖縄県 + 47 + 080-743-4928 + 090-5473-2794 + au + + + 井出 たまき + いで たまき + ide_tamaki@example.com + Female + 49 + 1964/8/11 + 既婚 + B型 + 福岡県 + 40 + 087-975-9906 + 080- 166-8364 + ドコモ + + + 小森 一徳 + こもり いっとく + komori_ittoku@example.com + Male + 73 + 1940/4/30 + 既婚 + O型 + 愛知県 + 23 + 035-723-9617 + 090-7902-1934 + ソフトバンク + + + 寺岡 恵美 + てらおか めぐみ + teraoka_megumi@example.com + Female + 52 + 1961/8/24 + 既婚 + B型 + 福岡県 + 40 + 099-713-1899 + 090-5247-5935 + au + + + 米倉 ちえみ + よねくら ちえみ + yonekura_chiemi@example.com + Female + 58 + 1955/9/4 + 既婚 + A型 + 広島県 + 34 + 092-288-1716 + 080-3716-2719 + ドコモ + + + 大坪 コウ + おおつぼ こう + ootsubo_kou@example.com + Female + 75 + 1938/8/17 + 既婚 + B型 + 福岡県 + 40 + 074-383-7069 + 080-4401-5110 + au + + + 三田 幸平 + みた こうへい + mita_kouhei@example.com + Male + 57 + 1956/5/19 + 既婚 + O型 + 茨城県 + 08 + 045-407-1609 + 090-5579-6742 + ドコモ + + + 田口 隆太 + たぐち りゅうた + taguchi_ryuuta@example.com + Male + 62 + 1950/11/13 + 既婚 + A型 + 神奈川県 + 14 + 051-928-9182 + 090-1089-1247 + ソフトバンク + + + 神崎 広司 + かんざき こうじ + kanzaki_kouji@example.com + Male + 27 + 1986/10/21 + 既婚 + O型 + 東京都 + 13 + 012-620-1363 + 090-1522-5637 + ドコモ + + + 小峰 秀樹 + こみね ひでき + komine_hideki@example.com + Male + 35 + 1978/9/1 + 未婚 + O型 + 茨城県 + 08 + 094-375-2431 + 090-7268-3744 + ソフトバンク + + + 福永 小雁 + ふくなが こがん + fukunaga_kogan@example.com + Male + 50 + 1963/4/16 + 既婚 + O型 + 京都府 + 26 + 074-503-7326 + 080-7109-7066 + ドコモ + + + 湯浅 淳 + ゆあさ あつし + yuasa_atsushi@example.com + Male + 58 + 1955/3/24 + 未婚 + O型 + 秋田県 + 05 + 053- 1-5851 + 080-4875-6088 + ソフトバンク + + + 内村 ケンイチ + うちむら けんいち + uchimura_kenichi@example.com + Male + 36 + 1977/6/19 + 既婚 + A型 + 東京都 + 13 + 063-237-8488 + 080-4197-8329 + au + + + ほしの 莉央 + ほしの りお + hoshino_rio@example.com + Female + 60 + 1953/1/9 + 既婚 + B型 + 栃木県 + 09 + 011-977-4107 + 090-5579-8654 + ドコモ + + + 小宮 俊二 + こみや しゅんじ + komiya_shunji@example.com + Male + 38 + 1975/2/24 + 既婚 + B型 + 大阪府 + 27 + 034-523-3537 + 080-6118- 463 + au + + + 中根 菜摘 + なかね なつみ + nakane_natsumi@example.com + Female + 37 + 1976/6/20 + 既婚 + O型 + 滋賀県 + 25 + 074-475-7520 + 080-4307-2735 + ドコモ + + + 大城 希 + おおしろ のぞみ + ooshiro_nozomi@example.com + Female + 36 + 1976/12/23 + 既婚 + O型 + 千葉県 + 12 + 091-822-4271 + 080-9571-5106 + au + + + 牧 たかお + まき たかお + maki_takao@example.com + Male + 27 + 1986/5/20 + 未婚 + A型 + 沖縄県 + 47 + 036-171- 236 + 090-7400-2276 + ドコモ + + + 日下部 真奈美 + くさかべ まなみ + kusakabe_manami@example.com + Female + 57 + 1956/4/12 + 既婚 + A型 + 宮城県 + 04 + 079-260-7375 + 090-7770- 302 + ツーカー + + + 篠山 将也 + しのやま まさや + shinoyama_masaya@example.com + Male + 47 + 1966/6/16 + 既婚 + A型 + 群馬県 + 10 + 027-884-3268 + 080-8572-8007 + ドコモ + + + 滝沢 佳乃 + たきざわ よしの + takizawa_yoshino@example.com + Female + 44 + 1969/2/23 + 既婚 + O型 + 北海道 + 01 + 055-648-9577 + 080-5448-4087 + au + + + 中里 慢太郎 + なかざと まんたろう + nakazato_mantarou@example.com + Male + 44 + 1969/4/28 + 既婚 + B型 + 京都府 + 26 + 013- 34-9034 + 080-1182-5467 + au + + + 三木 くるみ + みき くるみ + miki_kurumi@example.com + Female + 38 + 1975/10/7 + 既婚 + A型 + 東京都 + 13 + 047-314-6513 + 090-3869-4723 + ドコモ + + + 雨宮 研二 + あまみや けんじ + amamiya_kenji@example.com + Male + 27 + 1985/12/10 + 未婚 + A型 + 愛知県 + 23 + 023- 81-1049 + 080-2982-6221 + ドコモ + + + 瀬尾 七世 + せお ななせ + seo_nanase@example.com + Female + 73 + 1940/8/19 + 既婚 + O型 + 島根県 + 32 + 078-340-7974 + 080-5344-9018 + ドコモ + + + 笠井 米蔵 + かさい よねぞう + kasai_yonezou@example.com + Male + 53 + 1960/3/21 + 既婚 + B型 + 兵庫県 + 28 + 090-181-8811 + 090-3549-5731 + ソフトバンク + + + 大畑 フミヤ + おおはた ふみや + oohata_fumiya@example.com + Male + 36 + 1977/3/4 + 既婚 + A型 + 東京都 + 13 + 064-726-4379 + 090-7010-2274 + au + + + 八木 秀樹 + やぎ ひでき + yagi_hideki@example.com + Male + 32 + 1981/9/11 + 既婚 + A型 + 千葉県 + 12 + 018-410-6276 + 080-1372-1283 + ソフトバンク + + + 川村 淳 + かわむら あつし + kawamura_atsushi@example.com + Male + 43 + 1969/11/19 + 既婚 + B型 + 島根県 + 32 + 048-910-5169 + 090-4572-2675 + au + + + 小山 佳乃 + おやま よしの + oyama_yoshino@example.com + Female + 42 + 1970/11/6 + 既婚 + O型 + 兵庫県 + 28 + 044-425-4762 + 090-2903-3054 + au + + + 天野 惇 + あまの じゅん + amano_jun@example.com + Male + 79 + 1934/9/6 + 既婚 + B型 + 岐阜県 + 21 + 034-136-9439 + 080-2704-5498 + ソフトバンク + + + 並木 広司 + なみき こうじ + namiki_kouji@example.com + Male + 34 + 1979/7/26 + 既婚 + B型 + 新潟県 + 15 + 097- 81-9121 + 090-2744-1150 + ドコモ + + + 比嘉 菜摘 + ひよし なつみ + hiyoshi_natsumi@example.com + Female + 26 + 1987/7/24 + 既婚 + A型 + 東京都 + 13 + 0 3-144-6177 + 090-7124-3826 + ドコモ + + + 中村 恭子 + なかむら きょうこ + nakamura_kyouko@example.com + Female + 66 + 1947/8/20 + 既婚 + O型 + 東京都 + 13 + 074-223-9206 + 090- 459-3852 + au + + + 大石 育二 + おおいし いくじ + ooishi_ikuji@example.com + Male + 78 + 1935/6/25 + 既婚 + A型 + 東京都 + 13 + 021-941-7595 + 080-3373-2634 + ソフトバンク + + + 阿部 浩太郎 + あべ こうたろう + abe_koutarou@example.com + Male + 34 + 1979/10/24 + 既婚 + A型 + 静岡県 + 22 + 051-511-3391 + 080-8991-1971 + au + + + 布施 美優 + ふせ みゅう + fuse_myuu@example.com + Female + 38 + 1975/7/13 + 既婚 + O型 + 神奈川県 + 14 + 028- 31-1049 + 080-9126-2864 + ドコモ + + + 奥貫 勝久 + おくぬき かつひさ + okunuki_katsuhisa@example.com + Male + 21 + 1992/2/28 + 未婚 + O型 + 神奈川県 + 14 + 0 9-464-9469 + 090-2505-1083 + au + + + ト字 正敏 + とじ まさとし + toji_masatoshi@example.com + Male + 46 + 1967/2/26 + 既婚 + O型 + 沖縄県 + 47 + 0 -435-7443 + 080-8408-7747 + ソフトバンク + + + 山岡 瞳 + やまおか ひとみ + yamaoka_hitomi@example.com + Female + 50 + 1963/2/3 + 既婚 + O型 + 東京都 + 13 + 091-758-5971 + 090-8887-5065 + ドコモ + + + 安部 昴 + あべ すばる + abe_subaru@example.com + Male + 51 + 1962/7/14 + 既婚 + A型 + 新潟県 + 15 + 040-743-8407 + 090-9320-8529 + ドコモ + + + 前田 朝香 + まえだ あさか + maeda_asaka@example.com + Female + 32 + 1981/1/29 + 既婚 + AB型 + 埼玉県 + 11 + 039- 36-9667 + 090-9538-6129 + ソフトバンク + + + 今 右京 + いま うきょう + ima_ukyou@example.com + Male + 52 + 1961/5/28 + 未婚 + A型 + 福島県 + 07 + 046-674-7042 + 090-5400-6142 + ドコモ + + + 立花 麻由子 + たちばな まゆこ + tachibana_mayuko@example.com + Female + 22 + 1991/9/22 + 未婚 + A型 + 兵庫県 + 28 + 058-569-2015 + 080-2787-8630 + au + + + 並木 鉄洋 + なみき てつひろ + namiki_tetsuhiro@example.com + Male + 53 + 1960/4/17 + 既婚 + A型 + 埼玉県 + 11 + 013-308-9727 + 080-9862-1028 + au + + + 小松 和久 + こまつ かずひさ + komatsu_kazuhisa@example.com + Male + 77 + 1936/3/29 + 既婚 + B型 + 奈良県 + 29 + 026- 22-2895 + 090-6970-4959 + au + + + 戎 研二 + えびす けんじ + ebisu_kenji@example.com + Male + 70 + 1943/8/9 + 既婚 + A型 + 東京都 + 13 + 027-508-3982 + 090-6971-5387 + ドコモ + + + 綾小路 はるみ + あやのこうじ はるみ + ayanokouji_harumi@example.com + Female + 65 + 1948/3/14 + 既婚 + A型 + 岩手県 + 03 + 052-448-6534 + 090-2742- 888 + ドコモ + + + 鎌田 華子 + かまた はなこ + kamata_hanako@example.com + Female + 51 + 1962/7/7 + 既婚 + O型 + 和歌山県 + 30 + 082- 82-7516 + 080-8930-3232 + au + + + 戸田 なぎさ + とだ なぎさ + toda_nagisa@example.com + Female + 80 + 1933/9/7 + 既婚 + B型 + 鹿児島県 + 46 + 019-899-1628 + 080-3731-5168 + ドコモ + + + 高田 たかお + たかだ たかお + takada_takao@example.com + Male + 78 + 1935/5/2 + 既婚 + B型 + 福岡県 + 40 + 087-394-4973 + 090-7722-1341 + ツーカー + + + 森島 功補 + もりしま こうすけ + morishima_kousuke@example.com + Male + 63 + 1950/2/11 + 既婚 + A型 + 千葉県 + 12 + 072-974-7364 + 090-3014- 391 + ドコモ + + + 浅倉 里穂 + あさくら りほ + asakura_riho@example.com + Female + 57 + 1956/4/4 + 既婚 + O型 + 愛媛県 + 38 + 031-928-5948 + 080-8577-8832 + ドコモ + + + 高梨 由美子 + たかなし ゆみこ + takanashi_yumiko@example.com + Female + 20 + 1993/7/4 + 未婚 + O型 + 埼玉県 + 11 + 044-792-1088 + 090-5270- 822 + ドコモ + + + 関根 真一 + せきね しんいち + sekine_shinichi@example.com + Male + 71 + 1942/9/3 + 既婚 + A型 + 愛知県 + 23 + 077-299-7694 + 090-6654-2176 + ドコモ + + + 堀口 光良 + ほりぐち てるよし + horiguchi_teruyoshi@example.com + Male + 60 + 1952/11/11 + 既婚 + O型 + 神奈川県 + 14 + 028-512- 412 + 090-7076-8022 + ドコモ + + + 片桐 正義 + かたぎり まさよし + katagiri_masayoshi@example.com + Male + 41 + 1972/10/19 + 未婚 + O型 + 岐阜県 + 21 + 050-877-1468 + 080-8974-3237 + ドコモ + + + 武藤 くるみ + むとう くるみ + mutou_kurumi@example.com + Female + 79 + 1934/1/3 + 既婚 + B型 + 徳島県 + 36 + 095-267-1667 + 090-5012-1160 + au + + + 成田 麻緒 + なりた まお + narita_mao@example.com + Female + 52 + 1960/11/17 + 既婚 + A型 + 宮城県 + 04 + 0 2-681-2982 + 080-1589-3582 + ドコモ + + + 上野 健 + うえの けん + ueno_ken@example.com + Male + 33 + 1980/7/2 + 既婚 + B型 + 岩手県 + 03 + 0 3- 61-3578 + 080-4296-8976 + ソフトバンク + + + 浅倉 鉄二 + あさくら てつじ + asakura_tetsuji@example.com + Male + 45 + 1968/9/20 + 既婚 + B型 + 徳島県 + 36 + 033-641-4216 + 090-1603-2811 + ドコモ + + + 高野 祐一 + たかの ゆういち + takano_yuuichi@example.com + Male + 53 + 1960/8/10 + 既婚 + O型 + 香川県 + 37 + 075-853-7853 + 090-7613-5804 + ソフトバンク + + + 多岐川 希 + たきがわ のぞみ + takigawa_nozomi@example.com + Female + 41 + 1971/12/20 + 既婚 + O型 + 神奈川県 + 14 + 051-450-5050 + 080-5794-2552 + ドコモ + + + 岡村 愛子 + おかむら あいこ + okamura_aiko@example.com + Female + 52 + 1961/8/2 + 既婚 + A型 + 神奈川県 + 14 + 075-249-6985 + 080-4176-9561 + ドコモ + + + 内田 秀樹 + うちだ ひでき + uchida_hideki@example.com + Male + 74 + 1939/10/9 + 既婚 + A型 + 京都府 + 26 + 024-278-4544 + 090-5854- 686 + ドコモ + + + 門脇 翔子 + かどわき しょうこ + kadowaki_shouko@example.com + Female + 58 + 1955/4/13 + 既婚 + A型 + 茨城県 + 08 + 046-966-7046 + 090- 716- 508 + ソフトバンク + + + 仲村 俊二 + なかむら しゅんじ + nakamura_shunji@example.com + Male + 61 + 1951/12/8 + 既婚 + A型 + 鳥取県 + 31 + 087-423-7769 + 090-9907- 890 + au + + + 菅原 まなみ + すがわら まなみ + sugawara_manami@example.com + Female + 50 + 1963/4/12 + 未婚 + A型 + 神奈川県 + 14 + 0 4-122- 584 + 090-9473-5341 + ドコモ + + + 三井 慶太 + みつい けいた + mitsui_keita@example.com + Male + 59 + 1953/12/10 + 既婚 + O型 + 埼玉県 + 11 + 0 1-549-5216 + 090-3519-1893 + ソフトバンク + + + 三船 広之 + みふね ひろゆき + mifune_hiroyuki@example.com + Male + 64 + 1949/9/24 + 既婚 + A型 + 宮崎県 + 45 + 017-217-8858 + 080-2108-1978 + ドコモ + + + 三宅 陽子 + みやけ ようこ + miyake_youko@example.com + Female + 75 + 1938/4/3 + 既婚 + AB型 + 千葉県 + 12 + 016-545-6235 + 080-8813-8667 + ドコモ + + + 山岸 友香 + やまぎし ともか + yamagishi_tomoka@example.com + Female + 76 + 1937/9/16 + 既婚 + A型 + 千葉県 + 12 + 0 3-164-5390 + 080-4270-3968 + ドコモ + + + 矢島 幸平 + やじま こうへい + yajima_kouhei@example.com + Male + 72 + 1941/7/22 + 既婚 + B型 + 北海道 + 01 + 056-153-2111 + 090-5219-7841 + au + + + 花岡 雅之 + はなおか まさゆき + hanaoka_masayuki@example.com + Male + 66 + 1947/4/29 + 既婚 + A型 + 埼玉県 + 11 + 059-681-4362 + 090-1931-9859 + ドコモ + + + 杉田 一恵 + すぎた かづえ + sugita_kadue@example.com + Female + 50 + 1963/8/19 + 既婚 + B型 + 香川県 + 37 + 047-455-1043 + 090-7179-1238 + ドコモ + + + 曽我 雅彦 + そが まさひこ + soga_masahiko@example.com + Male + 48 + 1965/1/3 + 既婚 + A型 + 熊本県 + 43 + 030-809-6460 + 090-6172-7561 + ドコモ + + + 佐久間 光博 + さくま みつひろ + sakuma_mitsuhiro@example.com + Male + 20 + 1992/12/2 + 未婚 + B型 + 大阪府 + 27 + 094-155-9414 + 080-9299-5234 + ドコモ + + + 小坂 まさみ + こざか まさみ + kozaka_masami@example.com + Female + 26 + 1987/8/28 + 既婚 + B型 + 富山県 + 16 + 045-100-2992 + 090-6220-6762 + ドコモ + + + 本間 由美子 + ほんま ゆみこ + honnma_yumiko@example.com + Female + 68 + 1944/11/29 + 既婚 + A型 + 埼玉県 + 11 + 083-627-2685 + 090-5544-5428 + au + + + 三谷 愛梨 + みたに あいり + mitani_airi@example.com + Female + 52 + 1960/11/9 + 既婚 + B型 + 大分県 + 44 + 071- 85-7279 + 090-6793-7902 + ドコモ + + + 佐々木 涼子 + ささき りょうこ + sasaki_ryouko@example.com + Female + 55 + 1958/2/5 + 既婚 + O型 + 福岡県 + 40 + 052-221-9431 + 080-3157-9125 + au + + + 長浜 幸子 + ながはま さちこ + nagahama_sachiko@example.com + Female + 45 + 1967/12/24 + 既婚 + O型 + 福島県 + 07 + 050-578-8700 + 080-7610-9712 + ドコモ + + + 足立 さとみ + あだち さとみ + adachi_satomi@example.com + Female + 75 + 1937/11/24 + 既婚 + A型 + 茨城県 + 08 + 088-451-1131 + 080-2250-3405 + ドコモ + + + 岩城 大 + いわき まさる + iwaki_masaru@example.com + Male + 52 + 1960/12/29 + 既婚 + O型 + 兵庫県 + 28 + 055- 22-9735 + 080-4539-9718 + au + + + 八木 彩華 + やぎ あやか + yagi_ayaka@example.com + Female + 52 + 1961/7/13 + 既婚 + A型 + 秋田県 + 05 + 047-944-9736 + 090-6524-4974 + ソフトバンク + + + 大地 大五郎 + おおち だいごろう + oochi_daigorou@example.com + Male + 76 + 1937/4/18 + 既婚 + B型 + 福岡県 + 40 + 065-159-5147 + 080-1307-6499 + au + + + 伊沢 一徳 + いざわ いっとく + izawa_ittoku@example.com + Male + 65 + 1948/7/25 + 既婚 + B型 + 岐阜県 + 21 + 047-510- 440 + 080-3872-9403 + ドコモ + + + 小西 エリカ + こにし えりか + konishi_erika@example.com + Female + 47 + 1965/11/25 + 既婚 + A型 + 千葉県 + 12 + 042-391-7914 + 090-2870-7331 + au + + + 塩谷 恵梨香 + しおたに えりか + shiotani_erika@example.com + Female + 49 + 1963/11/10 + 既婚 + B型 + 大阪府 + 27 + 026-867-8369 + 090-6526-2998 + au + + + 小坂 法子 + こざか のりこ + kozaka_noriko@example.com + Female + 60 + 1953/5/8 + 既婚 + O型 + 東京都 + 13 + 021- 77-4489 + 080-1947-9350 + ドコモ + + + 堤 璃奈子 + つつみ りなこ + tsutsumi_rinako@example.com + Female + 60 + 1953/2/18 + 既婚 + O型 + 埼玉県 + 11 + 062-890-5695 + 090-6458- 560 + ドコモ + + + 海音寺 一哉 + かいおんじ かずや + kaionji_kazuya@example.com + Male + 71 + 1942/2/15 + 既婚 + B型 + 愛知県 + 23 + 017-385-9156 + 090-4636-1881 + ドコモ + + + 矢沢 たまき + やざわ たまき + yazawa_tamaki@example.com + Female + 70 + 1943/3/16 + 既婚 + O型 + 東京都 + 13 + 079-991- 996 + 080-2302-6670 + au + + + 甲斐 豊 + かい ゆたか + kai_yutaka@example.com + Male + 65 + 1948/9/21 + 既婚 + A型 + 宮崎県 + 45 + 043-920-5124 + 090-7892-3663 + ドコモ + + + 金森 俊二 + かなもり しゅんじ + kanamori_shunji@example.com + Male + 72 + 1941/4/29 + 既婚 + O型 + 愛知県 + 23 + 077-178-3849 + 080-2688-9904 + ドコモ + + + 中尾 裕次郎 + なかお ゆうじろう + nakao_yuujirou@example.com + Male + 42 + 1971/1/29 + 既婚 + AB型 + 兵庫県 + 28 + 090-113-2201 + 080-4122-6746 + ドコモ + + + 岡部 明 + おかべ あきら + okabe_akira@example.com + Male + 52 + 1961/6/15 + 既婚 + O型 + 熊本県 + 43 + 0 4-611-6554 + 090-7859-9622 + ソフトバンク + + + 倉田 さやか + くらた さやか + kurata_sayaka@example.com + Female + 37 + 1976/7/17 + 既婚 + O型 + 東京都 + 13 + 032-832-8977 + 080-9855-7100 + ドコモ + + + 江藤 宏行 + えとう ひろゆき + etou_hiroyuki@example.com + Male + 22 + 1990/11/14 + 未婚 + O型 + 沖縄県 + 47 + 086-731-6424 + 080-1675-6189 + ドコモ + + diff --git a/src/test/resources/randamu_kana.txt b/src/test/resources/randamu_kana.txt new file mode 100644 index 000000000..d480aee65 --- /dev/null +++ b/src/test/resources/randamu_kana.txt @@ -0,0 +1,302 @@ +グループ1 +グループ2 +グループ3 +グループ4 +グループ5 +グループ6 +グループ7 +グループ8 +グループ9 +グループ10 +グループ11 +グループ12 +グループ13 +グループ14 +グループ15 +グループ16 +グループ17 +グループ18 +グループ19 +グループ20 +グループ21 +グループ22 +グループ23 +グループ24 +グループ25 +グループ26 +グループ27 +グループ28 +グループ29 +グループ30 +グループ31 +グループ32 +グループ33 +グループ34 +グループ35 +グループ36 +グループ37 +グループ38 +グループ39 +グループ40 +グループ41 +グループ42 +グループ43 +グループ44 +グループ45 +グループ46 +グループ47 +グループ48 +グループ49 +グループ50 +グループ51 +グループ52 +グループ53 +グループ54 +グループ55 +グループ56 +グループ57 +グループ58 +グループ59 +グループ60 +グループ61 +グループ62 +グループ63 +グループ64 +グループ65 +グループ66 +グループ67 +グループ68 +グループ69 +グループ70 +グループ71 +グループ72 +グループ73 +グループ74 +グループ75 +グループ76 +グループ77 +グループ78 +グループ79 +グループ80 +グループ81 +グループ82 +グループ83 +グループ84 +グループ85 +グループ86 +グループ87 +グループ88 +グループ89 +グループ90 +グループ91 +グループ92 +グループ93 +グループ94 +グループ95 +グループ96 +グループ97 +グループ98 +グループ99 +グループ100 +グループ101 +グループ102 +グループ103 +グループ104 +グループ105 +グループ106 +グループ107 +グループ108 +グループ109 +グループ110 +グループ111 +グループ112 +グループ113 +グループ114 +グループ115 +グループ116 +グループ117 +グループ118 +グループ119 +グループ120 +グループ121 +グループ122 +グループ123 +グループ124 +グループ125 +グループ126 +グループ127 +グループ128 +グループ129 +グループ130 +グループ131 +グループ132 +グループ133 +グループ134 +グループ135 +グループ136 +グループ137 +グループ138 +グループ139 +グループ140 +グループ141 +グループ142 +グループ143 +グループ144 +グループ145 +グループ146 +グループ147 +グループ148 +グループ149 +グループ150 +グループ151 +グループ152 +グループ153 +グループ154 +グループ155 +グループ156 +グループ157 +グループ158 +グループ159 +グループ160 +グループ161 +グループ162 +グループ163 +グループ164 +グループ165 +グループ166 +グループ167 +グループ168 +グループ169 +グループ170 +グループ171 +グループ172 +グループ173 +グループ174 +グループ175 +グループ176 +グループ177 +グループ178 +グループ179 +グループ180 +グループ181 +グループ182 +グループ183 +グループ184 +グループ185 +グループ186 +グループ187 +グループ188 +グループ189 +グループ190 +グループ191 +グループ192 +グループ193 +グループ194 +グループ195 +グループ196 +グループ197 +グループ198 +グループ199 +グループ200 +グループ201 +グループ202 +グループ203 +グループ204 +グループ205 +グループ206 +グループ207 +グループ208 +グループ209 +グループ210 +グループ211 +グループ212 +グループ213 +グループ214 +グループ215 +グループ216 +グループ217 +グループ218 +グループ219 +グループ220 +グループ221 +グループ222 +グループ223 +グループ224 +グループ225 +グループ226 +グループ227 +グループ228 +グループ229 +グループ230 +グループ231 +グループ232 +グループ233 +グループ234 +グループ235 +グループ236 +グループ237 +グループ238 +グループ239 +グループ240 +グループ241 +グループ242 +グループ243 +グループ244 +グループ245 +グループ246 +グループ247 +グループ248 +グループ249 +グループ250 +グループ251 +グループ252 +グループ253 +グループ254 +グループ255 +グループ256 +グループ257 +グループ258 +グループ259 +グループ260 +グループ261 +グループ262 +グループ263 +グループ264 +グループ265 +グループ266 +グループ267 +グループ268 +グループ269 +グループ270 +グループ271 +グループ272 +グループ273 +グループ274 +グループ275 +グループ276 +グループ277 +グループ278 +グループ279 +グループ280 +グループ281 +グループ282 +グループ283 +グループ284 +グループ285 +グループ286 +グループ287 +グループ288 +グループ289 +グループ290 +グループ291 +グループ292 +グループ293 +グループ294 +グループ295 +グループ296 +グループ297 +グループ298 +グループ299 +グループ300 + +