create: new folder

This commit is contained in:
abiyasa05 2024-12-31 11:18:33 +07:00
parent 29460deb4b
commit 7b7ed2130c
20 changed files with 146305 additions and 1 deletions

145139
Database.sql Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demo.mp4 Normal file

Binary file not shown.

View File

@ -1 +0,0 @@
tes

View File

@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}

33
test spring boot/demo/.gitignore vendored Normal file
View File

@ -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/

View File

@ -0,0 +1,19 @@
# 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.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip

259
test spring boot/demo/mvnw vendored Normal file
View File

@ -0,0 +1,259 @@
#!/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.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.2
#
# Optional ENV vars
# -----------------
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
# MVNW_REPOURL - repo url base for downloading maven distribution
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
native_path() { cygpath --path --windows "$1"; }
;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
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"
JAVACCMD="$JAVA_HOME/jre/sh/javac"
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACCMD="$JAVA_HOME/bin/javac"
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
return 1
fi
fi
else
JAVACMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v java
)" || :
JAVACCMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v javac
)" || :
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
return 1
fi
fi
}
# hash string like Java String::hashCode
hash_string() {
str="${1:-}" h=0
while [ -n "$str" ]; do
char="${str%"${str#?}"}"
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
str="${str#?}"
done
printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
printf %s\\n "$1" >&2
exit 1
}
trim() {
# MWRAPPER-139:
# Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
# Needed for removing poorly interpreted newline sequences when running in more
# exotic environments such as mingw bash on Windows.
printf "%s" "${1}" | tr -d '[:space:]'
}
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
case "${key-}" in
distributionUrl) distributionUrl=$(trim "${value-}") ;;
distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
esac
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
*)
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
distributionPlatform=linux-amd64
;;
esac
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
trap clean HUP INT TERM EXIT
else
die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
distributionUrl="${distributionUrl%.zip}.tar.gz"
distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
verbose "Found wget ... using wget"
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
verbose "Found curl ... using curl"
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
verbose "Falling back to use Java to download"
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
cat >"$javaSource" <<-END
public class Downloader extends java.net.Authenticator
{
protected java.net.PasswordAuthentication getPasswordAuthentication()
{
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
}
public static void main( String[] args ) throws Exception
{
setDefault( new Downloader() );
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
}
}
END
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
verbose " - Compiling Downloader.java ..."
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
verbose " - Running Downloader.java ..."
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
distributionSha256Result=false
if [ "$MVN_CMD" = mvnd.sh ]; then
echo "Checksum validation is not supported for maven-mvnd." >&2
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
elif command -v sha256sum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
elif command -v shasum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
fi
if [ $distributionSha256Result = false ]; then
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
exit 1
fi
fi
# unzip and move
if command -v unzip >/dev/null; then
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"

149
test spring boot/demo/mvnw.cmd vendored Normal file
View File

@ -0,0 +1,149 @@
<# : batch portion
@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 Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

View File

@ -0,0 +1,69 @@
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.9.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,13 @@
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

View File

