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