diff --git a/Owner.md b/Owner.md new file mode 100644 index 00000000..f0d27f60 --- /dev/null +++ b/Owner.md @@ -0,0 +1 @@ +Nagaiko Ivan diff --git a/ejb3-persistence-1.0.2.GA.jar b/ejb3-persistence-1.0.2.GA.jar new file mode 100644 index 00000000..fcdfa41f --- /dev/null +++ b/ejb3-persistence-1.0.2.GA.jar @@ -0,0 +1,889 @@ + +Index of /maven2/ + +

Index of /maven2/


../
+HTTPClient/                                        01-Nov-2005 05:03                   -
+abbot/                                             28-Sep-2015 06:18                   -
+acegisecurity/                                     23-Dec-2005 12:20                   -
+activation/                                        21-Dec-2005 15:37                   -
+activecluster/                                     01-Nov-2005 05:09                   -
+activeio/                                          01-Nov-2005 05:10                   -
+activemq/                                          01-Nov-2005 05:13                   -
+activemq-jaxb/                                     01-Nov-2005 05:11                   -
+activesoap/                                        01-Nov-2005 05:20                   -
+activespace/                                       01-Nov-2005 05:04                   -
+adarwin/                                           01-Nov-2005 05:03                   -
+ae/                                                06-Apr-2015 06:14                   -
+aelfred/                                           01-Nov-2005 05:03                   -
+aero/                                              01-Aug-2014 14:03                   -
+ai/                                                28-Nov-2016 07:10                   -
+aislib/                                            01-Nov-2005 05:14                   -
+al/                                                21-Nov-2016 13:18                   -
+altrmi/                                            01-Nov-2005 05:14                   -
+am/                                                21-Nov-2016 13:19                   -
+andromda/                                          01-Nov-2005 05:19                   -
+annogen/                                           01-Nov-2005 05:19                   -
+ant/                                               01-Nov-2005 05:17                   -
+ant-contrib/                                       08-Aug-2008 22:17                   -
+ant-doxygen/                                       01-Nov-2005 05:04                   -
+ant4eclipse/                                       21-Aug-2011 11:53                   -
+antlr/                                             01-Nov-2005 05:12                   -
+anttex/                                            01-Nov-2005 05:19                   -
+aopalliance/                                       28-Oct-2005 01:26                   -
+apache-jaxme/                                      01-Nov-2005 05:10                   -
+aptconvert/                                        01-Nov-2005 05:07                   -
+ar/                                                06-Mar-2008 17:19                   -
+args4j/                                            16-Mar-2013 07:01                   -
+as/                                                25-May-2015 06:15                   -
+ashkay/                                            01-Nov-2005 05:13                   -
+ashkelon/                                          01-Nov-2005 05:20                   -
+asia/                                              23-Feb-2013 08:01                   -
+asm/                                               07-Jul-2009 04:08                   -
+aspectj/                                           21-Dec-2005 12:23                   -
+aspectwerkz/                                       01-Nov-2005 05:09                   -
+at/                                                28-Nov-2016 07:12                   -
+au/                                                12-Oct-2015 07:37                   -
+avalon/                                            19-Oct-2006 19:23                   -
+avalon-activation/                                 01-Nov-2005 05:20                   -
+avalon-apps/                                       01-Nov-2005 05:14                   -
+avalon-composition/                                01-Nov-2005 05:13                   -
+avalon-cornerstone/                                01-Nov-2005 05:02                   -
+avalon-extension/                                  01-Nov-2005 05:09                   -
+avalon-framework/                                  01-Nov-2005 05:15                   -
+avalon-http/                                       18-Jul-2006 18:10                   -
+avalon-logging/                                    01-Nov-2005 05:19                   -
+avalon-logkit/                                     01-Nov-2005 05:11                   -
+avalon-meta/                                       01-Nov-2005 05:05                   -
+avalon-phoenix/                                    01-Nov-2005 05:10                   -
+avalon-repository/                                 01-Nov-2005 05:10                   -
+avalon-util/                                       01-Nov-2005 05:12                   -
+axion/                                             01-Nov-2005 05:20                   -
+axis/                                              19-Oct-2006 19:23                   -
+axis2/                                             04-May-2006 20:31                   -
+azote/                                             01-Nov-2005 05:14                   -
+ba/                                                29-Jun-2015 06:17                   -
+backport-util-concurrent/                          20-Feb-2008 05:30                   -
+backport175/                                       01-Nov-2005 05:07                   -
+band/                                              21-Nov-2016 13:41                   -
+barsuift/                                          21-Aug-2011 11:54                   -
+batik/                                             01-Nov-2005 05:09                   -
+bcel/                                              28-Oct-2005 01:26                   -
+be/                                                21-Nov-2016 13:41                   -
+beehive/                                           01-Nov-2005 05:10                   -
+berkano/                                           01-Nov-2005 05:14                   -
+berkeleydb/                                        01-Nov-2005 05:06                   -
+binky/                                             26-Feb-2010 19:31                   -
+biz/                                               14-Mar-2016 06:15                   -
+black/                                             01-Jun-2015 06:20                   -
+blissed/                                           01-Nov-2005 05:04                   -
+boo/                                               06-Nov-2006 01:04                   -
+bouncycastle/                                      03-Sep-2009 13:30                   -
+boxstuff/                                          01-Nov-2005 05:12                   -
+br/                                                21-Nov-2016 13:45                   -
+bsf/                                               01-Nov-2005 05:03                   -
+bsh/                                               01-Nov-2005 05:03                   -
+burlap/                                            01-Nov-2005 05:03                   -
+by/                                                12-Jan-2015 07:18                   -
+bz/                                                01-Aug-2014 14:08                   -
+c10n/                                              09-Mar-2013 08:02                   -
+c3p0/                                              01-Nov-2005 05:06                   -
+ca/                                                21-Nov-2016 13:53                   -
+cactus/                                            11-Apr-2008 19:59                   -
+cargo/                                             01-Nov-2005 05:07                   -
+cas/                                               22-Jun-2006 17:05                   -
+castor/                                            06-Dec-2007 02:46                   -
+cat/                                               21-Nov-2016 14:02                   -
+cc/                                                21-Nov-2016 14:02                   -
+cd/                                                05-Jan-2015 07:18                   -
+cewolf/                                            01-Nov-2005 05:04                   -
+cf/                                                01-Aug-2014 14:11                   -
+cglib/                                             29-Feb-2016 07:17                   -
+ch/                                                21-Nov-2016 14:07                   -
+charlotte/                                         01-Nov-2005 05:04                   -
+checkstyle/                                        28-Oct-2005 01:27                   -
+cl/                                                06-Jul-2015 06:24                   -
+classworlds/                                       01-Nov-2005 05:10                   -
+clickstream/                                       24-Nov-2005 06:03                   -
+clirr/                                             01-Nov-2005 05:04                   -
+cloud/                                             21-Nov-2016 14:20                   -
+clover/                                            01-Nov-2005 05:11                   -
+cm/                                                21-Nov-2016 14:20                   -
+cmsdeploy/                                         06-Dec-2005 20:10                   -
+cn/                                                28-Nov-2016 07:25                   -
+co/                                                21-Nov-2016 14:24                   -
+cobertura/                                         06-Feb-2006 21:04                   -
+coconut/                                           01-Nov-2005 05:21                   -
+cocoon/                                            09-Jun-2008 20:01                   -
+code/                                              21-Aug-2011 11:56                   -
+code316/                                           01-Nov-2005 05:03                   -
+codehaus/                                          16-Jul-2008 22:44                   -
+codes/                                             01-Jun-2015 06:28                   -
+colt/                                              01-Nov-2005 05:03                   -
+com/                                               28-Nov-2016 07:29                   -
+commons-attributes/                                03-Jul-2006 21:30                   -
+commons-beanutils/                                 01-Dec-2012 08:50                   -
+commons-betwixt/                                   01-Nov-2005 05:13                   -
+commons-chain/                                     01-Jun-2008 18:20                   -
+commons-cli/                                       19-Mar-2009 20:08                   -
+commons-codec/                                     09-Aug-2009 21:14                   -
+commons-collections/                               15-Apr-2008 01:05                   -
+commons-compress/                                  01-Nov-2005 05:21                   -
+commons-configuration/                             11-Jan-2009 14:01                   -
+commons-daemon/                                    01-Nov-2005 05:12                   -
+commons-dbcp/                                      28-Oct-2005 01:26                   -
+commons-dbutils/                                   26-Apr-2009 04:30                   -
+commons-digester/                                  03-Jan-2009 21:44                   -
+commons-discovery/                                 01-Nov-2005 05:03                   -
+commons-el/                                        28-Oct-2005 01:27                   -
+commons-email/                                     28-Sep-2007 19:29                   -
+commons-fileupload/                                20-Feb-2007 11:31                   -
+commons-grafolia/                                  01-Nov-2005 05:03                   -
+commons-grant/                                     01-Nov-2005 05:16                   -
+commons-graph/                                     01-Nov-2005 05:19                   -
+commons-http/                                      01-Nov-2005 05:21                   -
+commons-httpclient/                                01-Nov-2005 05:19                   -
+commons-i18n/                                      01-Nov-2005 05:19                   -
+commons-io/                                        01-Jan-2008 21:00                   -
+commons-jdbc2pool/                                 01-Nov-2005 05:11                   -
+commons-jelly/                                     01-Nov-2005 05:12                   -
+commons-jexl/                                      01-Nov-2005 05:08                   -
+commons-jux/                                       01-Nov-2005 05:05                   -
+commons-jxpath/                                    13-Aug-2008 22:13                   -
+commons-lang/                                      19-Mar-2008 05:42                   -
+commons-latka/                                     01-Nov-2005 05:19                   -
+commons-launcher/                                  03-Jul-2006 21:30                   -
+commons-logging/                                   26-Nov-2007 19:24                   -
+commons-math/                                      25-Feb-2008 00:30                   -
+commons-messenger/                                 01-Nov-2005 05:14                   -
+commons-modeler/                                   01-Nov-2005 05:03                   -
+commons-naming/                                    01-Nov-2005 05:13                   -
+commons-net/                                       30-Oct-2008 20:28                   -
+commons-pool/                                      21-Dec-2008 00:14                   -
+commons-primitives/                                01-Nov-2005 05:08                   -
+commons-resources/                                 01-Nov-2005 05:09                   -
+commons-scxml/                                     19-May-2008 19:41                   -
+commons-services/                                  28-Oct-2005 01:27                   -
+commons-sql/                                       01-Nov-2005 05:14                   -
+commons-test/                                      08-Nov-2005 09:49                   -
+commons-threadpool/                                01-Nov-2005 05:14                   -
+commons-transaction/                               01-Nov-2005 05:14                   -
+commons-util/                                      01-Nov-2005 05:19                   -
+commons-validator/                                 28-Oct-2005 01:27                   -
+commons-vfs/                                       01-Nov-2005 05:10                   -
+commons-xo/                                        01-Nov-2005 05:08                   -
+concurrent/                                        28-Oct-2005 01:26                   -
+consulting/                                        10-Aug-2015 10:55                   -
+continuum/                                         01-Nov-2005 05:04                   -
+controlhaus/                                       01-Nov-2005 05:19                   -
+cool/                                              29-Nov-2016 23:08                   -
+coop/                                              20-Oct-2014 09:33                   -
+cornerstone-connection/                            01-Nov-2005 05:20                   -
+cornerstone-datasources/                           01-Nov-2005 05:21                   -
+cornerstone-scheduler/                             01-Nov-2005 05:12                   -
+cornerstone-sockets/                               01-Nov-2005 05:13                   -
+cornerstone-store/                                 01-Nov-2005 05:03                   -
+cornerstone-threads/                               01-Nov-2005 05:07                   -
+cos/                                               06-Dec-2005 20:11                   -
+crimson/                                           01-Nov-2005 05:03                   -
+cryptix/                                           01-Nov-2005 05:07                   -
+cssparser/                                         21-Aug-2011 14:29                   -
+cz/                                                29-Nov-2016 23:08                   -
+d-haven-event/                                     01-Nov-2005 05:14                   -
+d-haven-eventbus/                                  01-Nov-2005 05:09                   -
+d-haven-mpool/                                     01-Nov-2005 05:16                   -
+dalma/                                             21-Aug-2011 14:29                   -
+dalms/                                             21-Aug-2011 14:29                   -
+damagecontrol/                                     01-Nov-2005 05:10                   -
+dataforge/                                         01-Nov-2005 05:11                   -
+datasift/                                          01-Nov-2005 05:14                   -
+dbunit/                                            01-Nov-2005 05:13                   -
+de/                                                29-Nov-2016 23:10                   -
+decorutils/                                        01-Nov-2005 05:04                   -
+dentaku/                                           01-Nov-2005 05:07                   -
+directory/                                         24-Dec-2005 17:47                   -
+directory-asn1/                                    01-Nov-2005 05:19                   -
+directory-authx/                                   01-Nov-2005 05:21                   -
+directory-clients/                                 01-Nov-2005 05:05                   -
+directory-naming/                                  01-Nov-2005 05:03                   -
+directory-network/                                 01-Nov-2005 05:07                   -
+directory-protocols/                               01-Nov-2005 05:09                   -
+directory-shared/                                  01-Nov-2005 05:19                   -
+displaytag/                                        12-Aug-2008 07:35                   -
+ditchnet/                                          24-Nov-2005 06:03                   -
+dk/                                                30-Nov-2016 00:31                   -
+dna/                                               01-Nov-2005 05:21                   -
+dnsjava/                                           01-Nov-2005 05:14                   -
+docbook/                                           16-Jun-2006 18:32                   -
+doccheck/                                          01-Nov-2005 05:10                   -
+dom4j/                                             01-Nov-2005 05:16                   -
+domify/                                            21-Aug-2011 14:31                   -
+dot-index/                                         15-Jul-2012 10:55                   -
+doxia/                                             28-Oct-2005 01:27                   -
+drone/                                             01-Nov-2005 05:03                   -
+drools/                                            31-Jan-2007 18:40                   -
+drools-examples/                                   01-Nov-2005 05:10                   -
+dsh-vocabulary/                                    01-Nov-2005 05:09                   -
+dtdparser/                                         01-Nov-2005 05:15                   -
+dumbster/                                          01-Nov-2005 05:03                   -
+dwr/                                               24-Nov-2005 06:03                   -
+dynaop/                                            01-Nov-2005 05:04                   -
+easyconf/                                          01-Nov-2005 05:19                   -
+easymock/                                          28-Oct-2005 01:27                   -
+ec/                                                26-Jan-2015 11:42                   -
+echo/                                              01-Nov-2005 05:07                   -
+echo3/                                             21-Aug-2011 14:32                   -
+echo3extras/                                       21-Aug-2011 14:32                   -
+eclipse/                                           01-Nov-2005 05:03                   -
+ecs/                                               01-Nov-2005 05:14                   -
+edenlib/                                           01-Nov-2005 05:05                   -
+edtftp/                                            01-Nov-2005 05:16                   -
+edu/                                               30-Nov-2016 00:32                   -
+ee/                                                30-Nov-2016 01:01                   -
+ehcache/                                           28-Oct-2005 01:26                   -
+ejb/                                               06-Dec-2005 20:11                   -
+el-impl/                                           21-Aug-2011 14:32                   -
+emberio/                                           01-Nov-2005 05:17                   -
+emma/                                              01-Nov-2005 05:03                   -
+enterprises/                                       07-Dec-2015 10:38                   -
+ervacon/                                           01-Nov-2005 05:21                   -
+es/                                                30-Nov-2016 01:01                   -
+esper/                                             29-Jan-2008 02:43                   -
+eu/                                                30-Nov-2016 01:03                   -
+eus/                                               27-Apr-2015 10:40                   -
+excalibur/                                         01-Nov-2005 05:06                   -
+excalibur-altrmi/                                  01-Nov-2005 05:05                   -
+excalibur-cli/                                     01-Nov-2005 05:07                   -
+excalibur-collections/                             01-Nov-2005 05:10                   -
+excalibur-component/                               01-Nov-2005 05:10                   -
+excalibur-component-examples/                      01-Nov-2005 05:04                   -
+excalibur-component-tests/                         01-Nov-2005 05:15                   -
+excalibur-concurrent/                              01-Nov-2005 05:07                   -
+excalibur-configuration/                           01-Nov-2005 05:09                   -
+excalibur-containerkit/                            01-Nov-2005 05:03                   -
+excalibur-datasource/                              01-Nov-2005 05:03                   -
+excalibur-event/                                   01-Nov-2005 05:03                   -
+excalibur-extension/                               01-Nov-2005 05:04                   -
+excalibur-fortress/                                01-Nov-2005 05:04                   -
+excalibur-i18n/                                    01-Nov-2005 05:15                   -
+excalibur-instrument/                              01-Nov-2005 05:10                   -
+excalibur-instrument-manager/                      01-Nov-2005 05:08                   -
+excalibur-instrument-manager-interfaces/           01-Nov-2005 05:07                   -
+excalibur-io/                                      01-Nov-2005 05:11                   -
+excalibur-lifecycle/                               01-Nov-2005 05:15                   -
+excalibur-logger/                                  01-Nov-2005 05:04                   -
+excalibur-monitor/                                 01-Nov-2005 05:15                   -
+excalibur-mpool/                                   01-Nov-2005 05:05                   -
+excalibur-naming/                                  01-Nov-2005 05:14                   -
+excalibur-pool/                                    01-Nov-2005 05:03                   -
+excalibur-sourceresolve/                           01-Nov-2005 05:14                   -
+excalibur-store/                                   01-Nov-2005 05:09                   -
+excalibur-thread/                                  01-Nov-2005 05:07                   -
+excalibur-util/                                    01-Nov-2005 05:15                   -
+excalibur-xmlutil/                                 01-Nov-2005 05:04                   -
+exist/                                             01-Nov-2005 05:12                   -
+exml/                                              01-Nov-2005 05:16                   -
+exo/                                               01-Nov-2005 00:35                   -
+exolabcore/                                        01-Nov-2005 00:35                   -
+exteca/                                            01-Nov-2005 00:35                   -
+external/                                          01-Aug-2014 20:15                   -
+farm/                                              26-Oct-2015 11:01                   -
+fastutil/                                          01-Nov-2005 00:35                   -
+fesi/                                              01-Nov-2005 00:35                   -
+fi/                                                30-Nov-2016 01:13                   -
+findbugs/                                          06-Nov-2006 01:05                   -
+fish/                                              18-May-2015 10:45                   -
+flox/                                              01-Nov-2005 00:35                   -
+flux/                                              21-Aug-2011 14:32                   -
+fm/                                                22-Feb-2016 09:57                   -
+foo/                                               30-Nov-2016 01:49                   -
+foo3/                                              21-Nov-2016 12:45                   -
+fop/                                               01-Nov-2005 00:35                   -
+forehead/                                          01-Nov-2005 00:35                   -
+formproc/                                          01-Nov-2005 00:34                   -
+foundation/                                        30-Nov-2016 01:49                   -
+foxtrot/                                           12-Nov-2011 11:19                   -
+fr/                                                30-Nov-2016 01:49                   -
+freebxml/                                          01-Nov-2005 00:34                   -
+freemarker/                                        01-Nov-2005 00:35                   -
+frl/                                               14-Sep-2015 11:30                   -
+fulcrum/                                           01-Nov-2005 00:35                   -
+ga/                                                30-Nov-2016 02:02                   -
+gabriel/                                           01-Nov-2005 00:35                   -
+gbean/                                             01-Nov-2005 00:35                   -
+generama/                                          17-Jul-2008 20:56                   -
+genjar/                                            01-Nov-2005 00:34                   -
+genjava/                                           01-Nov-2005 00:35                   -
+geronimo/                                          08-Jan-2007 15:55                   -
+geronimo-spec/                                     01-Nov-2005 00:35                   -
+gg/                                                12-May-2012 09:05                   -
+github/                                            30-Nov-2016 02:04                   -
+glassfish/                                         21-Aug-2011 14:33                   -
+global/                                            30-Nov-2016 02:04                   -
+gnu/                                               21-Aug-2011 14:33                   -
+gnu-regexp/                                        01-Nov-2005 00:35                   -
+gov/                                               30-Nov-2016 02:04                   -
+gr/                                                30-Nov-2016 02:18                   -
+graphlayout/                                       01-Nov-2005 00:35                   -
+grizzly/                                           21-Aug-2011 14:33                   -
+grizzly-cachetest/                                 21-Aug-2011 14:33                   -
+groovy/                                            30-Apr-2007 21:29                   -
+groovy-xmlrpc/                                     26-May-2006 21:50                   -
+gs/                                                08-Sep-2012 07:49                   -
+gsbase/                                            01-Nov-2005 00:35                   -
+guru/                                              26-Jan-2015 11:51                   -
+hessian/                                           01-Nov-2005 00:34                   -
+hibernate/                                         26-Dec-2008 14:12                   -
+hivemind/                                          01-Nov-2005 00:34                   -
+hm/                                                01-Aug-2014 20:22                   -
+howl/                                              01-Nov-2005 00:35                   -
+hr/                                                30-Nov-2016 02:20                   -
+hsqldb/                                            28-Oct-2005 01:27                   -
+htmlunit/                                          01-Nov-2005 00:34                   -
+httpcomponents-httpcore/                           02-Jul-2007 18:15                   -
+httpunit/                                          28-Oct-2005 01:26                   -
+hu/                                                30-Nov-2016 02:20                   -
+hudson/                                            21-Aug-2011 14:34                   -
+ical4j/                                            01-Nov-2005 00:34                   -
+icu/                                               03-Nov-2005 01:12                   -
+icu4j/                                             03-Nov-2005 21:39                   -
+id/                                                30-Nov-2016 02:21                   -
+idb/                                               01-Nov-2005 00:35                   -
+ie/                                                21-Dec-2015 09:56                   -
+iirekm/                                            21-Aug-2011 14:34                   -
+il/                                                30-Nov-2016 02:21                   -
+im/                                                30-Nov-2016 02:21                   -
+in/                                                30-Nov-2016 02:50                   -
+info/                                              30-Nov-2016 02:51                   -
+informa/                                           01-Nov-2005 00:34                   -
+innig/                                             01-Nov-2005 00:35                   -
+int/                                               24-Aug-2014 05:19                   -
+io/                                                30-Nov-2016 03:02                   -
+ir/                                                30-Nov-2016 13:35                   -
+is/                                                03-Nov-2014 11:18                   -
+isorelax/                                          01-Nov-2005 00:35                   -
+it/                                                30-Nov-2016 13:37                   -
+itext/                                             01-Nov-2005 00:35                   -
+ivory/                                             01-Nov-2005 00:35                   -
+izpack/                                            01-Nov-2005 00:35                   -
+jaas/                                              01-Nov-2005 00:35                   -
+jackcess/                                          01-Nov-2005 00:35                   -
+jackson/                                           06-Sep-2008 07:58                   -
+jacl/                                              01-Nov-2005 00:35                   -
+jaf/                                               28-Oct-2005 01:27                   -
+jaimbot/                                           01-Nov-2005 00:35                   -
+jakarta-regexp/                                    01-Nov-2005 00:34                   -
+jalopy/                                            01-Nov-2005 00:35                   -
+james/                                             01-Nov-2005 00:35                   -
+janino/                                            01-Nov-2005 00:35                   -
+jardiff/                                           14-Feb-2006 01:31                   -
+jarjar/                                            01-Nov-2005 00:35                   -
+jarsync/                                           01-Nov-2005 00:35                   -
+jasper-jsr199/                                     21-Aug-2011 14:37                   -
+jasperreports/                                     01-Nov-2005 00:35                   -
+java2html/                                         01-Nov-2005 00:34                   -
+java3d/                                            01-Nov-2005 00:35                   -
+java_cup/                                          01-Aug-2014 21:21                   -
+javacc/                                            01-Nov-2005 00:34                   -
+javaconfig/                                        01-Nov-2005 00:35                   -
+javadb/                                            21-Aug-2011 14:37                   -
+javadoc/                                           31-Oct-2005 19:40                   -
+javaee/                                            21-Aug-2011 14:37                   -
+javagroups/                                        01-Nov-2005 05:14                   -
+javainetlocator/                                   01-Nov-2005 05:03                   -
+javamail/                                          01-Nov-2005 05:07                   -
+javancss/                                          01-Nov-2005 05:19                   -
+javanettasks/                                      21-Aug-2011 14:37                   -
+javassist/                                         01-Apr-2008 07:08                   -
+javassist /                                        04-Apr-2008 17:18                   -
+javatar/                                           01-Nov-2005 05:19                   -
+javax/                                             20-Jul-2015 11:38                   -
+javazoom/                                          10-Nov-2012 09:25                   -
+javolution/                                        21-Aug-2011 17:05                   -
+jawin/                                             24-Nov-2005 06:03                   -
+jaxb/                                              21-Aug-2011 14:37                   -
+jaxen/                                             19-Oct-2006 19:23                   -
+jaxme/                                             06-Nov-2006 01:06                   -
+jaxr-ra/                                           21-Aug-2011 14:37                   -
+jblanket/                                          01-Nov-2005 05:11                   -
+jboss/                                             27-Apr-2013 08:15                   -
+jca/                                               01-Nov-2005 05:03                   -
+jcache/                                            01-Nov-2005 05:03                   -
+jcharts/                                           06-Dec-2007 02:46                   -
+jcifs/                                             29-Apr-2008 16:16                   -
+jcom/                                              24-Nov-2005 06:03                   -
+jcommon/                                           28-Oct-2005 01:27                   -
+jcoverage/                                         01-Nov-2005 05:20                   -
+jcs/                                               01-Nov-2005 05:03                   -
+jcs-javagroups/                                    01-Nov-2005 05:18                   -
+jcvsii/                                            01-Nov-2005 05:03                   -
+jdbc/                                              28-Oct-2005 01:26                   -
+jdbm/                                              01-Nov-2005 05:13                   -
+jdepend/                                           01-Nov-2005 05:03                   -
+jdiff/                                             01-Nov-2005 05:19                   -
+jdo/                                               01-Nov-2005 05:03                   -
+jdom/                                              28-Oct-2005 01:27                   -
+jdring/                                            01-Nov-2005 05:09                   -
+jdsl/                                              01-Nov-2005 05:04                   -
+jen/                                               21-Aug-2011 14:38                   -
+jencks/                                            01-Nov-2005 05:13                   -
+jep/                                               01-Nov-2005 05:03                   -
+jepi/                                              21-Aug-2011 14:38                   -
+jersey/                                            21-Aug-2011 14:38                   -
+jetty/                                             20-Oct-2006 15:24                   -
+jexcelapi/                                         06-Nov-2006 01:07                   -
+jface/                                             01-Nov-2005 05:09                   -
+jfree/                                             13-Dec-2006 19:51                   -
+jfreechart/                                        01-Nov-2005 05:15                   -
+jgen/                                              01-Nov-2005 05:20                   -
+jgoodies/                                          01-Nov-2005 05:13                   -
+jgraph/                                            01-Nov-2005 05:07                   -
+jgrapht/                                           01-Nov-2005 05:07                   -
+jgroups/                                           01-Nov-2005 05:04                   -
+jhunlang/                                          01-Nov-2005 05:04                   -
+jini/                                              10-Dec-2005 02:18                   -
+jintention/                                        21-Aug-2011 14:38                   -
+jisp/                                              01-Nov-2005 05:10                   -
+jivesoftware/                                      01-Nov-2005 05:03                   -
+jlibdiff/                                          01-Nov-2005 05:03                   -
+jline/                                             19-Oct-2006 19:23                   -
+jmagick/                                           21-Aug-2011 14:38                   -
+jmaki/                                             21-Aug-2011 14:38                   -
+jmdns/                                             01-Nov-2005 05:14                   -
+jmimemagic/                                        01-Nov-2005 05:14                   -
+jmml/                                              01-Nov-2005 05:12                   -
+jmock/                                             28-Oct-2005 01:26                   -
+jms/                                               28-Oct-2005 01:27                   -
+jmscts/                                            01-Nov-2005 05:09                   -
+jmsn/                                              01-Nov-2005 05:16                   -
+joda-time/                                         15-Nov-2009 14:12                   -
+john-test/                                         29-May-2008 08:01                   -
+jotm/                                              01-Nov-2005 05:20                   -
+jp/                                                30-Nov-2016 13:53                   -
+jparsec/                                           26-Aug-2006 17:55                   -
+jpl/                                               10-Nov-2012 09:26                   -
+jpox/                                              21-Jan-2008 06:44                   -
+jpox-dbcp/                                         13-Mar-2007 21:30                   -
+jpox-enhancer/                                     13-Mar-2007 21:30                   -
+jpox-java5/                                        13-Mar-2007 21:30                   -
+jrexx/                                             01-Nov-2005 05:11                   -
+jrms/                                              01-Nov-2005 05:19                   -
+jrobin/                                            01-Nov-2005 05:06                   -
+jruby/                                             21-Aug-2007 18:14                   -
+jsch/                                              28-Oct-2005 01:26                   -
+jsf-extensions/                                    21-Aug-2011 14:38                   -
+jspapi/                                            28-Oct-2005 01:26                   -
+jsptags/                                           01-Nov-2005 05:15                   -
+jstl/                                              28-Oct-2005 01:26                   -
+jstyle/                                            01-Nov-2005 05:09                   -
+jta/                                               28-Oct-2005 01:26                   -
+jtds/                                              20-Jan-2006 12:18                   -
+jtidy/                                             28-Oct-2005 01:27                   -
+juddi/                                             01-Nov-2005 05:03                   -
+jug/                                               01-Nov-2005 05:12                   -
+jung/                                              01-Nov-2005 05:03                   -
+junit/                                             10-May-2009 13:17                   -
+junit-addons/                                      28-Oct-2005 01:27                   -
+junit-doclet/                                      01-Nov-2005 05:19                   -
+junitperf/                                         01-Nov-2005 05:21                   -
+juno/                                              21-Aug-2011 14:38                   -
+jwebunit/                                          01-Nov-2005 05:10                   -
+jxta/                                              01-Nov-2005 05:10                   -
+jython/                                            01-Nov-2005 05:04                   -
+kawa/                                              01-Nov-2005 05:04                   -
+kg/                                                23-Feb-2013 09:19                   -
+kohsuke/                                           21-Aug-2011 14:38                   -
+kr/                                                30-Nov-2016 13:56                   -
+kxml/                                              01-Nov-2005 05:09                   -
+kxml2/                                             01-Nov-2005 05:07                   -
+kz/                                                04-Jan-2016 09:50                   -
+la/                                                20-Apr-2015 11:09                   -
+ldapd-common/                                      01-Nov-2005 05:21                   -
+ldapsdk/                                           01-Nov-2005 05:11                   -
+li/                                                30-Nov-2016 14:03                   -
+life/                                              30-Nov-2016 14:04                   -
+lingo/                                             01-Nov-2005 05:21                   -
+link/                                              07-Dec-2015 11:24                   -
+locc/                                              01-Nov-2005 05:11                   -
+log4j/                                             28-Nov-2007 21:22                   -
+log4unit/                                          01-Nov-2005 05:20                   -
+logkit/                                            02-Nov-2005 09:29                   -
+loom/                                              01-Nov-2005 05:21                   -
+lpg/                                               16-Nov-2013 10:06                   -
+lt/                                                19-Jan-2013 09:12                   -
+lucene/                                            01-Nov-2005 05:04                   -
+lv/                                                22-Feb-2016 10:49                   -
+ly/                                                29-Sep-2014 10:35                   -
+ma/                                                30-Nov-2016 14:08                   -
+magicGball/                                        01-Nov-2005 05:03                   -
+maps/                                              21-Aug-2011 14:38                   -
+market/                                            12-Oct-2015 22:45                   -
+marmalade/                                         21-Jul-2006 17:02                   -
+math/                                              23-Nov-2013 10:01                   -
+maven/                                             06-Nov-2006 01:08                   -
+maven-integration-test-helper/                     11-Jun-2011 11:01                   -
+maven-javanet-plugin/                              21-Aug-2011 14:39                   -
+maven-new/                                         01-Nov-2005 05:06                   -
+maven-plugins/                                     06-Nov-2006 01:07                   -
+maven-proxy/                                       01-Nov-2005 05:03                   -
+maven-taglib/                                      01-Nov-2005 05:19                   -
+maven-torque-plugin/                               01-Nov-2005 05:03                   -
+maven-validator/                                   01-Nov-2005 05:07                   -
+maven-xdoclet2-plugin/                             01-Nov-2005 05:19                   -
+maxq/                                              01-Nov-2005 05:09                   -
+mckoi/                                             01-Nov-2005 05:12                   -
+md/                                                30-Nov-2016 14:09                   -
+me/                                                30-Nov-2016 14:09                   -
+merlin/                                            01-Nov-2005 05:02                   -
+merlin-developer/                                  01-Nov-2005 05:19                   -
+merlin-tutorial/                                   01-Nov-2005 05:15                   -
+messenger/                                         01-Nov-2005 05:08                   -
+metaclass/                                         01-Nov-2005 05:08                   -
+mevenide/                                          01-Nov-2005 05:14                   -
+microcontainer/                                    01-Nov-2005 05:16                   -
+middlegen/                                         01-Nov-2005 05:03                   -
+mil/                                               30-Nov-2016 14:19                   -
+milyn/                                             16-May-2007 17:40                   -
+ml/                                                30-Nov-2016 14:20                   -
+mm/                                                01-Nov-2005 05:12                   -
+mm-mysql/                                          01-Nov-2005 05:16                   -
+mobi/                                              30-Nov-2016 14:22                   -
+mockcreator/                                       01-Nov-2005 05:09                   -
+mockit/                                            21-Aug-2011 14:39                   -
+mockmaker/                                         01-Nov-2005 05:07                   -
+mockobjects/                                       01-Nov-2005 05:05                   -
+mockrunner/                                        24-Nov-2005 06:03                   -
+modello/                                           01-Nov-2005 05:12                   -
+mrj/                                               01-Nov-2005 05:14                   -
+ms/                                                01-Aug-2014 21:28                   -
+mstor/                                             01-Nov-2005 05:14                   -
+msv/                                               01-Nov-2005 05:15                   -
+mule/                                              10-Apr-2007 13:34                   -
+muse/                                              01-Nov-2005 05:11                   -
+mx/                                                22-Feb-2016 10:54                   -
+mx4j/                                              01-Nov-2005 05:14                   -
+myfaces/                                           21-Nov-2005 13:21                   -
+mysql/                                             15-Oct-2011 10:12                   -
+name/                                              30-Nov-2016 14:22                   -
+nanning/                                           01-Nov-2005 05:11                   -
+nanocontainer/                                     14-Jun-2006 10:28                   -
+nekohtml/                                          01-Jun-2008 16:25                   -
+neo/                                               01-Nov-2005 05:08                   -
+net/                                               30-Nov-2016 14:23                   -
+netbeans/                                          01-Nov-2005 05:04                   -
+new/                                               21-Aug-2011 15:09                   -
+nf/                                                02-Mar-2013 10:13                   -
+ng/                                                30-Nov-2016 16:55                   -
+ninja/                                             16-Nov-2015 14:52                   -
+nl/                                                30-Nov-2016 16:55                   -
+no/                                                30-Nov-2016 17:07                   -
+norbert/                                           01-Nov-2005 05:03                   -
+np/                                                17-Nov-2014 12:32                   -
+nsuml/                                             01-Nov-2005 05:16                   -
+nu/                                                30-Nov-2016 17:15                   -
+nz/                                                30-Nov-2016 17:15                   -
+oauth/                                             26-Feb-2010 19:44                   -
+odmg/                                              28-Oct-2005 01:27                   -
+ognl/                                              20-Jun-2007 20:09                   -
+ojb/                                               01-Nov-2005 05:11                   -
+ojdbc/                                             28-Oct-2005 01:26                   -
+old/                                               01-Nov-2005 05:13                   -
+one/                                               30-Nov-2015 14:42                   -
+oness/                                             01-Nov-2005 05:13                   -
+online/                                            30-Nov-2016 17:23                   -
+open/                                              21-Aug-2011 15:33                   -
+open-esb/                                          21-Aug-2011 15:33                   -
+opencypher/                                        30-Nov-2016 17:23                   -
+openejb/                                           07-May-2006 00:35                   -
+openim/                                            01-Nov-2005 05:12                   -
+openjms/                                           01-Nov-2005 05:03                   -
+opennms/                                           01-Nov-2005 05:06                   -
+opensymphony/                                      19-Feb-2009 14:07                   -
+oracle/                                            21-Aug-2011 15:33                   -
+org/                                               30-Nov-2016 17:23                   -
+org.elasticsearch/                                 30-Nov-2016 17:23                   -
+org.elasticsearch.client/                          30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.integ-test-zip/     30-Nov-2016 17:23                   -
+org.elasticsearch.distribution.zip/                30-Nov-2016 17:23                   -
+org.elasticsearch.gradle/                          30-Nov-2016 17:23                   -
+org.elasticsearch.plugin/                          30-Nov-2016 17:23                   -
+org.elasticsearch.test/                            30-Nov-2016 17:23                   -
+oro/                                               28-Oct-2005 01:27                   -
+oscube/                                            01-Nov-2005 05:02                   -
+p2psockets/                                        01-Nov-2005 05:15                   -
+p6spy/                                             01-Nov-2005 05:05                   -
+patterntesting/                                    01-Nov-2005 05:05                   -
+payload/                                           01-Nov-2005 05:03                   -
+pcj/                                               01-Nov-2005 05:09                   -
+pdfbox/                                            01-Nov-2005 05:16                   -
+pe/                                                21-Nov-2016 12:45                   -
+penguin/                                           01-Nov-2005 05:10                   -
+petridish/                                         01-Nov-2005 05:06                   -
+ph/                                                30-Jun-2012 17:32                   -
+piccolo/                                           01-Nov-2005 05:03                   -
+picocontainer/                                     14-Jun-2006 10:25                   -
+picounit/                                          01-Nov-2005 05:10                   -
+pircbot/                                           01-Nov-2005 05:06                   -
+pitt/                                              07-Dec-2013 15:12                   -
+pl/                                                25-Jan-2016 18:00                   -
+plexus/                                            04-Jan-2007 19:16                   -
+plj/                                               01-Nov-2005 05:14                   -
+plugin/                                            01-Nov-2005 05:07                   -
+pluto-container/                                   01-Nov-2005 05:07                   -
+pmd/                                               10-Aug-2008 09:08                   -
+pnuts/                                             22-Aug-2011 09:13                   -
+poi/                                               28-Oct-2005 23:26                   -
+poolman/                                           01-Nov-2005 05:20                   -
+portlet-api/                                       01-Nov-2005 05:10                   -
+postgresql/                                        01-Nov-2005 05:15                   -
+prevayler/                                         01-Nov-2005 05:13                   -
+pro/                                               03-Nov-2015 02:37                   -
+proctor/                                           22-Aug-2011 09:13                   -
+profiler/                                          01-Nov-2005 05:11                   -
+proxool/                                           28-Oct-2005 01:27                   -
+proxytoys/                                         01-Nov-2005 05:04                   -
+pt/                                                15-Dec-2015 03:32                   -
+pubscribe/                                         01-Nov-2005 05:11                   -
+pull-parser/                                       28-Oct-2005 01:27                   -
+pw/                                                26-Oct-2013 13:30                   -
+qdox/                                              28-Oct-2005 01:27                   -
+qfork/                                             01-Nov-2005 05:14                   -
+quartz/                                            01-Nov-2005 05:16                   -
+quartz-jboss/                                      26-Feb-2010 21:25                   -
+quartz-oracle/                                     26-Feb-2010 21:25                   -
+quartz-weblogic/                                   26-Feb-2010 21:25                   -
+quilt/                                             01-Nov-2005 05:12                   -
+radeox/                                            01-Nov-2005 05:14                   -
+re/                                                17-Aug-2014 12:17                   -
+readline/                                          01-Nov-2005 05:10                   -
+red/                                               21-Nov-2016 12:45                   -
+redhill/                                           01-Nov-2005 05:03                   -
+redis/                                             09-Oct-2010 07:48                   -
+redmine/                                           22-Aug-2011 09:13                   -
+regexp/                                            19-Oct-2006 19:23                   -
+relaxngDatatype/                                   01-Nov-2005 05:15                   -
+ren/                                               19-Oct-2015 23:59                   -
+reportrunner/                                      01-Nov-2005 05:15                   -
+rest/                                              21-Nov-2016 12:45                   -
+rhino/                                             01-Nov-2005 05:11                   -
+ro/                                                21-Dec-2015 16:56                   -
+robo-guice/                                        22-Aug-2011 09:13                   -
+roboguice/                                         22-Aug-2011 09:13                   -
+rocks/                                             20-Oct-2014 18:43                   -
+roller/                                            22-Aug-2011 09:13                   -
+rome/                                              22-Aug-2011 09:13                   -
+rs/                                                01-Dec-2014 19:54                   -
+rss4j/                                             01-Nov-2005 05:08                   -
+rsslibj/                                           01-Nov-2005 05:04                   -
+ru/                                                14-Mar-2016 15:50                   -
+rubygems/                                          27-Oct-2015 00:40                   -
+run/                                               21-Nov-2016 12:45                   -
+sablecc/                                           01-Nov-2005 05:04                   -
+sax/                                               01-Nov-2005 05:11                   -
+saxon/                                             19-Oct-2006 19:23                   -
+saxpath/                                           28-Oct-2005 01:26                   -
+sc/                                                15-Jun-2015 21:26                   -
+science/                                           21-Nov-2016 12:45                   -
+scout/                                             29-Oct-2005 08:00                   -
+scraping-engine/                                   01-Nov-2005 05:07                   -
+se/                                                11-Jan-2016 15:55                   -
+securityfilter/                                    01-Nov-2005 05:13                   -
+servicemix/                                        25-Mar-2006 00:55                   -
+servicemix-ws/                                     01-Nov-2005 05:15                   -
+servletapi/                                        28-Oct-2005 23:26                   -
+servlets/                                          01-Nov-2005 05:12                   -
+setpoint/                                          06-Nov-2006 01:09                   -
+sfx4j/                                             22-Aug-2011 09:14                   -
+sg/                                                21-Nov-2016 12:45                   -
+sh/                                                10-Nov-2015 04:31                   -
+shellix/                                           22-Aug-2011 09:14                   -
+shocks/                                            01-Nov-2005 05:11                   -
+si/                                                15-Feb-2016 16:33                   -
+sillyexceptions/                                   01-Nov-2005 05:04                   -
+simple-jms/                                        09-Dec-2005 01:32                   -
+simple-jndi/                                       01-Nov-2005 05:19                   -
+sk/                                                15-Feb-2016 16:33                   -
+skaringa/                                          01-Nov-2005 05:09                   -
+skinlf/                                            01-Nov-2005 05:03                   -
+slide/                                             01-Nov-2005 05:14                   -
+smartrics/                                         15-Dec-2012 12:57                   -
+soap/                                              01-Nov-2005 05:04                   -
+software/                                          14-Mar-2016 15:54                   -
+soimp/                                             22-Aug-2011 09:14                   -
+solarisrealm/                                      22-Aug-2011 09:14                   -
+solutions/                                         20-Oct-2015 00:09                   -
+space/                                             21-Nov-2016 12:45                   -
+speexx/                                            01-Nov-2005 05:04                   -
+spice/                                             01-Nov-2005 05:03                   -
+spring/                                            01-Nov-2005 05:07                   -
+springframework/                                   01-Nov-2005 05:11                   -
+springmodules/                                     19-Jun-2006 22:22                   -
+sqlline/                                           09-Mar-2015 21:41                   -
+sshtools/                                          01-Nov-2005 05:03                   -
+sslext/                                            01-Nov-2005 05:04                   -
+st/                                                10-Aug-2015 22:33                   -
+stapler/                                           22-Aug-2011 09:15                   -
+statcvs/                                           01-Nov-2005 05:07                   -
+stax/                                              06-Nov-2006 01:09                   -
+stax-utils/                                        01-Nov-2005 05:11                   -
+stratum/                                           01-Nov-2005 05:14                   -
+stream/                                            21-Nov-2016 12:45                   -
+struts/                                            01-Nov-2005 05:15                   -
+struts-menu/                                       01-Nov-2005 05:03                   -
+strutstestcase/                                    01-Nov-2005 05:12                   -
+studio/                                            21-Nov-2016 12:45                   -
+stxx/                                              01-Nov-2005 05:05                   -
+su/                                                10-Aug-2014 15:19                   -
+subpersistence/                                    01-Nov-2005 05:09                   -
+subshell/                                          01-Nov-2005 05:03                   -
+suiterunner/                                       01-Nov-2005 05:09                   -
+surefire/                                          28-Oct-2005 01:26                   -
+swarmcache/                                        28-Oct-2005 01:26                   -
+swt/                                               01-Nov-2005 05:05                   -
+systems/                                           18-Jan-2016 16:33                   -
+sysunit/                                           01-Nov-2005 05:15                   -
+tablelayout/                                       01-Nov-2005 05:14                   -
+tagalog/                                           01-Nov-2005 05:16                   -
+tagishauth/                                        01-Nov-2005 05:03                   -
+taglibrarydoc/                                     01-Nov-2005 05:07                   -
+taglibs/                                           01-Nov-2005 05:06                   -
+tagsoup/                                           05-Nov-2005 01:42                   -
+tambora/                                           01-Nov-2005 05:20                   -
+tanukisoft/                                        07-Mar-2008 02:07                   -
+tapestry/                                          01-Nov-2005 05:04                   -
+tclib/                                             01-Nov-2005 05:07                   -
+tec/                                               23-Mar-2015 21:07                   -
+tech/                                              22-Feb-2016 17:58                   -
+technology/                                        15-Dec-2015 03:41                   -
+textarea/                                          01-Nov-2005 05:16                   -
+th/                                                13-Oct-2015 11:58                   -
+thaiopensource/                                    19-Oct-2006 19:23                   -
+tiffrenderer/                                      01-Nov-2005 05:09                   -
+tjdo/                                              01-Nov-2005 05:03                   -
+tk/                                                11-Jan-2016 15:58                   -
+tl/                                                13-Jul-2013 12:50                   -
+tmporb/                                            01-Nov-2005 05:09                   -
+to/                                                25-Jan-2016 18:06                   -
+tokyo/                                             21-Nov-2016 12:45                   -
+tomcat/                                            24-Jan-2008 04:19                   -
+tomcat-util/                                       01-Nov-2005 05:20                   -
+tonic/                                             08-Nov-2005 05:35                   -
+tools/                                             29-Feb-2016 17:11                   -
+top/                                               08-Feb-2016 18:28                   -
+toplink/                                           22-Aug-2011 09:16                   -
+torque/                                            11-Jan-2008 22:47                   -
+torque-gen/                                        01-Nov-2005 05:04                   -
+touchstone/                                        01-Nov-2005 05:10                   -
+tr/                                                15-Dec-2015 03:41                   -
+traer/                                             07-Apr-2012 17:18                   -
+trail-taglib/                                      01-Nov-2005 05:04                   -
+tranql/                                            01-Nov-2005 05:10                   -
+travel/                                            04-May-2015 22:09                   -
+trove/                                             01-Nov-2005 05:08                   -
+turbine/                                           01-Nov-2005 05:04                   -
+tv/                                                18-Jan-2016 16:34                   -
+tw/                                                18-May-2015 21:53                   -
+tyrex/                                             01-Nov-2005 05:14                   -
+ua/                                                29-Feb-2016 17:11                   -
+uaihebert/                                         23-Feb-2013 13:20                   -
+ubique/                                            01-Nov-2005 05:15                   -
+ug/                                                25-Jan-2016 18:07                   -
+uispec4j/                                          01-Nov-2005 05:07                   -
+uk/                                                10-Aug-2015 22:35                   -
+uno/                                               01-Dec-2015 04:36                   -
+urbanophile/                                       01-Nov-2005 05:03                   -
+urlrewrite/                                        24-Nov-2005 06:03                   -
+us/                                                18-Jan-2016 16:35                   -
+uy/                                                24-Aug-2015 23:36                   -
+vc/                                                28-Dec-2015 15:38                   -
+vdoclet/                                           01-Nov-2005 05:11                   -
+velocity/                                          29-Apr-2007 21:29                   -
+velocity-anakia/                                   29-Apr-2007 21:29                   -
+velocity-dvsl/                                     01-Nov-2005 05:12                   -
+velocity-tools/                                    01-Nov-2005 05:10                   -
+village/                                           01-Nov-2005 05:04                   -
+vn/                                                21-Nov-2016 12:45                   -
+vu/                                                20-Jul-2013 12:57                   -
+wadi/                                              01-Nov-2005 05:15                   -
+wang/                                              10-Aug-2015 22:36                   -
+webmacro/                                          01-Nov-2005 05:12                   -
+website/                                           22-Feb-2016 18:03                   -
+webtest/                                           01-Nov-2005 05:19                   -
+werken-xpath/                                      28-Oct-2005 01:26                   -
+werkflow/                                          01-Nov-2005 05:16                   -
+werkz/                                             01-Nov-2005 05:08                   -
+westhawk/                                          01-Nov-2005 05:18                   -
+wf/                                                10-Nov-2014 19:54                   -
+which/                                             01-Nov-2005 05:16                   -
+wicket/                                            11-Aug-2008 15:44                   -
+wiki/                                              22-Feb-2016 18:03                   -
+win/                                               21-Nov-2016 12:45                   -
+woodstox/                                          21-Nov-2007 04:35                   -
+work/                                              18-Jan-2016 16:37                   -
+works/                                             22-Feb-2016 18:03                   -
+wrapper/                                           01-Nov-2005 05:14                   -
+ws/                                                25-Jan-2016 18:11                   -
+ws-commons/                                        19-Sep-2006 14:21                   -
+ws-commons-java5/                                  01-Nov-2005 05:03                   -
+ws-commons-util/                                   01-Nov-2005 05:16                   -
+ws-scout/                                          18-Feb-2006 13:32                   -
+wsdl4j/                                            01-Nov-2005 05:07                   -
+wsrf/                                              01-Nov-2005 05:08                   -
+wss4j/                                             02-May-2006 20:32                   -
+wstx/                                              01-Nov-2005 05:09                   -
+wurfl/                                             01-Nov-2005 05:14                   -
+wutka/                                             01-Nov-2005 05:21                   -
+xajile/                                            03-Aug-2009 09:25                   -
+xalan/                                             30-Sep-2008 08:02                   -
+xbean/                                             04-Jan-2006 17:31                   -
+xdoclet/                                           17-Jul-2008 21:29                   -
+xdoclet-plugins/                                   02-Jul-2006 21:14                   -
+xerces/                                            19-Oct-2006 19:23                   -
+xercesjarv/                                        01-Nov-2005 05:06                   -
+xfire/                                             06-Nov-2006 01:09                   -
+xfire-root/                                        01-Nov-2005 05:03                   -
+xin/                                               21-Nov-2016 12:45                   -
+xjavadoc/                                          01-Nov-2005 05:14                   -
+xml-apis/                                          22-Dec-2006 13:37                   -
+xml-resolver/                                      01-Nov-2005 05:11                   -
+xml-security/                                      19-Oct-2006 19:23                   -
+xmlbeans/                                          03-Jul-2007 16:43                   -
+xmldb/                                             01-Nov-2005 05:12                   -
+xmlenc/                                            01-Nov-2005 05:19                   -
+xmlmind/                                           01-Nov-2005 05:21                   -
+xmlpull/                                           01-Nov-2005 05:21                   -
+xmlrpc/                                            25-Jun-2006 02:41                   -
+xmlrpc-helma/                                      01-Nov-2005 05:03                   -
+xmlunit/                                           15-Sep-2008 23:50                   -
+xmlwise/                                           27-Oct-2012 10:59                   -
+xmlwriter/                                         01-Nov-2005 05:04                   -
+xom/                                               19-Oct-2006 19:23                   -
+xpp3/                                              28-Oct-2005 01:26                   -
+xsddoc/                                            01-Nov-2005 05:19                   -
+xsdlib/                                            01-Nov-2005 05:04                   -
+xstream/                                           27-Nov-2006 21:45                   -
+xtc/                                               07-Apr-2012 17:20                   -
+xtiff-jai/                                         01-Nov-2005 05:10                   -
+xxl/                                               01-Nov-2005 05:12                   -
+xyz/                                               08-Feb-2016 18:33                   -
+yan/                                               13-Jan-2006 21:31                   -
+ymsg/                                              01-Nov-2005 05:04                   -
+yom/                                               01-Nov-2005 05:08                   -
+za/                                                25-May-2013 12:39                   -
+zone/                                              26-Jan-2015 23:05                   -
+94a8262a403880.properties                          03-Feb-2015 07:36                 301
+94a8262a403880.properties.md5                      20-May-2015 05:24                  32
+94a8262a403880.properties.sha1                     20-May-2015 05:24                  40
+9e9bbc30f020cf.properties                          03-Oct-2014 19:03                 310
+9e9bbc30f020cf.properties.md5                      02-Nov-2014 16:27                  32
+9e9bbc30f020cf.properties.sha1                     02-Nov-2014 16:27                  40
+archetype-catalog.xml                              27-Nov-2016 13:20             5385400
+archetype-catalog.xml.md5                          27-Nov-2016 13:20                  32
+archetype-catalog.xml.sha1                         27-Nov-2016 13:20                  40
+fb69c44c24b38.properties                           17-Apr-2014 13:29                 307
+fb69c44c24b38.properties.md5                       02-Nov-2014 14:37                  32
+fb69c44c24b38.properties.sha1                      02-Nov-2014 14:37                  40
+last_updated.txt                                   28-Nov-2016 06:55                  29
+robots.txt                                         10-Nov-2009 12:12                  26
+server.txt                                         08-Nov-2014 19:04                 207
+

