Merge pull request 'feat/infer_dev_260107' (#310) from feat/infer_dev_260107 into develop
Reviewed-on: https://kamco.gitea.gs.dabeeo.com/dabeeo/kamco-dabeeo-backoffice/pulls/310
This commit is contained in:
550
gradle/linux/pack_offline_bundle_airgap.sh
Normal file
550
gradle/linux/pack_offline_bundle_airgap.sh
Normal file
@@ -0,0 +1,550 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# pack_offline_bundle_airgap.sh
|
||||||
|
# ============================================================================
|
||||||
|
# Gradle Offline Bundle Packer
|
||||||
|
# ============================================================================
|
||||||
|
# Version: 4.0
|
||||||
|
#
|
||||||
|
# WORKFLOW:
|
||||||
|
# 1. [ONLINE] Build project (./gradlew bootJar) - downloads all deps
|
||||||
|
# 2. [ONLINE] Test run (./gradlew bootRun) - verify app works
|
||||||
|
# 3. [OFFLINE TEST] Verify offline build works
|
||||||
|
# 4. Create bundle with all cached dependencies
|
||||||
|
#
|
||||||
|
# REQUIREMENTS:
|
||||||
|
# - Internet connection (for initial build)
|
||||||
|
# - Project with gradlew
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Configuration
|
||||||
|
# ============================================================================
|
||||||
|
WRAPPER_SEED_PATH="wrapper_jar_seed"
|
||||||
|
OFFLINE_HOME_NAME="_offline_gradle_home"
|
||||||
|
BOOTRUN_TIMEOUT_SECONDS=60
|
||||||
|
|
||||||
|
# Color codes
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
GRAY='\033[0;90m'
|
||||||
|
WHITE='\033[1;37m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo -e "${CYAN} Gradle Offline Bundle Packer v4.0${NC}"
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${WHITE} This script will:${NC}"
|
||||||
|
echo -e "${GRAY} 1. Build project with internet (download dependencies)${NC}"
|
||||||
|
echo -e "${GRAY} 2. Test run application (verify it works)${NC}"
|
||||||
|
echo -e "${GRAY} 3. Test offline build (verify cache is complete)${NC}"
|
||||||
|
echo -e "${GRAY} 4. Create offline bundle for air-gapped environment${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [1/20] Check Current Directory
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[1/20] Check Current Directory ==${NC}"
|
||||||
|
ROOT="$(pwd)"
|
||||||
|
echo "ROOT_DIR: $ROOT"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [2/20] Check Required Files
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[2/20] Check Required Files ==${NC}"
|
||||||
|
|
||||||
|
if [ ! -f "./gradlew" ]; then
|
||||||
|
echo -e "${RED}ERROR: gradlew not found. Run from project root.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
chmod +x ./gradlew
|
||||||
|
echo -e "${GREEN}[OK] gradlew${NC}"
|
||||||
|
|
||||||
|
BUILD_FILE=""
|
||||||
|
if [ -f "./build.gradle" ]; then
|
||||||
|
BUILD_FILE="build.gradle"
|
||||||
|
elif [ -f "./build.gradle.kts" ]; then
|
||||||
|
BUILD_FILE="build.gradle.kts"
|
||||||
|
else
|
||||||
|
echo -e "${RED}ERROR: build.gradle(.kts) not found.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}[OK] $BUILD_FILE${NC}"
|
||||||
|
|
||||||
|
SETTINGS_FILE=""
|
||||||
|
if [ -f "./settings.gradle" ]; then
|
||||||
|
SETTINGS_FILE="settings.gradle"
|
||||||
|
echo -e "${GREEN}[OK] $SETTINGS_FILE${NC}"
|
||||||
|
elif [ -f "./settings.gradle.kts" ]; then
|
||||||
|
SETTINGS_FILE="settings.gradle.kts"
|
||||||
|
echo -e "${GREEN}[OK] $SETTINGS_FILE${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [3/20] Check Gradle Wrapper
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[3/20] Check Gradle Wrapper ==${NC}"
|
||||||
|
|
||||||
|
WRAPPER_DIR="$ROOT/gradle/wrapper"
|
||||||
|
WRAPPER_JAR="$WRAPPER_DIR/gradle-wrapper.jar"
|
||||||
|
WRAPPER_PROP="$WRAPPER_DIR/gradle-wrapper.properties"
|
||||||
|
|
||||||
|
mkdir -p "$WRAPPER_DIR"
|
||||||
|
|
||||||
|
if [ ! -f "$WRAPPER_PROP" ]; then
|
||||||
|
echo -e "${RED}ERROR: gradle-wrapper.properties not found.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$WRAPPER_JAR" ]; then
|
||||||
|
SEED_JAR="$ROOT/$WRAPPER_SEED_PATH/gradle-wrapper.jar"
|
||||||
|
if [ -f "$SEED_JAR" ]; then
|
||||||
|
cp "$SEED_JAR" "$WRAPPER_JAR"
|
||||||
|
echo -e "${GREEN}[OK] Wrapper jar injected from seed${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}ERROR: gradle-wrapper.jar missing${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}[OK] gradle-wrapper.jar exists${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create seed backup
|
||||||
|
SEED_DIR="$ROOT/$WRAPPER_SEED_PATH"
|
||||||
|
if [ ! -d "$SEED_DIR" ]; then
|
||||||
|
mkdir -p "$SEED_DIR"
|
||||||
|
cp "$WRAPPER_JAR" "$SEED_DIR/gradle-wrapper.jar"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [4/20] Set GRADLE_USER_HOME (Project Local)
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[4/20] Set GRADLE_USER_HOME ==${NC}"
|
||||||
|
|
||||||
|
OFFLINE_HOME="$ROOT/$OFFLINE_HOME_NAME"
|
||||||
|
mkdir -p "$OFFLINE_HOME"
|
||||||
|
export GRADLE_USER_HOME="$OFFLINE_HOME"
|
||||||
|
|
||||||
|
echo -e "${CYAN}GRADLE_USER_HOME = $GRADLE_USER_HOME${NC}"
|
||||||
|
echo -e "${GRAY}[INFO] All dependencies will be cached in project folder${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [5/20] Check Internet Connection
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[5/20] Check Internet Connection ==${NC}"
|
||||||
|
|
||||||
|
HAS_INTERNET=false
|
||||||
|
TEST_HOSTS=("plugins.gradle.org" "repo.maven.apache.org" "repo1.maven.org")
|
||||||
|
|
||||||
|
for TEST_HOST in "${TEST_HOSTS[@]}"; do
|
||||||
|
if ping -c 1 -W 3 "$TEST_HOST" &>/dev/null; then
|
||||||
|
HAS_INTERNET=true
|
||||||
|
echo -e "${GREEN}[OK] Connected to $TEST_HOST${NC}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$HAS_INTERNET" = false ]; then
|
||||||
|
# Try DNS resolution as fallback
|
||||||
|
if nslookup google.com &>/dev/null || host google.com &>/dev/null; then
|
||||||
|
HAS_INTERNET=true
|
||||||
|
echo -e "${GREEN}[OK] Internet available (DNS)${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$HAS_INTERNET" = false ]; then
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo -e "${RED} ERROR: No Internet Connection!${NC}"
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}This script requires internet for initial build.${NC}"
|
||||||
|
echo -e "${YELLOW}Please connect to internet and run again.${NC}"
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [6/20] Initial Gradle Setup
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[6/20] Initial Gradle Setup ==${NC}"
|
||||||
|
echo -e "${GRAY}[INFO] Downloading Gradle distribution...${NC}"
|
||||||
|
|
||||||
|
if ./gradlew --version &>/dev/null; then
|
||||||
|
GRADLE_VERSION=$(./gradlew --version 2>&1 | grep "^Gradle" | awk '{print $2}')
|
||||||
|
echo -e "${GREEN}[OK] Gradle $GRADLE_VERSION${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}[ERROR] Gradle setup failed${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [7/20] ONLINE BUILD - bootJar (Download All Dependencies)
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[7/20] ONLINE BUILD - bootJar ==${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo -e "${CYAN} ONLINE BUILD (with Internet)${NC}"
|
||||||
|
echo -e "${CYAN} Downloading all dependencies to local cache${NC}"
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
BUILD_SUCCESS=false
|
||||||
|
|
||||||
|
./gradlew clean bootJar --no-daemon
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
BUILD_SUCCESS=true
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo -e "${GREEN} ONLINE BUILD SUCCESS!${NC}"
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -d "./build/libs" ]; then
|
||||||
|
echo -e "${CYAN}JAR files:${NC}"
|
||||||
|
ls -lh ./build/libs/*.jar 2>/dev/null | awk '{print " " $9 " (" $5 ")"}'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo -e "${RED} BUILD FAILED!${NC}"
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Build failed. Cannot continue.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [8/20] Stop Daemons
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[8/20] Stop Daemons ==${NC}"
|
||||||
|
|
||||||
|
./gradlew --stop &>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
echo -e "${GREEN}[OK] Daemons stopped${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [9/20] ONLINE TEST - bootRun (Verify Application Works)
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[9/20] ONLINE TEST - bootRun ==${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo -e "${CYAN} Testing application startup (timeout: ${BOOTRUN_TIMEOUT_SECONDS}s)${NC}"
|
||||||
|
echo -e "${CYAN} Will automatically stop after successful startup${NC}"
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
BOOTRUN_SUCCESS=false
|
||||||
|
|
||||||
|
timeout ${BOOTRUN_TIMEOUT_SECONDS}s ./gradlew bootRun --no-daemon &
|
||||||
|
BOOTRUN_PID=$!
|
||||||
|
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
if ps -p $BOOTRUN_PID &>/dev/null; then
|
||||||
|
BOOTRUN_SUCCESS=true
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}[OK] Application started successfully${NC}"
|
||||||
|
kill $BOOTRUN_PID &>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}[WARN] Application may not have started properly${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
pkill -f "gradle.*bootRun" &>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [10/20] Stop Daemons Again
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[10/20] Stop Daemons Again ==${NC}"
|
||||||
|
|
||||||
|
./gradlew --stop &>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
echo -e "${GREEN}[OK] Daemons stopped${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [11/20] OFFLINE BUILD TEST (Verify Cache Completeness)
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[11/20] OFFLINE BUILD TEST ==${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo -e "${CYAN} OFFLINE BUILD TEST (--offline flag)${NC}"
|
||||||
|
echo -e "${CYAN} Verifying all dependencies are cached${NC}"
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
OFFLINE_SUCCESS=false
|
||||||
|
|
||||||
|
./gradlew clean bootJar --offline --no-daemon
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
OFFLINE_SUCCESS=true
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo -e "${GREEN} OFFLINE BUILD TEST PASSED!${NC}"
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}[OK] All dependencies are cached${NC}"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo -e "${RED} OFFLINE BUILD TEST FAILED!${NC}"
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Some dependencies may be missing from cache.${NC}"
|
||||||
|
echo -e "${YELLOW}The bundle may not work in air-gapped environment.${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
read -p "Continue anyway? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [12/20] Stop Daemons Before Archive
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[12/20] Stop Daemons Before Archive ==${NC}"
|
||||||
|
|
||||||
|
./gradlew --stop &>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
echo -e "${GREEN}[OK] Daemons stopped${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [13/20] Verify settings.gradle for Offline
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[13/20] Verify settings.gradle ==${NC}"
|
||||||
|
|
||||||
|
if [ -n "$SETTINGS_FILE" ]; then
|
||||||
|
if grep -q "mavenLocal()" "$SETTINGS_FILE" && grep -q "pluginManagement" "$SETTINGS_FILE"; then
|
||||||
|
echo -e "${GREEN}[OK] settings.gradle configured for offline${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}[WARN] settings.gradle may need offline configuration${NC}"
|
||||||
|
echo -e "${GRAY}[INFO] Consider adding mavenLocal() to pluginManagement and repositories${NC}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${GRAY}[INFO] No settings.gradle found${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [14/20] Create Helper Scripts
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[14/20] Create Helper Scripts ==${NC}"
|
||||||
|
|
||||||
|
# run_offline_build.sh
|
||||||
|
cat > "$ROOT/run_offline_build.sh" << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
# run_offline_build.sh - Build JAR offline
|
||||||
|
export GRADLE_USER_HOME="$(pwd)/_offline_gradle_home"
|
||||||
|
echo "GRADLE_USER_HOME = $GRADLE_USER_HOME"
|
||||||
|
echo ""
|
||||||
|
./gradlew --offline bootJar --no-daemon
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo "BUILD SUCCESS!"
|
||||||
|
echo ""
|
||||||
|
echo "JAR files:"
|
||||||
|
ls -lh ./build/libs/*.jar 2>/dev/null | awk '{print " " $9}'
|
||||||
|
else
|
||||||
|
echo "BUILD FAILED"
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
chmod +x "$ROOT/run_offline_build.sh"
|
||||||
|
echo -e "${GREEN}[OK] run_offline_build.sh${NC}"
|
||||||
|
|
||||||
|
# run_offline_bootrun.sh
|
||||||
|
cat > "$ROOT/run_offline_bootrun.sh" << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
# run_offline_bootrun.sh - Run application offline
|
||||||
|
export GRADLE_USER_HOME="$(pwd)/_offline_gradle_home"
|
||||||
|
echo "GRADLE_USER_HOME = $GRADLE_USER_HOME"
|
||||||
|
echo ""
|
||||||
|
echo "Starting application (Ctrl+C to stop)..."
|
||||||
|
echo ""
|
||||||
|
./gradlew --offline bootRun --no-daemon
|
||||||
|
EOF
|
||||||
|
chmod +x "$ROOT/run_offline_bootrun.sh"
|
||||||
|
echo -e "${GREEN}[OK] run_offline_bootrun.sh${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [15/20] Final Daemon Cleanup
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[15/20] Final Daemon Cleanup ==${NC}"
|
||||||
|
|
||||||
|
./gradlew --stop &>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
echo -e "${GREEN}[OK] Daemons stopped${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [16/20] Clean Lock Files
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[16/20] Clean Lock Files ==${NC}"
|
||||||
|
|
||||||
|
DAEMON_DIR="$OFFLINE_HOME/daemon"
|
||||||
|
if [ -d "$DAEMON_DIR" ]; then
|
||||||
|
rm -rf "$DAEMON_DIR" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
find "$OFFLINE_HOME" -type f \( -name "*.lock" -o -name "*.log" -o -name "*.tmp" \) -delete 2>/dev/null || true
|
||||||
|
|
||||||
|
echo -e "${GREEN}[OK] Lock files cleaned${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [17/20] Calculate Cache Size
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[17/20] Cache Summary ==${NC}"
|
||||||
|
|
||||||
|
CACHES_DIR="$OFFLINE_HOME/caches"
|
||||||
|
WRAPPER_DISTS="$OFFLINE_HOME/wrapper/dists"
|
||||||
|
|
||||||
|
TOTAL_SIZE=0
|
||||||
|
|
||||||
|
if [ -d "$CACHES_DIR" ]; then
|
||||||
|
SIZE=$(du -sb "$CACHES_DIR" 2>/dev/null | cut -f1)
|
||||||
|
TOTAL_SIZE=$((TOTAL_SIZE + SIZE))
|
||||||
|
SIZE_MB=$(echo "scale=2; $SIZE / 1048576" | bc)
|
||||||
|
echo -e "${CYAN}[INFO] Dependencies: ${SIZE_MB} MB${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "$WRAPPER_DISTS" ]; then
|
||||||
|
SIZE=$(du -sb "$WRAPPER_DISTS" 2>/dev/null | cut -f1)
|
||||||
|
TOTAL_SIZE=$((TOTAL_SIZE + SIZE))
|
||||||
|
SIZE_MB=$(echo "scale=2; $SIZE / 1048576" | bc)
|
||||||
|
echo -e "${CYAN}[INFO] Gradle dist: ${SIZE_MB} MB${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
TOTAL_MB=$(echo "scale=2; $TOTAL_SIZE / 1048576" | bc)
|
||||||
|
echo -e "${CYAN}[INFO] Total cache: ${TOTAL_MB} MB${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [18/20] Create Archive
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[18/20] Create Archive ==${NC}"
|
||||||
|
|
||||||
|
BASE_NAME=$(basename "$ROOT")
|
||||||
|
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||||
|
PARENT=$(dirname "$ROOT")
|
||||||
|
ARCHIVE_PATH="${PARENT}/${BASE_NAME}_offline_bundle_${TIMESTAMP}.tar.gz"
|
||||||
|
|
||||||
|
echo "Archive: $ARCHIVE_PATH"
|
||||||
|
echo -e "${GRAY}[INFO] Creating archive (this may take several minutes)...${NC}"
|
||||||
|
|
||||||
|
tar -czf "$ARCHIVE_PATH" \
|
||||||
|
--exclude=".git" \
|
||||||
|
--exclude=".idea" \
|
||||||
|
--exclude=".DS_Store" \
|
||||||
|
--exclude="*.log" \
|
||||||
|
--exclude="*.lock" \
|
||||||
|
--exclude="_offline_gradle_home/daemon" \
|
||||||
|
--exclude="_offline_gradle_home/native" \
|
||||||
|
--exclude="_offline_gradle_home/jdks" \
|
||||||
|
--exclude="build" \
|
||||||
|
--exclude="out" \
|
||||||
|
--exclude=".gradle" \
|
||||||
|
-C "$ROOT" .
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "${RED}ERROR: tar failed${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ARCHIVE_SIZE=$(stat -f%z "$ARCHIVE_PATH" 2>/dev/null || stat -c%s "$ARCHIVE_PATH" 2>/dev/null)
|
||||||
|
ARCHIVE_SIZE_MB=$(echo "scale=2; $ARCHIVE_SIZE / 1048576" | bc)
|
||||||
|
echo -e "${GREEN}[OK] Archive created: ${ARCHIVE_SIZE_MB} MB${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [19/20] Verify Archive
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[19/20] Verify Archive ==${NC}"
|
||||||
|
|
||||||
|
CHECKS=(
|
||||||
|
"gradle/wrapper/gradle-wrapper.jar"
|
||||||
|
"gradlew"
|
||||||
|
"_offline_gradle_home/caches"
|
||||||
|
"run_offline_build.sh"
|
||||||
|
)
|
||||||
|
|
||||||
|
for CHECK in "${CHECKS[@]}"; do
|
||||||
|
if tar -tzf "$ARCHIVE_PATH" | grep -q "$CHECK"; then
|
||||||
|
echo -e " ${GREEN}[OK] $CHECK${NC}"
|
||||||
|
else
|
||||||
|
echo -e " ${YELLOW}[WARN] $CHECK${NC}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [20/20] Complete
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo -e "${GREEN} BUNDLE CREATION COMPLETE!${NC}"
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}Archive: $ARCHIVE_PATH${NC}"
|
||||||
|
echo -e "${CYAN}Size: ${ARCHIVE_SIZE_MB} MB${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo -e "${CYAN} Test Results${NC}"
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
if [ "$BUILD_SUCCESS" = true ]; then
|
||||||
|
echo -e " Online build (bootJar): ${GREEN}PASSED${NC}"
|
||||||
|
else
|
||||||
|
echo -e " Online build (bootJar): ${RED}FAILED${NC}"
|
||||||
|
fi
|
||||||
|
if [ "$BOOTRUN_SUCCESS" = true ]; then
|
||||||
|
echo -e " Online test (bootRun): ${GREEN}PASSED${NC}"
|
||||||
|
else
|
||||||
|
echo -e " Online test (bootRun): ${YELLOW}SKIPPED${NC}"
|
||||||
|
fi
|
||||||
|
if [ "$OFFLINE_SUCCESS" = true ]; then
|
||||||
|
echo -e " Offline build test: ${GREEN}PASSED${NC}"
|
||||||
|
else
|
||||||
|
echo -e " Offline build test: ${RED}FAILED${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e "${YELLOW}============================================================${NC}"
|
||||||
|
echo -e "${YELLOW} Usage in Air-gapped Environment${NC}"
|
||||||
|
echo -e "${YELLOW}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${WHITE}Option 1: Use unpack script${NC}"
|
||||||
|
echo -e "${GRAY} ./unpack_and_offline_build_airgap.sh${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${WHITE}Option 2: Manual extraction${NC}"
|
||||||
|
echo -e "${GRAY} tar -xzf <archive>.tar.gz${NC}"
|
||||||
|
echo -e "${GRAY} cd <project>${NC}"
|
||||||
|
echo -e "${GRAY} ./run_offline_build.sh${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${WHITE}Option 3: Direct commands${NC}"
|
||||||
|
echo -e "${GRAY} export GRADLE_USER_HOME=\"./_offline_gradle_home\"${NC}"
|
||||||
|
echo -e "${GRAY} ./gradlew --offline bootJar --no-daemon${NC}"
|
||||||
|
echo ""
|
||||||
347
gradle/linux/unpack_and_offline_build_airgap.sh
Normal file
347
gradle/linux/unpack_and_offline_build_airgap.sh
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# unpack_and_offline_build_airgap.sh
|
||||||
|
# ============================================================================
|
||||||
|
# Execution Environment: OFFLINE (Air-gapped, No Internet)
|
||||||
|
# Purpose: Extract bundle and run offline build
|
||||||
|
# ============================================================================
|
||||||
|
# Linux Bash Script
|
||||||
|
# Version: 3.1
|
||||||
|
#
|
||||||
|
# IMPORTANT: This script automatically:
|
||||||
|
# 1. Extracts the archive
|
||||||
|
# 2. Sets GRADLE_USER_HOME to project local cache
|
||||||
|
# 3. Configures settings.gradle for offline resolution
|
||||||
|
# 4. Runs build with --offline flag
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Configuration
|
||||||
|
# ============================================================================
|
||||||
|
WRAPPER_SEED_PATH="wrapper_jar_seed"
|
||||||
|
OFFLINE_HOME_NAME="_offline_gradle_home"
|
||||||
|
|
||||||
|
# Color codes
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
GRAY='\033[0;90m'
|
||||||
|
WHITE='\033[1;37m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo -e "${CYAN} Gradle Offline Build Runner${NC}"
|
||||||
|
echo -e "${CYAN} Environment: AIR-GAPPED (No Internet)${NC}"
|
||||||
|
echo -e "${CYAN} Mode: Fully Offline (--offline enforced)${NC}"
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [1/16] Check Current Directory
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[1/16] Check Current Directory ==${NC}"
|
||||||
|
START_DIR="$(pwd)"
|
||||||
|
echo "PWD: $START_DIR"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [2/16] Select Archive
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[2/16] Select Archive ==${NC}"
|
||||||
|
|
||||||
|
ARCHIVE=""
|
||||||
|
if [ $# -ge 1 ]; then
|
||||||
|
ARCHIVE="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$ARCHIVE" ]; then
|
||||||
|
# Auto-detect most recent .tar.gz file
|
||||||
|
ARCHIVE=$(find "$START_DIR" -maxdepth 1 -type f \( -name "*.tar.gz" -o -name "*.tgz" \) -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -1 | cut -d' ' -f2-)
|
||||||
|
|
||||||
|
if [ -z "$ARCHIVE" ]; then
|
||||||
|
echo -e "${RED}[ERROR] No archive found${NC}"
|
||||||
|
ls -lh "$START_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${CYAN}[AUTO] $(basename "$ARCHIVE")${NC}"
|
||||||
|
else
|
||||||
|
if [ ! -f "$ARCHIVE" ]; then
|
||||||
|
ARCHIVE="$START_DIR/$ARCHIVE"
|
||||||
|
fi
|
||||||
|
echo -e "${CYAN}[USER] $(basename "$ARCHIVE")${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$ARCHIVE" ]; then
|
||||||
|
echo -e "${RED}ERROR: Archive not found: $ARCHIVE${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ARCHIVE_SIZE=$(stat -f%z "$ARCHIVE" 2>/dev/null || stat -c%s "$ARCHIVE" 2>/dev/null)
|
||||||
|
ARCHIVE_SIZE_MB=$(echo "scale=2; $ARCHIVE_SIZE / 1048576" | bc)
|
||||||
|
echo "Size: ${ARCHIVE_SIZE_MB} MB"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [3/16] Check tar
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[3/16] Check tar ==${NC}"
|
||||||
|
|
||||||
|
if ! command -v tar &>/dev/null; then
|
||||||
|
echo -e "${RED}ERROR: tar not found${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}[OK] tar found${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [4/16] Extract Archive
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[4/16] Extract Archive ==${NC}"
|
||||||
|
echo -e "${GRAY}[INFO] Extracting...${NC}"
|
||||||
|
|
||||||
|
tar -xzf "$ARCHIVE" -C "$START_DIR"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "${RED}ERROR: Extraction failed${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}[OK] Extracted${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [5/16] Set Permissions
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[5/16] Set Permissions ==${NC}"
|
||||||
|
|
||||||
|
chmod -R u+rw "$START_DIR" 2>/dev/null || true
|
||||||
|
echo -e "${GREEN}[OK] Permissions set${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [6/16] Find Project Root
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[6/16] Find Project Root ==${NC}"
|
||||||
|
|
||||||
|
GRADLEW=$(find "$START_DIR" -name "gradlew" -type f 2>/dev/null | sort | head -1)
|
||||||
|
if [ -z "$GRADLEW" ]; then
|
||||||
|
echo -e "${RED}ERROR: gradlew not found${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
PROJECT_DIR=$(dirname "$GRADLEW")
|
||||||
|
echo -e "${CYAN}Project: $PROJECT_DIR${NC}"
|
||||||
|
cd "$PROJECT_DIR"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [7/16] Fix Permissions
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[7/16] Fix Permissions ==${NC}"
|
||||||
|
|
||||||
|
chmod +x ./gradlew
|
||||||
|
find . -name "*.sh" -type f -exec chmod +x {} \; 2>/dev/null || true
|
||||||
|
echo -e "${GREEN}[OK] Permissions fixed${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [8/16] Verify Wrapper
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[8/16] Verify Wrapper ==${NC}"
|
||||||
|
|
||||||
|
WRAPPER_DIR="$PROJECT_DIR/gradle/wrapper"
|
||||||
|
WRAPPER_JAR="$WRAPPER_DIR/gradle-wrapper.jar"
|
||||||
|
WRAPPER_PROP="$WRAPPER_DIR/gradle-wrapper.properties"
|
||||||
|
|
||||||
|
if [ ! -f "$WRAPPER_PROP" ]; then
|
||||||
|
echo -e "${RED}ERROR: gradle-wrapper.properties missing${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$WRAPPER_JAR" ]; then
|
||||||
|
SEED_JAR="$PROJECT_DIR/$WRAPPER_SEED_PATH/gradle-wrapper.jar"
|
||||||
|
if [ -f "$SEED_JAR" ]; then
|
||||||
|
mkdir -p "$WRAPPER_DIR"
|
||||||
|
cp "$SEED_JAR" "$WRAPPER_JAR"
|
||||||
|
echo -e "${GREEN}[OK] Injected from seed${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}ERROR: wrapper jar missing${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}[OK] Wrapper verified${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [9/16] Set GRADLE_USER_HOME
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[9/16] Set GRADLE_USER_HOME ==${NC}"
|
||||||
|
|
||||||
|
OFFLINE_HOME="$PROJECT_DIR/$OFFLINE_HOME_NAME"
|
||||||
|
if [ ! -d "$OFFLINE_HOME" ]; then
|
||||||
|
echo -e "${RED}ERROR: _offline_gradle_home not found in archive${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
export GRADLE_USER_HOME="$OFFLINE_HOME"
|
||||||
|
echo -e "${CYAN}GRADLE_USER_HOME = $GRADLE_USER_HOME${NC}"
|
||||||
|
|
||||||
|
# Check cache
|
||||||
|
CACHES_DIR="$OFFLINE_HOME/caches"
|
||||||
|
if [ -d "$CACHES_DIR" ]; then
|
||||||
|
CACHE_SIZE=$(du -sb "$CACHES_DIR" 2>/dev/null | cut -f1)
|
||||||
|
CACHE_SIZE_MB=$(echo "scale=2; $CACHE_SIZE / 1048576" | bc)
|
||||||
|
echo -e "${CYAN}[INFO] Cache size: ${CACHE_SIZE_MB} MB${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}[WARN] No cache folder found${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [10/16] Verify settings.gradle
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[10/16] Verify settings.gradle ==${NC}"
|
||||||
|
|
||||||
|
SETTINGS_FILE=""
|
||||||
|
if [ -f "./settings.gradle" ]; then
|
||||||
|
SETTINGS_FILE="settings.gradle"
|
||||||
|
elif [ -f "./settings.gradle.kts" ]; then
|
||||||
|
SETTINGS_FILE="settings.gradle.kts"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$SETTINGS_FILE" ]; then
|
||||||
|
if grep -q "mavenLocal()" "$SETTINGS_FILE" && grep -q "pluginManagement" "$SETTINGS_FILE"; then
|
||||||
|
echo -e "${GREEN}[OK] settings.gradle configured for offline${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}[WARN] settings.gradle may not be configured for offline${NC}"
|
||||||
|
echo -e "${GRAY}[INFO] Build may fail if plugins not cached${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [11/16] Test Gradle
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[11/16] Test Gradle ==${NC}"
|
||||||
|
|
||||||
|
GRADLE_WORKS=false
|
||||||
|
if ./gradlew --offline --version &>/dev/null; then
|
||||||
|
GRADLE_WORKS=true
|
||||||
|
echo -e "${GREEN}[OK] Gradle working in offline mode${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}[WARN] Gradle --version failed${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [12/16] Stop Daemon
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[12/16] Stop Daemon ==${NC}"
|
||||||
|
|
||||||
|
./gradlew --stop &>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
echo -e "${GREEN}[OK] Daemon stopped${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [13/16] Run Offline Build
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[13/16] Run Offline Build ==${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo -e "${CYAN} Building with --offline flag${NC}"
|
||||||
|
echo -e "${CYAN} All dependencies from local cache${NC}"
|
||||||
|
echo -e "${CYAN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
BUILD_SUCCESS=false
|
||||||
|
BUILD_TASK=""
|
||||||
|
|
||||||
|
# Try bootJar
|
||||||
|
echo -e "${GRAY}[TRY] --offline bootJar...${NC}"
|
||||||
|
if ./gradlew --offline clean bootJar --no-daemon; then
|
||||||
|
BUILD_SUCCESS=true
|
||||||
|
BUILD_TASK="bootJar"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Try jar
|
||||||
|
if [ "$BUILD_SUCCESS" = false ]; then
|
||||||
|
echo -e "${GRAY}[TRY] --offline jar...${NC}"
|
||||||
|
if ./gradlew --offline clean jar --no-daemon; then
|
||||||
|
BUILD_SUCCESS=true
|
||||||
|
BUILD_TASK="jar"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Try build
|
||||||
|
if [ "$BUILD_SUCCESS" = false ]; then
|
||||||
|
echo -e "${GRAY}[TRY] --offline build...${NC}"
|
||||||
|
if ./gradlew --offline build --no-daemon; then
|
||||||
|
BUILD_SUCCESS=true
|
||||||
|
BUILD_TASK="build"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
if [ "$BUILD_SUCCESS" = true ]; then
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo -e "${GREEN} BUILD SUCCESS! (task: $BUILD_TASK)${NC}"
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo -e "${RED} BUILD FAILED!${NC}"
|
||||||
|
echo -e "${RED}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Possible causes:${NC}"
|
||||||
|
echo -e "${WHITE} - Dependencies not in cache${NC}"
|
||||||
|
echo -e "${WHITE} - Plugin resolution failed${NC}"
|
||||||
|
echo -e "${WHITE} - Need complete build in online env first${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [14/16] Show Build Output
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[14/16] Build Output ==${NC}"
|
||||||
|
|
||||||
|
LIBS_DIR="$PROJECT_DIR/build/libs"
|
||||||
|
if [ -d "$LIBS_DIR" ]; then
|
||||||
|
echo -e "${CYAN}build/libs contents:${NC}"
|
||||||
|
ls -lh "$LIBS_DIR"/*.jar 2>/dev/null | awk '{printf " %-40s %10s\n", $9, $5}'
|
||||||
|
|
||||||
|
MAIN_JAR=$(find "$LIBS_DIR" -name "*.jar" -type f ! -name "*-plain.jar" ! -name "*-sources.jar" ! -name "*-javadoc.jar" 2>/dev/null | head -1)
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}[WARN] build/libs not found${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [15/16] Run Instructions
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${YELLOW}==[15/16] Run Instructions ==${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -n "$MAIN_JAR" ]; then
|
||||||
|
echo -e "${CYAN}To run the application:${NC}"
|
||||||
|
echo -e "${WHITE} java -jar $(basename "$MAIN_JAR")${NC}"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${CYAN}To rebuild:${NC}"
|
||||||
|
echo -e "${WHITE} export GRADLE_USER_HOME=\"./_offline_gradle_home\"${NC}"
|
||||||
|
echo -e "${WHITE} ./gradlew --offline bootJar --no-daemon${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# [16/16] Complete
|
||||||
|
# ============================================================================
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo -e "${GREEN} Offline Build Complete!${NC}"
|
||||||
|
echo -e "${GREEN}============================================================${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}Project: $PROJECT_DIR${NC}"
|
||||||
|
echo ""
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
package com.kamco.cd.kamcoback.Innopam;
|
package com.kamco.cd.kamcoback.Innopam;
|
||||||
|
|
||||||
import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto;
|
import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto;
|
||||||
|
import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ChnDetectMastReqDto;
|
||||||
|
import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ChngDetectMastSearchDto;
|
||||||
|
import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ResReturn;
|
||||||
import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.Basic;
|
import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.Basic;
|
||||||
import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.DetectMastReq;
|
import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.DetectMastReq;
|
||||||
import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.DetectMastSearch;
|
import com.kamco.cd.kamcoback.Innopam.service.InnopamApiService;
|
||||||
import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.FeaturePnuDto;
|
|
||||||
import com.kamco.cd.kamcoback.Innopam.service.DetectMastService;
|
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
|
||||||
import io.swagger.v3.oas.annotations.media.Content;
|
import io.swagger.v3.oas.annotations.media.Content;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
@@ -15,24 +15,21 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
|||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.PutMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
@Tag(name = "이노펨 mockup API", description = "이노펨 mockup API")
|
@Tag(name = "이노펨 연동 API", description = "이노펨 연동 API")
|
||||||
@RestController
|
@RestController
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RequestMapping("/api/kcd/cdi/detect")
|
@RequestMapping("/api/innopam/")
|
||||||
public class InnopamApiController {
|
public class InnopamApiController {
|
||||||
|
|
||||||
private final DetectMastService detectMastService;
|
private final InnopamApiService innopamApiService;
|
||||||
|
|
||||||
/** 탐지결과 등록 */
|
/** 탐지결과 등록 */
|
||||||
@Operation(summary = "탐지결과 등록", description = "탐지결과 등록")
|
@Operation(summary = "탐지결과 등록", description = "탐지결과 등록")
|
||||||
@@ -49,10 +46,10 @@ public class InnopamApiController {
|
|||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||||
})
|
})
|
||||||
@PostMapping("/mast/regist")
|
@PostMapping("/mast/regist")
|
||||||
public DetectMastReq setChangeDetection(
|
public ChngDetectMastDto.Basic regist(
|
||||||
@RequestBody @Valid DetectMastDto.DetectMastReq detectMast) {
|
@RequestBody @Valid ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) {
|
||||||
detectMastService.saveDetectMast(detectMast);
|
// innopamApiService.saveDetectMast(chnDetectMastReq);
|
||||||
return detectMast;
|
return innopamApiService.regist(chnDetectMastReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "탐지결과 삭제", description = "탐지결과 삭제")
|
@Operation(summary = "탐지결과 삭제", description = "탐지결과 삭제")
|
||||||
@@ -64,13 +61,14 @@ public class InnopamApiController {
|
|||||||
content =
|
content =
|
||||||
@Content(
|
@Content(
|
||||||
mediaType = "application/json",
|
mediaType = "application/json",
|
||||||
schema = @Schema(implementation = DetectMastReq.class))),
|
schema = @Schema(implementation = ChnDetectMastReqDto.class))),
|
||||||
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||||
})
|
})
|
||||||
@PostMapping("/mast/remove")
|
@PostMapping("/mast/remove")
|
||||||
public String deleteChangeDetection(@RequestBody DetectMastReq detectMast) {
|
public ResReturn remove(
|
||||||
return "OK";
|
@RequestBody @Valid ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) {
|
||||||
|
return innopamApiService.remove(chnDetectMastReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "탐지결과 등록목록 조회", description = "탐지결과 등록목록 조회")
|
@Operation(summary = "탐지결과 등록목록 조회", description = "탐지결과 등록목록 조회")
|
||||||
@@ -87,104 +85,16 @@ public class InnopamApiController {
|
|||||||
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||||
})
|
})
|
||||||
public List<Basic> selectChangeDetectionList(
|
public List<ChngDetectMastDto.Basic> selectChangeDetectionList(
|
||||||
@RequestParam(required = false) String cprsBfYr,
|
@RequestParam(required = false) String chnDtctId,
|
||||||
@RequestParam(required = false) String cprsAdYr,
|
@RequestParam(required = false) String cprsYr,
|
||||||
@RequestParam(required = false) Integer dtctSno) {
|
@RequestParam(required = false) String crtrYr,
|
||||||
DetectMastSearch detectMastSearch = new DetectMastSearch();
|
@RequestParam(required = false) String chnDtctSno) {
|
||||||
detectMastSearch.setCprsAdYr(cprsAdYr);
|
ChngDetectMastSearchDto searchDto = new ChngDetectMastSearchDto();
|
||||||
detectMastSearch.setCprsBfYr(cprsBfYr);
|
searchDto.setChnDtctId(chnDtctId);
|
||||||
detectMastSearch.setDtctSno(dtctSno);
|
searchDto.setCprsYr(cprsYr);
|
||||||
return detectMastService.selectDetectMast(detectMastSearch);
|
searchDto.setCrtrYr(crtrYr);
|
||||||
}
|
searchDto.setChnDtctSno(chnDtctSno);
|
||||||
|
return innopamApiService.list(searchDto);
|
||||||
@Operation(summary = "탐지결과 등록목록 상세 조회", description = "탐지결과 등록목록 상세 조회")
|
|
||||||
@ApiResponses(
|
|
||||||
value = {
|
|
||||||
@ApiResponse(
|
|
||||||
responseCode = "200",
|
|
||||||
description = "목록 성공",
|
|
||||||
content =
|
|
||||||
@Content(
|
|
||||||
mediaType = "application/json",
|
|
||||||
schema = @Schema(implementation = Basic.class))),
|
|
||||||
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
|
||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
|
||||||
})
|
|
||||||
@GetMapping("/mast/list/{dtctMstId}")
|
|
||||||
public Basic selectChangeDetectionDetail(@PathVariable Long dtctMstId) {
|
|
||||||
return detectMastService.selectDetectMast(dtctMstId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Operation(summary = "탐지객체 랜덤 PNU 리스트 조회", description = "탐지객체 PNU 랜덤값을 생성해서 보여준다")
|
|
||||||
@ApiResponses(
|
|
||||||
value = {
|
|
||||||
@ApiResponse(
|
|
||||||
responseCode = "200",
|
|
||||||
description = "목록 성공",
|
|
||||||
content =
|
|
||||||
@Content(
|
|
||||||
mediaType = "application/json",
|
|
||||||
schema = @Schema(implementation = FeaturePnuDto.class))),
|
|
||||||
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
|
||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
|
||||||
})
|
|
||||||
@GetMapping("/pnu/{cprsBfYr}/{cprsAfYr}/{dtctSno}")
|
|
||||||
public List<FeaturePnuDto> selectPnuList(
|
|
||||||
@PathVariable String cprsBfYr, @PathVariable String cprsAfYr, @PathVariable Integer dtctSno) {
|
|
||||||
DetectMastSearch detectMastSearch = new DetectMastSearch();
|
|
||||||
detectMastSearch.setCprsAdYr(cprsAfYr);
|
|
||||||
detectMastSearch.setCprsBfYr(cprsBfYr);
|
|
||||||
detectMastSearch.setDtctSno(dtctSno);
|
|
||||||
return detectMastService.findPnuData(detectMastSearch);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Operation(summary = "탐지객체 랜덤 PNU 상세 조회", description = "탐지객체 PNU 랜덤값을 생성해서 보여준다")
|
|
||||||
@ApiResponses(
|
|
||||||
value = {
|
|
||||||
@ApiResponse(
|
|
||||||
responseCode = "200",
|
|
||||||
description = "목록 성공",
|
|
||||||
content =
|
|
||||||
@Content(
|
|
||||||
mediaType = "application/json",
|
|
||||||
schema = @Schema(implementation = FeaturePnuDto.class))),
|
|
||||||
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
|
||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
|
||||||
})
|
|
||||||
@GetMapping("/pnu/{cprsBfYr}/{cprsAfYr}/{dtctSno}/{featureId}")
|
|
||||||
public FeaturePnuDto selectPnuDetail(
|
|
||||||
@Parameter(description = "이전년도", example = "2022") @PathVariable String cprsBfYr,
|
|
||||||
@Parameter(description = "기준년도", example = "2024") @PathVariable String cprsAfYr,
|
|
||||||
@Parameter(description = "회차", example = "4") @PathVariable Integer dtctSno,
|
|
||||||
@Parameter(description = "featureId", example = "000e161b-1955-4c89-ad87-0b3b4a91d00f")
|
|
||||||
@PathVariable
|
|
||||||
UUID featureId) {
|
|
||||||
return detectMastService.selectPnuDetail(featureId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Operation(
|
|
||||||
summary = "탐지객체 랜덤 PNU GEOM 업데이트(이노펨에 없는 API)",
|
|
||||||
description = "탐지객체 랜덤 PNU GEOM 업데이트(이노펨에 없는 API)")
|
|
||||||
@ApiResponses(
|
|
||||||
value = {
|
|
||||||
@ApiResponse(
|
|
||||||
responseCode = "201",
|
|
||||||
description = "pnu 업데이트 성공",
|
|
||||||
content =
|
|
||||||
@Content(
|
|
||||||
mediaType = "application/json",
|
|
||||||
schema = @Schema(implementation = Integer.class))),
|
|
||||||
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
|
|
||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
|
||||||
})
|
|
||||||
@PutMapping("/pnu/{cprsBfYr}/{cprsAfYr}/{dtctSno}")
|
|
||||||
public Integer updatePnuList(
|
|
||||||
@PathVariable String cprsBfYr, @PathVariable String cprsAfYr, @PathVariable Integer dtctSno) {
|
|
||||||
DetectMastSearch detectMastSearch = new DetectMastSearch();
|
|
||||||
detectMastSearch.setCprsAdYr(cprsAfYr);
|
|
||||||
detectMastSearch.setCprsBfYr(cprsBfYr);
|
|
||||||
detectMastSearch.setDtctSno(dtctSno);
|
|
||||||
return detectMastService.updatePnuData(detectMastSearch);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,146 @@
|
|||||||
|
package com.kamco.cd.kamcoback.Innopam.dto;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
public class ChngDetectMastDto {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class Basic {
|
||||||
|
|
||||||
|
private String chnDtctMstId; // 탐지마스터아이디
|
||||||
|
private String cprsYr; // 비교년도 2023
|
||||||
|
private String crtrYr; // 기준년도 2024
|
||||||
|
private String chnDtctSno; // 차수 (1 | 2 | ...)
|
||||||
|
private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성
|
||||||
|
private String chnDtctCnt; // 탐지객체개수
|
||||||
|
private String pnuMpngCnt; // PNU매핑개수
|
||||||
|
private String lrmYmd; // 지적도일자
|
||||||
|
private String pathNm; // 탐지결과 절대경로명 /kamco_nas/export/{chnDtctId}
|
||||||
|
private List<ChnDetectMastExcnStepDto> excnList; // 등록진행상태히스토리 (최근것부터 DESC)
|
||||||
|
private String excnStepCd; // 실행단계코드
|
||||||
|
private String excnStep; // 실행단계코드에 해당하는 영문명
|
||||||
|
private String excnPgrt; // 실행단계진행율
|
||||||
|
private String excnBngnDt; // 실행단계시작시간
|
||||||
|
private String excnEndDt; // 실행단계종료시간
|
||||||
|
private String rmk; // 비고
|
||||||
|
private String crtDt; // 생성일시
|
||||||
|
private String crtEpno; // 생성사원번호
|
||||||
|
private String crtIp; // 생성사원아이피
|
||||||
|
private String chgDt; // 변경일시
|
||||||
|
private String chgEpno; // 변경사원번호
|
||||||
|
private String chgIp; // 변경사원아이피
|
||||||
|
private String delYn; // 삭제여부
|
||||||
|
//
|
||||||
|
private String reqEpno; // 요청사원번호
|
||||||
|
private String reqIp; // 요청사원어이피
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ChnDetectMastExcnStepDto {
|
||||||
|
|
||||||
|
private String srno; // 일련번호
|
||||||
|
private String chnDtctMstId; // 탐지마스터아이디
|
||||||
|
private String excnStepCd; // 실행단계코드
|
||||||
|
private String excnStep; // 실행단계코드에 해당하는 영문명
|
||||||
|
private String excnPgrt; // 실행단계진행율
|
||||||
|
private String excnEndDt; // 실행단계종료시간
|
||||||
|
private String errCd; // 오류코드
|
||||||
|
private String errMsg; // 오류메세지
|
||||||
|
private String crtDt; // 실행단계시작시간
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ChnDetectMastReqDto {
|
||||||
|
private String cprsYr; // 비교년도 2023
|
||||||
|
private String crtrYr; // 기준년도 2024
|
||||||
|
private String chnDtctSno; // 차수 (1 | 2 | ...)
|
||||||
|
private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성
|
||||||
|
private String pathNm; // 탐지결과 절대경로명 /kamco_nas/export/{chnDtctId}
|
||||||
|
private String reqEpno; // 사원번호
|
||||||
|
private String reqIp; // 사원아이피
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ChnDetectContDto {
|
||||||
|
|
||||||
|
private String chnDtctMstId; // 탐지콘텐츠아이디
|
||||||
|
private String chnDtctContId; // 탐지마스타아이디
|
||||||
|
private String cprsYr; // 비교년도 2023
|
||||||
|
private String crtrYr; // 기준년도 2024
|
||||||
|
private String chnDtctSno; // 차수 (1 | 2 | ...)
|
||||||
|
private String mpqdNo; // 도엽번호
|
||||||
|
private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성
|
||||||
|
private String chnDtctObjtId; // 탐지객체아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성
|
||||||
|
private String chnDtctPolygon; // 탐지객체폴리곤
|
||||||
|
private String chnDtctSqms; // 탐지객체면적
|
||||||
|
private String chnCd; // 변화코드
|
||||||
|
private String chnDtctJson; // 변화탐지JSON
|
||||||
|
private String chnDtctProb; // 변화탐지정확도
|
||||||
|
private String bfClsCd; // 이전부류코드
|
||||||
|
private String bfClsProb; // 이전분류정확도
|
||||||
|
private String afClsCd; // 이후분류코드
|
||||||
|
private String afClsProb; // 이후분류정확도
|
||||||
|
private String crtDt; // 생성일시
|
||||||
|
private String crtEpno; // 생성사원번호
|
||||||
|
private String crtIp; // 생성사원아이피
|
||||||
|
private String delYn; // 삭제여부
|
||||||
|
//
|
||||||
|
private String reqEpno; // 요청사원번호
|
||||||
|
private String reqIp; // 요청사원아이피
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ChnDetectContReqDto {
|
||||||
|
|
||||||
|
private String cprsYr; // 비교년도 2023
|
||||||
|
private String crtrYr; // 기준년도 2024
|
||||||
|
private String chnDtctSno; // 차수 (1 | 2 | ...)
|
||||||
|
private String mpqdNo; // 도엽번호
|
||||||
|
private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성
|
||||||
|
private String chnDtctObjtId; // 탐지객체아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성
|
||||||
|
private String reqEpno; // 사원번호
|
||||||
|
private String reqIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ChngDetectMastSearchDto {
|
||||||
|
private String chnDtctId;
|
||||||
|
private String cprsYr;
|
||||||
|
private String crtrYr;
|
||||||
|
private String chnDtctSno;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(name = "ResReturn", description = "수행 후 리턴")
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class ResReturn {
|
||||||
|
|
||||||
|
private String flag;
|
||||||
|
private String message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package com.kamco.cd.kamcoback.Innopam.service;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonFactory;
|
||||||
|
import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto;
|
||||||
|
import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ResReturn;
|
||||||
|
import com.kamco.cd.kamcoback.Innopam.postgres.core.DetectMastCoreService;
|
||||||
|
import com.kamco.cd.kamcoback.common.utils.NetUtils;
|
||||||
|
import com.kamco.cd.kamcoback.common.utils.UserUtil;
|
||||||
|
import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient;
|
||||||
|
import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient.ExternalCallResult;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class InnopamApiService {
|
||||||
|
|
||||||
|
@Value("${spring.profiles.active:local}")
|
||||||
|
private String profile;
|
||||||
|
|
||||||
|
@Value("${innopam.url}")
|
||||||
|
private String innopamUrl;
|
||||||
|
|
||||||
|
@Value("${innopam.mast}")
|
||||||
|
private String innopamMastUrl;
|
||||||
|
|
||||||
|
private final DetectMastCoreService detectMastCoreService;
|
||||||
|
|
||||||
|
private final ExternalHttpClient externalHttpClient;
|
||||||
|
private final UserUtil userUtil = new UserUtil();
|
||||||
|
private final NetUtils netUtils = new NetUtils();
|
||||||
|
|
||||||
|
private final JsonFactory jsonFactory = new JsonFactory();
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public ChngDetectMastDto.Basic regist(ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) {
|
||||||
|
|
||||||
|
ChngDetectMastDto.Basic basic = new ChngDetectMastDto.Basic();
|
||||||
|
|
||||||
|
String url = innopamMastUrl + "/regist";
|
||||||
|
// url = "http://localhost:8080/api/kcd/cdi/detect/mast/regist";
|
||||||
|
|
||||||
|
String myip = netUtils.getLocalIP();
|
||||||
|
chnDetectMastReq.setReqIp(myip);
|
||||||
|
|
||||||
|
System.out.println("url == " + url);
|
||||||
|
System.out.println("url == " + myip);
|
||||||
|
|
||||||
|
ExternalCallResult<String> result =
|
||||||
|
externalHttpClient.call(
|
||||||
|
url, HttpMethod.POST, chnDetectMastReq, netUtils.jsonHeaders(), String.class);
|
||||||
|
|
||||||
|
System.out.println("result == " + result);
|
||||||
|
|
||||||
|
return basic;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public ResReturn remove(ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) {
|
||||||
|
ChngDetectMastDto.Basic basic = new ChngDetectMastDto.Basic();
|
||||||
|
|
||||||
|
String url = innopamMastUrl + "/remove";
|
||||||
|
// url = "http://localhost:8080/api/kcd/cdi/detect/mast/remove";
|
||||||
|
|
||||||
|
String myip = netUtils.getLocalIP();
|
||||||
|
chnDetectMastReq.setReqIp(myip);
|
||||||
|
|
||||||
|
System.out.println("url == " + url);
|
||||||
|
System.out.println("url == " + myip);
|
||||||
|
|
||||||
|
ExternalCallResult<String> result =
|
||||||
|
externalHttpClient.call(
|
||||||
|
url, HttpMethod.POST, chnDetectMastReq, netUtils.jsonHeaders(), String.class);
|
||||||
|
|
||||||
|
System.out.println("result == " + result);
|
||||||
|
|
||||||
|
return new ResReturn("success", "탐지결과 삭제 되었습니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public List<ChngDetectMastDto.Basic> list(ChngDetectMastDto.ChngDetectMastSearchDto searchDto) {
|
||||||
|
List<ChngDetectMastDto.Basic> masterList = new ArrayList<>();
|
||||||
|
|
||||||
|
String queryString = netUtils.dtoToQueryString(searchDto, null);
|
||||||
|
String url = innopamMastUrl + queryString;
|
||||||
|
|
||||||
|
ExternalCallResult<String> result =
|
||||||
|
externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), String.class);
|
||||||
|
|
||||||
|
System.out.println("list result == " + result);
|
||||||
|
|
||||||
|
return masterList;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.common.enums;
|
|||||||
|
|
||||||
import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose;
|
import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose;
|
||||||
import com.kamco.cd.kamcoback.common.utils.enums.EnumType;
|
import com.kamco.cd.kamcoback.common.utils.enums.EnumType;
|
||||||
|
import java.util.Arrays;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@@ -23,4 +24,20 @@ public enum ImageryFitStatus implements EnumType {
|
|||||||
public String getText() {
|
public String getText() {
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ImageryFitStatus fromCode(String code) {
|
||||||
|
if (code == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String c = code.trim();
|
||||||
|
return Arrays.stream(values())
|
||||||
|
.filter(v -> v.name().equalsIgnoreCase(c))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDescByCode(String code) {
|
||||||
|
ImageryFitStatus status = fromCode(code);
|
||||||
|
return status != null ? status.getDesc() : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package com.kamco.cd.kamcoback.common.utils;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
|
||||||
|
public class NetUtils {
|
||||||
|
|
||||||
|
public String getLocalIP() {
|
||||||
|
|
||||||
|
String ip;
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
InetAddress local = InetAddress.getLocalHost();
|
||||||
|
ip = local.getHostAddress();
|
||||||
|
} catch (UnknownHostException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String dtoToQueryString(Object dto, String queryString) {
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
|
||||||
|
Map<String, Object> map = objectMapper.convertValue(dto, Map.class);
|
||||||
|
|
||||||
|
String qStr =
|
||||||
|
map.entrySet().stream()
|
||||||
|
.filter(entry -> entry.getValue() != null) // null 제외
|
||||||
|
.map(
|
||||||
|
entry ->
|
||||||
|
String.format(
|
||||||
|
"%s=%s",
|
||||||
|
entry.getKey(),
|
||||||
|
URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8)))
|
||||||
|
.collect(Collectors.joining("&"));
|
||||||
|
|
||||||
|
if (queryString == null || queryString.isEmpty()) {
|
||||||
|
queryString = "?" + qStr;
|
||||||
|
} else {
|
||||||
|
queryString = queryString + "&" + qStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Map을 쿼리 스트링 문자열로 변환
|
||||||
|
return queryString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpHeaders jsonHeaders() {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||||
|
headers.setAccept(List.of(MediaType.APPLICATION_JSON));
|
||||||
|
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -168,9 +168,9 @@ public class InferenceResultApiController {
|
|||||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||||
})
|
})
|
||||||
@DeleteMapping("/end")
|
@DeleteMapping("/end")
|
||||||
public ApiResponseDto<Void> getInferenceGeomList() {
|
public ApiResponseDto<UUID> getInferenceGeomList() {
|
||||||
inferenceResultService.deleteInferenceEnd();
|
UUID uuid = inferenceResultService.deleteInferenceEnd();
|
||||||
return ApiResponseDto.ok(null);
|
return ApiResponseDto.ok(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "분석 모델 선택 조회", description = "변화탐지 실행 정보 입력 모델선택 팝업 ")
|
@Operation(summary = "분석 모델 선택 조회", description = "변화탐지 실행 정보 입력 모델선택 팝업 ")
|
||||||
@@ -204,80 +204,6 @@ public class InferenceResultApiController {
|
|||||||
return ApiResponseDto.ok(result);
|
return ApiResponseDto.ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @ApiResponses(
|
|
||||||
// value = {
|
|
||||||
// @ApiResponse(
|
|
||||||
// responseCode = "200",
|
|
||||||
// description = "검색 성공",
|
|
||||||
// content =
|
|
||||||
// @Content(
|
|
||||||
// mediaType = "application/json",
|
|
||||||
// schema = @Schema(implementation = InferenceDetailDto.AnalResSummary.class))),
|
|
||||||
// @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content),
|
|
||||||
// @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
|
||||||
// })
|
|
||||||
// @GetMapping("/summary/{id}")
|
|
||||||
// public ApiResponseDto<InferenceDetailDto.AnalResSummary> getInferenceResultSummary(
|
|
||||||
// @Parameter(description = "목록 id", example = "53") @PathVariable Long id) {
|
|
||||||
// return ApiResponseDto.ok(inferenceResultService.getInferenceResultSummary(id));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Operation(summary = "추론관리 분석결과 상세", description = "분석결과 상제 정보 Summary, DashBoard")
|
|
||||||
// @ApiResponses(
|
|
||||||
// value = {
|
|
||||||
// @ApiResponse(
|
|
||||||
// responseCode = "200",
|
|
||||||
// description = "검색 성공",
|
|
||||||
// content =
|
|
||||||
// @Content(
|
|
||||||
// mediaType = "application/json",
|
|
||||||
// schema = @Schema(implementation = InferenceDetailDto.Detail.class))),
|
|
||||||
// @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content),
|
|
||||||
// @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
|
||||||
// })
|
|
||||||
// @GetMapping("/detail/{id}")
|
|
||||||
// public ApiResponseDto<InferenceDetailDto.Detail> getInferenceDetail(
|
|
||||||
// @Parameter(description = "목록 id", example = "53") @PathVariable Long id) {
|
|
||||||
// return ApiResponseDto.ok(inferenceResultService.getDetail(id));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Operation(summary = "추론관리 분석결과 상세 목록", description = "추론관리 분석결과 상세 목록 geojson 데이터 조회")
|
|
||||||
// @ApiResponses(
|
|
||||||
// value = {
|
|
||||||
// @ApiResponse(
|
|
||||||
// responseCode = "200",
|
|
||||||
// description = "검색 성공",
|
|
||||||
// content =
|
|
||||||
// @Content(
|
|
||||||
// mediaType = "application/json",
|
|
||||||
// schema = @Schema(implementation = Page.class))),
|
|
||||||
// @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content),
|
|
||||||
// @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
|
||||||
// })
|
|
||||||
// @GetMapping("/geom/{id}")
|
|
||||||
// public ApiResponseDto<Page<InferenceDetailDto.Geom>> getInferenceResultGeomList(
|
|
||||||
// @Parameter(description = "분석결과 id", example = "53") @PathVariable Long id,
|
|
||||||
// @Parameter(description = "기준년도 분류", example = "land") @RequestParam(required = false)
|
|
||||||
// String targetClass,
|
|
||||||
// @Parameter(description = "비교년도 분류", example = "waste") @RequestParam(required = false)
|
|
||||||
// String compareClass,
|
|
||||||
// @Parameter(description = "5000:1 도협번호 37801011,37801012") @RequestParam(required = false)
|
|
||||||
// List<Long> mapSheetNum,
|
|
||||||
// @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0")
|
|
||||||
// int page,
|
|
||||||
// @Parameter(description = "페이지 크기", example = "20") @RequestParam(defaultValue = "20")
|
|
||||||
// int size,
|
|
||||||
// @Parameter(description = "정렬 조건 (형식: 필드명,방향)", example = "name,asc")
|
|
||||||
// @RequestParam(required = false)
|
|
||||||
// String sort) {
|
|
||||||
// InferenceDetailDto.SearchGeoReq searchGeoReq =
|
|
||||||
// new InferenceDetailDto.SearchGeoReq(
|
|
||||||
// targetClass, compareClass, mapSheetNum, page, size, sort);
|
|
||||||
// Page<InferenceDetailDto.Geom> geomList =
|
|
||||||
// inferenceResultService.getInferenceResultGeomList(id, searchGeoReq);
|
|
||||||
// return ApiResponseDto.ok(geomList);
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Operation(summary = "추론관리 추론진행 서버 현황", description = "추론관리 추론진행 서버 현황")
|
@Operation(summary = "추론관리 추론진행 서버 현황", description = "추론관리 추론진행 서버 현황")
|
||||||
@ApiResponses(
|
@ApiResponses(
|
||||||
value = {
|
value = {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.inference;
|
|||||||
|
|
||||||
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
|
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
|
||||||
import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto;
|
import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto;
|
||||||
|
import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto.CreateShpRequest;
|
||||||
import com.kamco.cd.kamcoback.inference.service.InferenceResultShpService;
|
import com.kamco.cd.kamcoback.inference.service.InferenceResultShpService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.media.Content;
|
import io.swagger.v3.oas.annotations.media.Content;
|
||||||
@@ -12,8 +13,8 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
@Tag(name = "추론결과 데이터 생성", description = "추론결과 데이터 생성 API")
|
@Tag(name = "추론결과 데이터 생성", description = "추론결과 데이터 생성 API")
|
||||||
@@ -47,11 +48,8 @@ public class InferenceResultShpApiController {
|
|||||||
@Operation(summary = "추론결과 shp 생성", description = "추론결과 shp 생성")
|
@Operation(summary = "추론결과 shp 생성", description = "추론결과 shp 생성")
|
||||||
@PostMapping("/shp/{uid}")
|
@PostMapping("/shp/{uid}")
|
||||||
public ApiResponseDto<Void> createShp(
|
public ApiResponseDto<Void> createShp(
|
||||||
@PathVariable String uid,
|
@PathVariable String uid, @RequestBody CreateShpRequest req) {
|
||||||
@RequestParam Long m1BatchId,
|
inferenceResultShpService.createShp(uid, req);
|
||||||
@RequestParam Long m2BatchId,
|
|
||||||
@RequestParam Long m3BatchId) {
|
|
||||||
inferenceResultShpService.createShp(uid, m1BatchId, m2BatchId, m3BatchId);
|
|
||||||
return ApiResponseDto.createOK(null);
|
return ApiResponseDto.createOK(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package com.kamco.cd.kamcoback.inference.dto;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.kamco.cd.kamcoback.common.enums.DetectionClassification;
|
import com.kamco.cd.kamcoback.common.enums.DetectionClassification;
|
||||||
|
import com.kamco.cd.kamcoback.common.enums.ImageryFitStatus;
|
||||||
import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm;
|
import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm;
|
||||||
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.DetectOption;
|
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.DetectOption;
|
||||||
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope;
|
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope;
|
||||||
@@ -306,7 +308,17 @@ public class InferenceDetailDto {
|
|||||||
String mapSheetName;
|
String mapSheetName;
|
||||||
String subUid;
|
String subUid;
|
||||||
String pnu;
|
String pnu;
|
||||||
String passYn;
|
String fitState;
|
||||||
|
|
||||||
|
@JsonProperty("fitState")
|
||||||
|
public String getFitState() {
|
||||||
|
return this.fitState == null ? null : this.fitState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonProperty("fitStateName")
|
||||||
|
public String fitStateName() {
|
||||||
|
return ImageryFitStatus.getDescByCode(this.fitState);
|
||||||
|
}
|
||||||
|
|
||||||
// @JsonIgnore String gemoStr;
|
// @JsonIgnore String gemoStr;
|
||||||
// @JsonIgnore String geomCenterStr;
|
// @JsonIgnore String geomCenterStr;
|
||||||
@@ -327,7 +339,7 @@ public class InferenceDetailDto {
|
|||||||
String mapSheetName,
|
String mapSheetName,
|
||||||
String subUid,
|
String subUid,
|
||||||
String pnu,
|
String pnu,
|
||||||
String passYn) {
|
String fitState) {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
this.uid = uid;
|
this.uid = uid;
|
||||||
this.compareYyyy = compareYyyy;
|
this.compareYyyy = compareYyyy;
|
||||||
@@ -343,7 +355,7 @@ public class InferenceDetailDto {
|
|||||||
this.mapSheetName = mapSheetName;
|
this.mapSheetName = mapSheetName;
|
||||||
this.subUid = subUid;
|
this.subUid = subUid;
|
||||||
this.pnu = pnu;
|
this.pnu = pnu;
|
||||||
this.passYn = passYn;
|
this.fitState = fitState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -538,20 +538,24 @@ public class InferenceResultDto {
|
|||||||
|
|
||||||
public String getServerStatus() {
|
public String getServerStatus() {
|
||||||
String enumId = "SAFETY";
|
String enumId = "SAFETY";
|
||||||
|
if (this.cpu_user + this.cpu_system + this.gpuUtil + this.kbmemused == 0) enumId = "FAILUR";
|
||||||
// if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION";
|
// if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION";
|
||||||
return enumId;
|
return enumId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getServerStatusName() {
|
public String getServerStatusName() {
|
||||||
// String enumId = "SAFETY";
|
String enumStr = ServerStatus.SAFETY.getText();
|
||||||
// if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION";
|
if (this.cpu_user + this.cpu_system + this.gpuUtil + this.kbmemused == 0)
|
||||||
return ServerStatus.SAFETY.getText();
|
enumStr = ServerStatus.FAILUR.getText();
|
||||||
|
return enumStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCpuStatus() {
|
public String getCpuStatus() {
|
||||||
String enumId = "SAFETY";
|
String enumId = "SAFETY";
|
||||||
if (this.cpu_user + this.cpu_system >= 80) {
|
if (this.cpu_user + this.cpu_system >= 80) {
|
||||||
enumId = "CAUTION";
|
enumId = "CAUTION";
|
||||||
|
} else if (this.cpu_user + this.cpu_system + this.memused == 0) {
|
||||||
|
enumId = "FAILUR";
|
||||||
}
|
}
|
||||||
return enumId;
|
return enumId;
|
||||||
}
|
}
|
||||||
@@ -560,6 +564,8 @@ public class InferenceResultDto {
|
|||||||
String enumId = "SAFETY";
|
String enumId = "SAFETY";
|
||||||
if (this.gpuUtil >= 80) {
|
if (this.gpuUtil >= 80) {
|
||||||
enumId = "CAUTION";
|
enumId = "CAUTION";
|
||||||
|
} else if (this.cpu_user + this.cpu_system == 0) {
|
||||||
|
enumId = "FAILUR";
|
||||||
}
|
}
|
||||||
return enumId;
|
return enumId;
|
||||||
}
|
}
|
||||||
@@ -568,6 +574,8 @@ public class InferenceResultDto {
|
|||||||
String enumId = "SAFETY";
|
String enumId = "SAFETY";
|
||||||
if (this.memused >= 80) {
|
if (this.memused >= 80) {
|
||||||
enumId = "CAUTION";
|
enumId = "CAUTION";
|
||||||
|
} else if (this.cpu_user + this.cpu_system + this.memused == 0) {
|
||||||
|
enumId = "FAILUR";
|
||||||
}
|
}
|
||||||
return enumId;
|
return enumId;
|
||||||
}
|
}
|
||||||
@@ -575,6 +583,8 @@ public class InferenceResultDto {
|
|||||||
public String getCpuStatusName() {
|
public String getCpuStatusName() {
|
||||||
if (this.cpu_user + this.cpu_system >= 80) {
|
if (this.cpu_user + this.cpu_system >= 80) {
|
||||||
return ServerStatus.CAUTION.getText();
|
return ServerStatus.CAUTION.getText();
|
||||||
|
} else if (this.cpu_user + this.cpu_system + this.memused == 0) {
|
||||||
|
return ServerStatus.FAILUR.getText();
|
||||||
}
|
}
|
||||||
return ServerStatus.SAFETY.getText();
|
return ServerStatus.SAFETY.getText();
|
||||||
}
|
}
|
||||||
@@ -582,6 +592,8 @@ public class InferenceResultDto {
|
|||||||
public String getGpuStatusName() {
|
public String getGpuStatusName() {
|
||||||
if (this.gpuUtil >= 80) {
|
if (this.gpuUtil >= 80) {
|
||||||
return ServerStatus.CAUTION.getText();
|
return ServerStatus.CAUTION.getText();
|
||||||
|
} else if (this.cpu_user + this.cpu_system + this.memused == 0) {
|
||||||
|
return ServerStatus.FAILUR.getText();
|
||||||
}
|
}
|
||||||
return ServerStatus.SAFETY.getText();
|
return ServerStatus.SAFETY.getText();
|
||||||
}
|
}
|
||||||
@@ -589,6 +601,8 @@ public class InferenceResultDto {
|
|||||||
public String getMemStatusName() {
|
public String getMemStatusName() {
|
||||||
if (this.memused >= 80) {
|
if (this.memused >= 80) {
|
||||||
return ServerStatus.CAUTION.getText();
|
return ServerStatus.CAUTION.getText();
|
||||||
|
} else if (this.cpu_user + this.cpu_system + this.memused == 0) {
|
||||||
|
return ServerStatus.FAILUR.getText();
|
||||||
}
|
}
|
||||||
return ServerStatus.SAFETY.getText();
|
return ServerStatus.SAFETY.getText();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,4 +102,12 @@ public class InferenceResultShpDto {
|
|||||||
@Schema(description = "geojson 파일 생성 수 (덮어쓰기 포함)", example = "120")
|
@Schema(description = "geojson 파일 생성 수 (덮어쓰기 포함)", example = "120")
|
||||||
private int geojson;
|
private int geojson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public static class CreateShpRequest {
|
||||||
|
|
||||||
|
private Long m1BatchId;
|
||||||
|
private Long m2BatchId;
|
||||||
|
private Long m3BatchId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import jakarta.validation.constraints.NotNull;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -514,7 +515,52 @@ public class InferenceResultService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<InferenceServerStatusDto> getInferenceServerStatusList() {
|
public List<InferenceServerStatusDto> getInferenceServerStatusList() {
|
||||||
return inferenceResultCoreService.getInferenceServerStatusList();
|
|
||||||
|
List<InferenceServerStatusDto> dtoList =
|
||||||
|
inferenceResultCoreService.getInferenceServerStatusList();
|
||||||
|
int size = dtoList.size();
|
||||||
|
|
||||||
|
System.out.println("size =" + size);
|
||||||
|
|
||||||
|
if (size == 0) {
|
||||||
|
for (int k = 1; k <= 4; k++) {
|
||||||
|
InferenceServerStatusDto dto = new InferenceServerStatusDto();
|
||||||
|
dto.setServerName("server0" + k);
|
||||||
|
dto.setCpu_user(0);
|
||||||
|
dto.setCpu_system(0);
|
||||||
|
dto.setMemused(0);
|
||||||
|
dto.setKbmemused(0L);
|
||||||
|
dto.setGpuUtil(0);
|
||||||
|
|
||||||
|
dtoList.add(dto);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int k = 1; k <= 4; k++) {
|
||||||
|
String srvNm = "server" + k;
|
||||||
|
String srvNmChk = "N";
|
||||||
|
for (InferenceServerStatusDto dto : dtoList) {
|
||||||
|
if (srvNm.equals(dto.getServerName())) {
|
||||||
|
srvNmChk = "Y";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (srvNmChk.equals("N")) {
|
||||||
|
InferenceServerStatusDto dto = new InferenceServerStatusDto();
|
||||||
|
dto.setServerName(srvNm);
|
||||||
|
dto.setCpu_user(0);
|
||||||
|
dto.setCpu_system(0);
|
||||||
|
dto.setMemused(0);
|
||||||
|
dto.setKbmemused(0L);
|
||||||
|
dto.setGpuUtil(0);
|
||||||
|
dtoList.add(dto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dtoList.sort(Comparator.comparing(InferenceServerStatusDto::getServerName));
|
||||||
|
|
||||||
|
return dtoList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -542,7 +588,7 @@ public class InferenceResultService {
|
|||||||
|
|
||||||
/** 추론 종료 */
|
/** 추론 종료 */
|
||||||
@Transactional
|
@Transactional
|
||||||
public void deleteInferenceEnd() {
|
public UUID deleteInferenceEnd() {
|
||||||
SaveInferenceAiDto dto = inferenceResultCoreService.getProcessing();
|
SaveInferenceAiDto dto = inferenceResultCoreService.getProcessing();
|
||||||
if (dto == null) {
|
if (dto == null) {
|
||||||
throw new CustomApiException("NOT_FOUND", HttpStatus.NOT_FOUND);
|
throw new CustomApiException("NOT_FOUND", HttpStatus.NOT_FOUND);
|
||||||
@@ -571,6 +617,7 @@ public class InferenceResultService {
|
|||||||
// upsertGeomData
|
// upsertGeomData
|
||||||
Long learnId = inferenceResultCoreService.getInferenceLearnIdByUuid(dto.getUuid());
|
Long learnId = inferenceResultCoreService.getInferenceLearnIdByUuid(dto.getUuid());
|
||||||
inferenceResultCoreService.upsertGeomData(learnId);
|
inferenceResultCoreService.upsertGeomData(learnId);
|
||||||
|
return dto.getUuid();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.kamco.cd.kamcoback.inference.service;
|
package com.kamco.cd.kamcoback.inference.service;
|
||||||
|
|
||||||
import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto;
|
import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto;
|
||||||
|
import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto.CreateShpRequest;
|
||||||
import com.kamco.cd.kamcoback.inference.dto.InferenceResultsTestingDto;
|
import com.kamco.cd.kamcoback.inference.dto.InferenceResultsTestingDto;
|
||||||
import com.kamco.cd.kamcoback.postgres.core.InferenceResultCoreService;
|
import com.kamco.cd.kamcoback.postgres.core.InferenceResultCoreService;
|
||||||
import com.kamco.cd.kamcoback.postgres.core.InferenceResultShpCoreService;
|
import com.kamco.cd.kamcoback.postgres.core.InferenceResultShpCoreService;
|
||||||
@@ -36,11 +37,17 @@ public class InferenceResultShpService {
|
|||||||
return coreService.buildInferenceData(id);
|
return coreService.buildInferenceData(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createShp(String uid, Long m1BatchId, Long m2BatchId, Long m3BatchId) {
|
/**
|
||||||
|
* shp 파일 수동생성
|
||||||
|
*
|
||||||
|
* @param uid
|
||||||
|
* @param req
|
||||||
|
*/
|
||||||
|
public void createShp(String uid, CreateShpRequest req) {
|
||||||
List<Long> batchIds = new ArrayList<>();
|
List<Long> batchIds = new ArrayList<>();
|
||||||
batchIds.add(m1BatchId);
|
batchIds.add(req.getM1BatchId());
|
||||||
batchIds.add(m2BatchId);
|
batchIds.add(req.getM2BatchId());
|
||||||
batchIds.add(m3BatchId);
|
batchIds.add(req.getM3BatchId());
|
||||||
|
|
||||||
List<InferenceResultsTestingDto.ShpDto> resultList =
|
List<InferenceResultsTestingDto.ShpDto> resultList =
|
||||||
inferenceResultCoreService.getInferenceResults(batchIds);
|
inferenceResultCoreService.getInferenceResults(batchIds);
|
||||||
@@ -58,7 +65,7 @@ public class InferenceResultShpService {
|
|||||||
}
|
}
|
||||||
inferenceId = uid;
|
inferenceId = uid;
|
||||||
String mapIds = sb.toString();
|
String mapIds = sb.toString();
|
||||||
String batchId = m1BatchId + "," + m2BatchId + "," + m3BatchId;
|
String batchId = req.getM1BatchId() + "," + req.getM2BatchId() + "," + req.getM3BatchId();
|
||||||
|
|
||||||
// shp 파일 비동기 생성
|
// shp 파일 비동기 생성
|
||||||
shpPipelineService.runPipeline(jarPath, datasetDir, batchId, inferenceId, mapIds);
|
shpPipelineService.runPipeline(jarPath, datasetDir, batchId, inferenceId, mapIds);
|
||||||
|
|||||||
@@ -90,7 +90,6 @@ public class MapSheetAnalDataInferenceGeomEntity {
|
|||||||
private Long pnu;
|
private Long pnu;
|
||||||
|
|
||||||
@Size(max = 20)
|
@Size(max = 20)
|
||||||
@ColumnDefault("'0'")
|
|
||||||
@Column(name = "fit_state", length = 20)
|
@Column(name = "fit_state", length = 20)
|
||||||
private String fitState;
|
private String fitState;
|
||||||
|
|
||||||
@@ -150,12 +149,6 @@ public class MapSheetAnalDataInferenceGeomEntity {
|
|||||||
@Column(name = "file_created_dttm")
|
@Column(name = "file_created_dttm")
|
||||||
private ZonedDateTime fileCreatedDttm;
|
private ZonedDateTime fileCreatedDttm;
|
||||||
|
|
||||||
@Column(name = "pass_yn")
|
|
||||||
private String passYn;
|
|
||||||
|
|
||||||
@Column(name = "pass_yn_dttm")
|
|
||||||
private ZonedDateTime passYnDttm;
|
|
||||||
|
|
||||||
@Column(name = "result_uid")
|
@Column(name = "result_uid")
|
||||||
private String resultUid;
|
private String resultUid;
|
||||||
|
|
||||||
|
|||||||
@@ -121,6 +121,8 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
|
|||||||
queryFactory
|
queryFactory
|
||||||
.select(systemMetricEntity.timestamp.max())
|
.select(systemMetricEntity.timestamp.max())
|
||||||
.from(systemMetricEntity)
|
.from(systemMetricEntity)
|
||||||
|
.where(systemMetricEntity.timestamp.goe(OffsetDateTime.now().minusMinutes(5)))
|
||||||
|
// .where(systemMetricEntity.timestamp.goe(OffsetDateTime.now().minusSeconds(30)))
|
||||||
.groupBy(systemMetricEntity.serverName)
|
.groupBy(systemMetricEntity.serverName)
|
||||||
.fetch();
|
.fetch();
|
||||||
|
|
||||||
@@ -128,6 +130,8 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
|
|||||||
queryFactory
|
queryFactory
|
||||||
.select(gpuMetricEntity.timestamp.max())
|
.select(gpuMetricEntity.timestamp.max())
|
||||||
.from(gpuMetricEntity)
|
.from(gpuMetricEntity)
|
||||||
|
.where(gpuMetricEntity.timestamp.goe(OffsetDateTime.now().minusMinutes(5)))
|
||||||
|
// .where(gpuMetricEntity.timestamp.goe(OffsetDateTime.now().minusSeconds(30)))
|
||||||
.groupBy(gpuMetricEntity.serverName)
|
.groupBy(gpuMetricEntity.serverName)
|
||||||
.fetch();
|
.fetch();
|
||||||
|
|
||||||
@@ -442,7 +446,7 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
|
|||||||
"substring({0} from 1 for 8)",
|
"substring({0} from 1 for 8)",
|
||||||
mapSheetAnalDataInferenceGeomEntity.resultUid),
|
mapSheetAnalDataInferenceGeomEntity.resultUid),
|
||||||
pnu,
|
pnu,
|
||||||
Expressions.nullExpression(String.class)))
|
mapSheetAnalDataInferenceGeomEntity.fitState))
|
||||||
.from(mapSheetAnalInferenceEntity)
|
.from(mapSheetAnalInferenceEntity)
|
||||||
.join(mapSheetAnalDataInferenceEntity)
|
.join(mapSheetAnalDataInferenceEntity)
|
||||||
.on(mapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id))
|
.on(mapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id))
|
||||||
|
|||||||
@@ -106,3 +106,8 @@ inference:
|
|||||||
batch-url: http://10.100.0.11:8000/batches
|
batch-url: http://10.100.0.11:8000/batches
|
||||||
geojson-dir: /kamco-nfs/requests/
|
geojson-dir: /kamco-nfs/requests/
|
||||||
jar-path: /kamco-nfs/dataset/shp_exporter-1.0.0.jar
|
jar-path: /kamco-nfs/dataset/shp_exporter-1.0.0.jar
|
||||||
|
|
||||||
|
innopam:
|
||||||
|
#url: http://localhost:8080
|
||||||
|
url: http://192.168.2.129:5301
|
||||||
|
mast : ${innopam.url}/api/kcd/cdi/chn/mast
|
||||||
|
|||||||
@@ -63,3 +63,7 @@ inference:
|
|||||||
geojson-dir: /kamco-nfs/requests/
|
geojson-dir: /kamco-nfs/requests/
|
||||||
jar-path: /kamco-nfs/dataset/shp_exporter-1.0.0.jar
|
jar-path: /kamco-nfs/dataset/shp_exporter-1.0.0.jar
|
||||||
|
|
||||||
|
innopam:
|
||||||
|
#url: http://localhost:8080
|
||||||
|
url: http://192.168.2.129:5301
|
||||||
|
mast: ${innopam.url}/api/kcd/cdi/chn/mast
|
||||||
|
|||||||
Reference in New Issue
Block a user