Revize 2a34f0e1
Přidáno uživatelem Václav Honzík před asi 3 roky(ů)
.gitignore | ||
---|---|---|
1 |
.idea |
DB/db_script-v1.1.sql | ||
---|---|---|
1 |
CREATE SCHEMA IF NOT EXISTS aswi; |
|
2 |
|
|
3 |
CREATE TABLE aswi."catalog" ( |
|
4 |
id uuid NOT NULL , |
|
5 |
name varchar(100) NOT NULL , |
|
6 |
certainty integer , |
|
7 |
latitude double precision , |
|
8 |
longitude double precision , |
|
9 |
CONSTRAINT pk_katalog PRIMARY KEY ( id ) |
|
10 |
); |
|
11 |
|
|
12 |
CREATE TABLE aswi.countries ( |
|
13 |
name varchar(100) NOT NULL , |
|
14 |
catalog_id uuid NOT NULL , |
|
15 |
CONSTRAINT pk_countries PRIMARY KEY ( name ) |
|
16 |
); |
|
17 |
|
|
18 |
CREATE TABLE aswi.types ( |
|
19 |
"type" varchar(100) NOT NULL , |
|
20 |
CONSTRAINT pk_types PRIMARY KEY ( "type" ) |
|
21 |
); |
|
22 |
|
|
23 |
CREATE TABLE aswi.users ( |
|
24 |
name varchar(100) , |
|
25 |
email varchar(100) NOT NULL , |
|
26 |
"password" varchar(128) NOT NULL , |
|
27 |
is_admin bit DEFAULT 0 , |
|
28 |
CONSTRAINT pk_users PRIMARY KEY ( email ) |
|
29 |
); |
|
30 |
|
|
31 |
CREATE TABLE aswi.written_forms ( |
|
32 |
form varchar(100) NOT NULL , |
|
33 |
catalog_id uuid NOT NULL , |
|
34 |
CONSTRAINT pk_written_forms PRIMARY KEY ( form, catalog_id ) |
|
35 |
); |
|
36 |
|
|
37 |
CREATE TABLE aswi.alternative_names ( |
|
38 |
catalog_id uuid NOT NULL , |
|
39 |
name varchar(100) NOT NULL , |
|
40 |
CONSTRAINT pk_alternative_names PRIMARY KEY ( catalog_id, name ) |
|
41 |
); |
|
42 |
|
|
43 |
CREATE TABLE aswi.bibliography ( |
|
44 |
"source" varchar(150) NOT NULL , |
|
45 |
catalog_id uuid NOT NULL , |
|
46 |
CONSTRAINT pk_bibliography PRIMARY KEY ( "source", catalog_id ) |
|
47 |
); |
|
48 |
|
|
49 |
CREATE TABLE aswi.catalog_type ( |
|
50 |
catalog_id uuid NOT NULL , |
|
51 |
"type" uuid NOT NULL , |
|
52 |
CONSTRAINT pk_catalog_type PRIMARY KEY ( catalog_id, "type" ) |
|
53 |
); |
|
54 |
|
|
55 |
ALTER TABLE aswi.alternative_names ADD CONSTRAINT fk_catalog FOREIGN KEY ( catalog_id ) REFERENCES aswi."catalog"( id ) ON DELETE CASCADE; |
|
56 |
|
|
57 |
ALTER TABLE aswi.bibliography ADD CONSTRAINT fk_bibliography_catalog FOREIGN KEY ( catalog_id ) REFERENCES aswi."catalog"( id ); |
|
58 |
|
|
59 |
ALTER TABLE aswi.catalog_type ADD CONSTRAINT fk_catalog FOREIGN KEY ( catalog_id ) REFERENCES aswi."catalog"( id ); |
|
60 |
|
|
61 |
ALTER TABLE aswi.catalog_type ADD CONSTRAINT fk_type_id FOREIGN KEY ( ) REFERENCES aswi.types( ); |
|
62 |
|
|
63 |
ALTER TABLE aswi.countries ADD CONSTRAINT fk_countries_catalog FOREIGN KEY ( catalog_id ) REFERENCES aswi."catalog"( id ); |
|
64 |
|
|
65 |
ALTER TABLE aswi.written_forms ADD CONSTRAINT fk_written_forms_catalog FOREIGN KEY ( catalog_id ) REFERENCES aswi."catalog"( id ); |
|
66 |
|
|
67 |
COMMENT ON TABLE aswi."catalog" IS 'Catalog with geografical terms'; |
|
68 |
|
|
69 |
COMMENT ON COLUMN aswi."catalog".name IS 'Name of the geografical term'; |
|
70 |
|
|
71 |
COMMENT ON COLUMN aswi."catalog".latitude IS 'Geografical latitude'; |
|
72 |
|
|
73 |
COMMENT ON COLUMN aswi."catalog".longitude IS 'Geografical longitude'; |
|
74 |
|
|
75 |
COMMENT ON TABLE aswi.users IS 'Table to store different application users'; |
|
76 |
|
|
77 |
COMMENT ON COLUMN aswi.users.is_admin IS 'Logical value if the user has admin privileges'; |
|
78 |
|
backend/.gitignore | ||
---|---|---|
1 |
HELP.md |
|
2 |
target/ |
|
3 |
!.mvn/wrapper/maven-wrapper.jar |
|
4 |
!**/src/main/**/target/ |
|
5 |
!**/src/test/**/target/ |
|
6 |
|
|
7 |
### STS ### |
|
8 |
.apt_generated |
|
9 |
.classpath |
|
10 |
.factorypath |
|
11 |
.project |
|
12 |
.settings |
|
13 |
.springBeans |
|
14 |
.sts4-cache |
|
15 |
|
|
16 |
### IntelliJ IDEA ### |
|
17 |
.idea |
|
18 |
*.iws |
|
19 |
*.iml |
|
20 |
*.ipr |
|
21 |
|
|
22 |
### NetBeans ### |
|
23 |
/nbproject/private/ |
|
24 |
/nbbuild/ |
|
25 |
/dist/ |
|
26 |
/nbdist/ |
|
27 |
/.nb-gradle/ |
|
28 |
build/ |
|
29 |
!**/src/main/**/build/ |
|
30 |
!**/src/test/**/build/ |
|
31 |
|
|
32 |
### VS Code ### |
|
33 |
.vscode/ |
backend/HELP.md | ||
---|---|---|
1 |
# Read Me First |
|
2 |
The following was discovered as part of building this project: |
|
3 |
|
|
4 |
* The original package name 'cz.zcu.kiv.backend-api' is invalid and this project uses 'cz.zcu.kiv.backendapi' instead. |
|
5 |
|
|
6 |
# Getting Started |
|
7 |
|
|
8 |
### Reference Documentation |
|
9 |
For further reference, please consider the following sections: |
|
10 |
|
|
11 |
* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) |
|
12 |
* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/html/) |
|
13 |
* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/html/#build-image) |
|
14 |
* [Spring Web](https://docs.spring.io/spring-boot/docs/2.6.4/reference/htmlsingle/#boot-features-developing-web-applications) |
|
15 |
|
|
16 |
### Guides |
|
17 |
The following guides illustrate how to use some features concretely: |
|
18 |
|
|
19 |
* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) |
|
20 |
* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) |
|
21 |
* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/) |
|
22 |
|
backend/mvnw | ||
---|---|---|
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 |
# https://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 |
# Maven 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 /usr/local/etc/mavenrc ] ; then |
|
40 |
. /usr/local/etc/mavenrc |
|
41 |
fi |
|
42 |
|
|
43 |
if [ -f /etc/mavenrc ] ; then |
|
44 |
. /etc/mavenrc |
|
45 |
fi |
|
46 |
|
|
47 |
if [ -f "$HOME/.mavenrc" ] ; then |
|
48 |
. "$HOME/.mavenrc" |
|
49 |
fi |
|
50 |
|
|
51 |
fi |
|
52 |
|
|
53 |
# OS specific support. $var _must_ be set to either true or false. |
|
54 |
cygwin=false; |
|
55 |
darwin=false; |
|
56 |
mingw=false |
|
57 |
case "`uname`" in |
|
58 |
CYGWIN*) cygwin=true ;; |
|
59 |
MINGW*) mingw=true;; |
|
60 |
Darwin*) darwin=true |
|
61 |
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home |
|
62 |
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html |
|
63 |
if [ -z "$JAVA_HOME" ]; then |
|
64 |
if [ -x "/usr/libexec/java_home" ]; then |
|
65 |
export JAVA_HOME="`/usr/libexec/java_home`" |
|
66 |
else |
|
67 |
export JAVA_HOME="/Library/Java/Home" |
|
68 |
fi |
|
69 |
fi |
|
70 |
;; |
|
71 |
esac |
|
72 |
|
|
73 |
if [ -z "$JAVA_HOME" ] ; then |
|
74 |
if [ -r /etc/gentoo-release ] ; then |
|
75 |
JAVA_HOME=`java-config --jre-home` |
|
76 |
fi |
|
77 |
fi |
|
78 |
|
|
79 |
if [ -z "$M2_HOME" ] ; then |
|
80 |
## resolve links - $0 may be a link to maven's home |
|
81 |
PRG="$0" |
|
82 |
|
|
83 |
# need this for relative symlinks |
|
84 |
while [ -h "$PRG" ] ; do |
|
85 |
ls=`ls -ld "$PRG"` |
|
86 |
link=`expr "$ls" : '.*-> \(.*\)$'` |
|
87 |
if expr "$link" : '/.*' > /dev/null; then |
|
88 |
PRG="$link" |
|
89 |
else |
|
90 |
PRG="`dirname "$PRG"`/$link" |
|
91 |
fi |
|
92 |
done |
|
93 |
|
|
94 |
saveddir=`pwd` |
|
95 |
|
|
96 |
M2_HOME=`dirname "$PRG"`/.. |
|
97 |
|
|
98 |
# make it fully qualified |
|
99 |
M2_HOME=`cd "$M2_HOME" && pwd` |
|
100 |
|
|
101 |
cd "$saveddir" |
|
102 |
# echo Using m2 at $M2_HOME |
|
103 |
fi |
|
104 |
|
|
105 |
# For Cygwin, ensure paths are in UNIX format before anything is touched |
|
106 |
if $cygwin ; then |
|
107 |
[ -n "$M2_HOME" ] && |
|
108 |
M2_HOME=`cygpath --unix "$M2_HOME"` |
|
109 |
[ -n "$JAVA_HOME" ] && |
|
110 |
JAVA_HOME=`cygpath --unix "$JAVA_HOME"` |
|
111 |
[ -n "$CLASSPATH" ] && |
|
112 |
CLASSPATH=`cygpath --path --unix "$CLASSPATH"` |
|
113 |
fi |
|
114 |
|
|
115 |
# For Mingw, ensure paths are in UNIX format before anything is touched |
|
116 |
if $mingw ; then |
|
117 |
[ -n "$M2_HOME" ] && |
|
118 |
M2_HOME="`(cd "$M2_HOME"; pwd)`" |
|
119 |
[ -n "$JAVA_HOME" ] && |
|
120 |
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" |
|
121 |
fi |
|
122 |
|
|
123 |
if [ -z "$JAVA_HOME" ]; then |
|
124 |
javaExecutable="`which javac`" |
|
125 |
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then |
|
126 |
# readlink(1) is not available as standard on Solaris 10. |
|
127 |
readLink=`which readlink` |
|
128 |
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then |
|
129 |
if $darwin ; then |
|
130 |
javaHome="`dirname \"$javaExecutable\"`" |
|
131 |
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" |
|
132 |
else |
|
133 |
javaExecutable="`readlink -f \"$javaExecutable\"`" |
|
134 |
fi |
|
135 |
javaHome="`dirname \"$javaExecutable\"`" |
|
136 |
javaHome=`expr "$javaHome" : '\(.*\)/bin'` |
|
137 |
JAVA_HOME="$javaHome" |
|
138 |
export JAVA_HOME |
|
139 |
fi |
|
140 |
fi |
|
141 |
fi |
|
142 |
|
|
143 |
if [ -z "$JAVACMD" ] ; then |
|
144 |
if [ -n "$JAVA_HOME" ] ; then |
|
145 |
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then |
|
146 |
# IBM's JDK on AIX uses strange locations for the executables |
|
147 |
JAVACMD="$JAVA_HOME/jre/sh/java" |
|
148 |
else |
|
149 |
JAVACMD="$JAVA_HOME/bin/java" |
|
150 |
fi |
|
151 |
else |
|
152 |
JAVACMD="`\\unset -f command; \\command -v java`" |
|
153 |
fi |
|
154 |
fi |
|
155 |
|
|
156 |
if [ ! -x "$JAVACMD" ] ; then |
|
157 |
echo "Error: JAVA_HOME is not defined correctly." >&2 |
|
158 |
echo " We cannot execute $JAVACMD" >&2 |
|
159 |
exit 1 |
|
160 |
fi |
|
161 |
|
|
162 |
if [ -z "$JAVA_HOME" ] ; then |
|
163 |
echo "Warning: JAVA_HOME environment variable is not set." |
|
164 |
fi |
|
165 |
|
|
166 |
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher |
|
167 |
|
|
168 |
# traverses directory structure from process work directory to filesystem root |
|
169 |
# first directory with .mvn subdirectory is considered project base directory |
|
170 |
find_maven_basedir() { |
|
171 |
|
|
172 |
if [ -z "$1" ] |
|
173 |
then |
|
174 |
echo "Path not specified to find_maven_basedir" |
|
175 |
return 1 |
|
176 |
fi |
|
177 |
|
|
178 |
basedir="$1" |
|
179 |
wdir="$1" |
|
180 |
while [ "$wdir" != '/' ] ; do |
|
181 |
if [ -d "$wdir"/.mvn ] ; then |
|
182 |
basedir=$wdir |
|
183 |
break |
|
184 |
fi |
|
185 |
# workaround for JBEAP-8937 (on Solaris 10/Sparc) |
|
186 |
if [ -d "${wdir}" ]; then |
|
187 |
wdir=`cd "$wdir/.."; pwd` |
|
188 |
fi |
|
189 |
# end of workaround |
|
190 |
done |
|
191 |
echo "${basedir}" |
|
192 |
} |
|
193 |
|
|
194 |
# concatenates all lines of a file |
|
195 |
concat_lines() { |
|
196 |
if [ -f "$1" ]; then |
|
197 |
echo "$(tr -s '\n' ' ' < "$1")" |
|
198 |
fi |
|
199 |
} |
|
200 |
|
|
201 |
BASE_DIR=`find_maven_basedir "$(pwd)"` |
|
202 |
if [ -z "$BASE_DIR" ]; then |
|
203 |
exit 1; |
|
204 |
fi |
|
205 |
|
|
206 |
########################################################################################## |
|
207 |
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central |
|
208 |
# This allows using the maven wrapper in projects that prohibit checking in binary data. |
|
209 |
########################################################################################## |
|
210 |
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then |
|
211 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
212 |
echo "Found .mvn/wrapper/maven-wrapper.jar" |
|
213 |
fi |
|
214 |
else |
|
215 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
216 |
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." |
|
217 |
fi |
|
218 |
if [ -n "$MVNW_REPOURL" ]; then |
|
219 |
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
|
220 |
else |
|
221 |
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
|
222 |
fi |
|
223 |
while IFS="=" read key value; do |
|
224 |
case "$key" in (wrapperUrl) jarUrl="$value"; break ;; |
|
225 |
esac |
|
226 |
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" |
|
227 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
228 |
echo "Downloading from: $jarUrl" |
|
229 |
fi |
|
230 |
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" |
|
231 |
if $cygwin; then |
|
232 |
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` |
|
233 |
fi |
|
234 |
|
|
235 |
if command -v wget > /dev/null; then |
|
236 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
237 |
echo "Found wget ... using wget" |
|
238 |
fi |
|
239 |
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then |
|
240 |
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" |
|
241 |
else |
|
242 |
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" |
|
243 |
fi |
|
244 |
elif command -v curl > /dev/null; then |
|
245 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
246 |
echo "Found curl ... using curl" |
|
247 |
fi |
|
248 |
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then |
|
249 |
curl -o "$wrapperJarPath" "$jarUrl" -f |
|
250 |
else |
|
251 |
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f |
|
252 |
fi |
|
253 |
|
|
254 |
else |
|
255 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
256 |
echo "Falling back to using Java to download" |
|
257 |
fi |
|
258 |
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" |
|
259 |
# For Cygwin, switch paths to Windows format before running javac |
|
260 |
if $cygwin; then |
|
261 |
javaClass=`cygpath --path --windows "$javaClass"` |
|
262 |
fi |
|
263 |
if [ -e "$javaClass" ]; then |
|
264 |
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then |
|
265 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
266 |
echo " - Compiling MavenWrapperDownloader.java ..." |
|
267 |
fi |
|
268 |
# Compiling the Java class |
|
269 |
("$JAVA_HOME/bin/javac" "$javaClass") |
|
270 |
fi |
|
271 |
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then |
|
272 |
# Running the downloader |
|
273 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
274 |
echo " - Running MavenWrapperDownloader.java ..." |
|
275 |
fi |
|
276 |
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") |
|
277 |
fi |
|
278 |
fi |
|
279 |
fi |
|
280 |
fi |
|
281 |
########################################################################################## |
|
282 |
# End of extension |
|
283 |
########################################################################################## |
|
284 |
|
|
285 |
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} |
|
286 |
if [ "$MVNW_VERBOSE" = true ]; then |
|
287 |
echo $MAVEN_PROJECTBASEDIR |
|
288 |
fi |
|
289 |
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" |
|
290 |
|
|
291 |
# For Cygwin, switch paths to Windows format before running java |
|
292 |
if $cygwin; then |
|
293 |
[ -n "$M2_HOME" ] && |
|
294 |
M2_HOME=`cygpath --path --windows "$M2_HOME"` |
|
295 |
[ -n "$JAVA_HOME" ] && |
|
296 |
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` |
|
297 |
[ -n "$CLASSPATH" ] && |
|
298 |
CLASSPATH=`cygpath --path --windows "$CLASSPATH"` |
|
299 |
[ -n "$MAVEN_PROJECTBASEDIR" ] && |
|
300 |
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` |
|
301 |
fi |
|
302 |
|
|
303 |
# Provide a "standardized" way to retrieve the CLI args that will |
|
304 |
# work with both Windows and non-Windows executions. |
|
305 |
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" |
|
306 |
export MAVEN_CMD_LINE_ARGS |
|
307 |
|
|
308 |
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain |
|
309 |
|
|
310 |
exec "$JAVACMD" \ |
|
311 |
$MAVEN_OPTS \ |
|
312 |
$MAVEN_DEBUG_OPTS \ |
|
313 |
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ |
|
314 |
"-Dmaven.home=${M2_HOME}" \ |
|
315 |
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ |
|
316 |
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" |
backend/mvnw.cmd | ||
---|---|---|
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 https://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 Maven 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 keystroke 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 set title of command window |
|
39 |
title %0 |
|
40 |
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' |
|
41 |
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% |
|
42 |
|
|
43 |
@REM set %HOME% to equivalent of $HOME |
|
44 |
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") |
|
45 |
|
|
46 |
@REM Execute a user defined script before this one |
|
47 |
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre |
|
48 |
@REM check for pre script, once with legacy .bat ending and once with .cmd ending |
|
49 |
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* |
|
50 |
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* |
|
51 |
:skipRcPre |
|
52 |
|
|
53 |
@setlocal |
|
54 |
|
|
55 |
set ERROR_CODE=0 |
|
56 |
|
|
57 |
@REM To isolate internal variables from possible post scripts, we use another setlocal |
|
58 |
@setlocal |
|
59 |
|
|
60 |
@REM ==== START VALIDATION ==== |
|
61 |
if not "%JAVA_HOME%" == "" goto OkJHome |
|
62 |
|
|
63 |
echo. |
|
64 |
echo Error: JAVA_HOME not found in your environment. >&2 |
|
65 |
echo Please set the JAVA_HOME variable in your environment to match the >&2 |
|
66 |
echo location of your Java installation. >&2 |
|
67 |
echo. |
|
68 |
goto error |
|
69 |
|
|
70 |
:OkJHome |
|
71 |
if exist "%JAVA_HOME%\bin\java.exe" goto init |
|
72 |
|
|
73 |
echo. |
|
74 |
echo Error: JAVA_HOME is set to an invalid directory. >&2 |
|
75 |
echo JAVA_HOME = "%JAVA_HOME%" >&2 |
|
76 |
echo Please set the JAVA_HOME variable in your environment to match the >&2 |
|
77 |
echo location of your Java installation. >&2 |
|
78 |
echo. |
|
79 |
goto error |
|
80 |
|
|
81 |
@REM ==== END VALIDATION ==== |
|
82 |
|
|
83 |
:init |
|
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 |
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" |
|
121 |
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain |
|
122 |
|
|
123 |
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
|
124 |
|
|
125 |
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( |
|
126 |
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B |
|
127 |
) |
|
128 |
|
|
129 |
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central |
|
130 |
@REM This allows using the maven wrapper in projects that prohibit checking in binary data. |
|
131 |
if exist %WRAPPER_JAR% ( |
|
132 |
if "%MVNW_VERBOSE%" == "true" ( |
|
133 |
echo Found %WRAPPER_JAR% |
|
134 |
) |
|
135 |
) else ( |
|
136 |
if not "%MVNW_REPOURL%" == "" ( |
|
137 |
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
|
138 |
) |
|
139 |
if "%MVNW_VERBOSE%" == "true" ( |
|
140 |
echo Couldn't find %WRAPPER_JAR%, downloading it ... |
|
141 |
echo Downloading from: %DOWNLOAD_URL% |
|
142 |
) |
|
143 |
|
|
144 |
powershell -Command "&{"^ |
|
145 |
"$webclient = new-object System.Net.WebClient;"^ |
|
146 |
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ |
|
147 |
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ |
|
148 |
"}"^ |
|
149 |
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ |
|
150 |
"}" |
|
151 |
if "%MVNW_VERBOSE%" == "true" ( |
|
152 |
echo Finished downloading %WRAPPER_JAR% |
|
153 |
) |
|
154 |
) |
|
155 |
@REM End of extension |
|
156 |
|
|
157 |
@REM Provide a "standardized" way to retrieve the CLI args that will |
|
158 |
@REM work with both Windows and non-Windows executions. |
|
159 |
set MAVEN_CMD_LINE_ARGS=%* |
|
160 |
|
|
161 |
%MAVEN_JAVA_EXE% ^ |
|
162 |
%JVM_CONFIG_MAVEN_PROPS% ^ |
|
163 |
%MAVEN_OPTS% ^ |
|
164 |
%MAVEN_DEBUG_OPTS% ^ |
|
165 |
-classpath %WRAPPER_JAR% ^ |
|
166 |
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ |
|
167 |
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* |
|
168 |
if ERRORLEVEL 1 goto error |
|
169 |
goto end |
|
170 |
|
|
171 |
:error |
|
172 |
set ERROR_CODE=1 |
|
173 |
|
|
174 |
:end |
|
175 |
@endlocal & set ERROR_CODE=%ERROR_CODE% |
|
176 |
|
|
177 |
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost |
|
178 |
@REM check for post script, once with legacy .bat ending and once with .cmd ending |
|
179 |
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" |
|
180 |
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" |
|
181 |
:skipRcPost |
|
182 |
|
|
183 |
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' |
|
184 |
if "%MAVEN_BATCH_PAUSE%"=="on" pause |
|
185 |
|
|
186 |
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% |
|
187 |
|
|
188 |
cmd /C exit /B %ERROR_CODE% |
backend/pom.xml | ||
---|---|---|
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> |
|
4 |
<modelVersion>4.0.0</modelVersion> |
|
5 |
<parent> |
|
6 |
<groupId>org.springframework.boot</groupId> |
|
7 |
<artifactId>spring-boot-starter-parent</artifactId> |
|
8 |
<version>2.6.4</version> |
|
9 |
<relativePath/> |
|
10 |
</parent> |
|
11 |
<groupId>cz.zcu.kiv</groupId> |
|
12 |
<artifactId>backend-api</artifactId> |
|
13 |
<version>0.0.1-SNAPSHOT</version> |
|
14 |
<name>backend-api</name> |
|
15 |
<description>Backend API for Neo-assyrian web application</description> |
|
16 |
<properties> |
|
17 |
<java.version>11</java.version> |
|
18 |
</properties> |
|
19 |
<dependencies> |
|
20 |
<dependency> |
|
21 |
<groupId>org.springframework.boot</groupId> |
|
22 |
<artifactId>spring-boot-starter-web</artifactId> |
|
23 |
</dependency> |
|
24 |
|
|
25 |
<dependency> |
|
26 |
<groupId>org.projectlombok</groupId> |
|
27 |
<artifactId>lombok</artifactId> |
|
28 |
<optional>true</optional> |
|
29 |
</dependency> |
|
30 |
<dependency> |
|
31 |
<groupId>org.springframework.boot</groupId> |
|
32 |
<artifactId>spring-boot-starter-test</artifactId> |
|
33 |
<scope>test</scope> |
|
34 |
</dependency> |
|
35 |
|
|
36 |
|
|
37 |
<dependency> |
|
38 |
<groupId>org.postgresql</groupId> |
|
39 |
<artifactId>postgresql</artifactId> |
|
40 |
<scope>runtime</scope> |
|
41 |
</dependency> |
|
42 |
|
|
43 |
<dependency> |
|
44 |
<groupId>org.springframework.boot</groupId> |
|
45 |
<artifactId>spring-boot-starter-data-jpa</artifactId> |
|
46 |
</dependency> |
|
47 |
|
|
48 |
<dependency> |
|
49 |
<groupId>org.springframework.boot</groupId> |
|
50 |
<artifactId>spring-boot-starter-validation</artifactId> |
|
51 |
</dependency> |
|
52 |
|
|
53 |
<dependency> |
|
54 |
<groupId>org.springframework.boot</groupId> |
|
55 |
<artifactId>spring-boot-starter-security</artifactId> |
|
56 |
</dependency> |
|
57 |
|
|
58 |
<dependency> |
|
59 |
<groupId>org.springframework.security</groupId> |
|
60 |
<artifactId>spring-security-test</artifactId> |
|
61 |
<scope>test</scope> |
|
62 |
</dependency> |
|
63 |
|
|
64 |
<dependency> |
|
65 |
<groupId>org.apache.commons</groupId> |
|
66 |
<artifactId>commons-csv</artifactId> |
|
67 |
<version>1.9.0</version> |
|
68 |
</dependency> |
|
69 |
|
|
70 |
<dependency> |
|
71 |
<groupId>com.auth0</groupId> |
|
72 |
<artifactId>java-jwt</artifactId> |
|
73 |
<version>3.19.0</version> |
|
74 |
</dependency> |
|
75 |
|
|
76 |
<dependency> |
|
77 |
<groupId>com.google.guava</groupId> |
|
78 |
<artifactId>guava</artifactId> |
|
79 |
<version>31.1-jre</version> |
|
80 |
</dependency> |
|
81 |
|
|
82 |
<dependency> |
|
83 |
<groupId>org.springframework.boot</groupId> |
|
84 |
<artifactId>spring-boot-configuration-processor</artifactId> |
|
85 |
<version>2.4.2</version> |
|
86 |
<optional>true</optional> |
|
87 |
</dependency> |
|
88 |
|
|
89 |
<dependency> |
|
90 |
<groupId>org.springdoc</groupId> |
|
91 |
<artifactId>springdoc-openapi-ui</artifactId> |
|
92 |
<version>1.6.6</version> |
|
93 |
</dependency> |
|
94 |
</dependencies> |
|
95 |
|
|
96 |
<build> |
|
97 |
<plugins> |
|
98 |
<plugin> |
|
99 |
<groupId>org.springframework.boot</groupId> |
|
100 |
<artifactId>spring-boot-maven-plugin</artifactId> |
|
101 |
<configuration> |
|
102 |
<excludes> |
|
103 |
<exclude> |
|
104 |
<groupId>org.projectlombok</groupId> |
|
105 |
<artifactId>lombok</artifactId> |
|
106 |
</exclude> |
|
107 |
</excludes> |
|
108 |
</configuration> |
|
109 |
</plugin> |
|
110 |
</plugins> |
|
111 |
</build> |
|
112 |
|
|
113 |
</project> |
backend/src/main/java/cz/zcu/kiv/backendapi/BackendApiApplication.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi; |
|
2 |
|
|
3 |
import java.util.logging.Logger; |
|
4 |
import org.springframework.boot.SpringApplication; |
|
5 |
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|
6 |
|
|
7 |
@SpringBootApplication |
|
8 |
public class BackendApiApplication { |
|
9 |
|
|
10 |
// TODO replace with log4j? |
|
11 |
public static final Logger LOGGER = Logger.getLogger(BackendApiApplication.class.getName()); |
|
12 |
|
|
13 |
public static void main(String[] args) { |
|
14 |
SpringApplication.run(BackendApiApplication.class, args); |
|
15 |
LOGGER.info("Swagger is running at: http://localhost:8080/swagger-ui.html"); |
|
16 |
} |
|
17 |
|
|
18 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/StubController.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi; |
|
2 |
|
|
3 |
import java.util.logging.Logger; |
|
4 |
import org.springframework.web.bind.annotation.GetMapping; |
|
5 |
import org.springframework.web.bind.annotation.RestController; |
|
6 |
|
|
7 |
@RestController() |
|
8 |
public class StubController { |
|
9 |
|
|
10 |
public static final Logger LOGGER = Logger.getLogger(StubController.class.getName()); |
|
11 |
|
|
12 |
static { |
|
13 |
LOGGER.info("StubController initialized!"); |
|
14 |
} |
|
15 |
|
|
16 |
// @GetMapping("/stub") |
|
17 |
// public StubDto getStubDto() { |
|
18 |
// return new StubDto("Hello API", true); |
|
19 |
// } |
|
20 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/StubDto.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi; |
|
2 |
|
|
3 |
// |
|
4 |
//import lombok.AllArgsConstructor; |
|
5 |
//public record StubDto(String message, Boolean success) {} |
backend/src/main/java/cz/zcu/kiv/backendapi/alternativename/AlternativeNameEntity.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.alternativename; |
|
2 |
|
|
3 |
import cz.zcu.kiv.backendapi.catalog.CatalogEntity; |
|
4 |
import lombok.AllArgsConstructor; |
|
5 |
import lombok.Data; |
|
6 |
import lombok.NoArgsConstructor; |
|
7 |
|
|
8 |
import javax.persistence.*; |
|
9 |
import java.io.Serializable; |
|
10 |
|
|
11 |
/** |
|
12 |
* Alternative name entity representing alternative name of geographic entry |
|
13 |
*/ |
|
14 |
@Data |
|
15 |
@NoArgsConstructor |
|
16 |
@AllArgsConstructor |
|
17 |
@Entity |
|
18 |
@Table(name = "alternative_names") |
|
19 |
@IdClass(AlternativeNameEntity.class) |
|
20 |
public class AlternativeNameEntity implements Serializable { |
|
21 |
/** |
|
22 |
* Name, serves as ID |
|
23 |
*/ |
|
24 |
@Id |
|
25 |
private String name; |
|
26 |
|
|
27 |
/** |
|
28 |
* Catalog entity |
|
29 |
*/ |
|
30 |
@ManyToOne |
|
31 |
@JoinColumn(name = "catalog_id") |
|
32 |
@Id |
|
33 |
private CatalogEntity catalog; |
|
34 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/alternativename/AlternativeNameRepository.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.alternativename; |
|
2 |
|
|
3 |
import org.springframework.data.jpa.repository.JpaRepository; |
|
4 |
import org.springframework.stereotype.Repository; |
|
5 |
import org.springframework.transaction.annotation.Transactional; |
|
6 |
|
|
7 |
/** |
|
8 |
* Alternative name repository |
|
9 |
*/ |
|
10 |
@Repository |
|
11 |
@Transactional(readOnly = true) |
|
12 |
public interface AlternativeNameRepository extends JpaRepository<AlternativeNameEntity, AlternativeNameEntity> { |
|
13 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/alternativename/AlternativeNameServiceImpl.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.alternativename; |
|
2 |
|
|
3 |
import lombok.RequiredArgsConstructor; |
|
4 |
import org.springframework.stereotype.Service; |
|
5 |
import org.springframework.transaction.annotation.Transactional; |
|
6 |
|
|
7 |
/** |
|
8 |
* Alternative name service implementation |
|
9 |
*/ |
|
10 |
@Service |
|
11 |
@Transactional |
|
12 |
@RequiredArgsConstructor |
|
13 |
public class AlternativeNameServiceImpl implements IAlternativeNameService { |
|
14 |
|
|
15 |
/** |
|
16 |
* Alternative name repository |
|
17 |
*/ |
|
18 |
private final AlternativeNameRepository alternativeNameRepository; |
|
19 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/alternativename/IAlternativeNameService.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.alternativename; |
|
2 |
|
|
3 |
/** |
|
4 |
* Alternative name service interface |
|
5 |
*/ |
|
6 |
public interface IAlternativeNameService { |
|
7 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/bibliography/BibliographyEntity.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.bibliography; |
|
2 |
|
|
3 |
import cz.zcu.kiv.backendapi.catalog.CatalogEntity; |
|
4 |
import lombok.AllArgsConstructor; |
|
5 |
import lombok.Data; |
|
6 |
import lombok.NoArgsConstructor; |
|
7 |
|
|
8 |
import javax.persistence.*; |
|
9 |
import java.io.Serializable; |
|
10 |
|
|
11 |
/** |
|
12 |
* Bibliography entity representing bibliography |
|
13 |
*/ |
|
14 |
@Data |
|
15 |
@NoArgsConstructor |
|
16 |
@AllArgsConstructor |
|
17 |
@Entity |
|
18 |
@Table(name = "bibliography") |
|
19 |
@IdClass(BibliographyEntity.class) |
|
20 |
public class BibliographyEntity implements Serializable { |
|
21 |
/** |
|
22 |
* Source, serves as ID |
|
23 |
*/ |
|
24 |
@Id |
|
25 |
private String source; |
|
26 |
|
|
27 |
@ManyToOne |
|
28 |
@JoinColumn(name = "catalog_id") |
|
29 |
private CatalogEntity catalog; |
|
30 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/bibliography/BibliographyRepository.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.bibliography; |
|
2 |
|
|
3 |
import org.springframework.data.jpa.repository.JpaRepository; |
|
4 |
import org.springframework.stereotype.Repository; |
|
5 |
import org.springframework.transaction.annotation.Transactional; |
|
6 |
|
|
7 |
/** |
|
8 |
* Bibliography repository |
|
9 |
*/ |
|
10 |
@Repository |
|
11 |
@Transactional(readOnly = true) |
|
12 |
public interface BibliographyRepository extends JpaRepository<BibliographyEntity, BibliographyEntity> { |
|
13 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/bibliography/BibliographyServiceImpl.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.bibliography; |
|
2 |
|
|
3 |
import lombok.RequiredArgsConstructor; |
|
4 |
import org.springframework.stereotype.Service; |
|
5 |
import org.springframework.transaction.annotation.Transactional; |
|
6 |
|
|
7 |
/** |
|
8 |
* Bibliography service implementation |
|
9 |
*/ |
|
10 |
@Service |
|
11 |
@Transactional |
|
12 |
@RequiredArgsConstructor |
|
13 |
public class BibliographyServiceImpl implements IBibliographyService { |
|
14 |
/** |
|
15 |
* Bibliography repository |
|
16 |
*/ |
|
17 |
private final BibliographyRepository bibliographyRepository; |
|
18 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/bibliography/IBibliographyService.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.bibliography; |
|
2 |
|
|
3 |
/** |
|
4 |
* Bibliography service interface |
|
5 |
*/ |
|
6 |
public interface IBibliographyService { |
|
7 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/catalog/CatalogController.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.catalog; |
|
2 |
|
|
3 |
import lombok.RequiredArgsConstructor; |
|
4 |
import org.springframework.http.HttpStatus; |
|
5 |
import org.springframework.http.ResponseEntity; |
|
6 |
import org.springframework.web.bind.annotation.*; |
|
7 |
|
|
8 |
import java.util.List; |
|
9 |
import java.util.UUID; |
|
10 |
|
|
11 |
/** |
|
12 |
* Controller for catalog |
|
13 |
*/ |
|
14 |
@RestController |
|
15 |
@RequiredArgsConstructor |
|
16 |
@RequestMapping("/catalog") |
|
17 |
public class CatalogController { |
|
18 |
|
|
19 |
/** |
|
20 |
* Catalog service |
|
21 |
*/ |
|
22 |
private final ICatalogService catalogService; |
|
23 |
|
|
24 |
@PostMapping("") |
|
25 |
public void addCatalogEntry(@RequestBody CatalogDto catalogDto) { |
|
26 |
catalogService.saveCatalogEntry(catalogDto); |
|
27 |
} |
|
28 |
|
|
29 |
/** |
|
30 |
* Returns catalog entries satisfying given filter |
|
31 |
* |
|
32 |
* @param name name - optional |
|
33 |
* @param country country - optional |
|
34 |
* @param type type - optional |
|
35 |
* @return list of catalog entries satisfying given filter |
|
36 |
*/ |
|
37 |
@GetMapping("") |
|
38 |
public ResponseEntity<List<CatalogDto>> getCatalog(@RequestParam(defaultValue = "") String name, @RequestParam(defaultValue = "") String country, @RequestParam(defaultValue = "") String type) { |
|
39 |
return new ResponseEntity<>(catalogService.getCatalog(name, country, type), HttpStatus.OK); |
|
40 |
} |
|
41 |
|
|
42 |
/** |
|
43 |
* Updates catalog entry with given ID |
|
44 |
* |
|
45 |
* @param id ID |
|
46 |
* @param catalogDto catalog DTO |
|
47 |
*/ |
|
48 |
@PutMapping("/{id}") |
|
49 |
public void updateCatalogEntry(@PathVariable UUID id, @RequestBody CatalogDto catalogDto) { |
|
50 |
catalogService.updateCatalogEntry(id, catalogDto); |
|
51 |
} |
|
52 |
|
|
53 |
/** |
|
54 |
* Deletes catalog entry with given ID |
|
55 |
* |
|
56 |
* @param id ID |
|
57 |
*/ |
|
58 |
@DeleteMapping("/{id}") |
|
59 |
public void deleteCatalogEntry(@PathVariable UUID id) { |
|
60 |
catalogService.deleteCatalogEntry(id); |
|
61 |
} |
|
62 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/catalog/CatalogDto.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.catalog; |
|
2 |
|
|
3 |
import com.fasterxml.jackson.annotation.JsonProperty; |
|
4 |
import lombok.AllArgsConstructor; |
|
5 |
import lombok.Data; |
|
6 |
import lombok.NoArgsConstructor; |
|
7 |
|
|
8 |
import java.util.Collections; |
|
9 |
import java.util.Set; |
|
10 |
import java.util.UUID; |
|
11 |
|
|
12 |
/** |
|
13 |
* Class representing catalog DTO |
|
14 |
*/ |
|
15 |
@Data |
|
16 |
@AllArgsConstructor |
|
17 |
@NoArgsConstructor |
|
18 |
public class CatalogDto { |
|
19 |
/** |
|
20 |
* Id |
|
21 |
*/ |
|
22 |
@JsonProperty(access = JsonProperty.Access.READ_ONLY) |
|
23 |
private UUID id; |
|
24 |
|
|
25 |
/** |
|
26 |
* Name of geographic entry |
|
27 |
*/ |
|
28 |
private String name; |
|
29 |
|
|
30 |
/** |
|
31 |
* Certainty |
|
32 |
*/ |
|
33 |
private int certainty; |
|
34 |
|
|
35 |
/** |
|
36 |
* Longitude |
|
37 |
*/ |
|
38 |
private double longitude; |
|
39 |
|
|
40 |
/** |
|
41 |
* Latitude |
|
42 |
*/ |
|
43 |
private double latitude; |
|
44 |
|
|
45 |
/** |
|
46 |
* Bibliography |
|
47 |
*/ |
|
48 |
private Set<String> bibliography = Collections.emptySet(); |
|
49 |
|
|
50 |
/** |
|
51 |
* Countries |
|
52 |
*/ |
|
53 |
private Set<String> countries = Collections.emptySet(); |
|
54 |
|
|
55 |
/** |
|
56 |
* Written forms |
|
57 |
*/ |
|
58 |
private Set<String> writtenForms = Collections.emptySet(); |
|
59 |
|
|
60 |
/** |
|
61 |
* Alternative names |
|
62 |
*/ |
|
63 |
private Set<String> alternativeNames = Collections.emptySet(); |
|
64 |
|
|
65 |
/** |
|
66 |
* Types |
|
67 |
*/ |
|
68 |
private Set<String> types = Collections.emptySet(); |
|
69 |
|
|
70 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/catalog/CatalogEntity.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.catalog; |
|
2 |
|
|
3 |
import cz.zcu.kiv.backendapi.alternativename.AlternativeNameEntity; |
|
4 |
import cz.zcu.kiv.backendapi.bibliography.BibliographyEntity; |
|
5 |
import cz.zcu.kiv.backendapi.country.CountryEntity; |
|
6 |
import cz.zcu.kiv.backendapi.type.TypeEntity; |
|
7 |
import cz.zcu.kiv.backendapi.writtenform.WrittenFormEntity; |
|
8 |
import lombok.Getter; |
|
9 |
import lombok.NoArgsConstructor; |
|
10 |
import lombok.Setter; |
|
11 |
import org.hibernate.annotations.LazyCollection; |
|
12 |
import org.hibernate.annotations.LazyCollectionOption; |
|
13 |
|
|
14 |
import javax.persistence.*; |
|
15 |
import java.util.*; |
|
16 |
import java.util.regex.Matcher; |
|
17 |
import java.util.regex.Pattern; |
|
18 |
import java.util.stream.Collectors; |
|
19 |
|
|
20 |
/** |
|
21 |
* Catalog entity representing catalog |
|
22 |
*/ |
|
23 |
//@Data |
|
24 |
@Getter |
|
25 |
@Setter |
|
26 |
@NoArgsConstructor |
|
27 |
@Entity |
|
28 |
@Table(name = "catalog") |
|
29 |
public class CatalogEntity { |
|
30 |
private static final String INTEGER_PATTERN = "\\d+"; |
|
31 |
private static final String DOUBLE_PATTERN = "(\\d+[.]\\d+)|(\\d+)"; |
|
32 |
private static final String EMPTY_ENTRY = "–"; |
|
33 |
/** |
|
34 |
* Catalog entry id |
|
35 |
*/ |
|
36 |
@Id |
|
37 |
@GeneratedValue |
|
38 |
private UUID id; |
|
39 |
|
|
40 |
/** |
|
41 |
* Name of geographic entry |
|
42 |
*/ |
|
43 |
private String name; |
|
44 |
|
|
45 |
/** |
|
46 |
* Certainty |
|
47 |
*/ |
|
48 |
private int certainty; |
|
49 |
|
|
50 |
/** |
|
51 |
* Longitude |
|
52 |
*/ |
|
53 |
private double longitude; |
|
54 |
|
|
55 |
/** |
|
56 |
* Latitude |
|
57 |
*/ |
|
58 |
private double latitude; |
|
59 |
|
|
60 |
/** |
|
61 |
* Bibliography |
|
62 |
*/ |
|
63 |
@OneToMany(mappedBy = "catalog", cascade = CascadeType.ALL) |
|
64 |
@LazyCollection(LazyCollectionOption.FALSE) |
|
65 |
private Set<BibliographyEntity> bibliography = Collections.emptySet(); |
|
66 |
|
|
67 |
/** |
|
68 |
* Countries |
|
69 |
*/ |
|
70 |
@OneToMany(mappedBy = "catalog", cascade = CascadeType.ALL) |
|
71 |
@LazyCollection(LazyCollectionOption.FALSE) |
|
72 |
private Set<CountryEntity> countries = Collections.emptySet(); |
|
73 |
|
|
74 |
/** |
|
75 |
* Written forms |
|
76 |
*/ |
|
77 |
@OneToMany(mappedBy = "catalog", cascade = CascadeType.ALL) |
|
78 |
@LazyCollection(LazyCollectionOption.FALSE) |
|
79 |
private Set<WrittenFormEntity> writtenForms = Collections.emptySet(); |
|
80 |
|
|
81 |
/** |
|
82 |
* Alternative names |
|
83 |
*/ |
|
84 |
@OneToMany(mappedBy = "catalog", cascade = CascadeType.ALL) |
|
85 |
@LazyCollection(LazyCollectionOption.FALSE) |
|
86 |
private Set<AlternativeNameEntity> alternativeNames = Collections.emptySet(); |
|
87 |
|
|
88 |
/** |
|
89 |
* Set of user roles - many-to-many relationship |
|
90 |
*/ |
|
91 |
@ManyToMany(fetch = FetchType.EAGER) |
|
92 |
@JoinTable( |
|
93 |
name = "catalog_type", |
|
94 |
joinColumns = { |
|
95 |
@JoinColumn(name = "catalog_id", referencedColumnName = "id") |
|
96 |
}, |
|
97 |
inverseJoinColumns = { |
|
98 |
@JoinColumn(name = "type", referencedColumnName = "type") |
|
99 |
} |
|
100 |
) |
|
101 |
private Set<TypeEntity> types = Collections.emptySet(); |
|
102 |
|
|
103 |
public CatalogEntity(final List<String> csvFields) { |
|
104 |
|
|
105 |
this.name = csvFields.get(1); |
|
106 |
List<String> stringList = processListField(csvFields.get(2)); |
|
107 |
this.alternativeNames = stringList.stream().map(s->new AlternativeNameEntity(s, this)).collect(Collectors.toSet()); |
|
108 |
|
|
109 |
this.certainty = processIntField(csvFields.get(3)); |
|
110 |
this.latitude = processDoubleField(csvFields.get(4)); |
|
111 |
this.longitude = processDoubleField(csvFields.get(5)); |
|
112 |
|
|
113 |
stringList = processListField(csvFields.get(6)); |
|
114 |
this.writtenForms = stringList.stream().map(s->new WrittenFormEntity(s, this)).collect(Collectors.toSet()); |
|
115 |
|
|
116 |
stringList = processListField(csvFields.get(7)); |
|
117 |
this.types = stringList.stream().map(TypeEntity::new).collect(Collectors.toSet()); |
|
118 |
|
|
119 |
stringList = processListField(csvFields.get(8)); |
|
120 |
this.countries = stringList.stream().map(s->new CountryEntity(s, this)).collect(Collectors.toSet()); |
|
121 |
|
|
122 |
stringList = processListField(csvFields.get(10)); |
|
123 |
this.bibliography = stringList.stream().map(s->new BibliographyEntity(s, this)).collect(Collectors.toSet()); |
|
124 |
} |
|
125 |
|
|
126 |
private int processIntField(String field) { |
|
127 |
Matcher matcher = Pattern.compile(INTEGER_PATTERN).matcher(field); |
|
128 |
if (matcher.find()) { |
|
129 |
return Integer.parseInt(matcher.group()); |
|
130 |
} else { |
|
131 |
return 0; |
|
132 |
} |
|
133 |
} |
|
134 |
|
|
135 |
private double processDoubleField(String field) { |
|
136 |
Matcher matcher = Pattern.compile(DOUBLE_PATTERN).matcher(field); |
|
137 |
if (matcher.find()) { |
|
138 |
return Double.parseDouble(matcher.group()); |
|
139 |
} else { |
|
140 |
return 0.0; |
|
141 |
} |
|
142 |
} |
|
143 |
|
|
144 |
private List<String> processListField(String field) { |
|
145 |
if (field.isEmpty() || field.equals(EMPTY_ENTRY)) { |
|
146 |
return new ArrayList<>(); |
|
147 |
} |
|
148 |
return Arrays.stream(field.split(",")).map(String::trim).filter(item -> !item.isEmpty()).collect(Collectors.toList()); |
|
149 |
} |
|
150 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/catalog/CatalogRepository.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.catalog; |
|
2 |
|
|
3 |
import org.springframework.data.jpa.repository.JpaRepository; |
|
4 |
import org.springframework.data.jpa.repository.Query; |
|
5 |
import org.springframework.stereotype.Repository; |
|
6 |
import org.springframework.transaction.annotation.Transactional; |
|
7 |
|
|
8 |
import java.util.Set; |
|
9 |
import java.util.UUID; |
|
10 |
|
|
11 |
/** |
|
12 |
* Catalog repository |
|
13 |
*/ |
|
14 |
@Repository |
|
15 |
@Transactional(readOnly = true) |
|
16 |
public interface CatalogRepository extends JpaRepository<CatalogEntity, UUID> { |
|
17 |
|
|
18 |
/** |
|
19 |
* Returns all catalog entries containing specific values |
|
20 |
* |
|
21 |
* @param name name - optional |
|
22 |
* @param country country - optional |
|
23 |
* @param type type - optional |
|
24 |
* @return set of catalog entries satisfying filter conditions |
|
25 |
*/ |
|
26 |
@Query("SELECT DISTINCT e FROM CatalogEntity e LEFT JOIN AlternativeNameEntity a ON e = a.catalog " + |
|
27 |
"LEFT JOIN CountryEntity c ON e = c.catalog " + |
|
28 |
"INNER JOIN e.types t " + |
|
29 |
"WHERE (?1 = '' OR e.name LIKE ?1 OR a.name LIKE ?1) " + |
|
30 |
"AND (?2 = '' OR c.name LIKE ?2) " + |
|
31 |
"AND (?3 = '' OR t.type LIKE ?3)") |
|
32 |
Set<CatalogEntity> filterCatalog(String name, String country, String type); |
|
33 |
} |
backend/src/main/java/cz/zcu/kiv/backendapi/catalog/CatalogServiceImpl.java | ||
---|---|---|
1 |
package cz.zcu.kiv.backendapi.catalog; |
|
2 |
|
|
3 |
import cz.zcu.kiv.backendapi.alternativename.AlternativeNameEntity; |
|
4 |
import cz.zcu.kiv.backendapi.bibliography.BibliographyEntity; |
|
5 |
import cz.zcu.kiv.backendapi.country.CountryEntity; |
|
6 |
import cz.zcu.kiv.backendapi.exception.ApiRequestException; |
|
7 |
import cz.zcu.kiv.backendapi.type.TypeEntity; |
|
8 |
import cz.zcu.kiv.backendapi.type.ITypeService; |
|
9 |
import cz.zcu.kiv.backendapi.writtenform.WrittenFormEntity; |
|
10 |
import lombok.RequiredArgsConstructor; |
|
11 |
import lombok.extern.slf4j.Slf4j; |
|
12 |
import org.springframework.http.HttpStatus; |
|
13 |
import org.springframework.stereotype.Service; |
|
14 |
import org.springframework.transaction.annotation.Transactional; |
|
15 |
|
|
16 |
import java.util.List; |
|
17 |
import java.util.Set; |
|
18 |
import java.util.UUID; |
|
19 |
import java.util.stream.Collectors; |
|
20 |
|
|
21 |
/** |
|
22 |
* Catalog service implementation |
|
23 |
*/ |
|
24 |
@Service |
|
25 |
@Transactional |
|
26 |
@RequiredArgsConstructor |
|
27 |
@Slf4j |
|
28 |
public class CatalogServiceImpl implements ICatalogService { |
|
29 |
/** |
|
30 |
* Message for exception when catalog entry is not found by id |
|
31 |
*/ |
|
32 |
private static final String CATALOG_ENTRY_NOT_FOUND = "Catalog entry not found"; |
|
33 |
/** |
|
34 |
* Catalog repository |
|
35 |
*/ |
|
36 |
private final CatalogRepository catalogRepository; |
|
37 |
|
|
38 |
/** |
|
39 |
* Type service |
|
40 |
*/ |
|
41 |
private final ITypeService typeService; |
|
42 |
|
|
43 |
@Override |
|
44 |
public void saveCatalog(List<CatalogEntity> catalogEntities) { |
|
45 |
log.info("Saving catalog"); |
|
46 |
catalogEntities.forEach(this::saveCatalogEntity); |
|
47 |
} |
|
48 |
|
|
49 |
@Override |
|
50 |
public void saveCatalogEntry(CatalogDto catalogDto) { |
|
51 |
log.info("Saving catalog entry"); |
|
52 |
CatalogEntity catalogEntity = new CatalogEntity(); |
|
53 |
convertDtoToEntity(catalogDto, catalogEntity); |
|
54 |
saveCatalogEntity(catalogEntity); |
|
55 |
} |
|
56 |
|
|
57 |
@Override |
|
58 |
public void updateCatalogEntry(UUID id, CatalogDto catalogDto) { |
|
59 |
CatalogEntity catalogEntity = catalogRepository.findById(id).orElseThrow(() -> { |
|
60 |
log.error(CATALOG_ENTRY_NOT_FOUND); |
|
61 |
throw new ApiRequestException(CATALOG_ENTRY_NOT_FOUND, HttpStatus.NOT_FOUND); |
|
62 |
}); |
|
63 |
convertDtoToEntity(catalogDto, catalogEntity); |
|
64 |
saveCatalogEntity(catalogEntity); |
|
65 |
log.info("Catalog entry updated"); |
|
66 |
} |
|
67 |
|
|
68 |
@Override |
|
69 |
public void deleteCatalogEntry(UUID id) { |
|
70 |
CatalogEntity catalogEntity = catalogRepository.findById(id).orElseThrow(() -> { |
|
71 |
log.error(CATALOG_ENTRY_NOT_FOUND); |
|
72 |
throw new ApiRequestException(CATALOG_ENTRY_NOT_FOUND, HttpStatus.NOT_FOUND); |
|
73 |
}); |
|
74 |
catalogRepository.delete(catalogEntity); |
|
75 |
log.info("Catalog entry deleted"); |
|
76 |
} |
|
77 |
|
|
78 |
@Override |
|
79 |
public List<CatalogDto> getCatalog(String name, String country, String type) { |
|
80 |
log.info("Retrieving catalog"); |
|
81 |
Set<CatalogEntity> entities = catalogRepository.filterCatalog(name, country, type); |
|
82 |
return entities.stream().map(this::convertEntityToDto).collect(Collectors.toList()); |
|
83 |
} |
|
84 |
|
|
85 |
/** |
|
86 |
* Saves catalog entity to database |
|
87 |
* |
|
88 |
* @param catalogEntity catalog entity |
|
89 |
*/ |
|
90 |
private void saveCatalogEntity(CatalogEntity catalogEntity) { |
|
91 |
for (TypeEntity type : catalogEntity.getTypes()) { |
|
92 |
if (typeService.getTypeByName(type.getType()).isEmpty()) { |
|
93 |
typeService.saveType(type); |
|
94 |
} |
|
95 |
} |
|
96 |
catalogRepository.save(catalogEntity); |
|
97 |
} |
|
98 |
|
|
99 |
/** |
|
100 |
* Converts catalog DTO to catalog entity |
|
101 |
* |
|
102 |
* @param catalogDto catalog DTO |
|
103 |
* @param catalogEntity catalog entity |
Také k dispozici: Unified diff
Merge after second iteration