+ diff --git a/logs/application.log b/logs/application.log new file mode 100644 index 00000000..bc020166 Binary files /dev/null and b/logs/application.log differ diff --git a/src/main/java/track/container/Container.java b/src/main/java/track/container/Container.java index 36c4bd9d..3a70eb05 100644 --- a/src/main/java/track/container/Container.java +++ b/src/main/java/track/container/Container.java @@ -1,8 +1,21 @@ package track.container; +import java.beans.PropertyEditor; +import java.beans.PropertyEditorManager; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Field; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import jdk.nashorn.internal.runtime.regexp.joni.exception.ValueException; import track.container.config.Bean; +import track.container.config.InvalidConfigurationException; +import track.container.config.Property; +import track.container.config.ValueType; + +import static org.apache.log4j.config.PropertyPrinter.capitalize; /** * Основной класс контейнера @@ -10,25 +23,81 @@ */ public class Container { + private Map beanById; + private Map beanByClassName; + private Map objById; // Реализуйте этот конструктор, используется в тестах! public Container(List beans) { - + beanById = new HashMap<>(); + beanByClassName = new HashMap<>(); + objById = new HashMap<>(); + for (Bean bean : beans) { + beanById.put(bean.getId(), bean); + beanByClassName.put(bean.getClassName(), bean); + } } /** * Вернуть объект по имени бина из конфига * Например, Car car = (Car) container.getById("carBean") */ - public Object getById(String id) { - return null; + public Object getById(String id) throws InvalidConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException { + Object object = objById.get(id); + if (object == null) { + Bean bean = beanById.get(id); + if (bean != null) { + object = createObject(bean); + } else { + throw new InvalidConfigurationException("Bean without id"); + } + } + + return object; } /** * Вернуть объект по имени класса * Например, Car car = (Car) container.getByClass("track.container.beans.Car") */ - public Object getByClass(String className) { - return null; + public Object getByClass(String className) throws InvalidConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException { + Object object = objById.get(className); + + if (object == null) { + Bean bean = beanByClassName.get(className); + if (bean != null) { + object = createObject(bean); + } else { + throw new InvalidConfigurationException("Bean without class"); + } + } + + return object; + } + + private Object createObject(Bean bean) throws ValueException, NoSuchFieldException, NoSuchMethodException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException { + Class clazz = Class.forName(bean.getClassName()); + Object object = clazz.newInstance(); + objById.put(bean, object); + for (Map.Entry entry : bean.getProperties().entrySet()) { + Property property = entry.getValue(); + Field field = clazz.getDeclaredField(property.getName()); + Class type = field.getType(); + Method set = clazz.getMethod(getSetName(property.getName()), type); + if (property.getType() == ValueType.VAL) { + set.invoke(object, Integer.parseInt(property.getValue())); + } else if (property.getType() == ValueType.REF) { + if (!objById.containsKey(beanById.get(property.getValue()))) { + createObject(beanById.get(property.getValue())); + } + set.invoke(object, objById.get(beanById.get(property.getValue()))); + } + + } + return object; + } + + private String getSetName(String line) { + return "set" + Character.toUpperCase(line.charAt(0)) + line.substring(1); } -} +} \ No newline at end of file diff --git a/src/main/java/track/container/JsonConfigReader.java b/src/main/java/track/container/JsonConfigReader.java index 76eb69ff..cb53ec0c 100644 --- a/src/main/java/track/container/JsonConfigReader.java +++ b/src/main/java/track/container/JsonConfigReader.java @@ -1,19 +1,58 @@ package track.container; import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import track.container.config.Bean; -import track.container.config.ConfigReader; -import track.container.config.InvalidConfigurationException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import track.container.config.*; /** * TODO: Реализовать */ public class JsonConfigReader implements ConfigReader { + private Property parseProperty(JsonNode property) throws InvalidConfigurationException { + String name = property.get("name").asText(); + ValueType type; + String value = property.get("value").asText(); + if (property.get("type").asText().equals("REF")) { + type = ValueType.REF; + } else { + type = ValueType.VAL; + } + + return new Property(name, value, type); + } + + private Bean parseBean(JsonNode bean) throws InvalidConfigurationException { + String id = bean.get("id").asText(); + String className = bean.get("className").asText(); + Map properties = new HashMap(); + for (JsonNode property: bean.get("properties")) { + Property parsedProperty = parseProperty(property); + properties.put(parsedProperty.getName(), parsedProperty); + } + + return new Bean(id, className, properties); + } + @Override public List parseBeans(File configFile) throws InvalidConfigurationException { - return null; + ObjectMapper objectMapper = new ObjectMapper(); + List beans = new ArrayList<>(); + try { + JsonNode root = objectMapper.readTree(configFile); + for (JsonNode bean : root.get("beans")) { + beans.add(parseBean(bean)); + } + } catch (InvalidConfigurationException | IOException e) { + e.printStackTrace(); + } + return beans; } -} +} \ No newline at end of file diff --git a/src/main/java/track/container/Main.java b/src/main/java/track/container/Main.java index 8fdc23e6..30e634be 100644 --- a/src/main/java/track/container/Main.java +++ b/src/main/java/track/container/Main.java @@ -1,26 +1,39 @@ package track.container; +import jdk.nashorn.internal.runtime.regexp.joni.exception.ValueException; +import track.container.config.Bean; +import track.container.config.ConfigReader; +import track.container.config.InvalidConfigurationException; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +import static org.apache.log4j.helpers.Loader.getResource; + /** * */ public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws ValueException, NoSuchFieldException, NoSuchMethodException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, InvalidConfigurationException { /* - ПРИМЕР ИСПОЛЬЗОВАНИЯ - */ // // При чтении нужно обработать исключение -// ConfigReader reader = new JsonReader(); -// List beans = reader.parseBeans("config.json"); -// Container container = new Container(beans); -// -// Car car = (Car) container.getByClass("track.container.beans.Car"); -// car = (Car) container.getById("carBean"); + File file = new File(getResource("config.json").getFile()); + ConfigReader reader = new JsonConfigReader(); + try { + List beans = reader.parseBeans(file); + System.out.print(beans.toString()); + + } catch (InvalidConfigurationException exception) { + System.out.println(exception.getMessage()); + } + } -} +} \ No newline at end of file diff --git a/src/main/java/track/lessons/lesson2/Document.java b/src/main/java/track/lessons/lesson2/Document.java index fa2b2915..657ebfbf 100644 --- a/src/main/java/track/lessons/lesson2/Document.java +++ b/src/main/java/track/lessons/lesson2/Document.java @@ -1,20 +1,26 @@ package track.lessons.lesson2; -/** - * - */ public class Document { String[] tokens; + Document(String[] token) { + this.tokens = token; + } + String[] getTokens() { - return null; + return tokens; } int getTokenCount() { - return 0; + return tokens.length; } boolean hasToken(String token) { + for (int i = 0; i < tokens.length; i++) { + if (token.equals(tokens[i])) { + return true; + } + } return false; } } diff --git a/src/main/java/track/lessons/lesson2/Document.java~ b/src/main/java/track/lessons/lesson2/Document.java~ new file mode 100644 index 00000000..3e687db5 --- /dev/null +++ b/src/main/java/track/lessons/lesson2/Document.java~ @@ -0,0 +1,26 @@ +package track.lessons.lesson2; + +public class Document { + String[] tokens; + + Document(String[] token) { + this.tokens = token; + } + + String[] getTokens() { + return tokens; + } + + int getTokenCount() { + return tokens.length; + } + + boolean hasToken(String token) { + for(int i = 0; i < tokens.length; i++) { + if (token.equals(tokens[i])) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/track/lessons/lesson2/Parser.java b/src/main/java/track/lessons/lesson2/Parser.java index 7276042d..fdea943f 100644 --- a/src/main/java/track/lessons/lesson2/Parser.java +++ b/src/main/java/track/lessons/lesson2/Parser.java @@ -3,25 +3,26 @@ import java.io.BufferedReader; import java.io.FileReader; -/** - * - */ public class Parser { - Document parse(String data) { - return null; + String[] tokens = data.split("[ ]"); + if (tokens == null) { + return null; + } + return new Document(tokens); } public static void main(String[] args) throws Exception { String path = "path/to/file"; BufferedReader reader = new BufferedReader(new FileReader(path)); - // reader умеет читать по строкам с помощью метода readLine() - - // Создайте объект Parser - - // Получите объект Document, реализовав метод parse() - - + StringBuilder builder = new StringBuilder(); + Parser pars = new Parser(); + String line; + while ((line = reader.readLine()) != null) { + builder.append(line); + } + String res = builder.toString(); + Document doc = pars.parse(res); } } diff --git a/src/main/java/track/lessons/lesson2/Parser.java~ b/src/main/java/track/lessons/lesson2/Parser.java~ new file mode 100644 index 00000000..e2f84799 --- /dev/null +++ b/src/main/java/track/lessons/lesson2/Parser.java~ @@ -0,0 +1,28 @@ +package track.lessons.lesson2; + +import java.io.BufferedReader; +import java.io.FileReader; + +public class Parser { + Document parse(String data) { + String[] tokens = data.split("[ ]"); + if (tokens == null) { + return null; + } + return new Document(tokens); + } + + public static void main(String[] args) throws Exception { + + String path = "path/to/file"; + BufferedReader reader = new BufferedReader(new FileReader(path)); + StringBuilder builder = new StringBuilder(); + Parser pars = new Parser(); + String line; + while ((line = reader.readLine()) != null) { + builder.append(line); + } + String res = builder.toString(); + Document doc = pars.parse(res); + } +} diff --git a/src/main/java/track/lessons/lesson3/DynamicList.java b/src/main/java/track/lessons/lesson3/DynamicList.java index 8b30d2c7..5e24e6db 100644 --- a/src/main/java/track/lessons/lesson3/DynamicList.java +++ b/src/main/java/track/lessons/lesson3/DynamicList.java @@ -3,5 +3,51 @@ /** * */ -public class DynamicList { -} +public class DynamicList extends List { + private static final int DEFAULT_SIZE = 1000; + private int[] array; + private int size; + + public DynamicList() { + array = new int[DEFAULT_SIZE]; + } + + @Override + public void add(int value) { + if (size == array.length) { + allocate(); + } + array[size++] = value; + } + + @Override + public int remove(int idx) { + valid_index(idx); + int value = array[idx]; + System.arraycopy(array, idx + 1, array, idx, size-- - idx); + return value; + } + + @Override + public int get(int idx) { + valid_index(idx); + return array[idx]; + } + + @Override + public int size() { + return size; + } + + private void allocate() { + int[] newarray = new int[2 * size]; + System.arraycopy(array, 0, newarray, 0, size); + array = newarray; + } + + private void valid_index(int idx) { + if (idx < 0 || idx >= size) { + throw new IndexOutOfBoundsException("Invalid index"); + } + } +} \ No newline at end of file diff --git a/src/main/java/track/lessons/lesson3/DynamicList.java~ b/src/main/java/track/lessons/lesson3/DynamicList.java~ new file mode 100644 index 00000000..c6c63a94 --- /dev/null +++ b/src/main/java/track/lessons/lesson3/DynamicList.java~ @@ -0,0 +1,52 @@ +package track.lessons.lesson3; + +/** + * + */ +public class DynamicList extends List{ + private static final int DEFAULT_SIZE = 1000; + private int[] array; + private int size; + + public DynamicList() { + array = new int[DEFAULT_SIZE]; + } + + @Override + public void add(int value) { + if(size == array.length) { + allocate(); + } + array[size++] = value; + } + + @Override + public int remove(int idx) { + valid_index(idx); + int value = array[idx]; + System.arraycopy(array, idx + 1, array, idx, size-- - idx); + return value; + } + + @Override + public int get(int idx) { + valid_index(idx); + return array[idx]; + } + @Override + public int size() { + return size; + } + + private void allocate() { + int[] newarray = new int[2 * size]; + System.arraycopy(array, 0, newarray, 0, size); + array = newarray; + } + + private void valid_index(int idx) { + if (idx < 0 || idx >= size) { + throw new IndexOutOfBoundsException("Invalid index"); + } + } +} diff --git a/src/main/java/track/lessons/lesson3/LinkedList.java b/src/main/java/track/lessons/lesson3/LinkedList.java index 49a5e181..80719df2 100644 --- a/src/main/java/track/lessons/lesson3/LinkedList.java +++ b/src/main/java/track/lessons/lesson3/LinkedList.java @@ -3,5 +3,140 @@ /** * */ -public class LinkedList { +public class LinkedList extends List implements Stack, Queue { + + private class Node { + public Node next; + public Node prev; + public int value; + } + + private Node first; + private Node last; + private int size; + + public LinkedList() { + first = null; + last = null; + size = 0; + } + + private boolean isEmpty() { + if (size > 0) { + return false; + } + return true; + } + + @Override + public void add(int item) { + Node newNode = new Node(); + if (isEmpty() == true) { + newNode.prev = newNode; + newNode.next = newNode; + first = newNode; + } + else { + newNode.prev = last; + newNode.next = first; + } + last = newNode; + first.prev = last; + newNode.value = item; + size++; + } + + private void valid_index(int idx) { + if (idx < 0 || idx >= size) { + throw new IndexOutOfBoundsException("Invalid index"); + } + } + + @Override + public int remove(int idx) { + valid_index(idx); + size--; + if (idx == 0) { + return removeFirst(); + } + if (idx == size) { + return removeLast(); + } + Node node = new Node(); + node = first; + for (int i = 0; i <= idx; i++) { + node = node.next; + } + int cur_value = node.value; + Node next = new Node(); + next = node.next; + node.prev.next = node.next; + next.prev = node.prev; + return cur_value; + } + + private int removeLast() { + int value = last.value; + if (last.prev != null) { + last = last.prev; + last.prev.next = null; + } + else { + last = null; + } + return value; + } + + private int removeFirst() { + int value = first.value; + if(first.next != null) { + first = first.next; + first.next.prev = null; + } + else { + first = null; + } + return value; + } + + @Override + int get(int idx){ + valid_index(idx); + if (idx == 0) { + return first.value; + } + if (idx == size - 1) { + return last.value; + } + Node node = new Node(); + node = first; + for (int i = 0; i <= idx; i++) { + node = node.next; + } + return node.value; + } + @Override + int size(){ + return size; + } + + @Override + public void enqueue(int value) { + add(value); + } + + @Override + public int dequeu() { + return remove(0); + } + + @Override + public void push(int value) { + add(value); + } + + @Override + public int pop() { + return remove(size - 1); + } } diff --git a/src/main/java/track/lessons/lesson3/LinkedList.java~ b/src/main/java/track/lessons/lesson3/LinkedList.java~ new file mode 100644 index 00000000..42297803 --- /dev/null +++ b/src/main/java/track/lessons/lesson3/LinkedList.java~ @@ -0,0 +1,141 @@ +package track.lessons.lesson3; + +/** + * + */ +public class LinkedList extends List implements Stack, Queue { + + private class Node { + public Node next; + public Node prev; + public int value; + } + + private Node first; + private Node last; + private int size; + + public LinkedList() { + first = null; + last = null; + size = 0; + } + + private boolean isEmpty() { + if (size > 0) { + return true; + } + return false; + } + + @Override + public void add(int item) { + Node newNode = new Node(); + if (isEmpty() == true) { + newNode.prev = newNode; + newNode.next = newNode; + first = newNode; + } + else { + newNode.prev = last; + newNode.next = first; + } + last = newNode; + newNode.value = item; + size++; + } + + private void valid_index(int idx) { + if (idx < 0 || idx >= size) { + throw new IndexOutOfBoundsException("Invalid index"); + } + } + + @Override + public int remove(int idx) { + valid_index(idx); + size--; + if (idx == 0) { + return removeFirst(); + } + if (idx == size) { + return removeLast(); + } + Node node = new Node(); + node = first; + for (int i = 0; i <= idx; i++) { + node = node.next; + } + int cur_value = node.value; + Node next = new Node(); + next = node.next; + node.prev.next = node.next; + next.prev = node.prev; + return cur_value; + } + + private int removeLast() { + int value = last.value; + if (last.prev != null) { + last = last.prev; + last.prev.next = null; + } + else { + last = null; + } + return value; + } + + private int removeFirst() { + int value = first.value; + if(first.next != null) { + first = first.next; + first.next.prev = null; + } + else { + first = null; + } + return value; + } + + @Override + int get(int idx){ + valid_index(idx); + if (idx == 0) { + return first.value; + } + if (idx == size - 1) { + return last.value; + } + Node node = new Node(); + node = first; + for (int i = 0; i <= idx; i++) { + node = node.next; + } + return next.value; + } + @Override + int size(){ + return size; + } + + @Override + public void enqueue(int value) { + add(value); + } + + @Override + public int dequeu() { + return remove(0); + } + + @Override + public void push(int value) { + add(value); + } + + @Override + public int pop() { + return remove(size - 1); + } +} diff --git a/src/main/java/track/lessons/lesson3/List.java b/src/main/java/track/lessons/lesson3/List.java index 49a182d5..361b9613 100644 --- a/src/main/java/track/lessons/lesson3/List.java +++ b/src/main/java/track/lessons/lesson3/List.java @@ -3,5 +3,9 @@ /** * */ -public class List { +public abstract class List { + abstract void add(int item); + abstract int remove(int idx); + abstract int get(int idx); + abstract int size(); } diff --git a/src/main/java/track/lessons/lesson3/List.java~ b/src/main/java/track/lessons/lesson3/List.java~ new file mode 100644 index 00000000..e5f83d5c --- /dev/null +++ b/src/main/java/track/lessons/lesson3/List.java~ @@ -0,0 +1,11 @@ +package track.lessons.lesson3; + +/** + * + */ +public abstract class List { + abstract void add(int item); + abstract void remove(int idx); + abstract int get(int idx); + abstract int size(); +} diff --git a/src/main/java/track/lessons/lesson3/ListMain.java b/src/main/java/track/lessons/lesson3/ListMain.java index 5a2e7a3a..1f109c38 100644 --- a/src/main/java/track/lessons/lesson3/ListMain.java +++ b/src/main/java/track/lessons/lesson3/ListMain.java @@ -6,7 +6,19 @@ public class ListMain { public static void main(String[] args) { + LinkedList linkedList = new LinkedList(); + for (int i = 0; i < 1000; i++) { + linkedList.add(i); + } + for (int i = 0; i < 1000; i++) { + linkedList.push(i); + } + DynamicList dynamicList = new DynamicList(); + + for (int i = 0; i < 1000; i++) { + dynamicList.add(i); + } // List list = new DynamicList(); // list.add(1); diff --git a/src/main/java/track/lessons/lesson3/ListMain.java~ b/src/main/java/track/lessons/lesson3/ListMain.java~ new file mode 100644 index 00000000..26d7438c --- /dev/null +++ b/src/main/java/track/lessons/lesson3/ListMain.java~ @@ -0,0 +1,72 @@ +package track.lessons.lesson3; + +/** + * + */ +public class ListMain { + + public static void main(String[] args) { + LinkedList linkedList = new LinkedList(); + + for (int i = 0; i < 1000; i++) { + linkedList.add(i); + } + + System.out.println(linkedList); + System.out.println(linkedList.get(0)); + System.out.println(linkedList.get(3)); + System.out.println(linkedList.remove(1)); + System.out.println(linkedList); + System.out.println(linkedList.remove(linkedList.size() - 1)); + System.out.println(linkedList); + System.out.println(linkedList.remove(0)); + System.out.println(linkedList); + System.out.println(linkedList.remove(0)); + System.out.println(linkedList.remove(0)); + System.out.println(linkedList); + + for (int i = 0; i < 5; i++) { + linkedList.push(i); + } + System.out.println(linkedList); + System.out.println(linkedList.pop()); + + DynamicList dynamicList = new DynamicList(); + + for (int i = 0; i < 12; i++) { + dynamicList.add(i); + } + + System.out.println(dynamicList); + System.out.println(dynamicList.get(0)); + System.out.println(dynamicList.get(3)); + System.out.println(dynamicList.remove(1)); + System.out.println(dynamicList); + System.out.println(dynamicList.remove(dynamicList.size() - 1)); + System.out.println(dynamicList); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList); + System.out.println(dynamicList.remove(0)); + System.out.println(dynamicList); + +// List list = new DynamicList(); +// list.add(1); +// list.add(2); +// list.add(10); +// int first = list.remove(0); + + } +} diff --git a/src/main/java/track/lessons/lesson3/Queue.java b/src/main/java/track/lessons/lesson3/Queue.java new file mode 100644 index 00000000..b9f3b2d6 --- /dev/null +++ b/src/main/java/track/lessons/lesson3/Queue.java @@ -0,0 +1,6 @@ +package track.lessons.lesson3; + +interface Queue { + void enqueue(int value); + int dequeu(); +} diff --git a/src/main/java/track/lessons/lesson3/Queue.java~ b/src/main/java/track/lessons/lesson3/Queue.java~ new file mode 100644 index 00000000..5df61cb7 --- /dev/null +++ b/src/main/java/track/lessons/lesson3/Queue.java~ @@ -0,0 +1,2 @@ +package track.lessons.lesson3; + diff --git a/src/main/java/track/lessons/lesson3/Stack.java b/src/main/java/track/lessons/lesson3/Stack.java new file mode 100644 index 00000000..dd5f2d23 --- /dev/null +++ b/src/main/java/track/lessons/lesson3/Stack.java @@ -0,0 +1,6 @@ +package track.lessons.lesson3; + +interface Stack { + void push(int value); + int pop(); +} diff --git a/src/main/java/track/lessons/lesson3/Stack.java~ b/src/main/java/track/lessons/lesson3/Stack.java~ new file mode 100644 index 00000000..17e08092 --- /dev/null +++ b/src/main/java/track/lessons/lesson3/Stack.java~ @@ -0,0 +1,4 @@ +interface Stack { + void push(int value); + int pop(); +} diff --git a/src/main/java/track/lessons/lesson4/Reflect.java b/src/main/java/track/lessons/lesson4/Reflect.java index a23bf751..66145cab 100644 --- a/src/main/java/track/lessons/lesson4/Reflect.java +++ b/src/main/java/track/lessons/lesson4/Reflect.java @@ -1,4 +1,3 @@ -package arhangel.dim.lections.reflection; import java.io.Serializable; import java.lang.annotation.Annotation; diff --git a/src/main/java/track/messenger/Chat.java b/src/main/java/track/messenger/Chat.java new file mode 100644 index 00000000..e3c425bd --- /dev/null +++ b/src/main/java/track/messenger/Chat.java @@ -0,0 +1,54 @@ +package track.messenger; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by asus on 07.12.16. + */ +public class Chat { + private Long id; + private Long creatorId; + private List messageIds = new ArrayList<>(); + private List participantIds = new ArrayList<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public void setCreatorId(Long creatorId) { + this.creatorId = creatorId; + } + + public Long getCreatorId() { + return creatorId; + } + + public List getMessageIds() { + return messageIds; + } + + public void setMessageIds(List messageIds) { + this.messageIds = messageIds; + } + + public List getParticipantIds() { + return participantIds; + } + + public void setParticipantIds(List participantIds) { + this.participantIds = participantIds; + } + + public void addParticipant(Long id) { + participantIds.add(id); + } + + public void addMessage(Long id) { + messageIds.add(id); + } +} diff --git a/src/main/java/track/messenger/Main.java b/src/main/java/track/messenger/Main.java new file mode 100644 index 00000000..0971f728 --- /dev/null +++ b/src/main/java/track/messenger/Main.java @@ -0,0 +1,30 @@ +package track.messenger; + +import track.container.Container; +import track.container.JsonConfigReader; +import track.container.config.ConfigReader; +import track.container.config.InvalidConfigurationException; +import track.messenger.net.MessengerServer; + +import java.io.File; + +import static org.apache.log4j.helpers.Loader.getResource; + +/** + * + */ +public class Main{ + public static void main(String[] args) throws Exception { + try { + File file = new File(getResource("server.json").getFile()); + ConfigReader reader = new JsonConfigReader(); + Container container = new Container(reader.parseBeans(file)); + MessengerServer server; + server = (MessengerServer) container.getByClass("track.messenger.net.MessengerServer"); + server.start(); + } catch (InvalidConfigurationException e) { + e.printStackTrace(); + } + } +} +//Написать бинарный протокол. Серверсокет в одно место. Сделать тредпул. \ No newline at end of file diff --git a/src/main/java/track/messenger/User.java b/src/main/java/track/messenger/User.java new file mode 100644 index 00000000..b617cfe5 --- /dev/null +++ b/src/main/java/track/messenger/User.java @@ -0,0 +1,44 @@ +package track.messenger; + +/** + * + */ + +public class User { + private long id; + private String name; + private String password; + + public User() { + + } + + public User(String name) + { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public Long getId() { + return id; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPassword() { + return password; + } + + public void setId(Long id) { + this.id = id; + } + +} diff --git a/src/main/java/track/messenger/commands/Command.java b/src/main/java/track/messenger/commands/Command.java new file mode 100644 index 00000000..9bf7ebe2 --- /dev/null +++ b/src/main/java/track/messenger/commands/Command.java @@ -0,0 +1,15 @@ +package track.messenger.commands; + +import track.messenger.messages.Message; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; + +import java.io.IOException; +import java.sql.SQLException; + +/** + * Created by asus on 30.11.16. + */ +public interface Command { + void execute(Session session, Message message) throws CommandException, SQLException, IOException, ProtocolException, ClassNotFoundException; +} diff --git a/src/main/java/track/messenger/commands/CommandException.java b/src/main/java/track/messenger/commands/CommandException.java new file mode 100644 index 00000000..2ee16174 --- /dev/null +++ b/src/main/java/track/messenger/commands/CommandException.java @@ -0,0 +1,14 @@ +package track.messenger.commands; + +/** + * Created by asus on 30.11.16. + */ +public class CommandException extends Exception { + public CommandException(Exception e) { + } + + public CommandException(String message) { + super(message); + } + +} diff --git a/src/main/java/track/messenger/commands/CommandExecutor.java b/src/main/java/track/messenger/commands/CommandExecutor.java new file mode 100644 index 00000000..a1911620 --- /dev/null +++ b/src/main/java/track/messenger/commands/CommandExecutor.java @@ -0,0 +1,51 @@ +package track.messenger.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.messages.Message; +import track.messenger.messages.Type; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by asus on 02.12.16. + */ +public class CommandExecutor { + static Logger log = LoggerFactory.getLogger(CommandExecutor.class); + + private Map commands; + + public CommandExecutor() { + commands = new HashMap<>(); + } + + public CommandExecutor addCommand(Type type, Command command) { + commands.put(type, command); + log.info("addCommand type: {}", type); + log.info("addCommand command: {}", command); + log.info(String.valueOf(commands.containsKey(Type.MSG_LOGIN))); + return this; + } + + public void handleMessage(Message message, Session session) throws CommandException, ProtocolException, SQLException, IOException, ClassNotFoundException { + Type messageType = message.getType(); + log.info("handlemessage: {}", message); + log.info("Type: {}", messageType); + + if (messageType == null) { + log.info("null"); + throw new CommandException("Message type is null"); + } else if (commands.containsKey(messageType)) { + log.info("func: {}", commands.get(messageType)); + commands.get(messageType).execute(session, message); + } else { + throw new CommandException("Undefined message type"); + } + } +} +//запросы с базойданной в одном классе. В базах \ No newline at end of file diff --git a/src/main/java/track/messenger/commands/CreateChatCommand.java b/src/main/java/track/messenger/commands/CreateChatCommand.java new file mode 100644 index 00000000..a3746fa4 --- /dev/null +++ b/src/main/java/track/messenger/commands/CreateChatCommand.java @@ -0,0 +1,70 @@ +package track.messenger.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.Chat; +import track.messenger.messages.ChatCreate; +import track.messenger.messages.Message; +import track.messenger.messages.StatusMessage; +import track.messenger.messages.Type; +import track.messenger.net.MessengerServer; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; +import track.messenger.store.UserFactory; + +import java.io.IOException; +import java.sql.SQLException; + +/** + * Created by asus on 02.12.16. + */ +public class CreateChatCommand implements Command { + private final MessengerServer server; + static Logger log = LoggerFactory.getLogger(CreateChatCommand.class); + public CreateChatCommand(MessengerServer server) { + this.server = server; + } + + @Override + public void execute(Session session, Message message) throws CommandException { + log.info("Createe"); + try { + if (session.getUser() == null) { + StatusMessage errorMessage = new StatusMessage(); + errorMessage.setStatus("Ony authorised person can create chat"); + errorMessage.setType(Type.MSG_STATUS); + session.send(errorMessage); + return; + } + + UserFactory userFactory = session.getUserFactory(); + StatusMessage response = new StatusMessage(); + + String[] participants = ((ChatCreate) message).getUsersIds(); + log.info("participants: {}", (Object) participants); + if (participants != null) { + if (participants.length == 1) { + response.setStatus(String.format( + "Uncorrect input")); + response.setType(Type.MSG_STATUS); + session.send(response); + + } + else { + Chat chat = userFactory.createChat(session.getUser().getId(), participants, server.getnumchat()); + + server.chatincr(); + + response.setStatus(String.format("Chat created. Chat id: %d", chat.getId())); + response.setType(Type.MSG_STATUS); + session.send(response); + return; + } + } + + + } catch ( ProtocolException | IOException | SQLException | ClassNotFoundException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/track/messenger/commands/HistChatCommand.java b/src/main/java/track/messenger/commands/HistChatCommand.java new file mode 100644 index 00000000..55f578ce --- /dev/null +++ b/src/main/java/track/messenger/commands/HistChatCommand.java @@ -0,0 +1,46 @@ +package track.messenger.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.messages.*; +import track.messenger.net.MessengerServer; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; +import track.messenger.store.UserFactory; +import track.messenger.store.Usermessage; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +/** + * Created by asus on 02.12.16. + */ +public class HistChatCommand implements Command { + static Logger log = LoggerFactory.getLogger(HistChatCommand.class); + private final MessengerServer server; + + public HistChatCommand(MessengerServer server) { + this.server = server; + } + + @Override + public void execute(Session session, Message message) throws CommandException, IOException, ProtocolException, SQLException { + ChatHistory chatHistory = (ChatHistory) message; + UserFactory userFactory = session.getUserFactory(); + List history = userFactory.getMessagesFromChat(chatHistory.getId()); + log.info("Usermessage: {}", history); + if (history.isEmpty()) { + StatusMessage response = new StatusMessage(); + response.setStatus(String.format("No messages in this chat")); + response.setType(Type.MSG_STATUS); + session.send(response); + } + else { + ChatHistResultMessage chatHistResultMessage = new ChatHistResultMessage(); + chatHistResultMessage.setType(Type.MSG_CHAT_HIST_RESULT); + chatHistResultMessage.setHistory(history); + session.send(chatHistResultMessage); + } + } +} diff --git a/src/main/java/track/messenger/commands/InfoCommand.java b/src/main/java/track/messenger/commands/InfoCommand.java new file mode 100644 index 00000000..1d549ab3 --- /dev/null +++ b/src/main/java/track/messenger/commands/InfoCommand.java @@ -0,0 +1,21 @@ +package track.messenger.commands; + +import track.messenger.messages.Message; +import track.messenger.net.MessengerServer; +import track.messenger.net.Session; + +/** + * Created by asus on 02.12.16. + */ +public class InfoCommand implements Command { + private final MessengerServer server; + + public InfoCommand(MessengerServer server) { + this.server = server; + } + + @Override + public void execute(Session session, Message message) throws CommandException { + + } +} diff --git a/src/main/java/track/messenger/commands/ListChatCommand.java b/src/main/java/track/messenger/commands/ListChatCommand.java new file mode 100644 index 00000000..60e98038 --- /dev/null +++ b/src/main/java/track/messenger/commands/ListChatCommand.java @@ -0,0 +1,57 @@ +package track.messenger.commands; + +import track.messenger.User; +import track.messenger.messages.*; +import track.messenger.net.MessengerServer; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; +import track.messenger.store.UserFactory; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +/** + * Created by asus on 02.12.16. + */ +public class ListChatCommand implements Command { + private final MessengerServer server; + + public ListChatCommand(MessengerServer server) { + this.server = server; + } + + @Override + public void execute(Session session, Message message) throws CommandException, SQLException { + try { + ChatList chatListMessage = (ChatList)message; + StatusMessage errorMessage = new StatusMessage(); + + User user = session.getUser(); + if (user == null) { + errorMessage.setStatus("Ony authorised person can see chats"); + errorMessage.setType(Type.MSG_STATUS); + session.send(errorMessage); + return; + } + + UserFactory userFactory = session.getUserFactory(); + List chatIds = userFactory.getChatsByUserId(user.getId()); + if (chatIds == null) { + errorMessage.setStatus("No chats for user"); + errorMessage.setType(Type.MSG_STATUS); + session.send(errorMessage); + return; + } + + ChatListResultMessage chatListResultMessage = new ChatListResultMessage(); + chatListResultMessage.setType(Type.MSG_CHAT_LIST_RESULT); + chatListResultMessage.setChatIds(chatIds); + session.send(chatListResultMessage); + + } catch (IOException | ProtocolException e) { + throw new CommandException(e); + } + + } +} diff --git a/src/main/java/track/messenger/commands/LoginCommand.java b/src/main/java/track/messenger/commands/LoginCommand.java new file mode 100644 index 00000000..f74a10be --- /dev/null +++ b/src/main/java/track/messenger/commands/LoginCommand.java @@ -0,0 +1,66 @@ +package track.messenger.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.User; +import track.messenger.messages.LoginMessage; +import track.messenger.messages.Message; +import track.messenger.messages.StatusMessage; +import track.messenger.messages.Type; +import track.messenger.net.MessengerServer; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; +import track.messenger.store.UserFactory; + +import java.io.IOException; +import java.sql.SQLException; + +/** + * Created by asus on 30.11.16. + */ +public class LoginCommand implements Command { + + private MessengerServer server; + static Logger log = LoggerFactory.getLogger(LoginCommand.class); + public LoginCommand(MessengerServer server) { + this.server = server; + } + + + @Override + public void execute(Session session, Message message) throws CommandException, SQLException { + LoginMessage loginMessage = (LoginMessage) message; + + String userName = loginMessage.getUsername(); + String password = loginMessage.getPassword(); + + UserFactory userFactory = session.getUserFactory(); + StatusMessage result = new StatusMessage(); + result.setType(Type.MSG_STATUS); + if (!userFactory.isUserExist(userName)) { + log.info("userName: {}", userName); + result.setStatus("User not found"); + try { + session.send(result); + } catch (IOException | ProtocolException e) { + e.printStackTrace(); + } + return; + } + User user = userFactory.getUser(userName, password); + if (user == null) { + result.setStatus("Login or password is incorrect"); + } else { + session.setUser(user); + result.setStatus(String.format("Success: userid: %d, name: %s", user.getId(), user.getName())); + } + + try { + session.send(result); + } catch (IOException | ProtocolException e) { + e.printStackTrace(); + } + } +} + + diff --git a/src/main/java/track/messenger/commands/RegistrationCommand.java b/src/main/java/track/messenger/commands/RegistrationCommand.java new file mode 100644 index 00000000..0da80b51 --- /dev/null +++ b/src/main/java/track/messenger/commands/RegistrationCommand.java @@ -0,0 +1,52 @@ +package track.messenger.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.User; +import track.messenger.messages.Message; +import track.messenger.messages.Registration; +import track.messenger.messages.StatusMessage; +import track.messenger.messages.Type; +import track.messenger.net.MessengerServer; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; +import track.messenger.store.UserFactory; + +import java.io.IOException; +import java.sql.SQLException; + +/** + * Created by asus on 15.12.16. + */ +public class RegistrationCommand implements Command { + private MessengerServer server; + static Logger log = LoggerFactory.getLogger(RegistrationCommand.class); + public RegistrationCommand(MessengerServer server) { + this.server = server; + } + + @Override + public void execute(Session session, Message message) throws CommandException, SQLException, IOException, ProtocolException, ClassNotFoundException { + Registration registration = (Registration) message; + User user = new User(); + user.setName(registration.getUsername()); + user.setPassword(registration.getPassword()); + user.setId(server.getnumlogin()); + UserFactory userFactory = session.getUserFactory(); + log.info("Name: {}", user.getName()); + StatusMessage result = new StatusMessage(); + result.setType(Type.MSG_STATUS); + if (userFactory.addUser(user, server.getnumlogin()) == null) { + result.setStatus("This login exists"); + } + else { + result.setStatus(String.format("Registration successful!: userid: %d, name: %s", user.getId(), user.getName())); + server.loginincr(); + } + try { + session.send(result); + } catch (IOException | ProtocolException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/track/messenger/commands/TextCommand.java b/src/main/java/track/messenger/commands/TextCommand.java new file mode 100644 index 00000000..34d96126 --- /dev/null +++ b/src/main/java/track/messenger/commands/TextCommand.java @@ -0,0 +1,61 @@ +package track.messenger.commands; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.Chat; +import track.messenger.messages.Message; +import track.messenger.messages.StatusMessage; +import track.messenger.messages.TextMessage; +import track.messenger.net.MessengerServer; +import track.messenger.net.ProtocolException; +import track.messenger.net.Session; +import track.messenger.store.UserFactory; + +import java.io.IOException; +import java.sql.SQLException; + +/** + * Created by asus on 02.12.16. + */ +public class TextCommand implements Command { + static Logger log = LoggerFactory.getLogger(TextCommand.class); + + private MessengerServer server; + + public TextCommand(MessengerServer server) { + this.server = server; + } + + @Override + public void execute(Session session, Message message) throws CommandException, IOException, ProtocolException, SQLException { + StatusMessage errorMessage = new StatusMessage(); + if (session.getUser() == null) { + errorMessage.setStatus("Only authorised person can send messages"); + session.send(errorMessage); + return; + } + + UserFactory userFactory = session.getUserFactory(); + + TextMessage textMessage = (TextMessage) message; + textMessage.setSenderId(session.getUser().getId()); + + Chat chat = userFactory.getChatById(textMessage.getChatId()); + userFactory.addMessage(chat.getId(), textMessage); + StatusMessage response = new StatusMessage(); + response.setStatus(String.format("User %s wrote to chat %d: %s", + session.getUser().getName(), chat.getId(), textMessage.getText())); + response.setSenderId(textMessage.getSenderId()); + log.info("sessions: {}", server.getSessions()); + + for (Long chatUsersId : chat.getParticipantIds()) { + for (Session s : server.getSessions()) { + if (s.getUser() != null && chatUsersId.equals(s.getUser().getId())) { + s.send(response); + } + } + + } + + } +} diff --git a/src/main/java/track/messenger/db/CreateDB.java b/src/main/java/track/messenger/db/CreateDB.java new file mode 100644 index 00000000..ef15a5a9 --- /dev/null +++ b/src/main/java/track/messenger/db/CreateDB.java @@ -0,0 +1,53 @@ +package track.messenger.db; + +import java.sql.*; + +/** + * Created by asus on 01.12.16. + */ +public class CreateDB { + public static void main(String args[]) throws ClassNotFoundException, SQLException { + Class.forName("org.sqlite.JDBC"); + Connection connection = DriverManager.getConnection("jdbc:sqlite:users.s3db"); + + Statement stmt; + String sql; + + /*stmt = connection.createStatement(); + + sql = "CREATE TABLE IF NOT EXISTS User " + + "(id SERIAL PRIMARY KEY," + + " login VARCHAR(255) NOT NULL UNIQUE," + + " password VARCHAR(255) NOT NULL)"; + stmt.executeUpdate(sql); + stmt.close(); + connection.setAutoCommit(false); + + stmt = connection.createStatement(); + sql = "CREATE TABLE IF NOT EXISTS Chat " + + "(id SERIAL PRIMARY KEY," + + " owner_id SERIAL references User(id))"; + stmt.executeUpdate(sql); + stmt.close(); +*/ + stmt = connection.createStatement(); + sql = "CREATE TABLE IF NOT EXISTS Message " + + "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + + " text TEXT NOT NULL," + + " chat_id SERIAL references Chat(id)," + + " user_id SERIAL references User(id)," + + " timestamp TIMESTAMP NOT NULL DEFAULT current_timestamp)"; + stmt.executeUpdate(sql); + stmt.close(); +/* + stmt = connection.createStatement(); + sql = "CREATE TABLE IF NOT EXISTS Chat_User " + + "(chat_id SERIAL references Chat(id)," + + " user_id SERIAL references User(id)," + + "PRIMARY KEY(chat_id, user_id))"; + stmt.executeUpdate(sql); + stmt.close(); +*/ + connection.close(); + } +} diff --git a/src/main/java/track/messenger/db/DBConnectionManager.java b/src/main/java/track/messenger/db/DBConnectionManager.java new file mode 100644 index 00000000..076b95ec --- /dev/null +++ b/src/main/java/track/messenger/db/DBConnectionManager.java @@ -0,0 +1,120 @@ +package track.messenger.db; + +import track.messenger.User; +import track.messenger.messages.TextMessage; +import track.messenger.messages.Type; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by asus on 30.11.16. + */ +public class DBConnectionManager { + private Connection connection; + private String tableName; + private Statement stmt; + private String sql; + private ResultSet rs; + + public DBConnectionManager() throws ClassNotFoundException, SQLException { + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite:users.s3db"); + connection.setAutoCommit(false); + + } + + public void connect() throws SQLException { + try { + stmt = connection.createStatement(); + } catch (SQLException e) { + System.err.println("connectionerror" + e); + } + } + + public void setsql(String sql) { + this.sql = sql; + } + + public void commit() throws SQLException { + try { + stmt.executeUpdate(sql); + stmt.close(); + connection.commit(); + } catch (SQLException e) { + System.err.println("Commiterror" + e); + } + } + + public void setResultset(String sql) throws SQLException { + try { + rs = stmt.executeQuery(sql); + } catch (SQLException e) { + System.err.println("error in setResultset" + e); + } + } + + public User searchUser() throws SQLException { + try { + while (rs.next()) { + String login = rs.getString("login"); + String password = rs.getString("password"); + Long id = rs.getLong("id"); + User user = new User(); + user.setName(login); + user.setPassword(password); + user.setId(id); + return user; + } + } catch (SQLException e) { + System.err.println("error in searchUser" + e); + } + return null; + } + + public List searchMessages(Long chatId) throws SQLException { + try { + List msgList = new ArrayList(); + while (rs.next()) { + msgList.add(rs.getLong("id")); + } + return msgList; + } catch (SQLException e) { + List msgList = null; + System.err.println("error in searchMessages" + e); + return msgList; + } + } + + public TextMessage getMessage(Long messageId) { + TextMessage msg = null; + try { + msg = new TextMessage(); + while (rs.next()) { + msg.setId(rs.getLong("id")); + msg.setText(rs.getString("text")); + msg.setType(Type.MSG_TEXT); + msg.setSenderId(rs.getLong("user_id")); + msg.setTime(rs.getString("timestamp")); + return msg; + } + return null; + } catch (SQLException e) { + System.err.println("error in getMessage" + e); + return msg; + } + } + + public List searchchats(Long userId) { + try { + List userList = new ArrayList(); + while (rs.next()) { + userList.add(rs.getLong("user_id")); + } + } catch (SQLException e) { + System.err.println("error in searchchats" + e); + } + return null; + } +} diff --git a/src/main/java/track/messenger/db/MessageBase.java b/src/main/java/track/messenger/db/MessageBase.java new file mode 100644 index 00000000..5405ac4c --- /dev/null +++ b/src/main/java/track/messenger/db/MessageBase.java @@ -0,0 +1,104 @@ +package track.messenger.db; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.Chat; +import track.messenger.messages.Message; +import track.messenger.messages.TextMessage; +import track.messenger.store.MessageStore; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +/** + * Created by asus on 02.12.16. + */ +public class MessageBase implements MessageStore{ + private DBConnectionManager dBConnectionManager; + private Connection connection; + static Logger log = LoggerFactory.getLogger(MessageBase.class); + + public MessageBase() throws SQLException, ClassNotFoundException { + dBConnectionManager = new DBConnectionManager(); + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite:users.s3db"); + } + + @Override + public List getChatsByUserId(Long userId) throws SQLException { + dBConnectionManager.connect(); + dBConnectionManager.setResultset("SELECT user_id " + + "FROM Chat_User " + + "WHERE chat_id =" + userId); + return dBConnectionManager.searchchats(userId); + } + + @Override + public Chat getChatById(Long chatId) throws SQLException { + return null; + } + + @Override + public List getMessagesFromChat(Long chatId) throws SQLException { + dBConnectionManager.connect(); + dBConnectionManager.setResultset("SELECT id " + + "FROM Messages " + + "WHERE chat_id =" + chatId); + return dBConnectionManager.searchMessages(chatId); + } + + @Override + public Message getMessageById(Long messageId) throws SQLException { + dBConnectionManager.connect(); + dBConnectionManager.setResultset("SELECT * " + + "FROM Messages " + + "WHERE id =" + messageId); + return dBConnectionManager.getMessage(messageId); + } + + @Override + public void addMessage(Long chatId, TextMessage message) throws SQLException { + dBConnectionManager.connect(); + dBConnectionManager.setsql("INSERT INTO Messages " + + "(text, chat_id, timestamp, user_id) VALUES " + + "(" + message.getText() + ","+ chatId + "," + message.getSenderId() + "," + message.getTime() + ") "); + dBConnectionManager.commit(); + } + + @Override + public void addUserToChat(Long userId, Long chatId) throws SQLException { + dBConnectionManager.connect(); + dBConnectionManager.setsql("INSERT INTO userchats (\"chat_id\", \"user_id\") " + + "VALUES " + + "(" + chatId + ","+ userId +"); "); + dBConnectionManager.commit(); + } + + @Override + public Chat createChat(Long id, String[] participants) throws SQLException, ClassNotFoundException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement( + "INSERT INTO Chat_User ('chat_id', 'user_id') VALUES (?, ?)"); + log.info("id : {}", id); + //log.info("partisipand: {}", participanе); + pstmt.setString(1, "0"); + pstmt.setString(2, "2"); + pstmt.executeUpdate(); + /*for (String participant: participants) { + if (Objects.equals(participant, "/chat_create")) + continue; + pstmt = connection.prepareStatement( + "INSERT INTO Chat_User ('chat_id', 'user_id') VALUES (?, ?)"); + log.info("id : {}", id); + log.info("partisipand: {}", participant); + pstmt.setString(1, "0"); + pstmt.setString(2, "1"); + pstmt.executeUpdate(); + break; + }*/ + return null; + } +} diff --git a/src/main/java/track/messenger/db/UserBase.java b/src/main/java/track/messenger/db/UserBase.java new file mode 100644 index 00000000..ad2943b7 --- /dev/null +++ b/src/main/java/track/messenger/db/UserBase.java @@ -0,0 +1,240 @@ +package track.messenger.db; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.Chat; +import track.messenger.User; +import track.messenger.messages.Message; +import track.messenger.messages.TextMessage; +import track.messenger.store.UserStore; +import track.messenger.store.Usermessage; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * Created by asus on 30.11.16. + */ +public class UserBase implements UserStore { + + static Logger log = LoggerFactory.getLogger(UserBase.class); + private DBConnectionManager dBConnectionManager; + private Connection connection; + + public UserBase() throws SQLException, ClassNotFoundException { + dBConnectionManager = new DBConnectionManager(); + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite:users.s3db"); + + } + + @Override + public User addUser(User user, long id) throws ClassNotFoundException, SQLException { + PreparedStatement pstmt = null; + log.info("id: {}", id); + pstmt = connection.prepareStatement( + "INSERT INTO User ('id', 'login', 'password') VALUES (?, ?, ?)"); + pstmt.setString(1, String.valueOf(id)); + pstmt.setString(2, user.getName()); + pstmt.setString(3, user.getPassword()); + pstmt.executeUpdate(); + return user; + } + + @Override + public User updateUser(User user) { + return null; + } + + @Override + public User getUser(String login, String password) throws SQLException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement( + "SELECT id, login, password FROM User where login = ? and password = ?;"); + pstmt.setString(1, login); + pstmt.setString(2, password); + ResultSet rs = pstmt.executeQuery(); + while(rs.next()) + { + log.info("id: {}", rs.getLong("id")); + log.info("login: {}", rs.getString("login")); + log.info("password: {}", rs.getString("Password")); + User user = new User(login); + user.setPassword(rs.getString("Password")); + user.setId(rs.getLong("id")); + return user; + } + return null; + } + + public User getUsertoLogin(String login) throws SQLException, ClassNotFoundException { + log.info("Begin"); + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement( + "SELECT id, login, password FROM User where login = ?"); + pstmt.setString(1, login); + ResultSet rs = pstmt.executeQuery(); + while(rs.next()) + { + log.info("id: {}", rs.getLong("id")); + log.info("login: {}", rs.getString("login")); + log.info("password: {}", rs.getString("Password")); + User user = new User(login); + user.setPassword(rs.getString("Password")); + user.setId(rs.getLong("id")); + return user; + } + return null; + } + + @Override + public User getUserById(Long id) throws SQLException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement("SELECT * from User WHERE id = ?;"); + pstmt.setString(1, String.valueOf(id)); + ResultSet rs = pstmt.executeQuery(); + User user = new User(); + user.setId(id); + while (rs.next()) { + user.setName(rs.getString("login")); + user.setPassword(rs.getString("password")); + } + return user; + } + + public List getUsersByChatId(Long chatId) throws SQLException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement("SELECT user_id FROM Chat_User WHERE chat_id = ?;"); + pstmt.setString(1, String.valueOf(chatId)); + List msgList = new ArrayList(); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + msgList.add(rs.getLong("user_id")); + } + return msgList; + } + + @Override + public List getChatsByUserId(Long userId) throws SQLException { + PreparedStatement pstmt = null; + log.info("user_id: {}", userId); + pstmt = connection.prepareStatement("SELECT chat_id FROM Chat_User WHERE user_id = ?;"); + pstmt.setString(1, String.valueOf(userId)); + List msgList = new ArrayList(); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + msgList.add(rs.getLong("chat_id")); + log.info("msgList: {}", msgList); + } + return msgList; + } + + @Override + public Chat getChatById(Long chatId) throws SQLException { + return null; + } + + @Override + public List getMessagesFromChat(Long chatId) throws SQLException { + log.info("chatId: {}", chatId); + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement("SELECT * from Message WHERE chat_id = ?;"); + pstmt.setString(1, String.valueOf(chatId)); + List msgList = new ArrayList<>(); + List userList = new ArrayList<>(); + List usermessages = new ArrayList<>(); + ResultSet rs = pstmt.executeQuery(); + Usermessage usermessage = null; + while (rs.next()) { + usermessage = new Usermessage(); + usermessage.setMessage(rs.getString("text")); + usermessage.setUser(getUserById(rs.getLong("user_id"))); + usermessages.add(usermessage); + msgList.add(rs.getString("text")); + userList.add(getUserById(rs.getLong("user_id")).getName()); + } + log.info("Array: {}", msgList); + log.info("Names: {}", userList); + log.info("Names: {}", usermessages); + return usermessages; + } + + @Override + public Message getMessageById(Long messageId) throws SQLException { + dBConnectionManager.connect(); + dBConnectionManager.setResultset("SELECT * " + + "FROM Messages " + + "WHERE id =" + messageId); + return dBConnectionManager.getMessage(messageId); + } + + @Override + public void addMessage(Long chatId, TextMessage message) throws SQLException { + log.info("onadd"); + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement("INSERT INTO Message ('text', 'chat_id', 'timestamp', 'user_id') " + + "VALUES (?, ?, ? , ?);"); + pstmt.setString(1, String.valueOf(message.getText())); + pstmt.setString(2, String.valueOf(chatId)); + pstmt.setString(3, String.valueOf(message.getTime())); + pstmt.setString(4, String.valueOf(message.getSenderId())); + pstmt.executeUpdate(); + } + + @Override + public void addUserToChat(Long userId, Long chatId) throws SQLException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement("INSERT INTO Chat ('chat_id', 'user_id') VALUES (?, ?);"); + pstmt.setString(1, String.valueOf(userId)); + pstmt.setString(2, String.valueOf(chatId)); + pstmt.executeUpdate(); + } + + @Override + public Chat createChat(Long id, String[] participants, long numchats) throws SQLException, ClassNotFoundException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement("INSERT INTO Chat ('id', 'owner_id') VALUES (?, ?);"); + pstmt.setString(1, String.valueOf(numchats)); + pstmt.setString(2, String.valueOf(id)); + pstmt.executeUpdate(); + for (String participant: participants) { + if (Objects.equals(participant, "/chat_create")) + continue; + pstmt = connection.prepareStatement( + "INSERT INTO Chat_User ('chat_id', 'user_id') VALUES (?, ?);"); + log.info("id : {}", numchats); + log.info("partisipand: {}", participant); + pstmt.setString(1, String.valueOf(numchats)); + pstmt.setString(2, participant); + pstmt.executeUpdate(); + } + Chat chat = new Chat(); + chat.setId(numchats); + return chat; + } + + @Override + public long Chat_size() throws SQLException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement( + "SELECT * FROM (Chat) ;", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = pstmt.executeQuery(); + long count = 0; + while(rs.next()) + count++; + return count; + } + + public long User_size() throws SQLException { + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement( + "SELECT * FROM (User) ;", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = pstmt.executeQuery(); + long count = 0; + while(rs.next()) + count++; + return count; + } +} diff --git a/src/main/java/track/messenger/db/test.java b/src/main/java/track/messenger/db/test.java new file mode 100644 index 00000000..31003c8b --- /dev/null +++ b/src/main/java/track/messenger/db/test.java @@ -0,0 +1,158 @@ +package track.messenger.db; + +import java.sql.*; + +public class test { + + public static void main(String[] args) throws SQLException, ClassNotFoundException { + Class.forName("org.sqlite.JDBC"); + Connection connection = DriverManager.getConnection("jdbc:sqlite:users.s3db"); + + PreparedStatement pstmt = null; + pstmt = connection.prepareStatement( + "INSERT INTO Chat_User ('chat_id', 'user_id') VALUES (?, ?)"); + pstmt.setString(1, "0"); + pstmt.setString(2, "1"); + pstmt.executeUpdate(); + /*Class.forName("org.sqlite.JDBC"); + Connection connection = DriverManager.getConnection("jdbc:sqlite:testDb.s3db"); + + Statement stmt; + String sql; + + stmt = connection.createStatement(); + sql = "CREATE TABLE IF NOT EXISTS company" + + "(ID INT PRIMARY KEY NOT NULL," + + " NAME TEXT NOT NULL, " + + " AGE INT NOT NULL, " + + " ADDRESS CHAR(50), " + + " SALARY REAL)"; + stmt.executeUpdate(sql); + stmt.close(); +// c.close(); + + connection.setAutoCommit(false); + + stmt = connection.createStatement(); + sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );"; + stmt.executeUpdate(sql); + + sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00 );"; + stmt.executeUpdate(sql); + + sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"; + stmt.executeUpdate(sql); + + sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; + stmt.executeUpdate(sql); + + stmt.close(); + connection.commit(); +// c.close(); + + stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM COMPANY;"); + while (rs.next()) { + int id = rs.getInt("id"); + String name = rs.getString("name"); + int age = rs.getInt("age"); + String address = rs.getString("address"); + float salary = rs.getFloat("salary"); + System.out.println("ID = " + id); + System.out.println("NAME = " + name); + System.out.println("AGE = " + age); + System.out.println("ADDRESS = " + address); + System.out.println("SALARY = " + salary); + System.out.println(); + } + rs.close(); + stmt.close(); +// c.close(); + + stmt = connection.createStatement(); + sql = "UPDATE COMPANY SET SALARY = 25000.00 WHERE ID=1;"; + stmt.executeUpdate(sql); + connection.commit(); + + rs = stmt.executeQuery("SELECT * FROM COMPANY;"); + while (rs.next()) { + int id = rs.getInt("id"); + String name = rs.getString("name"); + int age = rs.getInt("age"); + String address = rs.getString("address"); + float salary = rs.getFloat("salary"); + System.out.println("ID = " + id); + System.out.println("NAME = " + name); + System.out.println("AGE = " + age); + System.out.println("ADDRESS = " + address); + System.out.println("SALARY = " + salary); + System.out.println(); + } + rs.close(); + stmt.close(); +// c.close(); + + stmt = connection.createStatement(); + sql = "DELETE FROM COMPANY WHERE ID=2;"; + stmt.executeUpdate(sql); + connection.commit(); + + rs = stmt.executeQuery("SELECT * FROM COMPANY;"); + while (rs.next()) { + int id = rs.getInt("id"); + String name = rs.getString("name"); + int age = rs.getInt("age"); + String address = rs.getString("address"); + float salary = rs.getFloat("salary"); + System.out.println("ID = " + id); + System.out.println("NAME = " + name); + System.out.println("AGE = " + age); + System.out.println("ADDRESS = " + address); + System.out.println("SALARY = " + salary); + System.out.println(); + } + rs.close(); + stmt.close(); + + +/* + PreparedStatement prepStmnt = connection.prepareStatement("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " + + "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );"); + int parameterIndex = 2; + prepStmnt.setString(parameterIndex, "asd"); + rs = prepStmnt.executeQuery(); + *//** + * Использование executor для запроса в базу + *//* + QueryExecutor exec = new QueryExecutor(); + List users = exec.execQuery(connection, "SELECT * FROM users;", (rset) -> { + System.out.println("handle:"); + List data = new ArrayList<>(); + while (rset.next()) { + User user = new User(); + user.setName(rset.getString(2)); + data.add(user); + } + return data; + }); + System.out.println(users.toString()); + *//** + * Использование prepared executor для запроса в базу + *//* + Map prepared = new HashMap<>(); + prepared.put(1, "John"); + users = exec.execQuery(connection, "SELECT * FROM users WHERE name = ?;", prepared, (rset) -> { + System.out.println("handle:"); + List data = new ArrayList<>(); + while (rset.next()) { + User user = new User(); + user.setName(rset.getString(2)); + data.add(user); + } + return data; + }); + System.out.println(users.toString());*/ + + //connection.close(); + } +} \ No newline at end of file diff --git a/src/main/java/track/messenger/messages/ChatCreate.java b/src/main/java/track/messenger/messages/ChatCreate.java new file mode 100644 index 00000000..4d62fa51 --- /dev/null +++ b/src/main/java/track/messenger/messages/ChatCreate.java @@ -0,0 +1,22 @@ +package track.messenger.messages; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class ChatCreate extends Message implements Serializable { + private String[] usersIds; + + public ChatCreate() { + super(null); + } + + public String[] getUsersIds() { + return usersIds; + } + + public void setUsersIds(String[] userIds) { + this.usersIds = userIds; + } +} diff --git a/src/main/java/track/messenger/messages/ChatHistResultMessage.java b/src/main/java/track/messenger/messages/ChatHistResultMessage.java new file mode 100644 index 00000000..549d0ffe --- /dev/null +++ b/src/main/java/track/messenger/messages/ChatHistResultMessage.java @@ -0,0 +1,38 @@ +package track.messenger.messages; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.store.Usermessage; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by ivan on 21.11.16. + */ +public class ChatHistResultMessage extends Message{ + List text; + List name; + static Logger log = LoggerFactory.getLogger(ChatHistResultMessage.class); + public ChatHistResultMessage() { + super(null); + } + public void setHistory(List history) { + text = new ArrayList<>(); + name = new ArrayList<>(); + for (int i = 0; i < history.size(); i++) { + text.add(history.get(i).getMessage()); + name.add(history.get(i).getname()); + } + log.info("text: {}", text); + log.info("name: {}", name); + } + + public List getMessage() { + return text; + } + + public List getName() { + return name; + } +} diff --git a/src/main/java/track/messenger/messages/ChatHistory.java b/src/main/java/track/messenger/messages/ChatHistory.java new file mode 100644 index 00000000..e7864c56 --- /dev/null +++ b/src/main/java/track/messenger/messages/ChatHistory.java @@ -0,0 +1,14 @@ +package track.messenger.messages; + +import track.messenger.User; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class ChatHistory extends Message implements Serializable { + public ChatHistory() { + super(null); + } +} diff --git a/src/main/java/track/messenger/messages/ChatList.java b/src/main/java/track/messenger/messages/ChatList.java new file mode 100644 index 00000000..6a49e53a --- /dev/null +++ b/src/main/java/track/messenger/messages/ChatList.java @@ -0,0 +1,18 @@ +package track.messenger.messages; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class ChatList extends Message implements Serializable { + private char[] chatsList; + + public ChatList() { + super(null); + } + + public char[] getChatsList() { + return chatsList; + } +} diff --git a/src/main/java/track/messenger/messages/ChatListResultMessage.java b/src/main/java/track/messenger/messages/ChatListResultMessage.java new file mode 100644 index 00000000..08c6b556 --- /dev/null +++ b/src/main/java/track/messenger/messages/ChatListResultMessage.java @@ -0,0 +1,22 @@ +package track.messenger.messages; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by ivan on 21.11.16. + */ +public class ChatListResultMessage extends Message{ + private List chatIds; + public ChatListResultMessage() { + super(null); + chatIds = new ArrayList<>(); + } + public List getChatIds() { + return chatIds; + } + + public void setChatIds(List chatIds) { + this.chatIds = chatIds; + } +} diff --git a/src/main/java/track/messenger/messages/FormMessage.java b/src/main/java/track/messenger/messages/FormMessage.java new file mode 100644 index 00000000..91e65f33 --- /dev/null +++ b/src/main/java/track/messenger/messages/FormMessage.java @@ -0,0 +1,32 @@ +package track.messenger.messages; + +import track.messenger.User; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by asus on 30.11.16. + */ +public class FormMessage extends Message{ + public FormMessage(User sender) { + super(sender); + } + private Map fields = new HashMap<>(); + + public Map getFields() { + return fields; + } + + public void setFields(Map fields) { + this.fields = fields; + } + + public String getField(String name) { + return fields.get(name); + } + + public void setField(String name, String value) { + fields.put(name, value); + } +} diff --git a/src/main/java/track/messenger/messages/InfoMessage.java b/src/main/java/track/messenger/messages/InfoMessage.java new file mode 100644 index 00000000..4ba74c08 --- /dev/null +++ b/src/main/java/track/messenger/messages/InfoMessage.java @@ -0,0 +1,14 @@ +package track.messenger.messages; + +import track.messenger.User; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class InfoMessage extends Message implements Serializable { + public InfoMessage() { + super(null); + } +} diff --git a/src/main/java/track/messenger/messages/InfoResultMessage.java b/src/main/java/track/messenger/messages/InfoResultMessage.java new file mode 100644 index 00000000..ad0abaed --- /dev/null +++ b/src/main/java/track/messenger/messages/InfoResultMessage.java @@ -0,0 +1,16 @@ +package track.messenger.messages; + +import track.messenger.User; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class InfoResultMessage extends Message implements Serializable { + + public InfoResultMessage() { + super(null); + } + +} diff --git a/src/main/java/track/messenger/messages/LoginMessage.java b/src/main/java/track/messenger/messages/LoginMessage.java new file mode 100644 index 00000000..5f9bb515 --- /dev/null +++ b/src/main/java/track/messenger/messages/LoginMessage.java @@ -0,0 +1,32 @@ +package track.messenger.messages; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class LoginMessage extends Message implements Serializable { + private String username; + private String password; + + public LoginMessage() { + super(null); + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } + +} diff --git a/src/main/java/track/messenger/messages/Message.java b/src/main/java/track/messenger/messages/Message.java new file mode 100644 index 00000000..5d50820f --- /dev/null +++ b/src/main/java/track/messenger/messages/Message.java @@ -0,0 +1,44 @@ +package track.messenger.messages; + +import track.messenger.User; + +import java.io.Serializable; + +/** + * + */ +public abstract class Message implements Serializable { + + private Long id; + private Long senderId; + private Type type; + + public Message(User sender) { + if(sender != null) { + this.senderId = sender.getId(); + } + } + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSenderId() { + return senderId; + } + + public void setSenderId(Long senderId) { + this.senderId = senderId; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } +} diff --git a/src/main/java/track/messenger/messages/Quit.java b/src/main/java/track/messenger/messages/Quit.java new file mode 100644 index 00000000..183c055f --- /dev/null +++ b/src/main/java/track/messenger/messages/Quit.java @@ -0,0 +1,14 @@ +package track.messenger.messages; + +import track.messenger.User; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class Quit extends Message implements Serializable { + public Quit(User sender) { + super(sender); + } +} diff --git a/src/main/java/track/messenger/messages/Registration.java b/src/main/java/track/messenger/messages/Registration.java new file mode 100644 index 00000000..22904b95 --- /dev/null +++ b/src/main/java/track/messenger/messages/Registration.java @@ -0,0 +1,29 @@ +package track.messenger.messages; + +import java.io.Serializable; + +/** + * Created by ivan on 21.11.16. + */ +public class Registration extends Message implements Serializable { + private String username; + private String password; + public Registration() { + super(null); + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } +} diff --git a/src/main/java/track/messenger/messages/StatusMessage.java b/src/main/java/track/messenger/messages/StatusMessage.java new file mode 100644 index 00000000..047dbd6f --- /dev/null +++ b/src/main/java/track/messenger/messages/StatusMessage.java @@ -0,0 +1,20 @@ +package track.messenger.messages; + +/** + * Created by ivan on 21.11.16. + */ +public class StatusMessage extends Message{ + private String status; + + public StatusMessage() { + super(null); + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } +} diff --git a/src/main/java/track/messenger/messages/TextMessage.java b/src/main/java/track/messenger/messages/TextMessage.java new file mode 100644 index 00000000..de15451c --- /dev/null +++ b/src/main/java/track/messenger/messages/TextMessage.java @@ -0,0 +1,69 @@ +package track.messenger.messages; + +import java.util.Date; +import java.util.Objects; + +/** + * Простое текстовое сообщение + */ +public class TextMessage extends Message { + private String text; + private String time; + private Long chatId; + + public TextMessage() { + super(null); + time = new Date().toString(); + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + if (!super.equals(other)) { + return false; + } + TextMessage message = (TextMessage) other; + return Objects.equals(text, message.text); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), text); + } + + @Override + public String toString() { + return "TextMessage{" + + "text='" + text + '\'' + + '}'; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public Long getChatId() { + return chatId; + } + + public void setChatId(Long chatId) { + this.chatId = chatId; + } +} \ No newline at end of file diff --git a/src/main/java/track/messenger/messages/Type.java b/src/main/java/track/messenger/messages/Type.java new file mode 100644 index 00000000..4792d66f --- /dev/null +++ b/src/main/java/track/messenger/messages/Type.java @@ -0,0 +1,22 @@ +package track.messenger.messages; + +/** + * Типы сообщений в системе + */ +public enum Type { + // Сообщения от клиента к серверу + MSG_LOGIN, // в ответ MSG_STATUS + MSG_TEXT, // в ответ MSG_STATUS + MSG_INFO, // в ответ MSG_INFO_RESULT + MSG_REGISTER, + MSG_QUIT, + MSG_CHAT_LIST, // в ответ MSG_CHAT_LIST_RESULT, + MSG_CHAT_CREATE, // в ответ MSG_STATUS + MSG_CHAT_HIST, // в ответ MSG_CHAT_HIST_RESULT, + + // Сообщения от сервера клиенту + MSG_STATUS, + MSG_CHAT_LIST_RESULT, + MSG_CHAT_HIST_RESULT, + MSG_INFO_RESULT +} diff --git a/src/main/java/track/messenger/net/BinaryProtocol.java b/src/main/java/track/messenger/net/BinaryProtocol.java new file mode 100644 index 00000000..fd687b56 --- /dev/null +++ b/src/main/java/track/messenger/net/BinaryProtocol.java @@ -0,0 +1,44 @@ +package track.messenger.net; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.messages.Message; + +import java.io.*; + +/** + * Created by asus on 17.12.16. + */ +public class BinaryProtocol implements Protocol { + private static Logger log = LoggerFactory.getLogger(BinaryProtocol.class); + @Override + public Message decode(byte[] bytes) throws ProtocolException { + ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); + ObjectInput in = null; + Message msg = null; + try { + in = new ObjectInputStream(inputStream); + msg = (Message) in.readObject(); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + throw new ProtocolException(e); + } + return msg; + } + + @Override + public byte[] encode(Message msg) throws ProtocolException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ObjectOutput out = null; + byte[] bytes = null; + try { + out = new ObjectOutputStream(outputStream); + out.writeObject(msg); + bytes = outputStream.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + throw new ProtocolException(e); + } + return bytes; + } +} diff --git a/src/main/java/track/messenger/net/MessengerServer.java b/src/main/java/track/messenger/net/MessengerServer.java new file mode 100644 index 00000000..8a13aeca --- /dev/null +++ b/src/main/java/track/messenger/net/MessengerServer.java @@ -0,0 +1,154 @@ +package track.messenger.net; + +import org.mockito.internal.util.io.IOUtil; +import track.messenger.commands.*; +import track.messenger.db.MessageBase; +import track.messenger.db.UserBase; +import track.messenger.messages.Message; +import track.messenger.messages.Type; +import track.messenger.store.MessageFactory; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.sql.SQLException; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * + */ +public class MessengerServer { + + private static final int MAX_CLIENTS = 1000; + private ServerSocket serverSocket; + private ArrayBlockingQueue sessions; + private int port; + private int nthreads; + private volatile boolean running; + private MessageBase messageBase; + private ExecutorService service; + private UserBase userBase; + private MessageFactory messageFactory; + private CommandExecutor commandExecutor; + private volatile long numchats; + private volatile long numusers; + + private void addCommands() + { + this.commandExecutor.addCommand(Type.MSG_LOGIN, new LoginCommand(this)); + this.commandExecutor.addCommand(Type.MSG_REGISTER, new RegistrationCommand(this)); + this.commandExecutor.addCommand(Type.MSG_CHAT_CREATE, new CreateChatCommand(this)); + this.commandExecutor.addCommand(Type.MSG_CHAT_HIST, new HistChatCommand(this)); + this.commandExecutor.addCommand(Type.MSG_TEXT, new TextCommand(this)); + this.commandExecutor.addCommand(Type.MSG_CHAT_LIST, new ListChatCommand(this)); + } + + public MessengerServer() throws SQLException, ClassNotFoundException { + userBase = new UserBase(); + messageBase = new MessageBase(); + commandExecutor = new CommandExecutor(); + numchats = userBase.Chat_size(); + numusers = userBase.User_size(); + addCommands(); + } + + public void setPort(int port) { + this.port = port; + } + + public void setNthreads(int nthreads) { + this.nthreads = nthreads; + } + + public void start() throws Exception{ + running = true; + serverSocket + = null; + sessions = new ArrayBlockingQueue(MAX_CLIENTS); + service = Executors.newFixedThreadPool(nthreads); + System.out.println("Waiting..."); + serverSocket = new ServerSocket(port); + listen(); + Message msg = null; + while (running) { + Session session = null; + try { + session = sessions.take(); + msg = session.getMessage(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (msg != null) { + Session finalSession = session; + service.submit(() -> { + try { + assert finalSession != null; + sessions.put(finalSession); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + } + } + IOUtil.closeQuietly(serverSocket); + + } + + private void listen() { + Thread listenerThread = new Thread(() -> { + System.out.println("Listening..."); + while (!Thread.currentThread().isInterrupted() && running) { + try { + Socket clientSocket = serverSocket.accept(); + sessions.add(new Session(clientSocket, commandExecutor, userBase, messageBase));//убрать команды из каждого потока водин + } catch (Exception e) { + System.out.println("listen: " + e.toString() + " error"); + Thread.currentThread().interrupt(); + } + } + }); + listenerThread.setDaemon(true); + listenerThread.start(); + } + + public boolean isrunning() + { + return running; + } + + public void stop() { + running = false; + try { + serverSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + service.shutdown(); + } + + public ArrayBlockingQueue getSessions() { + return sessions; + } + + public MessageFactory getMessageStore() { + return messageFactory; + } + + public long getnumchat() { + return numchats; + } + + public long getnumlogin() { + return numusers; + } + + public void chatincr() { + numchats++; + } + + public void loginincr() { + numusers++; + } +} diff --git a/src/main/java/track/messenger/net/Protocol.java b/src/main/java/track/messenger/net/Protocol.java new file mode 100644 index 00000000..09899d26 --- /dev/null +++ b/src/main/java/track/messenger/net/Protocol.java @@ -0,0 +1,14 @@ +package track.messenger.net; + +import track.messenger.messages.Message; + +/** + * + */ +public interface Protocol { + + Message decode(byte[] bytes) throws ProtocolException; + + byte[] encode(Message msg) throws ProtocolException; + +} diff --git a/src/main/java/track/messenger/net/ProtocolException.java b/src/main/java/track/messenger/net/ProtocolException.java new file mode 100644 index 00000000..aba5d538 --- /dev/null +++ b/src/main/java/track/messenger/net/ProtocolException.java @@ -0,0 +1,14 @@ +package track.messenger.net; + +/** + * Исключение, которое бросается, когда происходят ошибки кодирования/декодирования + */ +public class ProtocolException extends Exception { + public ProtocolException(String msg) { + super(msg); + } + + public ProtocolException(Throwable ex) { + super(ex); + } +} diff --git a/src/main/java/track/messenger/net/Session.java b/src/main/java/track/messenger/net/Session.java new file mode 100644 index 00000000..ff578af5 --- /dev/null +++ b/src/main/java/track/messenger/net/Session.java @@ -0,0 +1,135 @@ +package track.messenger.net; + +import org.mockito.internal.util.io.IOUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.User; +import track.messenger.commands.CommandException; +import track.messenger.commands.CommandExecutor; +import track.messenger.db.MessageBase; +import track.messenger.db.UserBase; +import track.messenger.messages.Message; +import track.messenger.store.MessageFactory; +import track.messenger.store.MessageStore; +import track.messenger.store.UserFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.sql.SQLException; + +/** + * Сессия связывает бизнес-логику и сетевую часть. + * Бизнес логика представлена объектом юзера - владельца сессии. + * Сетевая часть привязывает нас к определнному соединению по сети (от клиента) + */ +public class Session { + + static Logger log = LoggerFactory.getLogger(Session.class); + /** + * Пользователь сессии, пока не прошел логин, user == null + * После логина устанавливается реальный пользователь + */ + private User user; + private InputStream in; + private OutputStream out; + // сокет на клиента + private Socket socket; + private Protocol protocol; + private static final int MAX_MSG_SIZE = 32 * 1024; + private UserFactory userFactory; + private MessageFactory messageFactory; + private MessageStore messageStore; + private CommandExecutor commandExecutor; + + public Session(Socket clientSocket, CommandExecutor commandExecutor, UserBase userBase, MessageBase messageBase) throws IOException { + try { + socket = clientSocket; + in = socket.getInputStream(); + out = socket.getOutputStream(); + protocol = new BinaryProtocol(); + this.commandExecutor = commandExecutor; + this.userFactory = new UserFactory(userBase); + this.messageFactory = new MessageFactory(userBase, messageBase); + + } catch (IOException e) { + e.printStackTrace(); + close(); + } + } + + /** + * С каждым сокетом связано 2 канала in/out + */ + + public void send(Message msg) throws ProtocolException, IOException { + // TODO: Отправить клиенту сообщение + log.info("onsend"); + log.info("Message: {}", msg); + /*if (msg.getSenderId() != null) { + System.out.println("sent to: " + msg.getSenderId().toString()); + } else { + System.out.println("sent to: " + null); + }*/ + out.write(protocol.encode(msg)); + out.flush(); + } + + public void onMessage(Message msg) throws IOException, ProtocolException { + // TODO: Пришло некое сообщение от клиента, его нужно обработать + try { + commandExecutor.handleMessage(msg, this); + } catch (CommandException | SQLException | ClassNotFoundException e) { + e.printStackTrace(); + } + + } + + + public Message getMessage() throws IOException, ProtocolException { + + byte[] buf = new byte[MAX_MSG_SIZE]; + int read = 0; + Message ret = null; + try { + read = in.read(buf, 0, MAX_MSG_SIZE); + if (read > 0) { + ret = protocol.decode(buf); + log.info("message: {}", ret); + onMessage(ret); + } + } catch (SocketTimeoutException ste) { + ret = null; + } + return ret; + } + + public void close() { + IOUtil.closeQuietly(in); + IOUtil.closeQuietly(out); + IOUtil.closeQuietly(socket); + // TODO: закрыть in/out каналы и сокет. Освободить другие ресурсы, если необходимо + } + + public UserFactory getUserFactory() { + return userFactory; + } + + public MessageFactory getMessageFactory() { + return messageFactory; + } + + public void setUser(User user) { + this.user = user; + } + + public User getUser() { + return user; + } + + public MessageStore getMessageStore() { + return messageStore; + } +} \ No newline at end of file diff --git a/src/main/java/track/messenger/net/StringProtocol.java b/src/main/java/track/messenger/net/StringProtocol.java new file mode 100644 index 00000000..29118db7 --- /dev/null +++ b/src/main/java/track/messenger/net/StringProtocol.java @@ -0,0 +1,156 @@ +package track.messenger.net; +//убрать строковый протокол и добавить сериализацию +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.User; +import track.messenger.messages.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Простейший протокол передачи данных + */ +public class StringProtocol implements Protocol { + + static Logger log = LoggerFactory.getLogger(StringProtocol.class); + + public static final String DELIMITER = ";"; + private User user; + + @Override + public Message decode(byte[] bytes) throws ProtocolException { + String str = new String(bytes); + log.info("decoded: {}", str); + String[] tokens = str.split(DELIMITER); + Type type = Type.valueOf(tokens[0]); + switch (type) { + case MSG_STATUS: + StatusMessage statusMessage = new StatusMessage(); + statusMessage.setStatus(tokens[1]); + statusMessage.setType(type); + return statusMessage; + case MSG_TEXT: + TextMessage textMsg = new TextMessage(); + textMsg.setSenderId(parseLong(tokens[1])); + textMsg.setText(tokens[2]); + textMsg.setType(type); + return textMsg; + case MSG_LOGIN: + LoginMessage logMsg = new LoginMessage(); + logMsg.setUsername(tokens[1]); + logMsg.setPassword(tokens[2]); + logMsg.setType(type); + return logMsg; + case MSG_REGISTER: + Registration registration = new Registration(); + registration.setUsername(tokens[1]); + registration.setPassword(tokens[2]); + registration.setType(type); + return registration; + case MSG_QUIT: + LoginMessage quitMsg = new LoginMessage(); + quitMsg.setType(type); + return quitMsg; + case MSG_CHAT_LIST: + ChatList listChatMessage = new ChatList(); + listChatMessage.setSenderId(parseLong(tokens[1])); + listChatMessage.setType(type); + return listChatMessage; + case MSG_CHAT_CREATE: + ChatCreate chatCreateMessage = new ChatCreate(); + String[] userIdsStr = tokens[2].split(","); + List userIds = new ArrayList(); + for (int i = 0; i < userIdsStr.length; ++i) { + userIds.add(Long.parseLong(userIdsStr[i])); + } + //chatCreateMessage.setUsersIds(userIds); + chatCreateMessage.setType(type); + return chatCreateMessage; + case MSG_CHAT_LIST_RESULT: + ChatListResultMessage chatListResultMessage = new ChatListResultMessage(); + chatListResultMessage.setSenderId(parseLong(tokens[1])); + if (tokens.length >= 3) { + chatListResultMessage.setChatIds(Arrays.stream(tokens[2].split(",")) + .map(this::parseLong) + .collect(Collectors.toList())); + } + return chatListResultMessage; + case MSG_CHAT_HIST_RESULT: + ChatHistResultMessage chatHistResultMessage = new ChatHistResultMessage(); + chatHistResultMessage.setSenderId(parseLong(tokens[1])); + //if (tokens.length >= 3) { + // chatHistResultMessage.setHistory(tokens[2]); + //} + return chatHistResultMessage; + default: + throw new ProtocolException("Invalid type: " + type); + } + } + + @Override + public byte[] encode(Message msg) throws ProtocolException { + StringBuilder builder = new StringBuilder(); + Type type = msg.getType(); + builder.append(type).append(DELIMITER); + switch (type) { + case MSG_STATUS: + StatusMessage statusMessage = (StatusMessage) msg; + builder.append(statusMessage.getStatus()).append(DELIMITER); + break; + case MSG_TEXT: + TextMessage sendMessage = (TextMessage) msg; + builder.append(String.valueOf(sendMessage.getSenderId())).append(DELIMITER); + builder.append(sendMessage.getText()).append(DELIMITER); + break; + case MSG_LOGIN: + LoginMessage loginMessage = (LoginMessage) msg; + builder.append(loginMessage.getUsername()).append(DELIMITER); + builder.append(loginMessage.getPassword()).append(DELIMITER); + break; + case MSG_REGISTER: + Registration registration = (Registration) msg; + builder.append(registration.getUsername()).append(DELIMITER); + builder.append(registration.getPassword()).append(DELIMITER); + break; + case MSG_CHAT_LIST: + ChatList chatList = (ChatList) msg; + builder.append(String.valueOf(chatList.getSenderId())).append(DELIMITER); + builder.append(chatList.getChatsList()).append(DELIMITER); + break; + case MSG_CHAT_CREATE: + ChatCreate chatCreate = (ChatCreate) msg; + //List userIds = chatCreate.getUsersIds(); + //List userIdsStr = new ArrayList(); + //for (int i = 0; i < userIds.size(); ++i) { + // userIdsStr.add(String.valueOf(userIds.get(i))); + //} + //builder.append(String.valueOf(chatCreate.getSenderId())).append(DELIMITER); + //builder.append(String.join(",", + // userIdsStr)).append(DELIMITER); + break; + + case MSG_QUIT: + TextMessage quitMessage = (TextMessage) msg; + builder.append(String.valueOf(quitMessage.getSenderId())).append(DELIMITER); + break; + default: + throw new ProtocolException("Invalid type: " + type); + + + } + log.info("encoded: {}", builder.toString()); + return builder.toString().getBytes(); + } + + private Long parseLong(String str) { + try { + return Long.parseLong(str); + } catch (Exception e) { + // who care + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/track/messenger/store/MessageFactory.java b/src/main/java/track/messenger/store/MessageFactory.java new file mode 100644 index 00000000..2f4d9e99 --- /dev/null +++ b/src/main/java/track/messenger/store/MessageFactory.java @@ -0,0 +1,77 @@ +package track.messenger.store; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.Chat; +import track.messenger.db.MessageBase; +import track.messenger.db.UserBase; +import track.messenger.messages.Message; +import track.messenger.messages.TextMessage; + +import java.sql.SQLException; +import java.util.List; + +/** + * Created by asus on 02.12.16. + */ +public class MessageFactory implements MessageStore{ + UserBase userBase; + MessageBase messageBase; + static Logger log = LoggerFactory.getLogger(MessageFactory.class); + + public MessageFactory(UserBase userBase, MessageBase messageBase) { + this.messageBase = messageBase; + this.userBase = userBase; + } + + + public List getUsersByChatId(Long chatId) throws SQLException { + List users = userBase.getUsersByChatId(chatId); + return users; + } + + @Override + public List getChatsByUserId(Long userId) throws SQLException { + return null; + } + + @Override + public Chat getChatById(Long chatId) throws SQLException { + Chat chat = new Chat(); + List userIds = getUsersByChatId(chatId); + List messagesIds = getMessagesFromChat(chatId); + log.info("userIds: {}", userIds); + for (Long userId : userIds) { + chat.addParticipant(userId); + } + + chat.setId(chatId); + + return chat; + } + + @Override + public List getMessagesFromChat(Long chatId) throws SQLException { + return null; + } + + @Override + public Message getMessageById(Long messageId) throws SQLException { + return null; + } + + @Override + public void addMessage(Long chatId, TextMessage message) throws SQLException { + + } + + @Override + public void addUserToChat(Long userId, Long chatId) throws SQLException { + + } + + @Override + public Chat createChat(Long id, String[] participants) throws SQLException, ClassNotFoundException { + return messageBase.createChat(id, participants); + } +} diff --git a/src/main/java/track/messenger/store/MessageStore.java b/src/main/java/track/messenger/store/MessageStore.java new file mode 100644 index 00000000..9e6d0653 --- /dev/null +++ b/src/main/java/track/messenger/store/MessageStore.java @@ -0,0 +1,42 @@ +package track.messenger.store; + +import track.messenger.Chat; +import track.messenger.messages.Message; +import track.messenger.messages.TextMessage; + +import java.sql.SQLException; +import java.util.List; + +public interface MessageStore { + /** + * получаем список ид пользователей заданного чата + */ + List getChatsByUserId(Long userId) throws SQLException; + + /** + * получить информацию о чате + */ + Chat getChatById(Long chatId) throws SQLException; + + /** + * Список сообщений из чата + */ + List getMessagesFromChat(Long chatId) throws SQLException; + + /** + * Получить информацию о сообщении + */ + Message getMessageById(Long messageId) throws SQLException; + + /** + * Добавить сообщение в чат + */ + void addMessage(Long chatId, TextMessage message) throws SQLException; + + /** + * Добавить пользователя к чату + */ + void addUserToChat(Long userId, Long chatId) throws SQLException; + + Chat createChat(Long id, String[] participants) throws SQLException, ClassNotFoundException; +} diff --git a/src/main/java/track/messenger/store/UserFactory.java b/src/main/java/track/messenger/store/UserFactory.java new file mode 100644 index 00000000..571ea1d6 --- /dev/null +++ b/src/main/java/track/messenger/store/UserFactory.java @@ -0,0 +1,126 @@ +package track.messenger.store; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.Chat; +import track.messenger.User; +import track.messenger.db.UserBase; +import track.messenger.messages.Message; +import track.messenger.messages.TextMessage; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by asus on 02.12.16. + */ +public class UserFactory implements UserStore{ + private Map users; + static Logger log = LoggerFactory.getLogger(UserFactory.class); + private UserBase userBase; + private Map userLogins = new HashMap<>(); + + public UserFactory(UserBase userBase) { + this.userBase = userBase; + } + + public boolean isUserExist(String login) { + try { + log.info("userName: {}", login); + if (userBase.getUsertoLogin(login) == null) + log.info("null!!"); + else + return true; + //return (userBase.getUsertoLogin(login) != null); + } catch (Exception e) { + System.err.println("this login doesn't exist:" + login); + } + return false; + } + + + @Override + public User addUser(User user, long id) throws ClassNotFoundException, SQLException { + try { + userBase.addUser(user, id); + return user; + } + catch (SQLException e) + { + return null; + } + } + + @Override + public User updateUser(User user) { + return null; + } + + @Override + public User getUser(String login, String password) throws SQLException { + return (userBase.getUser(login, password)); + } + + @Override + public User getUserById(Long id) throws SQLException { + return userBase.getUserById(id); + } + public List getUsersByChatId(Long chatId) throws SQLException { + log.info("getchats"); + List users = userBase.getUsersByChatId(chatId); + return users; + } + + @Override + public List getChatsByUserId(Long userId) throws SQLException { + return userBase.getChatsByUserId(userId); + } + + @Override + public Chat getChatById(Long chatId) throws SQLException { + Chat chat = new Chat(); + List userIds = getUsersByChatId(chatId); + //List messagesIds = getMessagesFromChat(chatId); + log.info("userIds: {}", userIds); + for (Long userId : userIds) { + chat.addParticipant(userId); + } + + chat.setId(chatId); + + return chat; + } + + @Override + public List getMessagesFromChat(Long chatId) throws SQLException { + return userBase.getMessagesFromChat(chatId); + } + + @Override + public Message getMessageById(Long messageId) throws SQLException { + return null; + } + + @Override + public void addMessage(Long chatId, TextMessage message) throws SQLException { + userBase.addMessage(chatId, message); + } + + @Override + public void addUserToChat(Long userId, Long chatId) throws SQLException { + + } + + @Override + public Chat createChat(Long id, String[] participants, long numchats) throws SQLException, ClassNotFoundException { + return userBase.createChat(id, participants, numchats); + } + + @Override + public long Chat_size() throws SQLException { + return userBase.Chat_size(); + } + +} diff --git a/src/main/java/track/messenger/store/UserStore.java b/src/main/java/track/messenger/store/UserStore.java new file mode 100644 index 00000000..4555c161 --- /dev/null +++ b/src/main/java/track/messenger/store/UserStore.java @@ -0,0 +1,67 @@ +package track.messenger.store; + +import track.messenger.Chat; +import track.messenger.User; +import track.messenger.messages.Message; +import track.messenger.messages.TextMessage; + +import java.sql.SQLException; +import java.util.List; + +public interface UserStore { + /** + * Добавить пользователя в хранилище + * Вернуть его же + */ + User addUser(User user, long id) throws ClassNotFoundException, SQLException; + + /** + * Обновить информацию о пользователе + */ + User updateUser(User user); + + /** + * + * Получить пользователя по логину/паролю + * return null if user not found + */ + User getUser(String login, String password) throws SQLException; + + /** + * + * Получить пользователя по id, например запрос информации/профиля + * return null if user not found + */ + User getUserById(Long id) throws SQLException; + + List getChatsByUserId(Long userId) throws SQLException; + + /** + * получить информацию о чате + */ + Chat getChatById(Long chatId) throws SQLException; + + /** + * Список сообщений из чата + */ + List getMessagesFromChat(Long chatId) throws SQLException; + + /** + * Получить информацию о сообщении + */ + Message getMessageById(Long messageId) throws SQLException; + + /** + * Добавить сообщение в чат + */ + void addMessage(Long chatId, TextMessage message) throws SQLException; + + /** + * Добавить пользователя к чату + */ + void addUserToChat(Long userId, Long chatId) throws SQLException; + + Chat createChat(Long id, String[] participants, long numchats) throws SQLException, ClassNotFoundException; + + long Chat_size() throws SQLException; +} diff --git a/src/main/java/track/messenger/store/Usermessage.java b/src/main/java/track/messenger/store/Usermessage.java new file mode 100644 index 00000000..aad55c76 --- /dev/null +++ b/src/main/java/track/messenger/store/Usermessage.java @@ -0,0 +1,31 @@ +package track.messenger.store; + +import track.messenger.User; + +/** + * Created by asus on 22.12.16. + */ +public class Usermessage { + private User user; + private String text; + + public void setUser (User user) { + this.user = user; + } + + public void setMessage (String text) { + this.text = text; + } + + public String getMessage () { + return text; + } + + public String getname () { + return user.getName(); + } + + public Long getId () { + return user.getId(); + } +} diff --git a/src/main/java/track/messenger/teacher/client/MessengerClient.java b/src/main/java/track/messenger/teacher/client/MessengerClient.java new file mode 100644 index 00000000..a189aa9c --- /dev/null +++ b/src/main/java/track/messenger/teacher/client/MessengerClient.java @@ -0,0 +1,278 @@ +package track.messenger.teacher.client; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import track.messenger.User; +import track.messenger.messages.*; +import track.messenger.net.BinaryProtocol; +import track.messenger.net.Protocol; +import track.messenger.net.ProtocolException; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Scanner; + + +/** + * + */ +public class MessengerClient { + + + /** + * Механизм логирования позволяет более гибко управлять записью данных в лог (консоль, файл и тд) + * */ + static Logger log = LoggerFactory.getLogger(MessengerClient.class); + + /** + * Протокол, хост и порт инициализируются из конфига + * + * */ + private Protocol protocol; + private int port; + private String host; + private User user; + private boolean running; + + /** + * С каждым сокетом связано 2 канала in/out + */ + private InputStream in; + private OutputStream out; + + public Protocol getProtocol() { + return protocol; + } + + public void setProtocol(Protocol protocol) { + this.protocol = protocol; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public void initSocket() throws IOException { + Socket socket = new Socket(host, port); + in = socket.getInputStream(); + out = socket.getOutputStream(); + running = true; + + /* + Тред "слушает" сокет на наличие входящих сообщений от сервера + */ + Thread socketListenerThread = new Thread(() -> { + final byte[] buf = new byte[1024 * 64]; + log.info("Starting listener thread..."); + while (!Thread.currentThread().isInterrupted() && running) { + try { + // Здесь поток блокируется на ожидании данных + int read = in.read(buf); + if (read > 0) { + + // По сети передается поток байт, его нужно раскодировать с помощью протокола + Message msg = protocol.decode(Arrays.copyOf(buf, read)); + onMessage(msg); + } + } catch (Exception e) { + log.error("Failed to process connection: {}", e); + e.printStackTrace(); + Thread.currentThread().interrupt(); + } + } + System.out.println("exit onMessage"); + }); + + socketListenerThread.start(); + } + + /** + * Реагируем на входящее сообщение + */ + public void onMessage(Message msg) { + log.info("Message received: {}", msg); + if (msg == null) { + return; + } + + Type msgType = msg.getType(); + switch (msgType) { + case MSG_INFO_RESULT: + InfoResultMessage selfInfoMessage = (InfoResultMessage) msg; + selfInfoMessage.setType(Type.MSG_INFO_RESULT); + break; + case MSG_STATUS: + StatusMessage statusMessage = (StatusMessage) msg; + statusMessage.setType(Type.MSG_STATUS); + switch (statusMessage.getStatus()) { + case "EXIST": + System.out.println("This login is already exists"); + break; + } + System.out.println(statusMessage.getStatus()); + break; + case MSG_CHAT_HIST_RESULT: + ChatHistResultMessage histMessage = (ChatHistResultMessage) msg; + histMessage.setType(Type.MSG_CHAT_HIST_RESULT); + ArrayList text = (ArrayList) histMessage.getMessage(); + ArrayList name = (ArrayList) histMessage.getName(); + for (int i = 0; i < text.size(); i++) { + System.out.println(name.get(i) + ": " + text.get(i)); + } + break; + case MSG_CHAT_LIST_RESULT: + ChatListResultMessage listMessage = (ChatListResultMessage) msg; + listMessage.setType(Type.MSG_CHAT_LIST_RESULT); + String chats = listMessage.getChatIds().stream() + .map(id -> id.toString() + " ") + .reduce((first, second) -> first + second) + .orElse("No Chats."); + System.out.println(chats); + break; + default: + System.out.println(this.getClass() + ": error in server"); + } + } + + + public void processInput(String line) throws IOException, ProtocolException { + String[] tokens = line.split(" "); + //log.info("Tokens: {}", Arrays.toString(tokens)); + String cmdType = tokens[0]; + switch (cmdType) { + case "/login": + LoginMessage login = new LoginMessage(); + login.setType(Type.MSG_LOGIN); + login.setUsername(tokens[1]); + login.setPassword(tokens[2]); + send(login); + break; + case "/help": + System.out.println("HELP:\n" + + "/help - help.\n" + + "/register [username] [password] - registration\n" + + "/login [username] [password] - login.\n" + + "/info - information.\n" + + "/info [id] - information about user id.\n" + + "/chat_list - list chats.\n" + + "/chat_create [id1] [id2] ... - crate chat with users id1, id2...\n" + + "/text [id] [text] - send message text to chat with id.\n" + + "/chat_hist [id] - get messages from chat id.\n" + + "/quit - quit." + ); + break; + case "/text": + TextMessage sendMessage = new TextMessage(); + sendMessage.setType(Type.MSG_TEXT); + sendMessage.setChatId(Long.valueOf(tokens[1])); + sendMessage.setText(tokens[2]); + send(sendMessage); + break; + case "/info": + InfoMessage info = new InfoMessage(); + info.setType(Type.MSG_INFO); + info.setId(Long.valueOf(tokens[1])); + send(info); + break; + case "/chat_list": + ChatList chatlist = new ChatList(); + chatlist.setType(Type.MSG_CHAT_LIST); + send(chatlist); + break; + case "/chat_create": + ChatCreate chatcreate = new ChatCreate(); + chatcreate.setType(Type.MSG_CHAT_CREATE); + chatcreate.setUsersIds(tokens); + send(chatcreate); + break; + case "/chat_history": + ChatHistory chathist = new ChatHistory(); + chathist.setType(Type.MSG_CHAT_HIST); + chathist.setId(Long.valueOf(tokens[1])); + send(chathist); + break; + case "/register": + Registration registration = new Registration(); + registration.setType(Type.MSG_REGISTER); + registration.setUsername(tokens[1]); + registration.setPassword(tokens[2]); + send(registration); + break; + default: + log.error("Invalid input: " + line); + } + } + + /** + * Отправка сообщения в сокет клиент -> сервер + */ + public void send(Message msg) throws IOException, ProtocolException { + log.info(msg.toString()); + out.write(protocol.encode(msg)); + out.flush(); // принудительно проталкиваем буфер с данными + } + + + + public static void main(String[] args) throws Exception { + + MessengerClient client = new MessengerClient(); + client.setHost("localhost"); + client.setPort(19000); + client.setProtocol(new BinaryProtocol()); + + try { + client.initSocket(); + + // Цикл чтения с консоли + Scanner scanner = new Scanner(System.in); + System.out.println("$"); + while (client.isRunning()) { + String input = scanner.nextLine(); + if ("q".equals(input)) { + client.close(); + System.out.println("exit processInput"); + return; + } + try { + client.processInput(input); + } catch (ProtocolException | IOException e) { + log.error("Failed to process user input", e); + } + } + } catch (Exception e) { + log.error("Application failed.", e); + } finally { + if (client != null) { + // TODO + client.close(); + } + } + } + + public void close() { + running = false; + } + + + public boolean isRunning() { + return running; + } +} \ No newline at end of file diff --git a/src/main/resources/server.json b/src/main/resources/server.json new file mode 100644 index 00000000..79539785 --- /dev/null +++ b/src/main/resources/server.json @@ -0,0 +1,52 @@ +{ + "beans": [ + { + "id": "messengerServer", + "className": "track.messenger.net.MessengerServer", + "properties": { + "port": { + "name": "port", + "value": 19000, + "type": "VAL" + }, + "nthreads": { + "name": "nthreads", + "value": 4, + "type": "VAL" + } + } + }, + { + "id": "userStore", + "className": "track.messenger.store.UserStore", + "properties": { + "databaseName": { + "name": "databaseName", + "value": "store.sqlite3", + "type": "VAL" + }, + "tableName": { + "name": "tableName", + "value": "Users", + "type": "VAL" + } + } + }, + { + "id": "messageStore", + "className": "track.messenger.store.MessageStore", + "properties": { + "databaseName": { + "name": "databaseName", + "value": "store.sqlite3", + "type": "VAL" + }, + "tableName": { + "name": "tableName", + "value": "Messages", + "type": "VAL" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/server.xml b/src/main/resources/server.xml new file mode 100644 index 00000000..93a0f13a --- /dev/null +++ b/src/main/resources/server.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testDb.s3db b/testDb.s3db new file mode 100644 index 00000000..a0118519 Binary files /dev/null and b/testDb.s3db differ diff --git a/users.s3db b/users.s3db new file mode 100644 index 00000000..af9e5b75 Binary files /dev/null and b/users.s3db differ