노승철
2 years ago
commit
098bd6a5ea
32 changed files with 4236 additions and 0 deletions
@ -0,0 +1,33 @@ |
|||||||
|
HELP.md |
||||||
|
target/ |
||||||
|
!.mvn/wrapper/maven-wrapper.jar |
||||||
|
!**/src/main/**/target/ |
||||||
|
!**/src/test/**/target/ |
||||||
|
|
||||||
|
### STS ### |
||||||
|
.apt_generated |
||||||
|
.classpath |
||||||
|
.factorypath |
||||||
|
.project |
||||||
|
.settings |
||||||
|
.springBeans |
||||||
|
.sts4-cache |
||||||
|
|
||||||
|
### IntelliJ IDEA ### |
||||||
|
.idea |
||||||
|
*.iws |
||||||
|
*.iml |
||||||
|
*.ipr |
||||||
|
|
||||||
|
### NetBeans ### |
||||||
|
/nbproject/private/ |
||||||
|
/nbbuild/ |
||||||
|
/dist/ |
||||||
|
/nbdist/ |
||||||
|
/.nb-gradle/ |
||||||
|
build/ |
||||||
|
!**/src/main/**/build/ |
||||||
|
!**/src/test/**/build/ |
||||||
|
|
||||||
|
### VS Code ### |
||||||
|
.vscode/ |
Binary file not shown.
@ -0,0 +1,2 @@ |
|||||||
|
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip |
||||||
|
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar |
@ -0,0 +1,316 @@ |
|||||||
|
#!/bin/sh |
||||||
|
# ---------------------------------------------------------------------------- |
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
# or more contributor license agreements. See the NOTICE file |
||||||
|
# distributed with this work for additional information |
||||||
|
# regarding copyright ownership. The ASF licenses this file |
||||||
|
# to you under the Apache License, Version 2.0 (the |
||||||
|
# "License"); you may not use this file except in compliance |
||||||
|
# with the License. You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# https://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, |
||||||
|
# software distributed under the License is distributed on an |
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
# KIND, either express or implied. See the License for the |
||||||
|
# specific language governing permissions and limitations |
||||||
|
# under the License. |
||||||
|
# ---------------------------------------------------------------------------- |
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------- |
||||||
|
# Maven Start Up Batch script |
||||||
|
# |
||||||
|
# Required ENV vars: |
||||||
|
# ------------------ |
||||||
|
# JAVA_HOME - location of a JDK home dir |
||||||
|
# |
||||||
|
# Optional ENV vars |
||||||
|
# ----------------- |
||||||
|
# M2_HOME - location of maven2's installed home dir |
||||||
|
# MAVEN_OPTS - parameters passed to the Java VM when running Maven |
||||||
|
# e.g. to debug Maven itself, use |
||||||
|
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 |
||||||
|
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files |
||||||
|
# ---------------------------------------------------------------------------- |
||||||
|
|
||||||
|
if [ -z "$MAVEN_SKIP_RC" ] ; then |
||||||
|
|
||||||
|
if [ -f /usr/local/etc/mavenrc ] ; then |
||||||
|
. /usr/local/etc/mavenrc |
||||||
|
fi |
||||||
|
|
||||||
|
if [ -f /etc/mavenrc ] ; then |
||||||
|
. /etc/mavenrc |
||||||
|
fi |
||||||
|
|
||||||
|
if [ -f "$HOME/.mavenrc" ] ; then |
||||||
|
. "$HOME/.mavenrc" |
||||||
|
fi |
||||||
|
|
||||||
|
fi |
||||||
|
|
||||||
|
# OS specific support. $var _must_ be set to either true or false. |
||||||
|
cygwin=false; |
||||||
|
darwin=false; |
||||||
|
mingw=false |
||||||
|
case "`uname`" in |
||||||
|
CYGWIN*) cygwin=true ;; |
||||||
|
MINGW*) mingw=true;; |
||||||
|
Darwin*) darwin=true |
||||||
|
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home |
||||||
|
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html |
||||||
|
if [ -z "$JAVA_HOME" ]; then |
||||||
|
if [ -x "/usr/libexec/java_home" ]; then |
||||||
|
export JAVA_HOME="`/usr/libexec/java_home`" |
||||||
|
else |
||||||
|
export JAVA_HOME="/Library/Java/Home" |
||||||
|
fi |
||||||
|
fi |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then |
||||||
|
if [ -r /etc/gentoo-release ] ; then |
||||||
|
JAVA_HOME=`java-config --jre-home` |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if [ -z "$M2_HOME" ] ; then |
||||||
|
## resolve links - $0 may be a link to maven's home |
||||||
|
PRG="$0" |
||||||
|
|
||||||
|
# need this for relative symlinks |
||||||
|
while [ -h "$PRG" ] ; do |
||||||
|
ls=`ls -ld "$PRG"` |
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'` |
||||||
|
if expr "$link" : '/.*' > /dev/null; then |
||||||
|
PRG="$link" |
||||||
|
else |
||||||
|
PRG="`dirname "$PRG"`/$link" |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
saveddir=`pwd` |
||||||
|
|
||||||
|
M2_HOME=`dirname "$PRG"`/.. |
||||||
|
|
||||||
|
# make it fully qualified |
||||||
|
M2_HOME=`cd "$M2_HOME" && pwd` |
||||||
|
|
||||||
|
cd "$saveddir" |
||||||
|
# echo Using m2 at $M2_HOME |
||||||
|
fi |
||||||
|
|
||||||
|
# For Cygwin, ensure paths are in UNIX format before anything is touched |
||||||
|
if $cygwin ; then |
||||||
|
[ -n "$M2_HOME" ] && |
||||||
|
M2_HOME=`cygpath --unix "$M2_HOME"` |
||||||
|
[ -n "$JAVA_HOME" ] && |
||||||
|
JAVA_HOME=`cygpath --unix "$JAVA_HOME"` |
||||||
|
[ -n "$CLASSPATH" ] && |
||||||
|
CLASSPATH=`cygpath --path --unix "$CLASSPATH"` |
||||||
|
fi |
||||||
|
|
||||||
|
# For Mingw, ensure paths are in UNIX format before anything is touched |
||||||
|
if $mingw ; then |
||||||
|
[ -n "$M2_HOME" ] && |
||||||
|
M2_HOME="`(cd "$M2_HOME"; pwd)`" |
||||||
|
[ -n "$JAVA_HOME" ] && |
||||||
|
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" |
||||||
|
fi |
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ]; then |
||||||
|
javaExecutable="`which javac`" |
||||||
|
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then |
||||||
|
# readlink(1) is not available as standard on Solaris 10. |
||||||
|
readLink=`which readlink` |
||||||
|
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then |
||||||
|
if $darwin ; then |
||||||
|
javaHome="`dirname \"$javaExecutable\"`" |
||||||
|
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" |
||||||
|
else |
||||||
|
javaExecutable="`readlink -f \"$javaExecutable\"`" |
||||||
|
fi |
||||||
|
javaHome="`dirname \"$javaExecutable\"`" |
||||||
|
javaHome=`expr "$javaHome" : '\(.*\)/bin'` |
||||||
|
JAVA_HOME="$javaHome" |
||||||
|
export JAVA_HOME |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if [ -z "$JAVACMD" ] ; then |
||||||
|
if [ -n "$JAVA_HOME" ] ; then |
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then |
||||||
|
# IBM's JDK on AIX uses strange locations for the executables |
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java" |
||||||
|
else |
||||||
|
JAVACMD="$JAVA_HOME/bin/java" |
||||||
|
fi |
||||||
|
else |
||||||
|
JAVACMD="`\\unset -f command; \\command -v java`" |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then |
||||||
|
echo "Error: JAVA_HOME is not defined correctly." >&2 |
||||||
|
echo " We cannot execute $JAVACMD" >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then |
||||||
|
echo "Warning: JAVA_HOME environment variable is not set." |
||||||
|
fi |
||||||
|
|
||||||
|
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher |
||||||
|
|
||||||
|
# traverses directory structure from process work directory to filesystem root |
||||||
|
# first directory with .mvn subdirectory is considered project base directory |
||||||
|
find_maven_basedir() { |
||||||
|
|
||||||
|
if [ -z "$1" ] |
||||||
|
then |
||||||
|
echo "Path not specified to find_maven_basedir" |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
|
||||||
|
basedir="$1" |
||||||
|
wdir="$1" |
||||||
|
while [ "$wdir" != '/' ] ; do |
||||||
|
if [ -d "$wdir"/.mvn ] ; then |
||||||
|
basedir=$wdir |
||||||
|
break |
||||||
|
fi |
||||||
|
# workaround for JBEAP-8937 (on Solaris 10/Sparc) |
||||||
|
if [ -d "${wdir}" ]; then |
||||||
|
wdir=`cd "$wdir/.."; pwd` |
||||||
|
fi |
||||||
|
# end of workaround |
||||||
|
done |
||||||
|
echo "${basedir}" |
||||||
|
} |
||||||
|
|
||||||
|
# concatenates all lines of a file |
||||||
|
concat_lines() { |
||||||
|
if [ -f "$1" ]; then |
||||||
|
echo "$(tr -s '\n' ' ' < "$1")" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
BASE_DIR=`find_maven_basedir "$(pwd)"` |
||||||
|
if [ -z "$BASE_DIR" ]; then |
||||||
|
exit 1; |
||||||
|
fi |
||||||
|
|
||||||
|
########################################################################################## |
||||||
|
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central |
||||||
|
# This allows using the maven wrapper in projects that prohibit checking in binary data. |
||||||
|
########################################################################################## |
||||||
|
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo "Found .mvn/wrapper/maven-wrapper.jar" |
||||||
|
fi |
||||||
|
else |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." |
||||||
|
fi |
||||||
|
if [ -n "$MVNW_REPOURL" ]; then |
||||||
|
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
||||||
|
else |
||||||
|
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
||||||
|
fi |
||||||
|
while IFS="=" read key value; do |
||||||
|
case "$key" in (wrapperUrl) jarUrl="$value"; break ;; |
||||||
|
esac |
||||||
|
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo "Downloading from: $jarUrl" |
||||||
|
fi |
||||||
|
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" |
||||||
|
if $cygwin; then |
||||||
|
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` |
||||||
|
fi |
||||||
|
|
||||||
|
if command -v wget > /dev/null; then |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo "Found wget ... using wget" |
||||||
|
fi |
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then |
||||||
|
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" |
||||||
|
else |
||||||
|
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" |
||||||
|
fi |
||||||
|
elif command -v curl > /dev/null; then |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo "Found curl ... using curl" |
||||||
|
fi |
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then |
||||||
|
curl -o "$wrapperJarPath" "$jarUrl" -f |
||||||
|
else |
||||||
|
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f |
||||||
|
fi |
||||||
|
|
||||||
|
else |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo "Falling back to using Java to download" |
||||||
|
fi |
||||||
|
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" |
||||||
|
# For Cygwin, switch paths to Windows format before running javac |
||||||
|
if $cygwin; then |
||||||
|
javaClass=`cygpath --path --windows "$javaClass"` |
||||||
|
fi |
||||||
|
if [ -e "$javaClass" ]; then |
||||||
|
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo " - Compiling MavenWrapperDownloader.java ..." |
||||||
|
fi |
||||||
|
# Compiling the Java class |
||||||
|
("$JAVA_HOME/bin/javac" "$javaClass") |
||||||
|
fi |
||||||
|
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then |
||||||
|
# Running the downloader |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo " - Running MavenWrapperDownloader.java ..." |
||||||
|
fi |
||||||
|
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
########################################################################################## |
||||||
|
# End of extension |
||||||
|
########################################################################################## |
||||||
|
|
||||||
|
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} |
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then |
||||||
|
echo $MAVEN_PROJECTBASEDIR |
||||||
|
fi |
||||||
|
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" |
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java |
||||||
|
if $cygwin; then |
||||||
|
[ -n "$M2_HOME" ] && |
||||||
|
M2_HOME=`cygpath --path --windows "$M2_HOME"` |
||||||
|
[ -n "$JAVA_HOME" ] && |
||||||
|
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` |
||||||
|
[ -n "$CLASSPATH" ] && |
||||||
|
CLASSPATH=`cygpath --path --windows "$CLASSPATH"` |
||||||
|
[ -n "$MAVEN_PROJECTBASEDIR" ] && |
||||||
|
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` |
||||||
|
fi |
||||||
|
|
||||||
|
# Provide a "standardized" way to retrieve the CLI args that will |
||||||
|
# work with both Windows and non-Windows executions. |
||||||
|
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" |
||||||
|
export MAVEN_CMD_LINE_ARGS |
||||||
|
|
||||||
|
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain |
||||||
|
|
||||||
|
exec "$JAVACMD" \ |
||||||
|
$MAVEN_OPTS \ |
||||||
|
$MAVEN_DEBUG_OPTS \ |
||||||
|
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ |
||||||
|
"-Dmaven.home=${M2_HOME}" \ |
||||||
|
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ |
||||||
|
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" |
@ -0,0 +1,188 @@ |
|||||||
|
@REM ---------------------------------------------------------------------------- |
||||||
|
@REM Licensed to the Apache Software Foundation (ASF) under one |
||||||
|
@REM or more contributor license agreements. See the NOTICE file |
||||||
|
@REM distributed with this work for additional information |
||||||
|
@REM regarding copyright ownership. The ASF licenses this file |
||||||
|
@REM to you under the Apache License, Version 2.0 (the |
||||||
|
@REM "License"); you may not use this file except in compliance |
||||||
|
@REM with the License. You may obtain a copy of the License at |
||||||
|
@REM |
||||||
|
@REM https://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
@REM |
||||||
|
@REM Unless required by applicable law or agreed to in writing, |
||||||
|
@REM software distributed under the License is distributed on an |
||||||
|
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
||||||
|
@REM KIND, either express or implied. See the License for the |
||||||
|
@REM specific language governing permissions and limitations |
||||||
|
@REM under the License. |
||||||
|
@REM ---------------------------------------------------------------------------- |
||||||
|
|
||||||
|
@REM ---------------------------------------------------------------------------- |
||||||
|
@REM Maven Start Up Batch script |
||||||
|
@REM |
||||||
|
@REM Required ENV vars: |
||||||
|
@REM JAVA_HOME - location of a JDK home dir |
||||||
|
@REM |
||||||
|
@REM Optional ENV vars |
||||||
|
@REM M2_HOME - location of maven2's installed home dir |
||||||
|
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands |
||||||
|
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending |
||||||
|
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven |
||||||
|
@REM e.g. to debug Maven itself, use |
||||||
|
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 |
||||||
|
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files |
||||||
|
@REM ---------------------------------------------------------------------------- |
||||||
|
|
||||||
|
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' |
||||||
|
@echo off |
||||||
|
@REM set title of command window |
||||||
|
title %0 |
||||||
|
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' |
||||||
|
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% |
||||||
|
|
||||||
|
@REM set %HOME% to equivalent of $HOME |
||||||
|
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") |
||||||
|
|
||||||
|
@REM Execute a user defined script before this one |
||||||
|
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre |
||||||
|
@REM check for pre script, once with legacy .bat ending and once with .cmd ending |
||||||
|
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* |
||||||
|
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* |
||||||
|
:skipRcPre |
||||||
|
|
||||||
|
@setlocal |
||||||
|
|
||||||
|
set ERROR_CODE=0 |
||||||
|
|
||||||
|
@REM To isolate internal variables from possible post scripts, we use another setlocal |
||||||
|
@setlocal |
||||||
|
|
||||||
|
@REM ==== START VALIDATION ==== |
||||||
|
if not "%JAVA_HOME%" == "" goto OkJHome |
||||||
|
|
||||||
|
echo. |
||||||
|
echo Error: JAVA_HOME not found in your environment. >&2 |
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2 |
||||||
|
echo location of your Java installation. >&2 |
||||||
|
echo. |
||||||
|
goto error |
||||||
|
|
||||||
|
:OkJHome |
||||||
|
if exist "%JAVA_HOME%\bin\java.exe" goto init |
||||||
|
|
||||||
|
echo. |
||||||
|
echo Error: JAVA_HOME is set to an invalid directory. >&2 |
||||||
|
echo JAVA_HOME = "%JAVA_HOME%" >&2 |
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2 |
||||||
|
echo location of your Java installation. >&2 |
||||||
|
echo. |
||||||
|
goto error |
||||||
|
|
||||||
|
@REM ==== END VALIDATION ==== |
||||||
|
|
||||||
|
:init |
||||||
|
|
||||||
|
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". |
||||||
|
@REM Fallback to current working directory if not found. |
||||||
|
|
||||||
|
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% |
||||||
|
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir |
||||||
|
|
||||||
|
set EXEC_DIR=%CD% |
||||||
|
set WDIR=%EXEC_DIR% |
||||||
|
:findBaseDir |
||||||
|
IF EXIST "%WDIR%"\.mvn goto baseDirFound |
||||||
|
cd .. |
||||||
|
IF "%WDIR%"=="%CD%" goto baseDirNotFound |
||||||
|
set WDIR=%CD% |
||||||
|
goto findBaseDir |
||||||
|
|
||||||
|
:baseDirFound |
||||||
|
set MAVEN_PROJECTBASEDIR=%WDIR% |
||||||
|
cd "%EXEC_DIR%" |
||||||
|
goto endDetectBaseDir |
||||||
|
|
||||||
|
:baseDirNotFound |
||||||
|
set MAVEN_PROJECTBASEDIR=%EXEC_DIR% |
||||||
|
cd "%EXEC_DIR%" |
||||||
|
|
||||||
|
:endDetectBaseDir |
||||||
|
|
||||||
|
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig |
||||||
|
|
||||||
|
@setlocal EnableExtensions EnableDelayedExpansion |
||||||
|
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a |
||||||
|
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% |
||||||
|
|
||||||
|
:endReadAdditionalConfig |
||||||
|
|
||||||
|
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" |
||||||
|
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" |
||||||
|
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain |
||||||
|
|
||||||
|
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
||||||
|
|
||||||
|
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( |
||||||
|
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B |
||||||
|
) |
||||||
|
|
||||||
|
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central |
||||||
|
@REM This allows using the maven wrapper in projects that prohibit checking in binary data. |
||||||
|
if exist %WRAPPER_JAR% ( |
||||||
|
if "%MVNW_VERBOSE%" == "true" ( |
||||||
|
echo Found %WRAPPER_JAR% |
||||||
|
) |
||||||
|
) else ( |
||||||
|
if not "%MVNW_REPOURL%" == "" ( |
||||||
|
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" |
||||||
|
) |
||||||
|
if "%MVNW_VERBOSE%" == "true" ( |
||||||
|
echo Couldn't find %WRAPPER_JAR%, downloading it ... |
||||||
|
echo Downloading from: %DOWNLOAD_URL% |
||||||
|
) |
||||||
|
|
||||||
|
powershell -Command "&{"^ |
||||||
|
"$webclient = new-object System.Net.WebClient;"^ |
||||||
|
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ |
||||||
|
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ |
||||||
|
"}"^ |
||||||
|
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ |
||||||
|
"}" |
||||||
|
if "%MVNW_VERBOSE%" == "true" ( |
||||||
|
echo Finished downloading %WRAPPER_JAR% |
||||||
|
) |
||||||
|
) |
||||||
|
@REM End of extension |
||||||
|
|
||||||
|
@REM Provide a "standardized" way to retrieve the CLI args that will |
||||||
|
@REM work with both Windows and non-Windows executions. |
||||||
|
set MAVEN_CMD_LINE_ARGS=%* |
||||||
|
|
||||||
|
%MAVEN_JAVA_EXE% ^ |
||||||
|
%JVM_CONFIG_MAVEN_PROPS% ^ |
||||||
|
%MAVEN_OPTS% ^ |
||||||
|
%MAVEN_DEBUG_OPTS% ^ |
||||||
|
-classpath %WRAPPER_JAR% ^ |
||||||
|
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ |
||||||
|
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* |
||||||
|
if ERRORLEVEL 1 goto error |
||||||
|
goto end |
||||||
|
|
||||||
|
:error |
||||||
|
set ERROR_CODE=1 |
||||||
|
|
||||||
|
:end |
||||||
|
@endlocal & set ERROR_CODE=%ERROR_CODE% |
||||||
|
|
||||||
|
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost |
||||||
|
@REM check for post script, once with legacy .bat ending and once with .cmd ending |
||||||
|
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" |
||||||
|
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" |
||||||
|
:skipRcPost |
||||||
|
|
||||||
|
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' |
||||||
|
if "%MAVEN_BATCH_PAUSE%"=="on" pause |
||||||
|
|
||||||
|
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% |
||||||
|
|
||||||
|
cmd /C exit /B %ERROR_CODE% |
@ -0,0 +1,68 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<parent> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-parent</artifactId> |
||||||
|
<version>2.7.1</version> |
||||||
|
<relativePath/> <!-- lookup parent from repository --> |
||||||
|
</parent> |
||||||
|
<groupId>com.palnet</groupId> |
||||||
|
<artifactId>pav-socket</artifactId> |
||||||
|
<version>0.0.1-SNAPSHOT</version> |
||||||
|
<name>pav-socket</name> |
||||||
|
<description>pav-socket</description> |
||||||
|
<properties> |
||||||
|
<java.version>11</java.version> |
||||||
|
</properties> |
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-amqp</artifactId> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-web</artifactId> |
||||||
|
</dependency> |
||||||
|
|
||||||
|
<dependency> |
||||||
|
<groupId>org.projectlombok</groupId> |
||||||
|
<artifactId>lombok</artifactId> |
||||||
|
<optional>true</optional> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-starter-test</artifactId> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.springframework.amqp</groupId> |
||||||
|
<artifactId>spring-rabbit-test</artifactId> |
||||||
|
<scope>test</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>io.netty</groupId> |
||||||
|
<artifactId>netty-all</artifactId> |
||||||
|
<version>4.1.77.Final</version> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
|
||||||
|
<build> |
||||||
|
<plugins> |
||||||
|
<plugin> |
||||||
|
<groupId>org.springframework.boot</groupId> |
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId> |
||||||
|
<configuration> |
||||||
|
<excludes> |
||||||
|
<exclude> |
||||||
|
<groupId>org.projectlombok</groupId> |
||||||
|
<artifactId>lombok</artifactId> |
||||||
|
</exclude> |
||||||
|
</excludes> |
||||||
|
</configuration> |
||||||
|
</plugin> |
||||||
|
</plugins> |
||||||
|
</build> |
||||||
|
|
||||||
|
</project> |
@ -0,0 +1,13 @@ |
|||||||
|
package com.palnet; |
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication; |
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||||
|
|
||||||
|
@SpringBootApplication |
||||||
|
public class Application { |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
SpringApplication.run(Application.class, args); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package com.palnet.comn.collection; |
||||||
|
|
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class AuthCollection { |
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass()); |
||||||
|
|
||||||
|
private static List<String> authkeyList = new ArrayList<String>(); |
||||||
|
|
||||||
|
public void reloadAuthkey() { |
||||||
|
// 인증키 하드코딩 처리
|
||||||
|
authkeyList.add("1cc2e08e-0c5c-43b2-8d4d-cddd3de558e3");// 지텔인증키
|
||||||
|
authkeyList.add("35ea4080-a3f2-4e34-8361-78db06bac6fc");// PAL 인증키
|
||||||
|
|
||||||
|
// authkeyList.add(null)
|
||||||
|
} |
||||||
|
|
||||||
|
public boolean checkAuthkey(String authKey) { |
||||||
|
boolean result = false; |
||||||
|
// logger.debug("authKey ::: " + authKey);
|
||||||
|
|
||||||
|
for(String key : authkeyList) { |
||||||
|
// logger.debug("key ::: " + key);
|
||||||
|
if(authKey.equals(key)) { |
||||||
|
result = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static void main(String [] agrs) { |
||||||
|
AuthCollection auth = new AuthCollection(); |
||||||
|
auth.reloadAuthkey(); |
||||||
|
|
||||||
|
System.out.println("1>>>>> " + auth.checkAuthkey("!234")); |
||||||
|
System.out.println("2>>>>> " + auth.checkAuthkey("1cc2e08e-0c5c-43b2-8d4d-cddd3de558e3")); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
package com.palnet.comn.collection; |
||||||
|
|
||||||
|
import com.palnet.comn.utils.ContextUtils; |
||||||
|
import com.palnet.comn.utils.DateUtils; |
||||||
|
import com.palnet.process.message.producer.MessageProducer; |
||||||
|
import com.palnet.process.model.GPDatabaseModel; |
||||||
|
import com.palnet.process.model.GPHistoryModel; |
||||||
|
import com.palnet.process.model.GPModel; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.beans.BeanUtils; |
||||||
|
|
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* 현재 움직이는 물체/비행체에 대한 정보를 전송하기 위해 저장하는 Collection |
||||||
|
* @author kang |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
public class GPCollection { |
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass()); |
||||||
|
|
||||||
|
private static Map<String , String> identKeys = Collections.synchronizedMap(new HashMap<String, String>()); // 기체의 식별 번호
|
||||||
|
|
||||||
|
private MessageProducer messageProducer; |
||||||
|
|
||||||
|
public GPCollection() { |
||||||
|
this.messageProducer = (MessageProducer) ContextUtils.getBean("messageProducer"); |
||||||
|
} |
||||||
|
|
||||||
|
// 받은 데이터 정보를 데이터구조에 맞게 저장 한다.
|
||||||
|
// 최초에 데이터를 수신한 경우 관제 ID , 관제시작 시간을 셋팅한다.
|
||||||
|
public void putData(List<GPModel> paramData) { |
||||||
|
|
||||||
|
List<GPHistoryModel> historyList; |
||||||
|
GPModel model = new GPModel(); |
||||||
|
|
||||||
|
for(GPModel data : paramData) { |
||||||
|
data.setServerRcvDt(DateUtils.getCurrentTime()); //서버에서 받은 시간 넣기
|
||||||
|
|
||||||
|
// History Coordinates Settings
|
||||||
|
GPHistoryModel historyModel = new GPHistoryModel(); |
||||||
|
historyModel.setObjectId(data.getObjectId()); |
||||||
|
historyModel.setLat(data.getLat()); |
||||||
|
historyModel.setLng(data.getLng()); |
||||||
|
|
||||||
|
if (data.getPostionHistory() != null) { |
||||||
|
historyList = data.getPostionHistory(); |
||||||
|
} else { |
||||||
|
historyList = new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
historyList.add(historyModel); |
||||||
|
data.setPostionHistory(historyList); |
||||||
|
|
||||||
|
/* Message Queue Server 전달 */ |
||||||
|
convertModel(model); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void convertModel(GPModel model) { |
||||||
|
GPDatabaseModel databaseModel = new GPDatabaseModel(); |
||||||
|
|
||||||
|
BeanUtils.copyProperties(model, databaseModel); |
||||||
|
messageProducer.sendSocketData(databaseModel); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
//package com.palnet.comn.collection;
|
||||||
|
//
|
||||||
|
//import com.palnet.comn.model.GPDatabaseModel;
|
||||||
|
//import com.palnet.comn.utils.BeanUtils;
|
||||||
|
//import com.palnet.server.message.producer.MessageProducer;
|
||||||
|
//import org.slf4j.Logger;
|
||||||
|
//import org.slf4j.LoggerFactory;
|
||||||
|
//
|
||||||
|
//import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * 전송된 원시데이터를 Database 에 넣기 위해 임시 저장해두는 Collection
|
||||||
|
// * @author kang
|
||||||
|
// *
|
||||||
|
// */
|
||||||
|
//public class GPDatabaseCollection {
|
||||||
|
//
|
||||||
|
// private Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
//
|
||||||
|
// private static ConcurrentLinkedQueue<GPDatabaseModel> dataList = new ConcurrentLinkedQueue<GPDatabaseModel>();
|
||||||
|
// private MessageProducer messageProducer;
|
||||||
|
//
|
||||||
|
// public void putData(GPDatabaseModel paramData) {
|
||||||
|
// dataList.add(paramData);
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//// public void putListData(List<GPDatabaseModel> paramDataList) {
|
||||||
|
//// dataList.addAll(paramDataList);
|
||||||
|
//// }
|
||||||
|
//
|
||||||
|
// public ConcurrentLinkedQueue<GPDatabaseModel> getData(){
|
||||||
|
//
|
||||||
|
// return dataList;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//// public static void main(String[] args) {
|
||||||
|
//// ConcurrentLinkedQueue<String> qe = new ConcurrentLinkedQueue<String>();
|
||||||
|
////
|
||||||
|
//// }
|
||||||
|
////
|
||||||
|
// public void messageSend(GPDatabaseModel model) {
|
||||||
|
// messageProducer = (MessageProducer) BeanUtils.getBean("kafkaProducer");
|
||||||
|
// messageProducer.send("sample-topic", model);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
@ -0,0 +1,25 @@ |
|||||||
|
package com.palnet.comn.utils; |
||||||
|
|
||||||
|
import org.springframework.beans.BeansException; |
||||||
|
import org.springframework.context.ApplicationContext; |
||||||
|
import org.springframework.context.ApplicationContextAware; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
@Component |
||||||
|
public class ContextUtils implements ApplicationContextAware { |
||||||
|
|
||||||
|
private static ApplicationContext applicationContext; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setApplicationContext(ApplicationContext ctx) throws BeansException { |
||||||
|
applicationContext = ctx; |
||||||
|
} |
||||||
|
|
||||||
|
public static ApplicationContext getApplicationContext() { |
||||||
|
return applicationContext; |
||||||
|
} |
||||||
|
|
||||||
|
public static Object getBean(String beanName) { |
||||||
|
return getApplicationContext().getBean(beanName); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,153 @@ |
|||||||
|
package com.palnet.comn.utils; |
||||||
|
|
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.time.format.DateTimeFormatter; |
||||||
|
import java.time.format.DateTimeFormatterBuilder; |
||||||
|
import java.time.temporal.ChronoField; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
public class DateUtils { |
||||||
|
|
||||||
|
public static String getCurrentTime(){ |
||||||
|
return new SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis()); |
||||||
|
} |
||||||
|
|
||||||
|
public static String stringToFormat(String str) { |
||||||
|
Date date = stringToDatetime(str); |
||||||
|
|
||||||
|
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static Date stringToDatetime(String date) { |
||||||
|
|
||||||
|
SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMddHHmmss"); |
||||||
|
Date result = null; |
||||||
|
try { |
||||||
|
if(date.length() == 14) { |
||||||
|
result = transFormat.parse(date); |
||||||
|
} |
||||||
|
}catch(Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public static Date stringToDate(String date) { |
||||||
|
SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd"); |
||||||
|
SimpleDateFormat transFormat2 = new SimpleDateFormat("yyyyMMdd"); |
||||||
|
Date result = null; |
||||||
|
try { |
||||||
|
if(date.length() == 10) { |
||||||
|
result = transFormat.parse(date); |
||||||
|
}else if(date.length() == 8) { |
||||||
|
result = transFormat2.parse(date); |
||||||
|
} |
||||||
|
}catch(Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public static LocalDateTime stringToLocalDateTime(String date) { |
||||||
|
|
||||||
|
DateTimeFormatter transFormat = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); |
||||||
|
LocalDateTime localDateTime = LocalDateTime.parse(date , transFormat); |
||||||
|
|
||||||
|
return localDateTime; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static LocalDateTime stringToLocalDate(String date) { |
||||||
|
DateTimeFormatter transFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
||||||
|
|
||||||
|
DateTimeFormatter DATEFORMATTER = new DateTimeFormatterBuilder().append(transFormat) |
||||||
|
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0) |
||||||
|
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) |
||||||
|
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) |
||||||
|
.toFormatter(); |
||||||
|
|
||||||
|
|
||||||
|
LocalDateTime localDateTime = LocalDateTime.parse(date , DATEFORMATTER); |
||||||
|
|
||||||
|
return localDateTime; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static Date nowDate() { |
||||||
|
return new Date(System.currentTimeMillis()); |
||||||
|
} |
||||||
|
|
||||||
|
public static long diffSecond(Date firstDate , Date secondDate) { |
||||||
|
|
||||||
|
long diffDate = secondDate.getTime() - firstDate.getTime(); |
||||||
|
long diffTime = diffDate / (1000); |
||||||
|
|
||||||
|
return diffTime; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static long diffMinute(Date firstDate , Date secondDate) { |
||||||
|
|
||||||
|
long diffDate = secondDate.getTime() - firstDate.getTime(); |
||||||
|
long diffTime = diffDate / (1000 * 60); |
||||||
|
|
||||||
|
return diffTime; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
//
|
||||||
|
// Date firstDate = stringToDate("20210630142014");
|
||||||
|
//
|
||||||
|
// Date secondDate = stringToDate("20210630142914");
|
||||||
|
//
|
||||||
|
// LocalDateTime dateTime = stringToLocalDate("2021-07-20");
|
||||||
|
//
|
||||||
|
// System.out.println(">>>>" + dateTime);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// System.out.println("두 날짜의 차이 분: "+diffMinute(firstDate , secondDate));
|
||||||
|
//
|
||||||
|
// System.out.println(">>>" + stringToFormat("20210630142014"));
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//// List<Map<String, Double>> list = new ArrayList<Map<String, Double>>();
|
||||||
|
////
|
||||||
|
////
|
||||||
|
//// for( double i= 0 ; i < 1000 ; i ++) {
|
||||||
|
//// Map<String, Double> position = new HashMap<String, Double>();
|
||||||
|
//// position.put("lat", 11111.0);
|
||||||
|
//// position.put("lng", 11111.0);
|
||||||
|
//// position.put("date", i);
|
||||||
|
//// list.add(position);
|
||||||
|
//// }
|
||||||
|
////
|
||||||
|
//// int limitSize = 1000;
|
||||||
|
//// if(list.size() < 1000) {
|
||||||
|
//// limitSize = list.size();
|
||||||
|
//// }
|
||||||
|
////
|
||||||
|
//// List<Map<String, Double>> lastThreeThings = list.subList(list.size() - limitSize, list.size());
|
||||||
|
////
|
||||||
|
//// //뒤집기
|
||||||
|
//// Collections.reverse(lastThreeThings);
|
||||||
|
////
|
||||||
|
//// for(Map<String , Double> data : lastThreeThings) {
|
||||||
|
////
|
||||||
|
////
|
||||||
|
//// System.out.println(data);
|
||||||
|
//// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
} |
@ -0,0 +1,80 @@ |
|||||||
|
package com.palnet.comn.utils; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException; |
||||||
|
import com.fasterxml.jackson.core.type.TypeReference; |
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature; |
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
public class JsonUtils { |
||||||
|
|
||||||
|
private static ObjectMapper getObjectMapper() { |
||||||
|
ObjectMapper mapper = new ObjectMapper(); |
||||||
|
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
||||||
|
return mapper; |
||||||
|
} |
||||||
|
|
||||||
|
public static String toJson(Object object) { |
||||||
|
String json = null; |
||||||
|
|
||||||
|
try { |
||||||
|
json = getObjectMapper().writeValueAsString(object); |
||||||
|
} catch (JsonProcessingException e) { |
||||||
|
log.error("", e); |
||||||
|
} |
||||||
|
|
||||||
|
return json; |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> T fromJson(String val, Class<T> clazz){ |
||||||
|
T object = null; |
||||||
|
|
||||||
|
try { |
||||||
|
object = getObjectMapper().readValue(val, clazz); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("", e); |
||||||
|
} |
||||||
|
|
||||||
|
return object; |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> T fromJson(byte[] bytes, Class<T> clazz){ |
||||||
|
T object = null; |
||||||
|
|
||||||
|
try { |
||||||
|
object = getObjectMapper().readValue(bytes, clazz); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("", e); |
||||||
|
} |
||||||
|
|
||||||
|
return object; |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> T fromJson(String val, TypeReference<T> type){ |
||||||
|
T object = null; |
||||||
|
|
||||||
|
try { |
||||||
|
object = getObjectMapper().readValue(val, type); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("", e); |
||||||
|
} |
||||||
|
|
||||||
|
return object; |
||||||
|
} |
||||||
|
|
||||||
|
public static <T> T bytesToJson(byte[] bytes, TypeReference<T> type){ |
||||||
|
T object = null; |
||||||
|
|
||||||
|
try { |
||||||
|
object = getObjectMapper().readValue(bytes, type); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("", e); |
||||||
|
} |
||||||
|
|
||||||
|
return object; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
package com.palnet.process.message.config; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.amqp.core.Binding; |
||||||
|
import org.springframework.amqp.core.BindingBuilder; |
||||||
|
import org.springframework.amqp.core.Queue; |
||||||
|
import org.springframework.amqp.core.TopicExchange; |
||||||
|
|
||||||
|
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; |
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate; |
||||||
|
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; |
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.core.env.Environment; |
||||||
|
|
||||||
|
@Configuration |
||||||
|
@Slf4j |
||||||
|
public class MessageConfig { |
||||||
|
|
||||||
|
private final Environment env; |
||||||
|
|
||||||
|
public MessageConfig(Environment env) { |
||||||
|
this.env = env; |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public CachingConnectionFactory cachingConnectionFactory() { |
||||||
|
return new CachingConnectionFactory(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public Jackson2JsonMessageConverter converter() { |
||||||
|
return new Jackson2JsonMessageConverter(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public TopicExchange droneExchange() { |
||||||
|
return new TopicExchange(env.getProperty("message.dron.exchange-name")); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public Queue droneQueue() { |
||||||
|
return new Queue(env.getProperty("message.dron.queue-name")); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public Binding droneBinding(Queue queue, TopicExchange exchange) { |
||||||
|
return BindingBuilder.bind(queue).to(exchange).with(env.getProperty("message.dron.routing-key")); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory, Jackson2JsonMessageConverter converter) { |
||||||
|
RabbitTemplate rabbitTemplate = new RabbitTemplate(); |
||||||
|
|
||||||
|
rabbitTemplate.setConnectionFactory(connectionFactory); |
||||||
|
rabbitTemplate.setMessageConverter(converter); |
||||||
|
|
||||||
|
return rabbitTemplate; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.palnet.process.message.producer; |
||||||
|
|
||||||
|
|
||||||
|
import com.palnet.process.model.GPDatabaseModel; |
||||||
|
import com.palnet.process.model.GPModel; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate; |
||||||
|
import org.springframework.core.env.Environment; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.util.Objects; |
||||||
|
|
||||||
|
@Component |
||||||
|
@Slf4j |
||||||
|
public class MessageProducer { |
||||||
|
|
||||||
|
private final RabbitTemplate rabbitTemplate; |
||||||
|
private final Environment env; |
||||||
|
|
||||||
|
public MessageProducer(RabbitTemplate rabbitTemplate, Environment env) { |
||||||
|
this.rabbitTemplate = rabbitTemplate; |
||||||
|
this.env = env; |
||||||
|
} |
||||||
|
|
||||||
|
public void sendSocketData(GPDatabaseModel model) { |
||||||
|
rabbitTemplate.convertAndSend( |
||||||
|
Objects.requireNonNull(env.getProperty("message.drone.exchange-name")), |
||||||
|
Objects.requireNonNull(env.getProperty("message.drone.routing-key")), |
||||||
|
model); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
package com.palnet.process.model; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class GPDatabaseModel { |
||||||
|
|
||||||
|
private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터
|
||||||
|
|
||||||
|
private String messageType; |
||||||
|
|
||||||
|
private String terminalId; |
||||||
|
|
||||||
|
private Double moveDistance = 0.0; |
||||||
|
|
||||||
|
private String moveDistanceType; |
||||||
|
|
||||||
|
private String prodNumber; |
||||||
|
|
||||||
|
private String controlId; |
||||||
|
|
||||||
|
private String objectType; |
||||||
|
|
||||||
|
private String objectId; |
||||||
|
|
||||||
|
private Double lat = 0.0; |
||||||
|
|
||||||
|
private Double lng = 0.0; |
||||||
|
|
||||||
|
private String elevType; |
||||||
|
|
||||||
|
private Double elev = 0.0; |
||||||
|
|
||||||
|
private String speedType; |
||||||
|
|
||||||
|
private Double speed = 0.0; |
||||||
|
|
||||||
|
private Double betteryLevel = 0.0; |
||||||
|
|
||||||
|
private Double betteryVoltage = 0.0; |
||||||
|
|
||||||
|
private String dronStatus; |
||||||
|
|
||||||
|
private Double heading = 0.0; |
||||||
|
|
||||||
|
private String terminalRcvDt; |
||||||
|
|
||||||
|
private String serverRcvDt; |
||||||
|
|
||||||
|
private String controlStartDt; |
||||||
|
|
||||||
|
private String controlEndDt; |
||||||
|
|
||||||
|
private String areaTrnsYn; |
||||||
|
|
||||||
|
private String endTypeCd; // 01: 일정시간 위치 정보가 들어오지 않는 경우 , 02 : 데이터 베이스에 종료 시점이 명시 되지 않은 경우
|
||||||
|
|
||||||
|
// 환경센서 필드
|
||||||
|
private Double sensorCo = 0.0; |
||||||
|
private Double sensorSo2 = 0.0; |
||||||
|
private Double sensorNo2 = 0.0; |
||||||
|
private Double sensorO3 = 0.0; |
||||||
|
private Double sensorDust = 0.0; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package com.palnet.process.model; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class GPHistoryModel { |
||||||
|
|
||||||
|
private String objectId; |
||||||
|
|
||||||
|
private Double lat = 0.0; |
||||||
|
|
||||||
|
private Double lng = 0.0; |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
package com.palnet.process.model; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class GPModel { |
||||||
|
|
||||||
|
private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터
|
||||||
|
|
||||||
|
private String messageType; |
||||||
|
|
||||||
|
private String terminalId; |
||||||
|
|
||||||
|
private Double moveDistance = 0.0; |
||||||
|
|
||||||
|
private String moveDistanceType; |
||||||
|
|
||||||
|
private String controlId; // 처음 위치 데이터가 들어 왔을때 생성 함
|
||||||
|
|
||||||
|
private String objectType; |
||||||
|
|
||||||
|
private String objectId; |
||||||
|
|
||||||
|
private Double lat = 0.0; |
||||||
|
|
||||||
|
private Double lng = 0.0; |
||||||
|
|
||||||
|
private String elevType; |
||||||
|
|
||||||
|
private Double elev = 0.0; |
||||||
|
|
||||||
|
private String speedType; |
||||||
|
|
||||||
|
private Double speed = 0.0; |
||||||
|
|
||||||
|
private Double betteryLevel = 0.0; |
||||||
|
|
||||||
|
private Double betteryVoltage = 0.0; |
||||||
|
|
||||||
|
private String dronStatus; |
||||||
|
|
||||||
|
private Double heading = 0.0; |
||||||
|
|
||||||
|
private String terminalRcvDt; |
||||||
|
|
||||||
|
private String serverRcvDt; |
||||||
|
|
||||||
|
private String controlStartDt; |
||||||
|
|
||||||
|
private String controlEndDt; |
||||||
|
|
||||||
|
private String areaTrnsYn; |
||||||
|
|
||||||
|
// 환경센서 필드
|
||||||
|
private Double sensorCo = 0.0; |
||||||
|
private Double sensorSo2 = 0.0; |
||||||
|
private Double sensorNo2 = 0.0; |
||||||
|
private Double sensorO3 = 0.0; |
||||||
|
private Double sensorDust = 0.0; |
||||||
|
|
||||||
|
//최근 5건만 저장
|
||||||
|
private List<GPHistoryModel> recentPositionHistory; |
||||||
|
|
||||||
|
// 전체 히스토리 저장
|
||||||
|
private List<GPHistoryModel> postionHistory; |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,112 @@ |
|||||||
|
package com.palnet.server; |
||||||
|
|
||||||
|
import com.palnet.server.initializer.SocketInitializer; |
||||||
|
import io.netty.bootstrap.ServerBootstrap; |
||||||
|
import io.netty.channel.Channel; |
||||||
|
import io.netty.channel.ChannelFuture; |
||||||
|
import io.netty.channel.ChannelOption; |
||||||
|
import io.netty.channel.EventLoopGroup; |
||||||
|
import io.netty.channel.nio.NioEventLoopGroup; |
||||||
|
import io.netty.channel.socket.nio.NioServerSocketChannel; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import javax.annotation.PostConstruct; |
||||||
|
import javax.annotation.PreDestroy; |
||||||
|
|
||||||
|
@Component |
||||||
|
public class SocketServer { |
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass()); |
||||||
|
|
||||||
|
@Value("${netty.socket.port}") |
||||||
|
private int port; |
||||||
|
|
||||||
|
@Value("${netty.socket.thread.boss}") |
||||||
|
private int threadBoss; |
||||||
|
|
||||||
|
@Value("${netty.socket.thread.worker}") |
||||||
|
private int threadWorker; |
||||||
|
|
||||||
|
|
||||||
|
private Channel ch; |
||||||
|
|
||||||
|
private EventLoopGroup bossGroup ; |
||||||
|
private EventLoopGroup workerGroup ; |
||||||
|
private ServerBootstrap b = new ServerBootstrap(); |
||||||
|
|
||||||
|
// @Autowired
|
||||||
|
// private AdsbClient client;
|
||||||
|
//
|
||||||
|
|
||||||
|
@PostConstruct |
||||||
|
public void postConstruct(){ |
||||||
|
start(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@PreDestroy |
||||||
|
public void preDestroy(){ |
||||||
|
|
||||||
|
stop(); |
||||||
|
} |
||||||
|
|
||||||
|
public void start(){ |
||||||
|
try { |
||||||
|
bossGroup = new NioEventLoopGroup(10); |
||||||
|
workerGroup =new NioEventLoopGroup(); |
||||||
|
|
||||||
|
b.group(bossGroup , workerGroup) // bossGroup과 workerGroup은 NioEventLoopGroup의 인스턴스입니다.이 때 스레드 개수를 설정할 수 있음 각각 1, Runtime.getRuntime().availableProcessors() * 2로 설정했습니다.
|
||||||
|
.channel(NioServerSocketChannel.class) |
||||||
|
// .handler(new LoggingHandler(LogLevel.valueOf(logBootstrap)))
|
||||||
|
// .handler(bootstrapHandler) // 채널이 활성화되면 소켓 서버와 소켓 클라이언트를 구동하게 되는 핸들러를 등록합니다.
|
||||||
|
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) |
||||||
|
.option(ChannelOption.SO_BACKLOG, 1000) // 동시에 수용할 수 있는 소켓 연결 요청 수입니다.
|
||||||
|
|
||||||
|
// .option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(1024 , 1024 * 16 , 1024 * 1024))
|
||||||
|
.childOption(ChannelOption.TCP_NODELAY, false) // 반응속도를 높이기 위해 Nagle 알고리즘을 비활성화 합니다
|
||||||
|
|
||||||
|
.childOption(ChannelOption.SO_LINGER, 0) // 소켓이 close될 때 신뢰성있는 종료를 위해 4way-handshake가 발생하고 이때 TIME_WAIT로 리소스가 낭비됩니다. 이를 방지하기 위해 0으로 설정합니다.
|
||||||
|
.childOption(ChannelOption.SO_KEEPALIVE, false) // Keep-alive를 켭니다.
|
||||||
|
.childOption(ChannelOption.SO_REUSEADDR, false) // SO_LINGER설정이 있으면 안해도 되나 혹시나병(!)으로 TIME_WAIT걸린 포트를 재사용할 수 있도록 설정합니다.
|
||||||
|
.childHandler(new SocketInitializer()); |
||||||
|
|
||||||
|
connection(); |
||||||
|
// taskProcess();
|
||||||
|
// client.start();
|
||||||
|
|
||||||
|
logger.warn("====== [SOCKET SERVER] Start ====== "); |
||||||
|
}catch (Exception e) { |
||||||
|
logger.warn("====== [SOCKET SERVER] Fail ====== "); |
||||||
|
logger.error(e.getMessage()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private void connection() { |
||||||
|
//서버는 Listen상태로 기다려야하는데, 톰캣이 Timeout이 발생함
|
||||||
|
//이를 방지하기 위해 Thread로 처리한다.
|
||||||
|
new Thread(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
try { |
||||||
|
ChannelFuture future = b.bind(port).sync(); |
||||||
|
future.channel().closeFuture().sync(); |
||||||
|
|
||||||
|
} catch (InterruptedException e) { |
||||||
|
logger.error("InterruptedException", e); |
||||||
|
} |
||||||
|
} |
||||||
|
}).start(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void stop(){ |
||||||
|
bossGroup.shutdownGracefully(); |
||||||
|
workerGroup.shutdownGracefully(); |
||||||
|
logger.warn("====== [SOCKET SERVER] STOP ====== "); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012 The Netty Project |
||||||
|
* |
||||||
|
* The Netty Project licenses this file to you under the Apache License, |
||||||
|
* version 2.0 (the "License"); you may not use this file except in compliance |
||||||
|
* with the License. You may obtain a copy of the License at: |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
||||||
|
* License for the specific language governing permissions and limitations |
||||||
|
* under the License. |
||||||
|
*/ |
||||||
|
package com.palnet.server.codec; |
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf; |
||||||
|
import io.netty.channel.ChannelHandlerContext; |
||||||
|
import io.netty.handler.codec.ByteToMessageDecoder; |
||||||
|
|
||||||
|
import java.math.BigInteger; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* Decodes the binary representation of a {@link BigInteger} prepended |
||||||
|
* with a magic number ('F' or 0x46) and a 32-bit integer length prefix into a |
||||||
|
* {@link BigInteger} instance. For example, { 'F', 0, 0, 0, 1, 42 } will be |
||||||
|
* decoded into new BigInteger("42"). |
||||||
|
*/ |
||||||
|
public class BigIntegerDecoder extends ByteToMessageDecoder { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println(">>>>>>>>>>>>>>>>>>>>>" + in.readableBytes()); |
||||||
|
|
||||||
|
if (in.isReadable()) { |
||||||
|
byte[] bytes = new byte[in.readableBytes()]; |
||||||
|
|
||||||
|
int readerIndex = in.readerIndex(); |
||||||
|
in.getBytes(readerIndex, bytes); |
||||||
|
|
||||||
|
System.out.println(">>>" + new String(bytes)); |
||||||
|
|
||||||
|
} |
||||||
|
// Wait until the length prefix is available.
|
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package com.palnet.server.codec; |
||||||
|
|
||||||
|
import com.palnet.comn.utils.JsonUtils; |
||||||
|
import io.netty.channel.ChannelHandler.Sharable; |
||||||
|
import io.netty.channel.ChannelHandlerContext; |
||||||
|
import io.netty.handler.codec.MessageToMessageDecoder; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Sharable |
||||||
|
public class SocketPayLoadDecoder extends MessageToMessageDecoder<Object> { |
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass()); |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void decode(ChannelHandlerContext ctx, Object msg, List<Object> out){ |
||||||
|
// logger.info("[SocketPayLoadDecoder] Init 2 " );
|
||||||
|
SocketPayload payload = null; |
||||||
|
|
||||||
|
try { |
||||||
|
payload = JsonUtils.fromJson((String) msg, SocketPayload.class); |
||||||
|
if(payload != null) { |
||||||
|
out.add(payload); |
||||||
|
|
||||||
|
} |
||||||
|
}catch(Exception e) { |
||||||
|
logger.info("MSG => " + msg ); |
||||||
|
logger.error(e.getMessage()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.palnet.server.codec; |
||||||
|
|
||||||
|
import com.palnet.comn.utils.JsonUtils; |
||||||
|
import io.netty.channel.ChannelHandler.Sharable; |
||||||
|
import io.netty.channel.ChannelHandlerContext; |
||||||
|
import io.netty.handler.codec.MessageToMessageEncoder; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Sharable |
||||||
|
public class SocketPayLoadEncorder extends MessageToMessageEncoder<SocketPayloadResponse> { |
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass()); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected void encode(ChannelHandlerContext ctx, SocketPayloadResponse msg, List<Object> out){ |
||||||
|
try { |
||||||
|
out.add(JsonUtils.toJson(msg)); |
||||||
|
// logger.debug("[SocketPayLoadEncorder] Init 11111" );
|
||||||
|
logger.info("=== >>>>>>>>>>>>>>" , JsonUtils.toJson(msg)); |
||||||
|
}catch(Exception e) { |
||||||
|
logger.info("MSG => " + msg ); |
||||||
|
logger.error(e.getMessage()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.palnet.server.codec; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class SocketPayload implements Serializable{ |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
private String authKey; |
||||||
|
|
||||||
|
private String terminalId; |
||||||
|
|
||||||
|
private String command; |
||||||
|
|
||||||
|
private Object body; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.palnet.server.codec; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class SocketPayloadResponse implements Serializable{ |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
private String rspCode; |
||||||
|
|
||||||
|
private String rspMessage; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.palnet.server.collection; |
||||||
|
|
||||||
|
import io.netty.channel.Channel; |
||||||
|
import io.netty.channel.group.ChannelGroup; |
||||||
|
import io.netty.channel.group.DefaultChannelGroup; |
||||||
|
import io.netty.util.concurrent.GlobalEventExecutor; |
||||||
|
|
||||||
|
|
||||||
|
public class ChannelCollection { |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
//접속 되어있는 모든 Channel
|
||||||
|
private static final ChannelGroup allChannels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); |
||||||
|
|
||||||
|
|
||||||
|
public void setAllChannels(Channel ch) { |
||||||
|
allChannels.add(ch); |
||||||
|
} |
||||||
|
|
||||||
|
public ChannelGroup getAllChannels() { |
||||||
|
return allChannels; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,137 @@ |
|||||||
|
package com.palnet.server.command; |
||||||
|
|
||||||
|
import com.palnet.comn.collection.GPCollection; |
||||||
|
import com.palnet.process.model.GPModel; |
||||||
|
import com.palnet.server.codec.SocketPayload; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.LinkedHashMap; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class SocketCommand { |
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass()); |
||||||
|
GPCollection collection = new GPCollection(); |
||||||
|
|
||||||
|
|
||||||
|
public void openSkyCollectionPut(SocketPayload payload) { |
||||||
|
|
||||||
|
/** 전문 설정 ***/ |
||||||
|
String messageType = "OPENSKY"; |
||||||
|
String objectType = "FLIGHT"; |
||||||
|
|
||||||
|
List<LinkedHashMap<?,?>> resultList = new ArrayList<LinkedHashMap<?,?>>(); |
||||||
|
|
||||||
|
List<GPModel> dataList = new ArrayList<GPModel>(); |
||||||
|
|
||||||
|
logger.debug("BODY TYPE :: " + payload.getBody().getClass()); |
||||||
|
|
||||||
|
resultList = (ArrayList)payload.getBody(); |
||||||
|
|
||||||
|
GPModel model; |
||||||
|
|
||||||
|
for(LinkedHashMap<?,?> obj : resultList) { |
||||||
|
model = new GPModel(); |
||||||
|
|
||||||
|
model.setObjectType(objectType); |
||||||
|
model.setMessageType(messageType); |
||||||
|
model.setObjectId(obj.get("objectId").toString().trim()); |
||||||
|
model.setTerminalId(obj.get("terminalId").toString().trim()); |
||||||
|
model.setLat((Double)obj.get("lat")); |
||||||
|
model.setLng((Double)obj.get("lng")); |
||||||
|
model.setElev((Double)obj.get("elev")); |
||||||
|
model.setTerminalRcvDt(obj.get("terminalRcvDt").toString().trim()); |
||||||
|
model.setSpeed((Double)obj.get("speed")); |
||||||
|
model.setHeading((Double)obj.get("heading")); |
||||||
|
model.setSpeedType((String)obj.get("speedType")); |
||||||
|
model.setElevType((String)obj.get("elevType")); |
||||||
|
model.setMoveDistanceType((String)obj.get("moveDistanceType")); |
||||||
|
model.setMoveDistance((Double)obj.get("moveDistance")); |
||||||
|
|
||||||
|
model.setBetteryLevel((Double)obj.get("betteryLevel")); |
||||||
|
model.setBetteryVoltage((Double)obj.get("betteryVoltage")); |
||||||
|
model.setDronStatus((String)obj.get("dronStatus")); |
||||||
|
|
||||||
|
dataList.add(model); |
||||||
|
} |
||||||
|
|
||||||
|
collection.putData(dataList); |
||||||
|
// logger.debug("SIZE :: " +collection.getData().size() );
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 들어온 데이터를 collection넣는 작업을 한다. |
||||||
|
* @param payload |
||||||
|
*/ |
||||||
|
public void sandboxCollectionPut(SocketPayload payload) { |
||||||
|
|
||||||
|
/** 전문 설정 ***/ |
||||||
|
String messageType = "LTEM"; |
||||||
|
String objectType = "DRON"; |
||||||
|
|
||||||
|
List<LinkedHashMap<?,?>> resultList = new ArrayList<LinkedHashMap<?,?>>(); |
||||||
|
|
||||||
|
List<GPModel> dataList = new ArrayList<GPModel>(); |
||||||
|
|
||||||
|
logger.debug("BODY TYPE :: " + payload.getBody().getClass()); |
||||||
|
|
||||||
|
resultList = (ArrayList)payload.getBody(); |
||||||
|
|
||||||
|
GPModel model; |
||||||
|
|
||||||
|
for(LinkedHashMap<?,?> obj : resultList) { |
||||||
|
|
||||||
|
//위,경도 좌표가 0으로 들어오는 것은 무시 처리
|
||||||
|
if((Double)obj.get("lat") > 0 && (Double)obj.get("lon") > 0) { |
||||||
|
model = new GPModel(); |
||||||
|
// logger.debug(">>>>" + obj.toString());
|
||||||
|
model.setObjectType(objectType); |
||||||
|
model.setMessageType(messageType); |
||||||
|
model.setObjectId(obj.get("objectId").toString().trim()); |
||||||
|
model.setTerminalId(payload.getTerminalId()); |
||||||
|
if(obj.get("lat") != null) model.setLat(Double.valueOf(obj.get("lat").toString())); |
||||||
|
if(obj.get("lon") != null) model.setLng(Double.valueOf(obj.get("lon").toString())); |
||||||
|
if(obj.get("elev") != null) model.setElev(Double.valueOf(obj.get("elev").toString())); |
||||||
|
model.setTerminalRcvDt(obj.get("terminalRcvDt").toString().trim()); |
||||||
|
if(obj.get("speed") != null) model.setSpeed(Double.valueOf(obj.get("speed").toString())); |
||||||
|
if(obj.get("heading") != null) model.setHeading(Double.valueOf(obj.get("heading").toString())); |
||||||
|
model.setSpeedType((String)obj.get("speedType")); |
||||||
|
model.setElevType((String)obj.get("elevType")); |
||||||
|
model.setMoveDistanceType((String)obj.get("moveDistanceType")); |
||||||
|
if(obj.get("moveDistance") != null) model.setMoveDistance(Double.valueOf(obj.get("moveDistance").toString())); |
||||||
|
|
||||||
|
if(obj.get("betteryLevel") != null) model.setBetteryLevel(Double.valueOf(obj.get("betteryLevel").toString())); |
||||||
|
if(obj.get("betteryVoltage") != null) model.setBetteryVoltage(Double.valueOf(obj.get("betteryVoltage").toString())); |
||||||
|
model.setDronStatus((String)obj.get("dronStatus")); |
||||||
|
|
||||||
|
// 환경 데이터 필드 추가
|
||||||
|
if(obj.get("sensorCo") != null) model.setSensorCo(Double.valueOf(obj.get("sensorCo").toString())); |
||||||
|
if(obj.get("sensorSo2") != null) model.setSensorSo2(Double.valueOf(obj.get("sensorSo2").toString())); |
||||||
|
if(obj.get("sensorNo2") != null) model.setSensorNo2(Double.valueOf(obj.get("sensorNo2").toString())); |
||||||
|
if(obj.get("sensorO3") != null) model.setSensorO3(Double.valueOf(obj.get("sensorO3").toString())); |
||||||
|
if(obj.get("sensorDust") != null) model.setSensorDust(Double.valueOf(obj.get("sensorDust").toString())); |
||||||
|
|
||||||
|
// TODO 환경 데이터 임의의 데이터로 수정 - 추후 제거(임시코드)
|
||||||
|
// if(model.getSensorCo() != null){
|
||||||
|
// model.setSensorCo(TempUtils.gradualData("co"));
|
||||||
|
// model.setSensorSo2(TempUtils.gradualData("so2"));
|
||||||
|
// model.setSensorNo2(TempUtils.gradualData("no2"));
|
||||||
|
// model.setSensorO3(TempUtils.gradualData("o3"));
|
||||||
|
// model.setSensorDust(TempUtils.gradualData("dust"));
|
||||||
|
// }
|
||||||
|
dataList.add(model); |
||||||
|
}else { |
||||||
|
logger.info("lat , lon No data "); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// collection.putData(dataList);
|
||||||
|
// logger.debug("SIZE :: " +collection.getData().size() );
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,100 @@ |
|||||||
|
package com.palnet.server.handler; |
||||||
|
|
||||||
|
import com.palnet.comn.collection.AuthCollection; |
||||||
|
import com.palnet.comn.utils.JsonUtils; |
||||||
|
import com.palnet.server.codec.SocketPayload; |
||||||
|
import com.palnet.server.codec.SocketPayloadResponse; |
||||||
|
import com.palnet.server.command.SocketCommand; |
||||||
|
import io.netty.channel.ChannelHandlerContext; |
||||||
|
import io.netty.channel.SimpleChannelInboundHandler; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
|
||||||
|
import org.springframework.util.StringUtils; |
||||||
|
|
||||||
|
public class SocketHandler extends SimpleChannelInboundHandler<SocketPayload> { |
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(getClass()); |
||||||
|
private SocketCommand command = new SocketCommand(); |
||||||
|
|
||||||
|
private AuthCollection auth = new AuthCollection(); |
||||||
|
private SocketPayloadResponse res = new SocketPayloadResponse(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void channelActive(ChannelHandlerContext ctx) { |
||||||
|
auth.reloadAuthkey(); // 채널 활성화 되면 인증키 정보를 다시 불러옴
|
||||||
|
|
||||||
|
logger.debug("==================== [SocketHandler channelActive ] ==================== "); |
||||||
|
ctx.writeAndFlush("Server Connection"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void channelRead0(ChannelHandlerContext ctx, SocketPayload payload){ |
||||||
|
|
||||||
|
try { |
||||||
|
|
||||||
|
logger.debug("==================== [SocketHandler channelRead0 ] ==================== "); |
||||||
|
logger.debug("AUTH KEY :: ==== > " +payload.getAuthKey()); |
||||||
|
// logger.info(auth.checkAuthkey(payload.getAuthKey().toString().trim()));
|
||||||
|
|
||||||
|
if(StringUtils.isEmpty(payload.getAuthKey())) { |
||||||
|
// 인증키가 없을 경우
|
||||||
|
logger.debug("AUTH : no key " ); |
||||||
|
res.setRspCode("-2000"); |
||||||
|
res.setRspMessage("inValidate AuthKey"); |
||||||
|
}else if(!auth.checkAuthkey(payload.getAuthKey().toString().trim())) { |
||||||
|
// 인증키가 틀린 경우
|
||||||
|
logger.debug("AUTH : error key " ); |
||||||
|
logger.debug(payload.getAuthKey() ); |
||||||
|
// logger.info(auth.checkAuthkey(payload.getAuthKey().toString().trim()));
|
||||||
|
res.setRspCode("-2000"); |
||||||
|
res.setRspMessage("inValidate AuthKey"); |
||||||
|
}else{ |
||||||
|
logger.warn("MSG :: ==== > " + JsonUtils.toJson(payload)); |
||||||
|
|
||||||
|
switch(payload.getCommand().trim()) { |
||||||
|
case "OPENSKY" : |
||||||
|
command.openSkyCollectionPut(payload); |
||||||
|
break; |
||||||
|
case "SANDBOX": |
||||||
|
command.sandboxCollectionPut(payload); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
res.setRspCode("0"); |
||||||
|
res.setRspMessage("SUCCESS"); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
}catch(Exception e) { |
||||||
|
res.setRspCode("-9999"); |
||||||
|
res.setRspMessage("Etc error"); |
||||||
|
|
||||||
|
e.printStackTrace(); |
||||||
|
}finally { |
||||||
|
logger.debug("res >>>" + JsonUtils.toJson(res)); |
||||||
|
ctx.writeAndFlush(res); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { |
||||||
|
logger.info("=========== [exceptionCaught ] ===================="); |
||||||
|
res.setRspCode("-9999"); |
||||||
|
res.setRspMessage("Etc error"); |
||||||
|
ctx.writeAndFlush(res); |
||||||
|
|
||||||
|
cause.printStackTrace(); |
||||||
|
ctx.close(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package com.palnet.server.initializer; |
||||||
|
|
||||||
|
import com.palnet.server.codec.SocketPayLoadDecoder; |
||||||
|
import com.palnet.server.codec.SocketPayLoadEncorder; |
||||||
|
import com.palnet.server.handler.SocketHandler; |
||||||
|
import io.netty.channel.ChannelInitializer; |
||||||
|
import io.netty.channel.ChannelPipeline; |
||||||
|
import io.netty.channel.socket.SocketChannel; |
||||||
|
import io.netty.handler.codec.json.JsonObjectDecoder; |
||||||
|
import io.netty.handler.codec.string.StringDecoder; |
||||||
|
import io.netty.handler.codec.string.StringEncoder; |
||||||
|
import io.netty.util.CharsetUtil; |
||||||
|
|
||||||
|
public class SocketInitializer extends ChannelInitializer<SocketChannel>{ |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void initChannel(SocketChannel ch) throws Exception { |
||||||
|
ChannelPipeline pipeline = ch.pipeline() |
||||||
|
.addLast(new JsonObjectDecoder(655360)) |
||||||
|
.addLast(new StringDecoder(CharsetUtil.UTF_8), new StringEncoder(CharsetUtil.UTF_8)) |
||||||
|
.addLast(new SocketPayLoadDecoder() , new SocketPayLoadEncorder()) |
||||||
|
.addLast(new SocketHandler()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
spring: |
||||||
|
rabbitmq: |
||||||
|
host: localhost |
||||||
|
port: 5672 |
||||||
|
username: guest |
||||||
|
password: guest |
||||||
|
|
||||||
|
|
||||||
|
netty: |
||||||
|
task: |
||||||
|
controlinfoTime: 2000 |
||||||
|
socket: |
||||||
|
port: 8082 |
||||||
|
thread: |
||||||
|
boss: 1 |
||||||
|
worker: 1 |
||||||
|
|
||||||
|
server: |
||||||
|
port: 8182 |
||||||
|
|
||||||
|
message: |
||||||
|
drone: |
||||||
|
queue-name: drone.queue |
||||||
|
exchange-name: drone.exchange |
||||||
|
routing-key: drone.routing.# |
||||||
|
|
||||||
|
|
Loading…
Reference in new issue