git.iko.soy/cautious-octo-palm-tree
on master help sign in
54 files changed+2801
since splitsnapshots
unifiedsplit
task4/Dockerfile+21 task4/DostavimVseDockerfile+23 task4/data/DostavimVse/.gitignore+26 task4/data/DostavimVse/.mvn/wrapper/maven-wrapper.jar task4/data/DostavimVse/.mvn/wrapper/maven-wrapper.properties+1 task4/data/DostavimVse/lib/thymeleaf-2.1.4.RELEASE-javadoc.jar task4/data/DostavimVse/lib/thymeleaf-2.1.4.RELEASE-sources.jar task4/data/DostavimVse/lib/thymeleaf-2.1.4.RELEASE.jar task4/data/DostavimVse/mvnw+233 task4/data/DostavimVse/mvnw.cmd+145 task4/data/DostavimVse/pom.xml+99 task4/data/DostavimVse/src/main/java/Main.java+126 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/DatabaseCrawler.java+40 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/DostavimvseApplication.java+15 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/Graph.java+30 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/HibernateSessionFactory.java+40 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/MainController.java+75 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/Operator.java+79 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OptimalPriceSolver.java+171 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OptimalSolver.java+15 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OptimalTimeSolver.java+172 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OrderChangeLegTask.java+53 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OrderController.java+76 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OrderCreateTask.java+40 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/RouteIterator.java+53 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Client.java+69 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Leg.java+101 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/LegType.java+21 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Order.java+154 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/OrderStatus.java+24 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/OrderType.java+22 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Product.java+58 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Route.java+54 task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/RouteLeg.java+67 task4/data/DostavimVse/src/main/resources/application.properties+4 task4/data/DostavimVse/src/main/resources/hibernate.cfg.xml+23 task4/data/DostavimVse/src/main/resources/templates/createorderpage.html+155 task4/data/DostavimVse/src/main/resources/templates/errororder.html+39 task4/data/DostavimVse/src/main/resources/templates/getorder.html+114 task4/data/DostavimVse/src/main/resources/templates/getorderhistory.html+89 task4/data/DostavimVse/src/main/resources/templates/main.html+66 task4/data/DostavimVse/src/test/java/ru/fivt/dostavimvse/DostavimvseApplicationTests.java+40 task4/data/cmake-with-flask/.gitignore+3 task4/data/cmake-with-flask/B/CMakeLists.txt+5 task4/data/cmake-with-flask/B/lib.cpp+9 task4/data/cmake-with-flask/B/lib.h+7 task4/data/cmake-with-flask/C/CMakeLists.txt+8 task4/data/cmake-with-flask/C/main.cpp+11 task4/data/cmake-with-flask/C/main.h+1 task4/data/cmake-with-flask/CMakeLists.txt+10 task4/data/cmake-with-flask/app.py+24 task4/data/scripts/CREATE.sql+58 task4/docker-compose.yml+24 task4/run.sh+8
task4/Dockerfilenew file+21
@@ -0,0 +1,21 @@
1+FROM ubuntu:latest
2+
3+ADD data/cmake-with-flask /src
4+
5+WORKDIR /src
6+
7+RUN apt-get update && apt-get install -y tzdata && apt-get install -y cmake g++ python3 python3-pip
8+
9+RUN cmake .
10+RUN make
11+
12+RUN pip install flask
13+
14+
15+RUN apt-get clean
16+
17+RUN useradd techproguser
18+
19+EXPOSE 5000
20+
21+ENTRYPOINT FLASK_APP=/src/app.py flask run --port=5000 --host=0.0.0.0
task4/DostavimVseDockerfilenew file+23
@@ -0,0 +1,23 @@
1+FROM maven:3.6.0-jdk-8-slim
2+
3+
4+
5+ADD data/DostavimVse /src
6+
7+WORKDIR /src
8+
9+RUN mvn clean package -Dmaven.test.skip -Dstart-class=ru.fivt.dostavimvse.DostavimvseApplication \
10+ && mv /src/target/dostavimvse-0.0.1-SNAPSHOT.jar /run.jar \
11+ && mvn clean package -Dmaven.test.skip -Dstart-class=Main \
12+ && mv /src/target/dostavimvse-0.0.1-SNAPSHOT.jar /seed.jar
13+
14+RUN apt-get update && apt-get install -y mysql-client
15+
16+ADD data/scripts/CREATE.sql /CREATE.sql
17+ADD run.sh /run.sh
18+RUN chmod +x /run.sh
19+
20+
21+RUN apt-get clean && rm -rf /src
22+
23+ENTRYPOINT [ "/run.sh" ]
task4/data/DostavimVse/.gitignorenew file+26
@@ -0,0 +1,26 @@
1+target/
2+!.mvn/wrapper/maven-wrapper.jar
3+
4+### STS ###
5+.apt_generated
6+.classpath
7+.factorypath
8+.project
9+.settings
10+.springBeans
11+
12+### IntelliJ IDEA ###
13+.idea
14+*.iws
15+*.iml
16+*.ipr
17+
18+### NetBeans ###
19+nbproject/private/
20+build/
21+nbbuild/
22+dist/
23+nbdist/
24+.nb-gradle/
25+
26+src/main/java/ru/fivt/dostavimvse/Diagram.uml
task4/data/DostavimVse/.mvn/wrapper/maven-wrapper.jarnew file

Binary file not shown.

task4/data/DostavimVse/.mvn/wrapper/maven-wrapper.propertiesnew file+1
@@ -0,0 +1 @@
1+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
task4/data/DostavimVse/lib/thymeleaf-2.1.4.RELEASE-javadoc.jarnew file

Binary file not shown.

task4/data/DostavimVse/lib/thymeleaf-2.1.4.RELEASE-sources.jarnew file

Binary file not shown.

task4/data/DostavimVse/lib/thymeleaf-2.1.4.RELEASE.jarnew file

Binary file not shown.