@ -0,0 +1,298 @@
package com.example.demo.controller;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.*;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.file.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@Controller
public class MainController {
public final ExecutorService executorService = Executors.newFixedThreadPool(5); // Sesuaikan jumlah thread sesuai
// kebutuhan
@PostMapping("/submit")
public ResponseEntity<Map<String, Object>> submit(@RequestParam("url") String fileURL,
@RequestParam("flutterid") String flutterid) {
Map<String, Object> response = new HashMap<>();
try {
Future<Map<String, Object>> futureResponse = executorService.submit(new TestTask(fileURL, flutterid));
response = futureResponse.get(); // Tunggu hingga tugas selesai
} catch (InterruptedException | ExecutionException e) {
response.put("message", "An error occurred: " + e.getMessage());
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Allow-Origin", "*"); // Sesuaikan dengan domain yang benar
headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
headers.add("Access-Control-Allow-Headers", "*");
headers.add("Access-Control-Max-Age", "3600");
return ResponseEntity.ok()
.headers(headers)
.body(response);
}
public class TestTask implements Callable<Map<String, Object>> {
public final String fileURL;
public final String flutterid;
public TestTask(String fileURL, String flutterid) {
this.fileURL = fileURL;
this.flutterid = flutterid;
}
@Override
public Map<String, Object> call() {
Map<String, Object> response = new HashMap<>();
String repoName = extractRepoName(fileURL);
String destDirectory = "C:\\Users\\kevin\\Desktop\\Materi kuliah\\SKRIPSI\\unzipped";
String zipFilePath = destDirectory + "\\downloaded.zip";
String folderToCopy = "C:\\Users\\kevin\\Desktop\\Materi kuliah\\SKRIPSI\\testFile\\" + flutterid
+ "\\test";
String destinationDir = destDirectory + "\\" + repoName + "-main\\test";
System.out.println("Received URL: " + fileURL);
try {
// Clear destination directory and previous zip file before download and unzip
clearDirectory(new File(destDirectory));
Files.deleteIfExists(Paths.get(zipFilePath));
// Download and unzip the new file
downloadFile(fileURL, zipFilePath);
unzip(zipFilePath, destDirectory);
copyDirectory(new File(folderToCopy), new File(destinationDir));
// Run Flutter tests
String testOutput = runFlutterTest(destDirectory + "\\" + repoName + "-main");
List<String> successTests = new ArrayList<>();
List<String> failedTests = new ArrayList<>();
parseTestOutput(testOutput, successTests, failedTests);
int totalSuccess = successTests.size();
int totalFailed = failedTests.size();
// Calculate score
int totalTests = totalSuccess + totalFailed;
double score = totalTests == 0 ? 0 : ((double) totalSuccess / totalTests) * 100;
DecimalFormat df = new DecimalFormat("#.##");
String formattedScore = df.format(score);
// Prepare response
response.put("message", "Download, unzip, and test completed successfully.");
response.put("successTests", successTests);
response.put("failedTests", failedTests);
response.put("totalSuccess", totalSuccess);
response.put("totalFailed", totalFailed);
response.put("score", formattedScore);
} catch (Exception ex) {
response.put("message", "An error occurred: " + ex.getMessage());
ex.printStackTrace();
}
return response;
}
}
public String extractRepoName(String url) {
// Contoh URL:
// https://github.com/Kev9794/media_player_flutter_failed/archive/refs/heads/main.zip
String pattern = "github\\.com/(.+?)/(\\w+)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(url);
if (m.find()) {
String repoName = m.group(2);
return repoName;
} else {
throw new IllegalArgumentException("Invalid GitHub URL format: " + url);
}
}
public static void downloadFile(String fileURL, String destination) throws IOException {
System.out.println("Downloading from URL: " + fileURL);
URL url = new URL(fileURL);
ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(destination);
fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
fileOutputStream.close();
readableByteChannel.close();
System.out.println("File downloaded to " + destination);
}
public static void clearDirectory(File directory) throws IOException {
if (directory.exists()) {
for (File file : directory.listFiles()) {
if (file.isDirectory()) {
clearDirectory(file);
}
if (!file.delete()) {
throw new IOException("Failed to delete " + file);
}
}
} else {
directory.mkdirs();
}
System.out.println("Directory " + directory.getPath() + " is cleared.");
}
public static void unzip(String zipFilePath, String destDirectory) throws IOException {
System.out.println("Unzipping file " + zipFilePath + " to " + destDirectory);
File destDir = new File(destDirectory);
if (!destDir.exists()) {
destDir.mkdirs();
}
byte[] buffer = new byte[1024];
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) {
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
File newFile = newFile(destDir, zipEntry);
if (zipEntry.isDirectory()) {
if (!newFile.isDirectory() && !newFile.mkdirs()) {
throw new IOException("Failed to create directory " + newFile);
}
} else {
File parent = newFile.getParentFile();
if (!parent.isDirectory() && !parent.mkdirs()) {
throw new IOException("Failed to create directory " + parent);
}
try (FileOutputStream fos = new FileOutputStream(newFile)) {
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
}
}
zipEntry = zis.getNextEntry();
}
zis.closeEntry();
}
System.out.println("Unzip completed.");
}
public static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException {
File destFile = new File(destinationDir, zipEntry.getName());
String destDirPath = destinationDir.getCanonicalPath();
String destFilePath = destFile.getCanonicalPath();
if (!destFilePath.startsWith(destDirPath + File.separator)) {
throw new IOException("Entry is outside of the target dir: " + zipEntry.getName());
}
return destFile;
}
public static void copyDirectory(File sourceDir, File destinationDir) throws IOException {
if (!sourceDir.isDirectory()) {
throw new IOException("Source is not a directory");
}
if (!destinationDir.exists()) {
destinationDir.mkdirs();
}
for (String file : sourceDir.list()) {
File srcFile = new File(sourceDir, file);
File destFile = new File(destinationDir, file);
if (srcFile.isDirectory()) {
copyDirectory(srcFile, destFile);
} else {
Files.copy(srcFile.toPath(), destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
}
System.out.println("Directory " + sourceDir.getName() + " copied to " + destinationDir.getPath());
}
public static String runFlutterTest(String projectDir) throws IOException {
ProcessBuilder builder = new ProcessBuilder(
"cmd.exe", "/c",
"cd \"" + projectDir + "\" && flutter test");
builder.redirectErrorStream(true);
Process p = builder.start();
StringBuilder output = new StringBuilder();
try (BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = r.readLine()) != null) {
output.append(line).append("\n");
}
}
return output.toString();
}
public static void parseTestOutput(String output, List<String> successTests,
List<String> failedTests) {
String[] lines = output.split("\n");
Pattern successPattern = Pattern.compile("\\+\\d+(?: -\\d+)?: .*: (.*)(?<! \\[E\\])$");
Pattern failedPattern = Pattern.compile("[\\+\\-]\\d+(?: -\\d+)?: .*: (.*) \\[E\\]");
Set<String> failedTestsSet = new HashSet<>(failedTests);
for (String line : lines) {
System.out.println("Processing line: " + line); // Debugging line
Matcher successMatcher = successPattern.matcher(line);
Matcher failedMatcher = failedPattern.matcher(line);
if (successMatcher.find()) {
String testName = successMatcher.group(1).trim();
successTests.add(testName);
System.out.println("Success test found: " + testName); // Debugging line
} else if (failedMatcher.find()) {
String testName = failedMatcher.group(1).trim();
failedTestsSet.add(testName);
failedTests.add(testName + " (failed)");
System.out.println("Failed test found: " + testName); // Debugging line
}
}
successTests.removeIf(failedTestsSet::contains);
}
// Ubuntu Parsing Output
// public static void parseTestOutput(String output, List<String> successTests,
// List<String> failedTests) {
// // Split the output by line
// String[] lines = output.split("\n");
// // Patterns for success and failed tests based on typical Flutter test output
// Pattern successPattern = Pattern.compile("\\+\\d+(?: -\\d+)?: .*: (.*)(?<!
// \\[E\\])$");
// Pattern failedPattern = Pattern.compile("[\\+\\-]\\d+(?: -\\d+)?: .*: (.*)
// \\[E\\]");
// Set<String> failedTestsSet = new HashSet<>(failedTests);
// for (String line : lines) {
// System.out.println("Processing line: " + line); // Debugging line
// Matcher successMatcher = successPattern.matcher(line);
// Matcher failedMatcher = failedPattern.matcher(line);
// if (successMatcher.find()) {
// String testName = successMatcher.group(1).trim();
// successTests.add(testName);
// System.out.println("Success test found: " + testName); // Debugging line
// } else if (failedMatcher.find()) {
// String testName = failedMatcher.group(1).trim();
// failedTestsSet.add(testName);
// failedTests.add(testName + " (failed)");
// System.out.println("Failed test found: " + testName); // Debugging line
// }
// }
// // Remove any successful tests that are also in the failed tests
// successTests.removeIf(failedTestsSet::contains);
// }
}