task4/data/DostavimVse/mvnwnew file+233
@@ -0,0 +1,233 @@
1+#!/bin/sh
2+# ----------------------------------------------------------------------------
3+# Licensed to the Apache Software Foundation (ASF) under one
4+# or more contributor license agreements. See the NOTICE file
5+# distributed with this work for additional information
6+# regarding copyright ownership. The ASF licenses this file
7+# to you under the Apache License, Version 2.0 (the
8+# "License"); you may not use this file except in compliance
9+# with the License. You may obtain a copy of the License at
10+#
11+# http://www.apache.org/licenses/LICENSE-2.0
12+#
13+# Unless required by applicable law or agreed to in writing,
14+# software distributed under the License is distributed on an
15+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+# KIND, either express or implied. See the License for the
17+# specific language governing permissions and limitations
18+# under the License.
19+# ----------------------------------------------------------------------------
20+
21+# ----------------------------------------------------------------------------
22+# Maven2 Start Up Batch script
23+#
24+# Required ENV vars:
25+# ------------------
26+# JAVA_HOME - location of a JDK home dir
27+#
28+# Optional ENV vars
29+# -----------------
30+# M2_HOME - location of maven2's installed home dir
31+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
32+# e.g. to debug Maven itself, use
33+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35+# ----------------------------------------------------------------------------
36+
37+if [ -z "$MAVEN_SKIP_RC" ] ; then
38+
39+ if [ -f /etc/mavenrc ] ; then
40+ . /etc/mavenrc
41+ fi
42+
43+ if [ -f "$HOME/.mavenrc" ] ; then
44+ . "$HOME/.mavenrc"
45+ fi
46+
47+fi
48+
49+# OS specific support. $var _must_ be set to either true or false.
50+cygwin=false;
51+darwin=false;
52+mingw=false
53+case "`uname`" in
54+ CYGWIN*) cygwin=true ;;
55+ MINGW*) mingw=true;;
56+ Darwin*) darwin=true
57+ #
58+ # Look for the Apple JDKs first to preserve the existing behaviour, and then look
59+ # for the new JDKs provided by Oracle.
60+ #
61+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
62+ #
63+ # Apple JDKs
64+ #
65+ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
66+ fi
67+
68+ if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
69+ #
70+ # Apple JDKs
71+ #
72+ export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
73+ fi
74+
75+ if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
76+ #
77+ # Oracle JDKs
78+ #
79+ export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
80+ fi
81+
82+ if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
83+ #
84+ # Apple JDKs
85+ #
86+ export JAVA_HOME=`/usr/libexec/java_home`
87+ fi
88+ ;;
89+esac
90+
91+if [ -z "$JAVA_HOME" ] ; then
92+ if [ -r /etc/gentoo-release ] ; then
93+ JAVA_HOME=`java-config --jre-home`
94+ fi
95+fi
96+
97+if [ -z "$M2_HOME" ] ; then
98+ ## resolve links - $0 may be a link to maven's home
99+ PRG="$0"
100+
101+ # need this for relative symlinks
102+ while [ -h "$PRG" ] ; do
103+ ls=`ls -ld "$PRG"`
104+ link=`expr "$ls" : '.*-> \(.*\)$'`
105+ if expr "$link" : '/.*' > /dev/null; then
106+ PRG="$link"
107+ else
108+ PRG="`dirname "$PRG"`/$link"
109+ fi
110+ done
111+
112+ saveddir=`pwd`
113+
114+ M2_HOME=`dirname "$PRG"`/..
115+
116+ # make it fully qualified
117+ M2_HOME=`cd "$M2_HOME" && pwd`
118+
119+ cd "$saveddir"
120+ # echo Using m2 at $M2_HOME
121+fi
122+
123+# For Cygwin, ensure paths are in UNIX format before anything is touched
124+if $cygwin ; then
125+ [ -n "$M2_HOME" ] &&
126+ M2_HOME=`cygpath --unix "$M2_HOME"`
127+ [ -n "$JAVA_HOME" ] &&
128+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
129+ [ -n "$CLASSPATH" ] &&
130+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
131+fi
132+
133+# For Migwn, ensure paths are in UNIX format before anything is touched
134+if $mingw ; then
135+ [ -n "$M2_HOME" ] &&
136+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
137+ [ -n "$JAVA_HOME" ] &&
138+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
139+ # TODO classpath?
140+fi
141+
142+if [ -z "$JAVA_HOME" ]; then
143+ javaExecutable="`which javac`"
144+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
145+ # readlink(1) is not available as standard on Solaris 10.
146+ readLink=`which readlink`
147+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
148+ if $darwin ; then
149+ javaHome="`dirname \"$javaExecutable\"`"
150+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
151+ else
152+ javaExecutable="`readlink -f \"$javaExecutable\"`"
153+ fi
154+ javaHome="`dirname \"$javaExecutable\"`"
155+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
156+ JAVA_HOME="$javaHome"
157+ export JAVA_HOME
158+ fi
159+ fi
160+fi
161+
162+if [ -z "$JAVACMD" ] ; then
163+ if [ -n "$JAVA_HOME" ] ; then
164+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
165+ # IBM's JDK on AIX uses strange locations for the executables
166+ JAVACMD="$JAVA_HOME/jre/sh/java"
167+ else
168+ JAVACMD="$JAVA_HOME/bin/java"
169+ fi
170+ else
171+ JAVACMD="`which java`"
172+ fi
173+fi
174+
175+if [ ! -x "$JAVACMD" ] ; then
176+ echo "Error: JAVA_HOME is not defined correctly." >&2
177+ echo " We cannot execute $JAVACMD" >&2
178+ exit 1
179+fi
180+
181+if [ -z "$JAVA_HOME" ] ; then
182+ echo "Warning: JAVA_HOME environment variable is not set."
183+fi
184+
185+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
186+
187+# For Cygwin, switch paths to Windows format before running java
188+if $cygwin; then
189+ [ -n "$M2_HOME" ] &&
190+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
191+ [ -n "$JAVA_HOME" ] &&
192+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
193+ [ -n "$CLASSPATH" ] &&
194+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
195+fi
196+
197+# traverses directory structure from process work directory to filesystem root
198+# first directory with .mvn subdirectory is considered project base directory
199+find_maven_basedir() {
200+ local basedir=$(pwd)
201+ local wdir=$(pwd)
202+ while [ "$wdir" != '/' ] ; do
203+ if [ -d "$wdir"/.mvn ] ; then
204+ basedir=$wdir
205+ break
206+ fi
207+ wdir=$(cd "$wdir/.."; pwd)
208+ done
209+ echo "${basedir}"
210+}
211+
212+# concatenates all lines of a file
213+concat_lines() {
214+ if [ -f "$1" ]; then
215+ echo "$(tr -s '\n' ' ' < "$1")"
216+ fi
217+}
218+
219+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
220+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
221+
222+# Provide a "standardized" way to retrieve the CLI args that will
223+# work with both Windows and non-Windows executions.
224+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
225+export MAVEN_CMD_LINE_ARGS
226+
227+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
228+
229+exec "$JAVACMD" \
230+ $MAVEN_OPTS \
231+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
232+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
233+ ${WRAPPER_LAUNCHER} "$@"
task4/data/DostavimVse/mvnw.cmdnew file+145
@@ -0,0 +1,145 @@
1+@REM ----------------------------------------------------------------------------
2+@REM Licensed to the Apache Software Foundation (ASF) under one
3+@REM or more contributor license agreements. See the NOTICE file
4+@REM distributed with this work for additional information
5+@REM regarding copyright ownership. The ASF licenses this file
6+@REM to you under the Apache License, Version 2.0 (the
7+@REM "License"); you may not use this file except in compliance
8+@REM with the License. You may obtain a copy of the License at
9+@REM
10+@REM http://www.apache.org/licenses/LICENSE-2.0
11+@REM
12+@REM Unless required by applicable law or agreed to in writing,
13+@REM software distributed under the License is distributed on an
14+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+@REM KIND, either express or implied. See the License for the
16+@REM specific language governing permissions and limitations
17+@REM under the License.
18+@REM ----------------------------------------------------------------------------
19+
20+@REM ----------------------------------------------------------------------------
21+@REM Maven2 Start Up Batch script
22+@REM
23+@REM Required ENV vars:
24+@REM JAVA_HOME - location of a JDK home dir
25+@REM
26+@REM Optional ENV vars
27+@REM M2_HOME - location of maven2's installed home dir
28+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31+@REM e.g. to debug Maven itself, use
32+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34+@REM ----------------------------------------------------------------------------
35+
36+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37+@echo off
38+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
39+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
40+
41+@REM set %HOME% to equivalent of $HOME
42+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
43+
44+@REM Execute a user defined script before this one
45+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
46+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
47+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
48+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
49+:skipRcPre
50+
51+@setlocal
52+
53+set ERROR_CODE=0
54+
55+@REM To isolate internal variables from possible post scripts, we use another setlocal
56+@setlocal
57+
58+@REM ==== START VALIDATION ====
59+if not "%JAVA_HOME%" == "" goto OkJHome
60+
61+echo.
62+echo Error: JAVA_HOME not found in your environment. >&2
63+echo Please set the JAVA_HOME variable in your environment to match the >&2
64+echo location of your Java installation. >&2
65+echo.
66+goto error
67+
68+:OkJHome
69+if exist "%JAVA_HOME%\bin\java.exe" goto init
70+
71+echo.
72+echo Error: JAVA_HOME is set to an invalid directory. >&2
73+echo JAVA_HOME = "%JAVA_HOME%" >&2
74+echo Please set the JAVA_HOME variable in your environment to match the >&2
75+echo location of your Java installation. >&2
76+echo.
77+goto error
78+
79+@REM ==== END VALIDATION ====
80+
81+:init
82+
83+set MAVEN_CMD_LINE_ARGS=%*
84+
85+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86+@REM Fallback to current working directory if not found.
87+
88+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90+
91+set EXEC_DIR=%CD%
92+set WDIR=%EXEC_DIR%
93+:findBaseDir
94+IF EXIST "%WDIR%"\.mvn goto baseDirFound
95+cd ..
96+IF "%WDIR%"=="%CD%" goto baseDirNotFound
97+set WDIR=%CD%
98+goto findBaseDir
99+
100+:baseDirFound
101+set MAVEN_PROJECTBASEDIR=%WDIR%
102+cd "%EXEC_DIR%"
103+goto endDetectBaseDir
104+
105+:baseDirNotFound
106+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107+cd "%EXEC_DIR%"
108+
109+:endDetectBaseDir
110+
111+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112+
113+@setlocal EnableExtensions EnableDelayedExpansion
114+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116+
117+:endReadAdditionalConfig
118+
119+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120+
121+set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar""
122+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
123+
124+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
125+if ERRORLEVEL 1 goto error
126+goto end
127+
128+:error
129+set ERROR_CODE=1
130+
131+:end
132+@endlocal & set ERROR_CODE=%ERROR_CODE%
133+
134+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
135+@REM check for post script, once with legacy .bat ending and once with .cmd ending
136+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
137+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
138+:skipRcPost
139+
140+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
141+if "%MAVEN_BATCH_PAUSE%" == "on" pause
142+
143+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
144+
145+exit /B %ERROR_CODE%
task4/data/DostavimVse/pom.xmlnew file+99
@@ -0,0 +1,99 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+ <modelVersion>4.0.0</modelVersion>
5+
6+ <groupId>ru.fivt.dostavimvse</groupId>
7+ <artifactId>dostavimvse</artifactId>
8+ <version>0.0.1-SNAPSHOT</version>
9+ <packaging>jar</packaging>
10+
11+ <name>dostavimvse</name>
12+ <description>Project For PPS course</description>
13+
14+ <parent>
15+ <groupId>org.springframework.boot</groupId>
16+ <artifactId>spring-boot-starter-parent</artifactId>
17+ <version>1.4.2.RELEASE</version>
18+ <relativePath/> <!-- lookup parent from repository -->
19+ </parent>
20+
21+ <properties>
22+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
23+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
24+ <java.version>1.8</java.version>
25+ </properties>
26+
27+ <dependencies>
28+ <dependency>
29+ <groupId>org.springframework.boot</groupId>
30+ <artifactId>spring-boot-starter-data-jpa</artifactId>
31+ </dependency>
32+ <dependency>
33+ <groupId>org.springframework.boot</groupId>
34+ <artifactId>spring-boot-starter-web</artifactId>
35+ </dependency>
36+
37+ <dependency>
38+ <groupId>org.springframework.boot</groupId>
39+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
40+ </dependency>
41+
42+ <dependency>
43+ <groupId>mysql</groupId>
44+ <artifactId>mysql-connector-java</artifactId>
45+ <scope>runtime</scope>
46+ </dependency>
47+ <dependency>
48+ <groupId>org.springframework.boot</groupId>
49+ <artifactId>spring-boot-starter-test</artifactId>
50+ <scope>test</scope>
51+ </dependency>
52+ <dependency>
53+ <groupId>org.hibernate</groupId>
54+ <artifactId>hibernate-java8</artifactId>
55+ </dependency>
56+ <dependency>
57+ <groupId>org.webjars</groupId>
58+ <artifactId>jquery</artifactId>
59+ <version>1.9.1</version>
60+ </dependency>
61+ <dependency>
62+ <groupId>com.jayway.jsonpath</groupId>
63+ <artifactId>json-path</artifactId>
64+ <scope>test</scope>
65+ </dependency>
66+ <dependency>
67+ <groupId>org.json</groupId>
68+ <artifactId>json</artifactId>
69+ </dependency>
70+ </dependencies>
71+
72+ <profiles>
73+ <profile>
74+ <id>init-base</id>
75+ <properties>
76+ <spring.boot.mainclass>Main</spring.boot.mainclass>
77+ </properties>
78+ </profile>
79+ <profile>
80+ <id>web-app</id>
81+ <properties>
82+ <spring.boot.mainclass>ru.fivt.dostavimvse.DostavimvseApplication</spring.boot.mainclass>
83+ </properties>
84+ </profile>
85+ </profiles>
86+ <build>
87+ <plugins>
88+ <plugin>
89+ <groupId>org.springframework.boot</groupId>
90+ <artifactId>spring-boot-maven-plugin</artifactId>
91+ <configuration>
92+ <mainClass>${spring.boot.mainclass}</mainClass>
93+ </configuration>
94+ </plugin>
95+ </plugins>
96+ </build>
97+
98+
99+</project>
task4/data/DostavimVse/src/main/java/Main.javanew file+126
@@ -0,0 +1,126 @@
1+import org.hibernate.Query;
2+import org.hibernate.Session;
3+import ru.fivt.dostavimvse.HibernateSessionFactory;
4+import ru.fivt.dostavimvse.RouteIterator;
5+import ru.fivt.dostavimvse.models.*;
6+
7+import java.time.LocalDateTime;
8+import java.util.HashSet;
9+import java.util.List;
10+import java.util.Set;
11+
12+/**
13+ * Created by akhtyamovpavel on 29.11.16.
14+ */
15+public class Main {
16+
17+ public static void main(final String[] args) throws Exception {
18+ final Session session = HibernateSessionFactory.getSessionFactory().openSession();
19+ try {
20+
21+ session.beginTransaction();
22+ for (int i = 0; i < 5; ++i) {
23+ Client firstClient = new Client();
24+ session.save(firstClient);
25+ }
26+ session.getTransaction().commit();
27+
28+
29+ session.beginTransaction();
30+ Client firstClient = new Client();
31+ Order order = new Order();
32+ Product product = new Product();
33+ product.setWeight(0.8);
34+ product.setPrice(0.4);
35+
36+ product.setOrder(order);
37+
38+
39+ Set<Product> products = order.getProducts();
40+ products.add(product);
41+
42+ order.setProducts(products);
43+ order.setStartDate(LocalDateTime.now());
44+ order.setStartVertex(0);
45+ order.setEndVertex(9);
46+
47+ order.setClient(firstClient);
48+ order.setOrderStatus(OrderStatus.WAIT_CHANGE);
49+ order.setOrderType(OrderType.TIME);
50+ order.setReceiver(session.get(Client.class, 1));
51+ Set<Order> orders = firstClient.getOrders();
52+ orders.add(order);
53+ firstClient.setOrders(orders);
54+ session.save(firstClient);
55+ session.getTransaction().commit();
56+
57+
58+ session.beginTransaction();
59+ // up some legs in graph
60+
61+ for (int i = 0; i < 10; ++i) {
62+ for (int j = i; j < 10; ++j) {
63+ Leg leg = new Leg();
64+ leg.setStartVertex(i);
65+ leg.setEndVertex(j);
66+ leg.setBasePrice(1.0);
67+ leg.setMaxWeight(100.0);
68+ leg.setLegType(LegType.TRAIN);
69+ leg.setSendTime(20);
70+ session.save(leg);
71+ }
72+ }
73+ session.getTransaction().commit();
74+
75+
76+ session.beginTransaction();
77+ Route route = new Route();
78+
79+ order.setRoute(route);
80+ route.setOrder(order);
81+
82+ session.getTransaction().commit();
83+ System.err.println("Order -> Route mapped");
84+ session.beginTransaction();
85+
86+ Query query = session.createQuery("FROM Leg");
87+ List<Leg> legs = query.list();
88+ System.err.println("Legs obtained");
89+
90+ boolean found[] = new boolean[10];
91+ for (int i = 0; i < 10; ++i) {
92+ found[i] = false;
93+ }
94+
95+ Set<RouteLeg> routeLegs = new HashSet<>();
96+ for (Leg leg: legs) {
97+ int startVertex = leg.getStartVertex();
98+ int endVertex = leg.getEndVertex();
99+
100+ if (endVertex == startVertex + 1) {
101+ System.err.println(startVertex);
102+ System.err.println(endVertex);
103+ if (!found[startVertex]) {
104+ found[startVertex] = true;
105+ RouteLeg routeLeg = new RouteLeg();
106+ routeLeg.setLeg(leg);
107+ routeLeg.setRoute(route);
108+ routeLegs.add(routeLeg);
109+ }
110+ }
111+ }
112+ route.setRouteLegs(routeLegs);
113+
114+ session.saveOrUpdate(route);
115+ session.saveOrUpdate(order);
116+
117+ session.getTransaction().commit();
118+ } catch (Exception e) {
119+ System.err.println("Exception");
120+ System.err.println(e.getMessage());
121+ } finally {
122+ session.close();
123+ HibernateSessionFactory.shutdown();
124+ }
125+ }
126+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/DatabaseCrawler.javanew file+40
@@ -0,0 +1,40 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Criteria;
4+import org.hibernate.Query;
5+import org.hibernate.Session;
6+import ru.fivt.dostavimvse.models.Order;
7+import ru.fivt.dostavimvse.models.OrderStatus;
8+
9+import java.time.LocalDateTime;
10+import java.util.List;
11+import java.util.concurrent.ThreadPoolExecutor;
12+
13+/**
14+ * Created by akhtyamovpavel on 01.12.16.
15+ */
16+public class DatabaseCrawler implements Runnable {
17+
18+
19+ @Override
20+ public void run() {
21+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
22+
23+ Operator operator = Operator.getInstance();
24+
25+ Query query = session.createQuery("SELECT o FROM Order o INNER JOIN o.route AS r LEFT JOIN r.currentLeg AS rl WHERE (o.orderStatus = :order_status " +
26+ "AND (r.currentLeg is NULL OR rl.endTime < :end_time)) OR (o.orderStatus = :order_status_waiting " +
27+ "AND r.currentLeg is NULL)");
28+ query.setParameter("order_status", OrderStatus.MOVING);
29+ query.setParameter("end_time", LocalDateTime.now());
30+ query.setParameter("order_status_waiting", OrderStatus.WAIT_CHANGE);
31+
32+
33+ List<Order> orders = (List<Order>)query.list();
34+
35+ orders.forEach(operator::changeRouteLeg);
36+
37+ System.out.println("Session closed");
38+ session.close();
39+ }
40+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/DostavimvseApplication.javanew file+15
@@ -0,0 +1,15 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.SessionFactory;
4+import org.springframework.boot.SpringApplication;
5+import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+@SpringBootApplication
8+public class DostavimvseApplication {
9+
10+ public static void main(String[] args) {
11+ final SessionFactory factory = HibernateSessionFactory.getSessionFactory(); // open sessions and create factory
12+ Operator operator = Operator.getInstance();
13+ SpringApplication.run(DostavimvseApplication.class, args);
14+ }
15+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/Graph.javanew file+30
@@ -0,0 +1,30 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Query;
4+import org.hibernate.Session;
5+import ru.fivt.dostavimvse.models.Leg;
6+
7+import java.util.List;
8+
9+/**
10+ * Created by akhtyamovpavel on 30.11.16.
11+ */
12+public class Graph {
13+ private static Graph ourInstance = new Graph();
14+
15+ public static Graph getInstance() {
16+ return ourInstance;
17+ }
18+
19+ public List<Leg> legs = null;
20+
21+ private Graph() {
22+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
23+ Query query = session.createQuery("FROM Leg");
24+ legs = (List<Leg>)query.list();
25+ }
26+
27+ public List<Leg> getLegs() {
28+ return legs;
29+ }
30+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/HibernateSessionFactory.javanew file+40
@@ -0,0 +1,40 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.SessionFactory;
4+import org.hibernate.boot.MetadataSources;
5+import org.hibernate.boot.registry.StandardServiceRegistry;
6+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
7+
8+public class HibernateSessionFactory {
9+
10+ private static SessionFactory sessionFactory = buildSessionFactory();
11+
12+ protected static SessionFactory buildSessionFactory() {
13+ // A SessionFactory is set up once for an application!
14+ final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
15+ .configure() // configures settings from hibernate.cfg.xml
16+ .build();
17+ try {
18+ sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
19+ }
20+ catch (Exception e) {
21+ // The registry would be destroyed by the SessionFactory, but we had trouble building the SessionFactory
22+ // so destroy it manually.
23+ StandardServiceRegistryBuilder.destroy( registry );
24+
25+ throw new ExceptionInInitializerError("Initial SessionFactory failed" + e);
26+ }
27+ return sessionFactory;
28+ }
29+
30+
31+ public static SessionFactory getSessionFactory() {
32+ return sessionFactory;
33+ }
34+
35+ public static void shutdown() {
36+ // Close caches and connection pools
37+ getSessionFactory().close();
38+ }
39+
40+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/MainController.javanew file+75
@@ -0,0 +1,75 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Session;
4+import org.springframework.stereotype.Controller;
5+import org.springframework.ui.Model;
6+import org.springframework.web.bind.annotation.*;
7+import org.springframework.web.servlet.ModelAndView;
8+import ru.fivt.dostavimvse.models.Client;
9+import ru.fivt.dostavimvse.models.Order;
10+import ru.fivt.dostavimvse.models.OrderStatus;
11+import ru.fivt.dostavimvse.models.OrderType;
12+
13+/**
14+ * Created by akhtyamovpavel on 30.11.16.
15+ */
16+@Controller
17+public class MainController {
18+
19+
20+ @RequestMapping(value="/orders/{id}", method = RequestMethod.GET)
21+ public ModelAndView getOrderHistory(@PathVariable("id") int clientId) {
22+ ModelAndView modelAndView = new ModelAndView("getorderhistory");
23+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
24+
25+ Client client = session.get(Client.class, clientId);
26+
27+ modelAndView.addObject("client", client);
28+
29+ session.close();
30+ return modelAndView;
31+ }
32+
33+ @RequestMapping(value = "/order/{id}", method = RequestMethod.GET)
34+ public ModelAndView getOrder(@PathVariable("id") int orderId, @RequestParam(name="clientId") int clientId) {
35+
36+ try (Session session = HibernateSessionFactory.getSessionFactory().openSession()) {
37+ Client client = session.get(Client.class, clientId);
38+ if (client == null) {
39+ return new ModelAndView("errororder");
40+ }
41+ Order order = client.getOrder(orderId);
42+ if (order != null) {
43+ ModelAndView modelAndView = new ModelAndView("getorder");
44+ modelAndView.addObject("order", order);
45+ modelAndView.addObject("clientId", clientId);
46+ modelAndView.addObject("order_ready", OrderStatus.READY);
47+ return modelAndView;
48+ } else {
49+ return new ModelAndView("errororder");
50+ }
51+ } catch (Exception e) {
52+ ModelAndView modelAndView = new ModelAndView("errororder");
53+ return modelAndView;
54+ }
55+ }
56+
57+ @RequestMapping(value = "/receiveOrder/{id}", method = RequestMethod.POST)
58+ public ModelAndView receiveOrder(@PathVariable("id") int orderId) {
59+ return new ModelAndView();
60+ }
61+
62+ @RequestMapping(value="/", method=RequestMethod.GET)
63+ public ModelAndView getMainPage() {
64+ return new ModelAndView("main");
65+ }
66+
67+
68+ @RequestMapping(value = "/create/{id}", method = RequestMethod.GET)
69+ public ModelAndView getCreateOrderPage(@PathVariable("id") int clientId) {
70+ ModelAndView mav = new ModelAndView("createorderpage");
71+ mav.addObject("clientId", clientId);
72+ mav.addObject("orderTypes", OrderType.values());
73+ return mav;
74+ }
75+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/Operator.javanew file+79
@@ -0,0 +1,79 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Query;
4+import org.hibernate.Session;
5+import org.hibernate.SessionFactory;
6+import ru.fivt.dostavimvse.models.Order;
7+import ru.fivt.dostavimvse.models.OrderStatus;
8+import ru.fivt.dostavimvse.models.Product;
9+import ru.fivt.dostavimvse.models.Route;
10+
11+import java.io.Serializable;
12+import java.sql.Timestamp;
13+import java.time.LocalDateTime;
14+import java.util.List;
15+import java.util.concurrent.*;
16+
17+/**
18+ * Created by akhtyamovpavel on 01.12.16.
19+ */
20+public class Operator {
21+ private static Operator ourInstance = new Operator();
22+
23+ public static Operator getInstance() {
24+ return ourInstance;
25+ }
26+
27+ private ThreadPoolExecutor createOrderExecutor;
28+ private ThreadPoolExecutor changeLegExecutor;
29+ private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
30+
31+ public ThreadPoolExecutor getChangeLegExecutor() {
32+ return changeLegExecutor;
33+ }
34+
35+
36+
37+ private Operator() {
38+ createOrderExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);
39+ changeLegExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);
40+ scheduler.scheduleAtFixedRate(new DatabaseCrawler(), 10, 10, TimeUnit.SECONDS);
41+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
42+ Query query = session.createQuery("SELECT o FROM Order o INNER JOIN o.route AS r LEFT JOIN r.currentLeg AS rl WHERE o.orderStatus = :order_status " +
43+ "AND (r.currentLeg is NULL OR rl.endTime > :end_time)");
44+ query.setParameter("order_status", OrderStatus.WAIT_CHANGE);
45+ query.setParameter("end_time", LocalDateTime.now());
46+
47+ List<Order> orders = (List<Order>)query.list();
48+
49+
50+ for (Order order: orders) {
51+ System.out.println("OK");
52+ changeRouteLeg(order);
53+ }
54+
55+ session.close();
56+ }
57+
58+ Order createRoute(Order order) throws ExecutionException, InterruptedException {
59+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
60+ session.beginTransaction();
61+
62+ order.setStartDate(LocalDateTime.now());
63+ Future<Order> newRoute = createOrderExecutor.submit(new OrderCreateTask(order));
64+
65+ Order updatedOrder = newRoute.get();
66+
67+ for (Product product: updatedOrder.getProducts()) {
68+ product.setOrder(updatedOrder);
69+ }
70+ session.save(updatedOrder);
71+ session.getTransaction().commit();
72+ session.close();
73+ return updatedOrder;
74+ }
75+
76+ public void changeRouteLeg(Order order) {
77+ changeLegExecutor.execute(new OrderChangeLegTask(order));
78+ }
79+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OptimalPriceSolver.javanew file+171
@@ -0,0 +1,171 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.springframework.data.domain.Sort;
4+import ru.fivt.dostavimvse.models.Leg;
5+import ru.fivt.dostavimvse.models.Order;
6+import ru.fivt.dostavimvse.models.Route;
7+import ru.fivt.dostavimvse.models.RouteLeg;
8+
9+import java.util.*;
10+
11+/**
12+ * Created by akhtyamovpavel on 30.11.16.
13+ */
14+
15+class SortPriceVertex implements Comparable {
16+ private int fromVertex;
17+ private double cost;
18+
19+ public static final Double EPS = 1e-7;
20+
21+ public int getFromVertex() {
22+ return fromVertex;
23+ }
24+
25+ public void setFromVertex(int fromVertex) {
26+ this.fromVertex = fromVertex;
27+ }
28+
29+ public double getCost() {
30+ return cost;
31+ }
32+
33+ public void setCost(double cost) {
34+ this.cost = cost;
35+ }
36+
37+ SortPriceVertex(int fromVertex, double cost) {
38+ this.fromVertex = fromVertex;
39+ this.cost = cost;
40+ }
41+
42+ @Override
43+ public int compareTo(Object o) {
44+ SortPriceVertex other = (SortPriceVertex)o;
45+ if (cost + EPS < other.cost) {
46+ return -1;
47+ } else if (cost > other.cost + EPS) {
48+ return 1;
49+ }
50+ if (fromVertex < other.fromVertex) {
51+ return -1;
52+ } else if (fromVertex > other.fromVertex) {
53+ return 1;
54+ } else {
55+ return 0;
56+ }
57+ }
58+}
59+
60+public class OptimalPriceSolver implements OptimalSolver {
61+ @Override
62+ public Route buildOptimalRoute(Order order) {
63+ int startVertex = order.getStartVertex();
64+ int endVertex = order.getEndVertex();
65+
66+
67+ List<Leg> legs = Graph.getInstance().getLegs();
68+
69+ ArrayList<LinkedList<Leg>> legsMatrix = new ArrayList<>();
70+ int maxVertex = 0;
71+ for (Leg leg: legs) {
72+ int legStartVertex = leg.getStartVertex();
73+ int legEndVertex = leg.getEndVertex();
74+ if (legStartVertex > maxVertex) {
75+ maxVertex = legStartVertex;
76+ }
77+ if (legEndVertex > maxVertex) {
78+ maxVertex = legEndVertex;
79+ }
80+ }
81+
82+ for (int index = 0; index <= maxVertex; ++index) {
83+ legsMatrix.add(new LinkedList<>());
84+ }
85+
86+ for (Leg leg: legs) {
87+ int legStartVertex = leg.getStartVertex();
88+ legsMatrix.get(legStartVertex).add(leg);
89+ }
90+
91+ Double[] distances = new Double[maxVertex + 1];
92+ Boolean[] usedVertices = new Boolean[maxVertex + 1];
93+// ArrayList<Boolean> usedVertices = new ArrayList<>(maxVertex + 1);
94+ for (int index = 0; index <= maxVertex; ++index) {
95+ if (index != startVertex) {
96+ distances[index] = Double.MAX_VALUE;
97+ } else {
98+ distances[index] = 0.0;
99+ }
100+ usedVertices[index] = false;
101+ }
102+
103+ TreeSet<SortTimeVertex> sortVertices = new TreeSet<>();
104+ sortVertices.add(new SortTimeVertex(startVertex, 0.0));
105+ usedVertices[startVertex] = true;
106+
107+ ArrayList<Leg> answerLegs = new ArrayList<>();
108+ for (int index = 0; index <= maxVertex; ++index) {
109+ answerLegs.add(null);
110+ }
111+
112+ for (int index = 0; index <= maxVertex; ++index) {
113+ if (sortVertices.isEmpty()) {
114+ continue;
115+ }
116+ SortTimeVertex topVertex = sortVertices.first();
117+ int currentVertex = topVertex.getFromVertex();
118+ sortVertices.remove(topVertex);
119+ usedVertices[currentVertex] = true;
120+
121+ for (Leg outputLeg: legsMatrix.get(currentVertex)) {
122+ double cost = getLegCost(order, outputLeg);
123+ double updatedCost = distances[outputLeg.getStartVertex()] + cost;
124+ double outputCost = distances[outputLeg.getEndVertex()];
125+ int toVertex = outputLeg.getEndVertex();
126+ if (cost == Double.MAX_VALUE) {
127+ continue;
128+ }
129+ if (!usedVertices[toVertex] && updatedCost + cost + SortTimeVertex.EPS < outputCost) {
130+
131+ sortVertices.remove(new SortTimeVertex(outputLeg.getEndVertex(), outputCost));
132+ distances[toVertex] = updatedCost;
133+ sortVertices.add(new SortTimeVertex(outputLeg.getEndVertex(), updatedCost));
134+ answerLegs.set(toVertex, outputLeg);
135+ }
136+ }
137+ }
138+
139+
140+
141+ Route route = new Route();
142+
143+ if (distances[endVertex] == Double.MAX_VALUE) {
144+ return null;
145+ }
146+ ArrayList<RouteLeg> routeWay = new ArrayList<>();
147+
148+ int currentVertex = endVertex;
149+ while (currentVertex != startVertex) {
150+ RouteLeg leg = new RouteLeg();
151+ Leg answerLeg = answerLegs.get(currentVertex);
152+ leg.setLeg(answerLeg);
153+ routeWay.add(leg);
154+ leg.setRoute(route);
155+ currentVertex = answerLeg.getStartVertex();
156+ }
157+
158+
159+ route.setRouteLegs(new HashSet<>(routeWay));
160+ return route;
161+ }
162+
163+ @Override
164+ public double getLegCost(Order order, Leg leg) {
165+ double weight = order.getOverallWeight();
166+ if (weight > leg.getMaxWeight()) {
167+ return Double.MAX_VALUE;
168+ }
169+ return leg.getBasePrice() + order.getOverallPrice(); // stub
170+ }
171+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OptimalSolver.javanew file+15
@@ -0,0 +1,15 @@
1+package ru.fivt.dostavimvse;
2+
3+import ru.fivt.dostavimvse.models.Leg;
4+import ru.fivt.dostavimvse.models.Order;
5+import ru.fivt.dostavimvse.models.Route;
6+
7+/**
8+ * Created by akhtyamovpavel on 30.11.16.
9+ */
10+public interface OptimalSolver {
11+
12+ Route buildOptimalRoute(Order order);
13+
14+ double getLegCost(Order order, Leg leg);
15+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OptimalTimeSolver.javanew file+172
@@ -0,0 +1,172 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.springframework.data.domain.Sort;
4+import ru.fivt.dostavimvse.models.Leg;
5+import ru.fivt.dostavimvse.models.Order;
6+import ru.fivt.dostavimvse.models.Route;
7+import ru.fivt.dostavimvse.models.RouteLeg;
8+
9+import java.util.*;
10+
11+/**
12+ * Created by akhtyamovpavel on 30.11.16.
13+ */
14+
15+class SortTimeVertex implements Comparable {
16+ private int fromVertex;
17+ private double cost;
18+
19+ public static final Double EPS = 1e-7;
20+
21+ public int getFromVertex() {
22+ return fromVertex;
23+ }
24+
25+ public void setFromVertex(int fromVertex) {
26+ this.fromVertex = fromVertex;
27+ }
28+
29+ public double getCost() {
30+ return cost;
31+ }
32+
33+ public void setCost(double cost) {
34+ this.cost = cost;
35+ }
36+
37+ SortTimeVertex(int fromVertex, double cost) {
38+ this.fromVertex = fromVertex;
39+ this.cost = cost;
40+ }
41+
42+ @Override
43+ public int compareTo(Object o) {
44+ SortTimeVertex other = (SortTimeVertex)o;
45+ if (cost + EPS < other.cost) {
46+ return -1;
47+ } else if (cost > other.cost + EPS) {
48+ return 1;
49+ }
50+ if (fromVertex < other.fromVertex) {
51+ return -1;
52+ } else if (fromVertex > other.fromVertex) {
53+ return 1;
54+ } else {
55+ return 0;
56+ }
57+ }
58+}
59+
60+public class OptimalTimeSolver implements OptimalSolver {
61+ @Override
62+ public Route buildOptimalRoute(Order order) {
63+ int startVertex = order.getStartVertex();
64+ int endVertex = order.getEndVertex();
65+
66+
67+ List<Leg> legs = Graph.getInstance().getLegs();
68+
69+ ArrayList<LinkedList<Leg>> legsMatrix = new ArrayList<>();
70+ int maxVertex = 0;
71+ for (Leg leg: legs) {
72+ int legStartVertex = leg.getStartVertex();
73+ int legEndVertex = leg.getEndVertex();
74+ if (legStartVertex > maxVertex) {
75+ maxVertex = legStartVertex;
76+ }
77+ if (legEndVertex > maxVertex) {
78+ maxVertex = legEndVertex;
79+ }
80+ }
81+
82+ for (int index = 0; index <= maxVertex; ++index) {
83+ legsMatrix.add(new LinkedList<>());
84+ }
85+
86+ for (Leg leg: legs) {
87+ int legStartVertex = leg.getStartVertex();
88+ legsMatrix.get(legStartVertex).add(leg);
89+ }
90+
91+ Double[] distances = new Double[maxVertex + 1];
92+ Boolean[] usedVertices = new Boolean[maxVertex + 1];
93+// ArrayList<Boolean> usedVertices = new ArrayList<>(maxVertex + 1);
94+ for (int index = 0; index <= maxVertex; ++index) {
95+ if (index != startVertex) {
96+ distances[index] = Double.MAX_VALUE;
97+ } else {
98+ distances[index] = 0.0;
99+ }
100+ usedVertices[index] = false;
101+ }
102+
103+ TreeSet<SortTimeVertex> sortVertices = new TreeSet<>();
104+ sortVertices.add(new SortTimeVertex(startVertex, 0.0));
105+ usedVertices[startVertex] = true;
106+
107+ ArrayList<Leg> answerLegs = new ArrayList<>();
108+ for (int index = 0; index <= maxVertex; ++index) {
109+ answerLegs.add(null);
110+ }
111+
112+ for (int index = 0; index <= maxVertex; ++index) {
113+ if (sortVertices.isEmpty()) {
114+ continue;
115+ }
116+ SortTimeVertex topVertex = sortVertices.first();
117+ int currentVertex = topVertex.getFromVertex();
118+ sortVertices.remove(topVertex);
119+ usedVertices[currentVertex] = true;
120+
121+ for (Leg outputLeg: legsMatrix.get(currentVertex)) {
122+ double cost = getLegCost(order, outputLeg);
123+ double updatedCost = distances[outputLeg.getStartVertex()] + cost;
124+ double outputCost = distances[outputLeg.getEndVertex()];
125+ int toVertex = outputLeg.getEndVertex();
126+ if (cost == Double.MAX_VALUE) {
127+ continue;
128+ }
129+ if (!usedVertices[toVertex] && updatedCost + cost + SortTimeVertex.EPS < outputCost) {
130+
131+ sortVertices.remove(new SortTimeVertex(outputLeg.getEndVertex(), outputCost));
132+ distances[toVertex] = updatedCost;
133+ sortVertices.add(new SortTimeVertex(outputLeg.getEndVertex(), updatedCost));
134+ answerLegs.set(toVertex, outputLeg);
135+ }
136+ }
137+ }
138+
139+
140+
141+ Route route = new Route();
142+
143+ if (distances[endVertex] == Double.MAX_VALUE) {
144+ return null;
145+ }
146+ ArrayList<RouteLeg> routeWay = new ArrayList<>();
147+
148+ int currentVertex = endVertex;
149+ while (currentVertex != startVertex) {
150+ RouteLeg leg = new RouteLeg();
151+ Leg answerLeg = answerLegs.get(currentVertex);
152+ leg.setLeg(answerLeg);
153+ routeWay.add(leg);
154+ leg.setRoute(route);
155+ currentVertex = answerLeg.getStartVertex();
156+ }
157+
158+
159+ // TODO: write this code in normal way
160+ route.setRouteLegs(new HashSet<>(routeWay));
161+ return route;
162+ }
163+
164+ @Override
165+ public double getLegCost(Order order, Leg leg) {
166+ double weight = order.getOverallWeight();
167+ if (weight > leg.getMaxWeight()) {
168+ return Double.MAX_VALUE;
169+ }
170+ return leg.getSendTime(); // stub
171+ }
172+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OrderChangeLegTask.javanew file+53
@@ -0,0 +1,53 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Session;
4+import ru.fivt.dostavimvse.models.Order;
5+import ru.fivt.dostavimvse.models.OrderStatus;
6+import ru.fivt.dostavimvse.models.Route;
7+import ru.fivt.dostavimvse.models.RouteLeg;
8+
9+import java.time.LocalDateTime;
10+
11+/**
12+ * Created by akhtyamovpavel on 01.12.16.
13+ */
14+public class OrderChangeLegTask implements Runnable {
15+
16+ private Order order;
17+
18+ public OrderChangeLegTask(Order order) {
19+ this.order = order;
20+ }
21+
22+ @Override
23+ public void run() {
24+ Route route = order.getRoute();
25+ RouteIterator routeIterator = new RouteIterator(order, false);
26+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
27+ session.beginTransaction();
28+ // TODO: write current session in RouteLeg
29+ if (routeIterator.hasNext()) {
30+ RouteLeg newLeg = routeIterator.next();
31+
32+ int sendTime = newLeg.getLeg().getSendTime();
33+
34+ newLeg.setStartTime(LocalDateTime.now());
35+ newLeg.setEndTime(LocalDateTime.now().plusSeconds(sendTime));
36+ // Add some info for next leg
37+ order.setOrderStatus(OrderStatus.MOVING);
38+
39+ route.setCurrentLeg(newLeg);
40+
41+ } else {
42+ order.setOrderStatus(OrderStatus.READY);
43+ route.setCurrentLeg(null);
44+ }
45+
46+// session.saveOrUpdate(route);
47+ session.saveOrUpdate(order);
48+
49+ session.getTransaction().commit();
50+ session.close();
51+
52+ }
53+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OrderController.javanew file+76
@@ -0,0 +1,76 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Session;
4+import org.json.JSONObject;
5+import org.springframework.web.bind.annotation.*;
6+import ru.fivt.dostavimvse.models.Client;
7+import ru.fivt.dostavimvse.models.Order;
8+
9+/**
10+ * Created by akhtyamovpavel on 06.12.16.
11+ */
12+@RestController
13+public class OrderController {
14+ @RequestMapping(value = "/create/{id}", method = RequestMethod.POST)
15+ @ResponseBody
16+ public String createOrder(@PathVariable("id") int clientId, @RequestParam(name = "receiver") int receiverId,
17+ @RequestBody Order order) {
18+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
19+ try {
20+ Client client = session.get(Client.class, clientId);
21+ Client receiver = session.get(Client.class, receiverId);
22+
23+ if (client == null || receiver == null) {
24+ JSONObject object = new JSONObject();
25+ object.append("message", "No such client or receiver");
26+ object.append("code", 400);
27+ return object.toString();
28+ }
29+ order.setReceiver(receiver);
30+ Order packedOrder = client.createOrder(order);
31+
32+ Order updatedOrder = Operator.getInstance().createRoute(packedOrder);
33+ JSONObject response = new JSONObject();
34+ response.append("message", "Order created");
35+ response.append("code", 200);
36+ response.append("orderId", updatedOrder.getId());
37+ return response.toString();
38+ } catch (Exception e) {
39+ JSONObject response = new JSONObject();
40+ response.append("message", "Error happened");
41+ response.append("code", 400);
42+ return response.toString();
43+ }
44+ }
45+
46+ @RequestMapping(value = "/receive", method = RequestMethod.POST)
47+ public String receiverOrder(@RequestParam(name="receiverId") Integer receiverId,
48+ @RequestParam(name="orderId") Integer orderId) {
49+ Session session = HibernateSessionFactory.getSessionFactory().openSession();
50+
51+ Client receiver = session.get(Client.class, receiverId);
52+ Order order = session.get(Order.class, orderId);
53+ if (receiver == null || order == null) {
54+ JSONObject response = new JSONObject();
55+ response.append("code", 400);
56+ response.append("message", "Невозможно получить заказ: несанкционированный вход!");
57+ return response.toString();
58+ }
59+ Order receivedOrder = receiver.receiveOrder(order);
60+ try {
61+ session.saveOrUpdate(receivedOrder);
62+ session.beginTransaction().commit();
63+ session.close();
64+ JSONObject response = new JSONObject();
65+ response.append("code", 200);
66+ response.append("message", "Заказ получен! Страница будет обновлена для отображения нового статуса!");
67+ return response.toString();
68+ } catch (Exception e) {
69+ JSONObject response = new JSONObject();
70+ response.append("code", 400);
71+ response.append("message", "Заказ не может быть получен! Повторите позже!");
72+ return response.toString();
73+ }
74+ }
75+
76+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/OrderCreateTask.javanew file+40
@@ -0,0 +1,40 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Session;
4+import ru.fivt.dostavimvse.models.Order;
5+import ru.fivt.dostavimvse.models.OrderStatus;
6+import ru.fivt.dostavimvse.models.OrderType;
7+import ru.fivt.dostavimvse.models.Route;
8+
9+import java.util.concurrent.Callable;
10+
11+/**
12+ * Created by akhtyamovpavel on 01.12.16.
13+ */
14+public class OrderCreateTask implements Callable<Order> {
15+ private Order order;
16+
17+ public OrderCreateTask(Order order) {
18+ this.order = order;
19+ }
20+
21+ @Override
22+ public Order call() {
23+ OptimalSolver solver = null;
24+ if (order.getOrderType() == OrderType.TIME) {
25+ solver = new OptimalTimeSolver();
26+ } else if (order.getOrderType() == OrderType.PRICE) {
27+ solver = new OptimalPriceSolver();
28+ } else {
29+ return null;
30+ }
31+
32+ Route route = solver.buildOptimalRoute(order);
33+ order.setRoute(route);
34+ route.setOrder(order);
35+ order.setOrderStatus(OrderStatus.WAIT_CHANGE);
36+
37+ return order;
38+ }
39+
40+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/RouteIterator.javanew file+53
@@ -0,0 +1,53 @@
1+package ru.fivt.dostavimvse;
2+
3+import ru.fivt.dostavimvse.models.Order;
4+import ru.fivt.dostavimvse.models.Route;
5+import ru.fivt.dostavimvse.models.RouteLeg;
6+
7+import java.util.Iterator;
8+import java.util.NoSuchElementException;
9+import java.util.Set;
10+
11+/**
12+ * Created by akhtyamovpavel on 02.12.16.
13+ */
14+
15+public class RouteIterator implements Iterator<RouteLeg>{
16+ private Set<RouteLeg> routeLegs;
17+ private int currentVertex;
18+ private int endVertex;
19+
20+ public RouteIterator(Order order, boolean fromStart) {
21+ Route route = order.getRoute();
22+ this.routeLegs = route.getRouteLegs();
23+ if (fromStart) {
24+ this.currentVertex = order.getStartVertex();
25+ } else {
26+ if (route.getCurrentLeg() == null) {
27+ this.currentVertex = order.getStartVertex();
28+ } else {
29+ this.currentVertex = route.getCurrentLeg().getLeg().getEndVertex();
30+ }
31+ }
32+ this.endVertex = order.getEndVertex();
33+ }
34+
35+ @Override
36+ public boolean hasNext() {
37+ return currentVertex != endVertex;
38+ }
39+
40+ @Override
41+ public RouteLeg next() {
42+ if (!hasNext()) {
43+ throw new NoSuchElementException("Route iterator finished the end");
44+ }
45+ for (RouteLeg routeLeg: routeLegs) {
46+ if (routeLeg.getLeg().getStartVertex() == currentVertex) {
47+ currentVertex = routeLeg.getLeg().getEndVertex();
48+ return routeLeg;
49+ }
50+ }
51+ throw new NoSuchElementException("Failed to found next vertex");
52+ }
53+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Client.javanew file+69
@@ -0,0 +1,69 @@
1+package ru.fivt.dostavimvse.models;
2+
3+import javax.persistence.*;
4+import java.io.Serializable;
5+import java.util.*;
6+import java.util.stream.Stream;
7+
8+/**
9+ * Created by akhtyamovpavel on 29.11.16.
10+ */
11+@Entity
12+@Table(name = "CLIENT")
13+public class Client implements Serializable {
14+
15+ @Id
16+ @Column(name = "ID", unique = true, nullable = false)
17+ @GeneratedValue(strategy = GenerationType.IDENTITY)
18+ private Integer id;
19+
20+ @OneToMany(fetch = FetchType.EAGER, mappedBy = "client", cascade = CascadeType.ALL)
21+ private Set<Order> orders = new HashSet<>();
22+
23+ public Set<Order> getReceiverOrders() {
24+ return receiverOrders;
25+ }
26+
27+ @OneToMany(fetch = FetchType.EAGER, mappedBy = "receiver", cascade = CascadeType.ALL)
28+ private Set<Order> receiverOrders = new HashSet<>();
29+
30+
31+ public Set<Order> getOrders() {
32+ return this.orders;
33+ }
34+
35+ public Order receiveOrder(Order order) {
36+ if (order.getReceiver().getId().equals(getId()) && order.getOrderStatus() == OrderStatus.READY) {
37+ order.setOrderStatus(OrderStatus.COMPLETED);
38+ return order;
39+ } else {
40+ return null;
41+ }
42+ }
43+
44+ public Order getOrder(Integer id) {
45+ Optional<Order> firstStream = orders.stream().filter((Order order) ->
46+ order.getId().equals(id)
47+ ).findFirst();
48+ if (firstStream.isPresent()) {
49+ return firstStream.get();
50+ }
51+ return receiverOrders.stream().filter((Order order) ->
52+ order.getId().equals(id)
53+ ).findFirst().get();
54+ }
55+
56+ public void setOrders(Set<Order> orders) {
57+ this.orders = orders;
58+ }
59+
60+ public Integer getId() {
61+ return id;
62+ }
63+
64+ public Order createOrder(Order order) {
65+ order.setOrderStatus(OrderStatus.WAIT_CREATE);
66+ order.setClient(this);
67+ return order;
68+ }
69+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Leg.javanew file+101
@@ -0,0 +1,101 @@
1+package ru.fivt.dostavimvse.models;
2+
3+import javax.persistence.*;
4+import javax.validation.constraints.DecimalMin;
5+import javax.validation.constraints.Min;
6+import java.io.Serializable;
7+
8+/**
9+ * Created by akhtyamovpavel on 29.11.16.
10+ */
11+@Entity
12+@Table(name = "LEG")
13+public class Leg implements Serializable {
14+
15+ @Id
16+ @Column(name = "ID")
17+ @GeneratedValue(strategy = GenerationType.IDENTITY)
18+ private Integer id;
19+
20+ @Min(0)
21+ @Column(name = "START_VERTEX")
22+ private Integer startVertex;
23+
24+ @Min(0)
25+ @Column(name = "END_VERTEX")
26+ private Integer endVertex;
27+
28+ @DecimalMin("0.0")
29+ @Column(name = "MAX_WEIGHT")
30+ private Double maxWeight;
31+
32+ @DecimalMin("0.0")
33+ @Column(name = "BASE_PRICE")
34+ private Double basePrice;
35+
36+ @Column(name="LEG_TYPE", columnDefinition = "enum('AVIA';'TRAIN')")
37+ @Enumerated(EnumType.STRING)
38+ private LegType legType;
39+
40+ @Min(1)
41+ @Column(name = "SEND_TIME")
42+ private Integer sendTime;
43+
44+ public Integer getId() {
45+ return id;
46+ }
47+
48+ public void setId(Integer id) {
49+ this.id = id;
50+ }
51+
52+ public Integer getStartVertex() {
53+ return startVertex;
54+ }
55+
56+ public void setStartVertex(Integer startVertex) {
57+ this.startVertex = startVertex;
58+ }
59+
60+ public Integer getEndVertex() {
61+ return endVertex;
62+ }
63+
64+ public void setEndVertex(Integer endVertex) {
65+ this.endVertex = endVertex;
66+ }
67+
68+ public Double getMaxWeight() {
69+ return maxWeight;
70+ }
71+
72+ public void setMaxWeight(Double maxWeight) {
73+ this.maxWeight = maxWeight;
74+ }
75+
76+
77+ public Double getBasePrice() {
78+ return basePrice;
79+ }
80+
81+ public void setBasePrice(Double basePrice) {
82+ this.basePrice = basePrice;
83+ }
84+
85+ public LegType getLegType() {
86+ return legType;
87+ }
88+
89+ public void setLegType(LegType legType) {
90+ this.legType = legType;
91+ }
92+
93+ public void setSendTime(Integer sendTime) {
94+ this.sendTime = sendTime;
95+ }
96+
97+ public Integer getSendTime() {
98+ return sendTime;
99+ }
100+
101+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/LegType.javanew file+21
@@ -0,0 +1,21 @@
1+package ru.fivt.dostavimvse.models;
2+
3+/**
4+ * Created by akhtyamovpavel on 01.12.16.
5+ */
6+public enum LegType {
7+ AVIA("avia"),
8+ TRAIN("train");
9+
10+
11+ private final String type;
12+
13+ LegType(String type) {
14+ this.type = type;
15+ }
16+
17+ @Override
18+ public String toString() {
19+ return type;
20+ }
21+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Order.javanew file+154
@@ -0,0 +1,154 @@
1+package ru.fivt.dostavimvse.models;
2+
3+import javax.persistence.*;
4+import javax.validation.constraints.Min;
5+import java.io.Serializable;
6+import java.time.LocalDateTime;
7+import java.util.*;
8+
9+/**
10+ * Created by akhtyamovpavel on 30.11.16.
11+ */
12+
13+@Entity
14+@Table(name = "ORDERS")
15+public class Order implements Serializable {
16+
17+ @Id
18+ @Column(name = "ID", unique = true, nullable = false)
19+ @GeneratedValue(strategy = GenerationType.IDENTITY)
20+ private Integer id;
21+
22+ @OneToMany(fetch = FetchType.EAGER, mappedBy = "order", cascade = CascadeType.ALL)
23+ private Set<Product> products = new HashSet<>();
24+
25+
26+ @Column(name = "START_DATE")
27+ private LocalDateTime startDate;
28+
29+
30+ @Column(name = "ORDER_TYPE", columnDefinition = "enum('TIME';'PRICE')")
31+ @Enumerated(EnumType.STRING)
32+ private OrderType orderType;
33+
34+ @Column(name = "ORDER_STATUS", columnDefinition = "enum('WAIT_CREATE';'WAIT_CHANGE';'MOVING';'READY';'COMPLETED')")
35+ @Enumerated(EnumType.STRING)
36+ private OrderStatus orderStatus;
37+
38+ @Min(0)
39+ @Column(name = "START_VERTEX", nullable = false)
40+ private Integer startVertex;
41+
42+ @Min(0)
43+ @Column(name = "END_VERTEX", nullable = false)
44+ private Integer endVertex;
45+
46+ @ManyToOne()
47+ @JoinColumn(name = "CLIENT_ID", nullable = false)
48+ private Client client;
49+
50+ public Client getReceiver() {
51+ return receiver;
52+ }
53+
54+ public void setReceiver(Client receiver) {
55+ this.receiver = receiver;
56+ }
57+
58+ @ManyToOne()
59+ @JoinColumn(name = "RECEIVER_ID", nullable = false)
60+ private Client receiver;
61+
62+ @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "order")
63+ private Route route;
64+
65+
66+ public Integer getStartVertex() {
67+ return startVertex;
68+ }
69+
70+ public void setStartVertex(Integer startVertex) {
71+ this.startVertex = startVertex;
72+ }
73+
74+ public Integer getEndVertex() {
75+ return endVertex;
76+ }
77+
78+ public void setEndVertex(Integer endVertex) {
79+ this.endVertex = endVertex;
80+ }
81+
82+
83+
84+
85+
86+ public LocalDateTime getStartDate() {
87+ return startDate;
88+ }
89+
90+ public void setStartDate(LocalDateTime startDate) {
91+ this.startDate = startDate;
92+ }
93+
94+ public Client getClient() {
95+ return client;
96+ }
97+
98+ public Integer getId() {
99+ return id;
100+ }
101+
102+
103+ public Set<Product> getProducts() {
104+ return this.products;
105+ }
106+
107+ public void setProducts(Set<Product> products) {
108+ this.products = products;
109+ }
110+
111+ public void setClient(Client client) {
112+ this.client = client;
113+ }
114+
115+ public double getOverallPrice() {
116+ double sum = 0;
117+ for (Product product : products) {
118+ sum += product.getPrice();
119+ }
120+ return sum;
121+ }
122+
123+ public double getOverallWeight() {
124+ double sum = 0;
125+ for (Product product : products) {
126+ sum += product.getWeight();
127+ }
128+ return sum;
129+ }
130+
131+ public OrderType getOrderType() {
132+ return orderType;
133+ }
134+
135+ public void setOrderType(OrderType orderType) {
136+ this.orderType = orderType;
137+ }
138+
139+ public Route getRoute() {
140+ return route;
141+ }
142+
143+ public void setRoute(Route route) {
144+ this.route = route;
145+ }
146+
147+ public void setOrderStatus(OrderStatus orderStatus) {
148+ this.orderStatus = orderStatus;
149+ }
150+
151+ public OrderStatus getOrderStatus() {
152+ return orderStatus;
153+ }
154+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/OrderStatus.javanew file+24
@@ -0,0 +1,24 @@
1+package ru.fivt.dostavimvse.models;
2+
3+/**
4+ * Created by akhtyamovpavel on 01.12.16.
5+ */
6+public enum OrderStatus {
7+ WAIT_CREATE("WAIT_CREATE"),
8+ WAIT_CHANGE("WAIT_CHANGE"),
9+ MOVING("MOVING"),
10+ READY("READY"),
11+ COMPLETED("COMPLETED");
12+
13+
14+ private final String status;
15+
16+ OrderStatus(String status) {
17+ this.status = status;
18+ }
19+
20+ @Override
21+ public String toString() {
22+ return status;
23+ }
24+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/OrderType.javanew file+22
@@ -0,0 +1,22 @@
1+package ru.fivt.dostavimvse.models;
2+
3+/**
4+ * Created by akhtyamovpavel on 01.12.16.
5+ */
6+public enum OrderType {
7+ TIME("TIME"),
8+ PRICE("PRICE");
9+
10+
11+ private final String type;
12+
13+ OrderType(String type) {
14+ this.type = type;
15+ }
16+
17+ @Override
18+ public String toString() {
19+ return type;
20+ }
21+
22+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Product.javanew file+58
@@ -0,0 +1,58 @@
1+package ru.fivt.dostavimvse.models;
2+
3+import javax.persistence.*;
4+import javax.validation.constraints.DecimalMin;
5+import java.io.Serializable;
6+
7+/**
8+ * Created by akhtyamovpavel on 30.11.16.
9+ */
10+@Entity
11+@Table(name = "PRODUCT")
12+public class Product implements Serializable {
13+
14+ @Id
15+ @Column(name = "ID")
16+ @GeneratedValue(strategy = GenerationType.IDENTITY)
17+ private Integer id;
18+
19+ @DecimalMin("0.0")
20+ @Column(name = "PRICE")
21+ private Double price;
22+
23+ @DecimalMin("0.0")
24+ @Column(name = "WEIGHT")
25+ private Double weight;
26+
27+ @ManyToOne()
28+ @JoinColumn(name = "ORDER_ID", nullable = false)
29+ private Order order;
30+
31+ public Integer getId() {
32+ return id;
33+ }
34+
35+ public Double getPrice() {
36+ return price;
37+ }
38+
39+ public Double getWeight() {
40+ return weight;
41+ }
42+
43+ public void setPrice(Double price) {
44+ this.price = price;
45+ }
46+
47+ public void setWeight(Double weight) {
48+ this.weight = weight;
49+ }
50+
51+ public Order getOrder() {
52+ return order;
53+ }
54+
55+ public void setOrder(Order order) {
56+ this.order = order;
57+ }
58+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/Route.javanew file+54
@@ -0,0 +1,54 @@
1+package ru.fivt.dostavimvse.models;
2+
3+import javax.persistence.*;
4+import java.util.HashSet;
5+import java.util.Set;
6+
7+/**
8+ * Created by akhtyamovpavel on 30.11.16.
9+ */
10+@Entity
11+@Table(name = "ROUTE")
12+public class Route {
13+ @Id
14+ @Column(name = "ID", unique = true, nullable = false)
15+ @GeneratedValue(strategy = GenerationType.IDENTITY)
16+ private Integer id;
17+
18+ public Order getOrder() {
19+ return order;
20+ }
21+
22+ @OneToOne()
23+ @JoinColumn(name = "ORDER_ID", nullable = false, referencedColumnName = "ID")
24+ private Order order;
25+
26+ @ManyToOne()
27+ @JoinColumn(name = "CURRENT_ROUTE_LEG_ID", nullable = true, referencedColumnName = "ID")
28+ private RouteLeg currentLeg;
29+
30+
31+
32+ @OneToMany(fetch = FetchType.EAGER, mappedBy = "route", cascade = CascadeType.ALL)
33+ private Set<RouteLeg> routeLegs = new HashSet<>();
34+
35+ public Set<RouteLeg> getRouteLegs() {
36+ return routeLegs;
37+ }
38+
39+ public void setRouteLegs(Set<RouteLeg> legSet) {
40+ this.routeLegs = legSet;
41+ }
42+
43+ public void setOrder(Order order) {
44+ this.order = order;
45+ }
46+
47+ public RouteLeg getCurrentLeg() {
48+ return currentLeg;
49+ }
50+
51+ public void setCurrentLeg(RouteLeg currentLeg) {
52+ this.currentLeg = currentLeg;
53+ }
54+}
task4/data/DostavimVse/src/main/java/ru/fivt/dostavimvse/models/RouteLeg.javanew file+67
@@ -0,0 +1,67 @@
1+package ru.fivt.dostavimvse.models;
2+
3+import org.apache.tomcat.jni.Local;
4+
5+import javax.persistence.*;
6+import java.time.LocalDateTime;
7+
8+/**
9+ * Created by akhtyamovpavel on 30.11.16.
10+ */
11+
12+@Entity
13+@Table(name = "ROUTE_LEG")
14+public class RouteLeg {
15+
16+ @Id
17+ @Column(name = "ID", unique = true, nullable = false)
18+ @GeneratedValue(strategy = GenerationType.IDENTITY)
19+ private Integer id;
20+
21+ @Column(name = "START_TIME")
22+ private LocalDateTime startTime;
23+
24+
25+ @Column(name = "END_TIME")
26+ private LocalDateTime endTime;
27+
28+ public Leg getLeg() {
29+ return leg;
30+ }
31+
32+ public void setLeg(Leg leg) {
33+ this.leg = leg;
34+ }
35+
36+ @ManyToOne()
37+ @JoinColumn(name = "LEG_ID", nullable = false)
38+ private Leg leg;
39+
40+ @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
41+ @JoinColumn(name = "ROUTE_ID", nullable = false)
42+ private Route route;
43+
44+ public LocalDateTime getStartTime() {
45+ return startTime;
46+ }
47+
48+ public void setStartTime(LocalDateTime startTime) {
49+ this.startTime = startTime;
50+ }
51+
52+ public LocalDateTime getEndTime() {
53+ return endTime;
54+ }
55+
56+ public void setEndTime(LocalDateTime endTime) {
57+ this.endTime = endTime;
58+ }
59+
60+ public Route getRoute() {
61+ return route;
62+ }
63+
64+ public void setRoute(Route route) {
65+ this.route = route;
66+ }
67+}
task4/data/DostavimVse/src/main/resources/application.propertiesnew file+4
@@ -0,0 +1,4 @@
1+spring.datasource.driverClassName=com.mysql.jdbc.Driver
2+spring.datasource.url=jdbc:mysql://db:3306/dostavim?useSSL=false
3+spring.datasource.username=root
4+spring.datasource.password=admin
task4/data/DostavimVse/src/main/resources/hibernate.cfg.xmlnew file+23
@@ -0,0 +1,23 @@
1+<?xml version='1.0' encoding='utf-8'?>
2+<!DOCTYPE hibernate-configuration PUBLIC
3+ "-//Hibernate/Hibernate Configuration DTD//EN"
4+ "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
5+<hibernate-configuration>
6+ <session-factory>
7+ <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
8+ <property name="connection.url">jdbc:mysql://db:3306/dostavim?useSSL=false</property>
9+ <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
10+
11+ <property name="connection.username">root</property>
12+ <property name="connection.password">admin</property>
13+
14+ <mapping class="ru.fivt.dostavimvse.models.Leg" />
15+ <mapping class="ru.fivt.dostavimvse.models.Client" />
16+ <mapping class="ru.fivt.dostavimvse.models.Order" />
17+ <mapping class="ru.fivt.dostavimvse.models.Product" />
18+ <mapping class="ru.fivt.dostavimvse.models.Route" />
19+ <mapping class="ru.fivt.dostavimvse.models.RouteLeg" />
20+ <!-- DB schema will be updated if needed -->
21+ <!-- <property name="hbm2ddl.auto">update</property> -->
22+ </session-factory>
23+</hibernate-configuration>
task4/data/DostavimVse/src/main/resources/templates/createorderpage.htmlnew file+155
@@ -0,0 +1,155 @@
1+<!DOCTYPE html>
2+<html xmlns:th="http://www.thymeleaf.org">
3+<head>
4+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5+ <title>Get Legs Test</title>
6+ <link href="http://cdn.jsdelivr.net/webjars/bootstrap/3.2.0/css/bootstrap.min.css"
7+ th:href="@{/webjars/bootstrap/3.2.0/css/bootstrap.min.css}"
8+ rel="stylesheet" media="screen" />
9+
10+ <script src="http://cdn.jsdelivr.net/webjars/jquery/1.9.1/jquery.min.js"
11+ th:src="@{/webjars/jquery/1.9.1/jquery.min.js}"></script>
12+</head>
13+<body>
14+
15+
16+<h1>Создать заказ</h1>
17+<!--/*@thymesVar id="order" type="ru.fivt.dostavimvse.models.Order"*/-->
18+<div class="order-info">
19+ <p style="display: none;" id="clientid" th:text="${id}"></p>
20+ <button id="main-page">На главную</button>
21+
22+ <div>
23+ <label for="receiver-id">id получателя</label>
24+ <input type="text" id="receiver-id"/>
25+ </div>
26+
27+ <div>
28+ <label for="start-vertex-id">Стартовая вершина</label>
29+ <input type="text" id="start-vertex-id" />
30+ </div>
31+ <div>
32+ <label for="end-vertex-id">Конечная вершина</label>
33+ <input type="text" id="end-vertex-id" />
34+ </div>
35+
36+
37+ <div>
38+ <select id="order-type">
39+ <option th:each="orderType: ${orderTypes}" th:value="${orderType.toString()}" th:text="${orderType.toString()}">Test</option>
40+ </select>
41+ </div>
42+
43+ <div id="products-field">
44+ <div class="product">
45+ Вес
46+ <input type="text" class="weight-input"/>
47+ Цена
48+ <input type="text" class="price-input"/>
49+ </div>
50+ </div>
51+
52+ <button id="add-product-button">
53+ Добавить продукт
54+ </button>
55+
56+ <button id="remove-product-button" style="display: none">
57+ Удалить продукт
58+ </button>
59+
60+ <button id="send-order">Отправить</button>
61+</div>
62+<script>
63+ jQuery(document).ready(function($) {
64+ var productsLength = 1;
65+ function BrowserClient() {
66+
67+ BrowserClient.prototype.sendOrderButton = document.getElementById("send-order");
68+ BrowserClient.prototype.mainPageButton = document.getElementById("main-page");
69+
70+ BrowserClient.prototype.addProductButton = document.getElementById("add-product-button");
71+
72+ BrowserClient.prototype.removeProductButton = document.getElementById("remove-product-button");
73+
74+ BrowserClient.prototype.getMainPage = function () {
75+ window.location = '/';
76+ };
77+
78+ BrowserClient.prototype.createOrder = function () {
79+ var data = {};
80+ data["orderType"] = document.getElementById("order-type").value;
81+ data["startVertex"] = document.getElementById("start-vertex-id").value;
82+ data["endVertex"] = document.getElementById("end-vertex-id").value;
83+
84+ data["products"] = [];
85+
86+ var flag = false;
87+ $("#products-field").find(".product").each(function(index, element) {
88+ console.log($($(element).find(".price-input").first()).val());
89+ console.log($($(element).find(".weight-input").first()).val());
90+ var price = Number($($(element).find(".price-input").first()).val());
91+ var weight = Number($($(element).find(".weight-input").first()).val());
92+ if (isNaN(price) || isNaN(weight)) {
93+ flag = true;
94+ } else {
95+ data["products"].push({"weight": weight, "price": price});
96+ }
97+ });
98+ if (flag) {
99+ alert("Введите корректные данные о пользователе!");
100+ return;
101+ }
102+ var clientId = document.getElementById("clientid").innerText;
103+ $.ajax({
104+ type: "POST",
105+ contentType: "application/json",
106+ url: "/create/" + clientId + "?receiver=" + document.getElementById("receiver-id").value,
107+ data: JSON.stringify(data),
108+ dataType: "json"
109+ }).done(function (data) {
110+ if (data.code != 200) {
111+ alert(data.message);
112+ } else {
113+ window.location = "/order/" + data.orderId[0] + "?clientId=" + clientId;
114+ }
115+ });
116+ };
117+
118+ BrowserClient.prototype.addProduct = function() {
119+ $( "#products-field" ).append( '<div class="product"> Вес <input type="text" class="weight-input"/> Цена <input type="text" class="price-input"/></div>');
120+ ++productsLength;
121+ $("#remove-product-button").css("display", "block");
122+ };
123+
124+ BrowserClient.prototype.removeProduct = function() {
125+ if (productsLength >= 2) {
126+ $("#products-field").find(".product").last().remove();
127+ --productsLength;
128+ }
129+ if (productsLength == 1) {
130+ $("#remove-product-button").css("display", "none");
131+ }
132+
133+ }
134+ }
135+
136+ var client = new BrowserClient();
137+ client.mainPageButton.onclick = function() {
138+ client.getMainPage();
139+ };
140+ client.sendOrderButton.onclick = function() {
141+ client.createOrder();
142+ };
143+
144+ client.addProductButton.onclick = function() {
145+ client.addProduct();
146+ };
147+
148+ client.removeProductButton.onclick = function() {
149+ client.removeProduct();
150+ };
151+ });
152+
153+</script>
154+</body>
155+</html>
task4/data/DostavimVse/src/main/resources/templates/errororder.htmlnew file+39
@@ -0,0 +1,39 @@
1+<!DOCTYPE html>
2+<html xmlns:th="http://www.thymeleaf.org">
3+<head>
4+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5+ <title>Get Legs Test</title>
6+</head>
7+<body>
8+
9+<!--/*@thymesVar id="order" type="ru.fivt.dostavimvse.models.Order"*/-->
10+Ошибка! Заказа с таким номером не существует. Мы предлагаем Вам перейти на одну из следующих страниц:
11+
12+<button id="get-order-history">История заказов</button>
13+<button id="main-page">На главную</button>
14+
15+<script>
16+ function BrowserClient() {
17+
18+ BrowserClient.prototype.getOrderHistoryButton = document.getElementById("get-order-history");
19+ BrowserClient.prototype.getMainPageButton = document.getElementById("main-page");
20+
21+ BrowserClient.prototype.getOrderHistory = function () {
22+ window.location = '/orders/1';
23+ };
24+
25+ BrowserClient.prototype.getMainPage = function () {
26+ window.location = '/';
27+ };
28+ }
29+
30+ var client = new BrowserClient();
31+ client.getOrderHistoryButton.onclick = function() {
32+ client.getOrderHistory();
33+ };
34+ client.getMainPageButton.onclick = function() {
35+ client.getMainPage();
36+ };
37+</script>
38+</body>
39+</html>
task4/data/DostavimVse/src/main/resources/templates/getorder.htmlnew file+114
@@ -0,0 +1,114 @@
1+<!DOCTYPE html>
2+<html xmlns:th="http://www.thymeleaf.org">
3+<head>
4+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5+ <title>Get Legs Test</title>
6+ <link href="http://cdn.jsdelivr.net/webjars/bootstrap/3.2.0/css/bootstrap.min.css"
7+ th:href="@{/webjars/bootstrap/3.2.0/css/bootstrap.min.css}"
8+ rel="stylesheet" media="screen" />
9+
10+ <script src="http://cdn.jsdelivr.net/webjars/jquery/1.9.1/jquery.min.js"
11+ th:src="@{/webjars/jquery/1.9.1/jquery.min.js}"></script>
12+</head>
13+<body>
14+
15+<div>
16+ <button id="main-page">На главную</button>
17+</div>
18+
19+<!--/*@thymesVar id="order" type="ru.fivt.dostavimvse.models.Order"*/-->
20+<div class="order-info">
21+ <p style="display: none;" id="order-id" th:text="${order.getId()}"></p>
22+ <p style="display: none;" id="receiver-id" th:text="${order.getReceiver().getId()}"></p>
23+ <div class="order_id">
24+ Заказ <span th:text="${order.getId()}"></span>
25+ </div>
26+ <div class="order_start">
27+ Создан: <span th:text="${order.getStartDate()}"></span>
28+ </div>
29+ <div class="order_start_vertex">
30+ Начальная вершина: <span th:text="${order.getStartVertex()}"></span>
31+ </div>
32+
33+ <div class="order_end_vertex">
34+ Конечная вершина: <span th:text="${order.getEndVertex()}"></span>
35+ </div>
36+
37+ <div class="order_status">
38+ Статус заказа: <span th:text="${order.getOrderStatus().toString()}"></span>
39+ </div>
40+
41+ <div class="order_receivcer">
42+ Получатель: <span th:text="${order.getReceiver().getId()}"></span>
43+ </div>
44+
45+ <div class="order_products">
46+ Продукты:
47+ <div th:each="product: ${order.getProducts()}">
48+ <div class="product">
49+ Вес: <span th:text="${product.getWeight()}"></span>
50+ Цена: <span th:text="${product.getPrice()}"></span>
51+ </div>
52+ </div>
53+
54+ <div>
55+ Данные о заказе
56+ <div class="route">
57+ <div class="route_leg">
58+ <div th:each="routeLeg: ${order.getRoute().getRouteLegs()}">
59+ Время начала: <span th:text="${routeLeg.getStartTime()}"></span>
60+ Время конца: <span th:text="${routeLeg.getEndTime()}"></span>
61+ Начало: <span th:text="${routeLeg.getLeg().getStartVertex()}"></span>
62+ Конец: <span th:text="${routeLeg.getLeg().getEndVertex()}"></span>
63+ </div>
64+
65+ </div>
66+ </div>
67+ </div>
68+ </div>
69+ <!---->
70+ <button th:if="${order.getReceiver().getId() == clientId and order.getOrderStatus().toString().equals('READY')}" id="receive-order-button">
71+ Получить заказ!
72+ </button>
73+</div>
74+
75+<script>
76+ function BrowserClient() {
77+
78+ BrowserClient.prototype.getMainPageButton = document.getElementById("main-page");
79+ BrowserClient.prototype.receiveOrderButton = document.getElementById("receive-order-button");
80+
81+ BrowserClient.prototype.getMainPage = function () {
82+ window.location = '/';
83+ };
84+ BrowserClient.prototype.receiveOrder = function () {
85+ var receiverId = document.getElementById("receiver-id").innerText;
86+ var orderId = document.getElementById("order-id").innerText;
87+ var amp = "&amp;";
88+ $.ajax({
89+ type: "POST",
90+ contentType: "application/json",
91+ url: "/receive?receiverId=" + receiverId + amp[0] + "orderId=" + orderId,
92+ dataType: "json"
93+ }).done(function (data) {
94+ if (data.code != 200) {
95+ alert(data.message);
96+ } else {
97+ alert(data.message);
98+ location.reload();
99+ }
100+ });
101+ }
102+ }
103+
104+ var client = new BrowserClient();
105+
106+ client.getMainPageButton.onclick = function() {
107+ client.getMainPage();
108+ };
109+ client.receiveOrderButton.onclick = function() {
110+ client.receiveOrder();
111+ }
112+</script>
113+</body>
114+</html>
task4/data/DostavimVse/src/main/resources/templates/getorderhistory.htmlnew file+89
@@ -0,0 +1,89 @@
1+<!DOCTYPE HTML>
2+<html xmlns:th="http://www.thymeleaf.org">
3+<head>
4+ <title>Getting Started: Serving Web Content</title>
5+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6+</head>
7+<body>
8+<p th:text="'Hello !'" ></p>
9+
10+<!--/*@thymesVar id="client" type="ru.fivt.dostavimvse.models.Client"*/-->
11+
12+<div>
13+ <button id="main-page">На главную</button>
14+</div>
15+
16+
17+<h1>История заказов</h1>
18+
19+<b>Отправленные заказы:</b>
20+<table class="table table-bordered table-striped">
21+ <thead>
22+ <tr>
23+ <td>id</td>
24+ <td>Дата отправки</td>
25+ <td>Число продуктов</td>
26+ <td>Общий вес</td>
27+ <td>Общая стоимость</td>
28+ <td>Статус заказа</td>
29+ </tr>
30+ </thead>
31+ <th:block th:each="order : ${client.getOrders()}">
32+ <tr>
33+ <!--th:href="@{/orders/${order.getId()}}"-->
34+ <td><a th:href="@{/order/{orderId}(orderId=${order.getId()}, clientId=${client.getId()})}" th:text="${order.getId()}"></a></td>
35+ <td th:text="${order.getStartDate()}">Дата отправки</td>
36+ <td th:text="${order.getProducts().size()}">Число продуктов</td>
37+ <td th:text="${order.getOverallWeight()}">Общий вес</td>
38+ <td th:text="${order.getOverallPrice()}">Общая стоимость</td>
39+ <td th:text="${order.getOrderStatus()}">Статус заказа</td>
40+ </tr>
41+ </th:block>
42+</table>
43+
44+<b>Получаемые заказы:</b>
45+
46+
47+<table class="table table-bordered table-striped">
48+ <thead>
49+ <tr>
50+ <td>id</td>
51+ <td>Дата отправки</td>
52+ <td>Число продуктов</td>
53+ <td>Общий вес</td>
54+ <td>Общая стоимость</td>
55+ <td>Статус заказа</td>
56+ </tr>
57+ </thead>
58+ <th:block th:each="order : ${client.getReceiverOrders()}">
59+ <tr>
60+ <!--th:href="@{/orders/${order.getId()}}"-->
61+ <td><a th:href="@{/order/{orderId}(orderId=${order.getId()}, clientId=${client.getId()})}" th:text="${order.getId()}"></a></td>
62+ <td th:text="${order.getStartDate()}">Дата отправки</td>
63+ <td th:text="${order.getProducts().size()}">Число продуктов</td>
64+ <td th:text="${order.getOverallWeight()}">Общий вес</td>
65+ <td th:text="${order.getOverallPrice()}">Общая стоимость</td>
66+ <td th:text="${order.getOrderStatus()}">Статус заказа</td>
67+ </tr>
68+ </th:block>
69+</table>
70+
71+<script>
72+ function BrowserClient() {
73+
74+ BrowserClient.prototype.getMainPageButton = document.getElementById("main-page");
75+
76+ BrowserClient.prototype.getMainPage = function () {
77+ window.location = '/';
78+ };
79+ }
80+
81+ var client = new BrowserClient();
82+
83+ client.getMainPageButton.onclick = function() {
84+ client.getMainPage();
85+ };
86+</script>
87+
88+</body>
89+</html>
task4/data/DostavimVse/src/main/resources/templates/main.htmlnew file+66
@@ -0,0 +1,66 @@
1+<!DOCTYPE html>
2+<html xmlns:th="http://www.thymeleaf.org">
3+<head>
4+ <title>DostavimVse</title>
5+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6+ <link href="http://cdn.jsdelivr.net/webjars/bootstrap/3.2.0/css/bootstrap.min.css"
7+ th:href="@{/webjars/bootstrap/3.2.0/css/bootstrap.min.css}"
8+ rel="stylesheet" media="screen" />
9+
10+ <script src="http://cdn.jsdelivr.net/webjars/jquery/1.9.1/jquery.min.js"
11+ th:src="@{/webjars/jquery/1.9.1/jquery.min.js}"></script>
12+</head>
13+<body>
14+
15+Проект Доставим Все
16+
17+<p><button id="get-order-history">История заказов</button></p>
18+
19+<p><button id="create-order-button">Создать заказ</button></p>
20+
21+
22+<div>
23+ <label for="get-order-input">Поиск по id заказа</label>
24+ <input type="text" id="get-order-input" placeholder="Введите номер заказа числом"/>
25+ <button id="get-order-button">Найти</button>
26+</div>
27+
28+
29+<script>
30+ function BrowserClient() {
31+
32+ BrowserClient.prototype.getOrderHistoryButton = document.getElementById("get-order-history");
33+ BrowserClient.prototype.requestOrderButton = document.getElementById("create-order-button");
34+ BrowserClient.prototype.gerOrderButton = document.getElementById("get-order-button");
35+
36+ BrowserClient.prototype.getOrderHistory = function () {
37+ window.location = '/orders/1';
38+ };
39+
40+ BrowserClient.prototype.requestOrder = function () {
41+ window.location = '/create/1';
42+ };
43+
44+ BrowserClient.prototype.getOrder = function() {
45+ var value = Number(document.getElementById("get-order-input").value);
46+ if (isNaN(value)) {
47+ alert("Введите число!");
48+ return;
49+ }
50+ window.location = '/order/' + value + '?clientId=1';
51+ }
52+ }
53+
54+ var client = new BrowserClient();
55+ client.getOrderHistoryButton.onclick = function() {
56+ client.getOrderHistory();
57+ };
58+ client.requestOrderButton.onclick = function() {
59+ client.requestOrder();
60+ };
61+ client.gerOrderButton.onclick = function() {
62+ client.getOrder();
63+ };
64+</script>
65+</body>
66+</html>
task4/data/DostavimVse/src/test/java/ru/fivt/dostavimvse/DostavimvseApplicationTests.javanew file+40
@@ -0,0 +1,40 @@
1+package ru.fivt.dostavimvse;
2+
3+import org.hibernate.Session;
4+import org.junit.Before;
5+import org.junit.Test;
6+import org.junit.runner.RunWith;
7+import org.springframework.boot.test.context.SpringBootTest;
8+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
9+import org.springframework.test.context.junit4.SpringRunner;
10+import ru.fivt.dostavimvse.models.Leg;
11+import ru.fivt.dostavimvse.models.Product;
12+
13+@RunWith(SpringJUnit4ClassRunner.class)
14+@SpringBootTest
15+public class DostavimvseApplicationTests {
16+
17+ @Test
18+ public void contextLoads() {
19+ }
20+
21+ Session session;
22+ @Before
23+ public void createSession() {
24+ session = HibernateSessionFactory.getSessionFactory().openSession();
25+ }
26+
27+ @Test
28+ public void checkProductNonNegativePriceCreated() {
29+// Leg leg = new Leg();
30+
31+ session.beginTransaction();
32+ Product product = new Product();
33+ product.setPrice(0.5);
34+ product.setWeight(0.8);
35+
36+
37+// Integer id =
38+ }
39+
40+}
task4/data/cmake-with-flask/.gitignorenew file+3
@@ -0,0 +1,3 @@
1+bin
2+build
3+lib
task4/data/cmake-with-flask/B/CMakeLists.txtnew file+5
@@ -0,0 +1,5 @@
1+project(B)
2+
3+add_library(ClassLib SHARED lib.cpp)
4+
5+
task4/data/cmake-with-flask/B/lib.cppnew file+9
@@ -0,0 +1,9 @@
1+#include "lib.h"
2+
3+void ClassLib::Set(int value) {
4+ x_ = value;
5+}
6+
7+int ClassLib::Get() const {
8+ return x_;
9+}
task4/data/cmake-with-flask/B/lib.hnew file+7
@@ -0,0 +1,7 @@
1+class ClassLib {
2+ public:
3+ void Set(int value);
4+ int Get() const;
5+ private:
6+ int x_;
7+};
task4/data/cmake-with-flask/C/CMakeLists.txtnew file+8
@@ -0,0 +1,8 @@
1+project(C)
2+
3+
4+add_executable(C main.cpp)
5+
6+target_link_libraries(C ClassLib)
7+target_include_directories(C PRIVATE ${Task6_SOURCE_DIR})
8+
task4/data/cmake-with-flask/C/main.cppnew file+11
@@ -0,0 +1,11 @@
1+#include "main.h"
2+#include <iostream>
3+
4+int main() {
5+
6+ ClassLib class_;
7+ class_.Set(1);
8+
9+ std::cout << class_.Get() << std::endl;
10+ return 0;
11+}
task4/data/cmake-with-flask/C/main.hnew file+1
@@ -0,0 +1 @@
1+#include "B/lib.h"
task4/data/cmake-with-flask/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+cmake_minimum_required(VERSION 3.5)
2+
3+project(Task6)
4+
5+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Task6_SOURCE_DIR}/bin)
6+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${Task6_SOURCE_DIR}/lib)
7+
8+add_subdirectory(B)
9+add_subdirectory(C)
10+
task4/data/cmake-with-flask/app.pynew file+24
@@ -0,0 +1,24 @@
1+from argparse import ArgumentParser
2+from flask import Flask
3+
4+
5+
6+def parse_args():
7+ parser = ArgumentParser('Test web app')
8+ parser.add_argument('--port', type=int, help='Port to use')
9+ parser.add_argument('--host', type=str, help='Host to use')
10+ return parser.parse_args()
11+
12+
13+
14+app = Flask('Test app')
15+
16+
17+@app.route('/app')
18+def main():
19+ return 'ok'
20+
21+
22+if __name__ == '__main__':
23+ args = parse_args()
24+ app.run(port=args.port, host=args.host)
task4/data/scripts/CREATE.sqlnew file+58
@@ -0,0 +1,58 @@
1+CREATE TABLE CLIENT
2+(
3+ ID INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT
4+);
5+CREATE TABLE LEG
6+(
7+ ID INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
8+ START_VERTEX INT(11) NOT NULL,
9+ END_VERTEX INT(11) NOT NULL,
10+ MAX_WEIGHT DOUBLE NOT NULL,
11+ LEG_TYPE ENUM('TRAIN', 'AVIA') NOT NULL,
12+ BASE_PRICE DOUBLE NOT NULL,
13+ SEND_TIME INT(11) DEFAULT '20' NOT NULL
14+);
15+CREATE TABLE ORDERS
16+(
17+ ID INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
18+ START_DATE DATETIME NOT NULL,
19+ CLIENT_ID INT(11) NOT NULL,
20+ START_VERTEX INT(11) NOT NULL,
21+ END_VERTEX INT(11) NOT NULL,
22+ ORDER_TYPE ENUM('TIME', 'PRICE') NOT NULL,
23+ RECEIVER_ID INT(11) DEFAULT '1' NOT NULL,
24+ ORDER_STATUS ENUM('WAIT_CREATE', 'WAIT_CHANGE', 'MOVING', 'READY', 'COMPLETED') DEFAULT 'WAIT_CREATE' NOT NULL,
25+ CONSTRAINT ORDER_CLIENT_ID_fk FOREIGN KEY (CLIENT_ID) REFERENCES CLIENT (ID),
26+ CONSTRAINT ORDERS_CLIENT_ID_fk FOREIGN KEY (RECEIVER_ID) REFERENCES CLIENT (ID)
27+);
28+CREATE INDEX ORDERS_CLIENT_ID_fk ON ORDERS (RECEIVER_ID);
29+CREATE INDEX ORDER_CLIENT_ID_fk ON ORDERS (CLIENT_ID);
30+CREATE TABLE PRODUCT
31+(
32+ ID INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
33+ WEIGHT DOUBLE NOT NULL,
34+ PRICE DOUBLE,
35+ ORDER_ID INT(11) NOT NULL,
36+ CONSTRAINT PRODUCT_ORDER_ID_fk FOREIGN KEY (ORDER_ID) REFERENCES ORDERS (ID)
37+);
38+CREATE INDEX PRODUCT_ORDER_ID_fk ON PRODUCT (ORDER_ID);
39+CREATE TABLE ROUTE
40+(
41+ ID INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
42+ ORDER_ID INT(11) NOT NULL,
43+ CURRENT_ROUTE_LEG_ID INT(11),
44+ CONSTRAINT ROUTE_ORDERS_ID_fk FOREIGN KEY (ORDER_ID) REFERENCES ORDERS (ID)
45+);
46+CREATE INDEX ROUTE_ORDERS_ID_fk ON ROUTE (ORDER_ID);
47+CREATE TABLE ROUTE_LEG
48+(
49+ ID INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
50+ LEG_ID INT(11) NOT NULL,
51+ ROUTE_ID INT(11) NOT NULL,
52+ START_TIME DATETIME,
53+ END_TIME DATETIME,
54+ CONSTRAINT ROUTE_LEG_LEG_ID_fk FOREIGN KEY (LEG_ID) REFERENCES LEG (ID),
55+ CONSTRAINT ROUTE_LEG_ROUTE_ID_fk FOREIGN KEY (ROUTE_ID) REFERENCES ROUTE (ID)
56+);
57+CREATE INDEX ROUTE_LEG_LEG_ID_fk ON ROUTE_LEG (LEG_ID);
58+CREATE INDEX ROUTE_LEG_ROUTE_ID_fk ON ROUTE_LEG (ROUTE_ID);
task4/docker-compose.ymlnew file+24
@@ -0,0 +1,24 @@
1+version: '3'
2+
3+services:
4+ backend:
5+ build:
6+ context: .
7+ dockerfile: DostavimVseDockerfile
8+ depends_on:
9+ db:
10+ condition: service_healthy
11+ ports:
12+ - "8080:8080"
13+ db:
14+ image: mysql:5.7
15+ environment:
16+ MYSQL_ROOT_PASSWORD: admin
17+ healthcheck:
18+ test: "/usr/bin/mysql --user=root --password=admin --execute \"SHOW
19+ DATABASES;\""
20+ interval: 3s
21+ timeout: 1s
22+ retries: 20
23+ ports:
24+ - "3306:3306"
task4/run.shnew file+8
@@ -0,0 +1,8 @@
1+#!/bin/bash
2+
3+mysql -h db -P 3306 -u root --password=admin --execute "CREATE DATABASE dostavim;"
4+
5+mysql -h db -P 3306 -u root --password=admin --database=dostavim </CREATE.sql
6+
7+java -jar /seed.jar
8+java -jar /run.jar