View File

@ -0,0 +1,5 @@
spring.application.name=demo
spring.mvc.cors.allow-credentials=true
spring.mvc.cors.allowed-origins=http://localhost:8000
spring.mvc.cors.allowed-methods=GET,POST,PUT,DELETE
spring.mvc.cors.allowed-headers=Authorization,Content-Type

View File

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flutter Test Runner</title>
</head>
<body>
<h1>Flutter Test Runner</h1>
<p>Modul dapat diunduh pada link berikut : <a
href="https://drive.google.com/drive/folders/1xlDgPfzkflORsz4fTdRAV1NxvM3Z1oyg">
https://drive.google.com/drive/folders/1xlDgPfzkflORsz4fTdRAV1NxvM3Z1oyg</a></p>
<p>Langkah-langkah mengupload tugas: <br>
1. Upload tugas pada GitHub dengan repository baru.<br>
2. Pastikan repository anda bersifat Public.<br>
3. Setelah sudah terupload copy link untuk download zip repository.<br>
4. Paste link tersebut pada form dibawah ini.<br>
</p>
<form action="/submit" method="post">
<label for="url">GitHub URL:</label>
<input type="text" id="url" name="url" required>
<button type="submit">Submit</button>
</form>
</body>
</html>

View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flutter Test Runner</title>
</head>
<body>
<h1>Flutter Test Runner</h1>
<p th:text="${message}"></p>
<h2>Test Results:</h2>
<p>Total Success: <span th:text="${totalSuccess}"></span></p>
<p>Total Failed: <span th:text="${totalFailed}"></span></p>
<p>Score: <span th:text="${score}"></span>%</p>
<h2>Success Tests:</h2>
<ul>
<li th:each="test : ${successTests}" th:text="${test}"></li>
</ul>
<h2>Failed Tests:</h2>
<ul>
<li th:each="test : ${failedTests}" th:text="${test}"></li>
</ul>
<a href="/">Go back</a>
</body>
</html>

View File

@ -0,0 +1,13 @@
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}

View File

@ -0,0 +1,245 @@
package com.example.demo.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import static org.junit.Assert.*;
@RunWith(MockitoJUnitRunner.class)
public class MainControllerTest {
private final MainController mainController = new MainController();
@Test
public void testExtractRepoName_ValidURL() {
String url = "https://github.com/user/repo";
String expected = "repo";
String actual = mainController.extractRepoName(url);
assertEquals(expected, actual);
}
@Test(expected = IllegalArgumentException.class)
public void testExtractRepoName_InvalidURL() {
String url = "invalid_url";
mainController.extractRepoName(url);
}
@Test
public void testDownloadFile_ValidURL() throws IOException {
String fileURL = "https://github.com/Kev9794/modul3/archive/refs/heads/main.zip";
String destination = "tempFile.zip";
MainController.downloadFile(fileURL, destination);
assertTrue(Files.exists(Paths.get(destination)));
Files.delete(Paths.get(destination)); // Cleanup
}
@Test(expected = IOException.class)
public void testDownloadFile_InvalidURL() throws IOException {
String fileURL = "invalid_url";
String destination = "tempFile.zip";
MainController.downloadFile(fileURL, destination);
}
@Test
public void testUnzip_ValidFile() throws IOException {
String zipFilePath = "testDir//test.zip";
String destDirectory = "testDir";
// Assume the zip file exists and contains valid data for the test
MainController.unzip(zipFilePath, destDirectory);
assertTrue(Files.exists(Paths.get(destDirectory)));
// Cleanup
Files.walk(Paths.get(destDirectory))
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
Files.deleteIfExists(Paths.get(zipFilePath));
}
@Test(expected = IOException.class)
public void testUnzip_InvalidFile() throws IOException {
String zipFilePath = "invalid.zip";
String destDirectory = "testDir";
MainController.unzip(zipFilePath, destDirectory);
}
@Test
public void testCopyDirectory() throws IOException {
Path sourceDir = Files.createTempDirectory("sourceDir");
Path destinationDir = Files.createTempDirectory("destinationDir");
Files.createFile(sourceDir.resolve("testFile.txt"));
MainController.copyDirectory(sourceDir.toFile(), destinationDir.toFile());
assertTrue(Files.exists(destinationDir.resolve("testFile.txt")));
// Cleanup
Files.walk(sourceDir).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
Files.walk(destinationDir).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
}
@Test
public void testRunFlutterTest() throws IOException {
String projectDir = "C:\\Users\\kevin\\Desktop\\Materi kuliah\\SKRIPSI\\flutter_testing_app";
// Assume the Flutter project exists at the specified path
String output = MainController.runFlutterTest(projectDir);
assertNotNull(output);
assertTrue(output.contains("All tests passed") || output.contains("Some tests failed"));
}
@Test
public void testParseSuccessTestOutput() {
String testOutput = "00:17 +42 -2: C:/Users/kevin/Desktop/Materi kuliah/SKRIPSI/unzipped/media_player_flutter_failed-main/test/scenario/task3a_test.dart: All tests passed";
List<String> successTests = new ArrayList<>();
List<String> failedTests = new ArrayList<>();
MainController.parseTestOutput(testOutput, successTests, failedTests);
assertTrue(successTests.contains("All tests passed"));
}
@Test
public void testParseFailedTestOutput() {
String testOutput = "00:17 +42 -2: C:/Users/kevin/Desktop/Materi kuliah/SKRIPSI/unzipped/media_player_flutter_failed-main/test/scenario/task3a_test.dart: Some tests failed [E]";
List<String> successTests = new ArrayList<>();
List<String> failedTests = new ArrayList<>();
MainController.parseTestOutput(testOutput, successTests, failedTests);
assertTrue(failedTests.contains("Some tests failed"));
}
// @Test
// public void testLoad() throws InterruptedException {
// int numberOfRequests = 100;
// ExecutorService executorService = Executors.newFixedThreadPool(10);
// List<Future<ResponseEntity<Map<String, Object>>>> futures = new
// ArrayList<>();
// for (int i = 0; i < numberOfRequests; i++) {
// Future<ResponseEntity<Map<String, Object>>> future =
// executorService.submit(() -> {
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
// String flutterid = "testFlutterID";
// return mainController.submit(fileURL, flutterid);
// });
// futures.add(future);
// }
// for (Future<ResponseEntity<Map<String, Object>>> future : futures) {
// try {
// ResponseEntity<Map<String, Object>> response = future.get();
// assertEquals(HttpStatus.OK, response.getStatusCode());
// } catch (ExecutionException e) {
// e.printStackTrace();
// }
// }
// executorService.shutdown();
// executorService.awaitTermination(1, TimeUnit.MINUTES);
// }
// @Test
// public void testStress() throws InterruptedException {
// int numberOfRequests = 1000; // Increase until failureS
// ExecutorService executorService = Executors.newFixedThreadPool(50);
// List<Future<ResponseEntity<Map<String, Object>>>> futures = new
// ArrayList<>();
// for (int i = 0; i < numberOfRequests; i++) {
// Future<ResponseEntity<Map<String, Object>>> future =
// executorService.submit(() -> {
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
// String flutterid = "testFlutterID";
// return mainController.submit(fileURL, flutterid);
// });
// futures.add(future);
// }
// for (Future<ResponseEntity<Map<String, Object>>> future : futures) {
// try {
// ResponseEntity<Map<String, Object>> response = future.get();
// assertEquals(HttpStatus.OK, response.getStatusCode());
// } catch (ExecutionException e) {
// e.printStackTrace();
// }
// }
// executorService.shutdown();
// executorService.awaitTermination(1, TimeUnit.MINUTES);
// }
// @Test
// public void testEndurance() throws InterruptedException {
// int durationInMinutes = 2; // 2 minutes for endurance test
// long endTime = System.currentTimeMillis() + (durationInMinutes * 60 * 1000);
// ExecutorService executorService = Executors.newFixedThreadPool(10);
// while (System.currentTimeMillis() < endTime) {
// Future<ResponseEntity<Map<String, Object>>> future =
// executorService.submit(() -> {
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
// String flutterid = "testFlutterID";
// return mainController.submit(fileURL, flutterid);
// });
// try {
// ResponseEntity<Map<String, Object>> response = future.get();
// assertEquals(HttpStatus.OK, response.getStatusCode());
// } catch (ExecutionException e) {
// e.printStackTrace();
// }
// }
// executorService.shutdown();
// executorService.awaitTermination(10, TimeUnit.MINUTES);
// }
// @Test
// public void testThroughput() throws InterruptedException {
// int numberOfRequests = 50;
// long startTime = System.currentTimeMillis();
// ExecutorService executorService = Executors.newFixedThreadPool(50);
// List<Future<ResponseEntity<Map<String, Object>>>> futures = new
// ArrayList<>();
// for (int i = 0; i < numberOfRequests; i++) {
// Future<ResponseEntity<Map<String, Object>>> future =
// executorService.submit(() -> {
// String fileURL = "https://github.com/user/repo/archive/refs/heads/main.zip";
// String flutterid = "testFlutterID";
// return mainController.submit(fileURL, flutterid);
// });
// futures.add(future);
// }
// for (Future<ResponseEntity<Map<String, Object>>> future : futures) {
// try {
// ResponseEntity<Map<String, Object>> response = future.get();
// assertEquals(HttpStatus.OK, response.getStatusCode());
// } catch (ExecutionException e) {
// e.printStackTrace();
// }
// }
// long endTime = System.currentTimeMillis();
// long duration = endTime - startTime;
// double throughput = (double) numberOfRequests / (duration / 1000.0);
// System.out.println("Throughput: " + throughput + " requests per second");
// executorService.shutdown();
// executorService.awaitTermination(1, TimeUnit.MINUTES);
// }
}