1. 首次提交
This commit is contained in:
commit
24b498dbd0
|
@ -0,0 +1,33 @@
|
||||||
|
HELP.md
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**/target/
|
||||||
|
!**/src/test/**/target/
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
Binary file not shown.
|
@ -0,0 +1,2 @@
|
||||||
|
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
|
||||||
|
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
|
|
@ -0,0 +1,23 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name" : "com.cInterface.Data",
|
||||||
|
"queryAllDeclaredConstructors" : true,
|
||||||
|
"queryAllPublicConstructors" : true,
|
||||||
|
"queryAllDeclaredMethods" : true,
|
||||||
|
"queryAllPublicMethods" : true,
|
||||||
|
"allDeclaredClasses" : true,
|
||||||
|
"allPublicClasses" : true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "com.cInterface.Data",
|
||||||
|
"fields" : [
|
||||||
|
{ "name" : "mParam" },
|
||||||
|
{ "name" : "mInfo" }
|
||||||
|
],
|
||||||
|
"methods" : [
|
||||||
|
{ "name" : "<init>", "parameterTypes" : [] },
|
||||||
|
{ "name" : "getParam", "parameterTypes" : [] },
|
||||||
|
{ "name" : "setInfo", "parameterTypes" : ["byte[]", "int"] }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,308 @@
|
||||||
|
#!/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.2.0
|
||||||
|
#
|
||||||
|
# Required ENV vars:
|
||||||
|
# ------------------
|
||||||
|
# JAVA_HOME - location of a JDK home dir
|
||||||
|
#
|
||||||
|
# Optional ENV vars
|
||||||
|
# -----------------
|
||||||
|
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
# e.g. to debug Maven itself, use
|
||||||
|
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||||
|
|
||||||
|
if [ -f /usr/local/etc/mavenrc ] ; then
|
||||||
|
. /usr/local/etc/mavenrc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /etc/mavenrc ] ; then
|
||||||
|
. /etc/mavenrc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$HOME/.mavenrc" ] ; then
|
||||||
|
. "$HOME/.mavenrc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OS specific support. $var _must_ be set to either true or false.
|
||||||
|
cygwin=false;
|
||||||
|
darwin=false;
|
||||||
|
mingw=false
|
||||||
|
case "$(uname)" in
|
||||||
|
CYGWIN*) cygwin=true ;;
|
||||||
|
MINGW*) mingw=true;;
|
||||||
|
Darwin*) darwin=true
|
||||||
|
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||||
|
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
if [ -x "/usr/libexec/java_home" ]; then
|
||||||
|
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
|
||||||
|
else
|
||||||
|
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then
|
||||||
|
if [ -r /etc/gentoo-release ] ; then
|
||||||
|
JAVA_HOME=$(java-config --jre-home)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $cygwin ; then
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $mingw ; then
|
||||||
|
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
javaExecutable="$(which javac)"
|
||||||
|
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
|
||||||
|
# readlink(1) is not available as standard on Solaris 10.
|
||||||
|
readLink=$(which readlink)
|
||||||
|
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
|
||||||
|
if $darwin ; then
|
||||||
|
javaHome="$(dirname "\"$javaExecutable\"")"
|
||||||
|
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
|
||||||
|
else
|
||||||
|
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
|
||||||
|
fi
|
||||||
|
javaHome="$(dirname "\"$javaExecutable\"")"
|
||||||
|
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
|
||||||
|
JAVA_HOME="$javaHome"
|
||||||
|
export JAVA_HOME
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVACMD" ] ; then
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||||
|
echo " We cannot execute $JAVACMD" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then
|
||||||
|
echo "Warning: JAVA_HOME environment variable is not set."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# traverses directory structure from process work directory to filesystem root
|
||||||
|
# first directory with .mvn subdirectory is considered project base directory
|
||||||
|
find_maven_basedir() {
|
||||||
|
if [ -z "$1" ]
|
||||||
|
then
|
||||||
|
echo "Path not specified to find_maven_basedir"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
basedir="$1"
|
||||||
|
wdir="$1"
|
||||||
|
while [ "$wdir" != '/' ] ; do
|
||||||
|
if [ -d "$wdir"/.mvn ] ; then
|
||||||
|
basedir=$wdir
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||||
|
if [ -d "${wdir}" ]; then
|
||||||
|
wdir=$(cd "$wdir/.." || exit 1; pwd)
|
||||||
|
fi
|
||||||
|
# end of workaround
|
||||||
|
done
|
||||||
|
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# concatenates all lines of a file
|
||||||
|
concat_lines() {
|
||||||
|
if [ -f "$1" ]; then
|
||||||
|
# Remove \r in case we run on Windows within Git Bash
|
||||||
|
# and check out the repository with auto CRLF management
|
||||||
|
# enabled. Otherwise, we may read lines that are delimited with
|
||||||
|
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
|
||||||
|
# splitting rules.
|
||||||
|
tr -s '\r\n' ' ' < "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
log() {
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
printf '%s\n' "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
|
||||||
|
if [ -z "$BASE_DIR" ]; then
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
|
||||||
|
log "$MAVEN_PROJECTBASEDIR"
|
||||||
|
|
||||||
|
##########################################################################################
|
||||||
|
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||||
|
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||||
|
##########################################################################################
|
||||||
|
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
|
||||||
|
if [ -r "$wrapperJarPath" ]; then
|
||||||
|
log "Found $wrapperJarPath"
|
||||||
|
else
|
||||||
|
log "Couldn't find $wrapperJarPath, downloading it ..."
|
||||||
|
|
||||||
|
if [ -n "$MVNW_REPOURL" ]; then
|
||||||
|
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
else
|
||||||
|
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
fi
|
||||||
|
while IFS="=" read -r key value; do
|
||||||
|
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
|
||||||
|
safeValue=$(echo "$value" | tr -d '\r')
|
||||||
|
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
|
||||||
|
esac
|
||||||
|
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||||
|
log "Downloading from: $wrapperUrl"
|
||||||
|
|
||||||
|
if $cygwin; then
|
||||||
|
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v wget > /dev/null; then
|
||||||
|
log "Found wget ... using wget"
|
||||||
|
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
|
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||||
|
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||||
|
else
|
||||||
|
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||||
|
fi
|
||||||
|
elif command -v curl > /dev/null; then
|
||||||
|
log "Found curl ... using curl"
|
||||||
|
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
|
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||||
|
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||||
|
else
|
||||||
|
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "Falling back to using Java to download"
|
||||||
|
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||||
|
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
|
||||||
|
# For Cygwin, switch paths to Windows format before running javac
|
||||||
|
if $cygwin; then
|
||||||
|
javaSource=$(cygpath --path --windows "$javaSource")
|
||||||
|
javaClass=$(cygpath --path --windows "$javaClass")
|
||||||
|
fi
|
||||||
|
if [ -e "$javaSource" ]; then
|
||||||
|
if [ ! -e "$javaClass" ]; then
|
||||||
|
log " - Compiling MavenWrapperDownloader.java ..."
|
||||||
|
("$JAVA_HOME/bin/javac" "$javaSource")
|
||||||
|
fi
|
||||||
|
if [ -e "$javaClass" ]; then
|
||||||
|
log " - Running MavenWrapperDownloader.java ..."
|
||||||
|
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
##########################################################################################
|
||||||
|
# End of extension
|
||||||
|
##########################################################################################
|
||||||
|
|
||||||
|
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||||
|
wrapperSha256Sum=""
|
||||||
|
while IFS="=" read -r key value; do
|
||||||
|
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
|
||||||
|
esac
|
||||||
|
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||||
|
if [ -n "$wrapperSha256Sum" ]; then
|
||||||
|
wrapperSha256Result=false
|
||||||
|
if command -v sha256sum > /dev/null; then
|
||||||
|
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
|
||||||
|
wrapperSha256Result=true
|
||||||
|
fi
|
||||||
|
elif command -v shasum > /dev/null; then
|
||||||
|
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
|
||||||
|
wrapperSha256Result=true
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
|
||||||
|
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ $wrapperSha256Result = false ]; then
|
||||||
|
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
|
||||||
|
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
|
||||||
|
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin; then
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
|
||||||
|
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||||
|
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Provide a "standardized" way to retrieve the CLI args that will
|
||||||
|
# work with both Windows and non-Windows executions.
|
||||||
|
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
|
||||||
|
export MAVEN_CMD_LINE_ARGS
|
||||||
|
|
||||||
|
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
# shellcheck disable=SC2086 # safe args
|
||||||
|
exec "$JAVACMD" \
|
||||||
|
$MAVEN_OPTS \
|
||||||
|
$MAVEN_DEBUG_OPTS \
|
||||||
|
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||||
|
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||||
|
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
|
@ -0,0 +1,205 @@
|
||||||
|
@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.2.0
|
||||||
|
@REM
|
||||||
|
@REM Required ENV vars:
|
||||||
|
@REM JAVA_HOME - location of a JDK home dir
|
||||||
|
@REM
|
||||||
|
@REM Optional ENV vars
|
||||||
|
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||||
|
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||||
|
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
@REM e.g. to debug Maven itself, use
|
||||||
|
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||||
|
@echo off
|
||||||
|
@REM set title of command window
|
||||||
|
title %0
|
||||||
|
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||||
|
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||||
|
|
||||||
|
@REM set %HOME% to equivalent of $HOME
|
||||||
|
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||||
|
|
||||||
|
@REM Execute a user defined script before this one
|
||||||
|
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||||
|
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||||
|
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
|
||||||
|
:skipRcPre
|
||||||
|
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
set ERROR_CODE=0
|
||||||
|
|
||||||
|
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
@REM ==== START VALIDATION ====
|
||||||
|
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME not found in your environment. >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
:OkJHome
|
||||||
|
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||||
|
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
@REM ==== END VALIDATION ====
|
||||||
|
|
||||||
|
:init
|
||||||
|
|
||||||
|
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||||
|
@REM Fallback to current working directory if not found.
|
||||||
|
|
||||||
|
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||||
|
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||||
|
|
||||||
|
set EXEC_DIR=%CD%
|
||||||
|
set WDIR=%EXEC_DIR%
|
||||||
|
:findBaseDir
|
||||||
|
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||||
|
cd ..
|
||||||
|
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||||
|
set WDIR=%CD%
|
||||||
|
goto findBaseDir
|
||||||
|
|
||||||
|
:baseDirFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
goto endDetectBaseDir
|
||||||
|
|
||||||
|
:baseDirNotFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
|
||||||
|
:endDetectBaseDir
|
||||||
|
|
||||||
|
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||||
|
|
||||||
|
@setlocal EnableExtensions EnableDelayedExpansion
|
||||||
|
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||||
|
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||||
|
|
||||||
|
:endReadAdditionalConfig
|
||||||
|
|
||||||
|
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||||
|
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||||
|
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
|
||||||
|
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||||
|
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
|
||||||
|
)
|
||||||
|
|
||||||
|
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||||
|
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||||
|
if exist %WRAPPER_JAR% (
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Found %WRAPPER_JAR%
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
if not "%MVNW_REPOURL%" == "" (
|
||||||
|
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
)
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||||
|
echo Downloading from: %WRAPPER_URL%
|
||||||
|
)
|
||||||
|
|
||||||
|
powershell -Command "&{"^
|
||||||
|
"$webclient = new-object System.Net.WebClient;"^
|
||||||
|
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||||
|
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||||
|
"}"^
|
||||||
|
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
|
||||||
|
"}"
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Finished downloading %WRAPPER_JAR%
|
||||||
|
)
|
||||||
|
)
|
||||||
|
@REM End of extension
|
||||||
|
|
||||||
|
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||||
|
SET WRAPPER_SHA_256_SUM=""
|
||||||
|
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||||
|
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
|
||||||
|
)
|
||||||
|
IF NOT %WRAPPER_SHA_256_SUM%=="" (
|
||||||
|
powershell -Command "&{"^
|
||||||
|
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
|
||||||
|
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
|
||||||
|
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
|
||||||
|
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
|
||||||
|
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
|
||||||
|
" exit 1;"^
|
||||||
|
"}"^
|
||||||
|
"}"
|
||||||
|
if ERRORLEVEL 1 goto error
|
||||||
|
)
|
||||||
|
|
||||||
|
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||||
|
@REM work with both Windows and non-Windows executions.
|
||||||
|
set MAVEN_CMD_LINE_ARGS=%*
|
||||||
|
|
||||||
|
%MAVEN_JAVA_EXE% ^
|
||||||
|
%JVM_CONFIG_MAVEN_PROPS% ^
|
||||||
|
%MAVEN_OPTS% ^
|
||||||
|
%MAVEN_DEBUG_OPTS% ^
|
||||||
|
-classpath %WRAPPER_JAR% ^
|
||||||
|
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
|
||||||
|
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||||
|
if ERRORLEVEL 1 goto error
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:error
|
||||||
|
set ERROR_CODE=1
|
||||||
|
|
||||||
|
:end
|
||||||
|
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||||
|
|
||||||
|
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
|
||||||
|
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||||
|
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
|
||||||
|
:skipRcPost
|
||||||
|
|
||||||
|
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||||
|
if "%MAVEN_BATCH_PAUSE%"=="on" pause
|
||||||
|
|
||||||
|
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
|
||||||
|
|
||||||
|
cmd /C exit /B %ERROR_CODE%
|
|
@ -0,0 +1,147 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<!-- <parent>-->
|
||||||
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
|
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
|
||||||
|
<!-- <version>3.2.2</version>-->
|
||||||
|
<!-- <relativePath/> <!– lookup parent from repository –>-->
|
||||||
|
<!-- </parent>-->
|
||||||
|
<groupId>org.aohe</groupId>
|
||||||
|
<artifactId>scan-service</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>scan-service</name>
|
||||||
|
<description>scan-service</description>
|
||||||
|
<properties>
|
||||||
|
<java.version>8</java.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.java-websocket</groupId>
|
||||||
|
<artifactId>Java-WebSocket</artifactId>
|
||||||
|
<version>1.5.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-all</artifactId>
|
||||||
|
<version>5.8.25</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.googlecode.jfreesane</groupId>
|
||||||
|
<artifactId>jfreesane</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.fastjson2</groupId>
|
||||||
|
<artifactId>fastjson2</artifactId>
|
||||||
|
<version>2.0.45</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.aohe</groupId>
|
||||||
|
<artifactId>twain-service</artifactId>
|
||||||
|
<version>0.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<!-- <plugin>-->
|
||||||
|
<!-- <groupId>org.graalvm.buildtools</groupId>-->
|
||||||
|
<!-- <artifactId>native-maven-plugin</artifactId>-->
|
||||||
|
<!-- </plugin>-->
|
||||||
|
<!-- <plugin>-->
|
||||||
|
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
||||||
|
<!-- <artifactId>maven-assembly-plugin</artifactId>-->
|
||||||
|
<!-- <version>2.3</version>-->
|
||||||
|
<!-- <configuration>-->
|
||||||
|
<!-- <!–如果不想在打包的后缀加上 assembly.xml 中设置的 id,可以加上下面的配置–>-->
|
||||||
|
<!-- <appendAssemblyId>false</appendAssemblyId>-->
|
||||||
|
<!-- <descriptorRefs>-->
|
||||||
|
<!-- <descriptorRef>jar-with-dependencies</descriptorRef>-->
|
||||||
|
<!-- </descriptorRefs>-->
|
||||||
|
<!-- <archive>-->
|
||||||
|
<!-- <manifest>-->
|
||||||
|
<!-- <!– 是否绑定依赖,将外部 jar 包依赖加入到 classPath 中 –>-->
|
||||||
|
<!-- <addClasspath>true</addClasspath>-->
|
||||||
|
<!-- <!– 依赖前缀,与之前设置的文件夹路径要匹配 –>-->
|
||||||
|
<!-- <classpathPrefix>lib/</classpathPrefix>-->
|
||||||
|
<!-- <!– 执行的主程序入口 –>-->
|
||||||
|
<!-- <mainClass>org.aohe.scanservice.Main</mainClass>-->
|
||||||
|
<!-- </manifest>-->
|
||||||
|
<!-- </archive>-->
|
||||||
|
<!-- </configuration>-->
|
||||||
|
<!-- <executions>-->
|
||||||
|
<!-- <execution>-->
|
||||||
|
<!-- <id>make-assembly</id>-->
|
||||||
|
<!-- <!–绑定的 maven 操作–>-->
|
||||||
|
<!-- <phase>package</phase>-->
|
||||||
|
<!-- <goals>-->
|
||||||
|
<!-- <goal>assembly</goal>-->
|
||||||
|
<!-- </goals>-->
|
||||||
|
<!-- </execution>-->
|
||||||
|
<!-- </executions>-->
|
||||||
|
<!-- </plugin>-->
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.graalvm.nativeimage</groupId>
|
||||||
|
<artifactId>native-image-maven-plugin</artifactId>
|
||||||
|
<version>21.2.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>native-image</goal>
|
||||||
|
</goals>
|
||||||
|
<phase>package</phase>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<skip>false</skip>
|
||||||
|
<imageName>scan-service</imageName>
|
||||||
|
<mainClass>org.aohe.scanservice.Main</mainClass>
|
||||||
|
<buildArgs>
|
||||||
|
--no-fallback
|
||||||
|
</buildArgs>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-dependencies</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${project.build.directory}/lib</outputDirectory>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<!-- <plugin>-->
|
||||||
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
|
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
|
||||||
|
<!-- <configuration>-->
|
||||||
|
<!-- <excludes>-->
|
||||||
|
<!-- <exclude>-->
|
||||||
|
<!-- <groupId>org.projectlombok</groupId>-->
|
||||||
|
<!-- <artifactId>lombok</artifactId>-->
|
||||||
|
<!-- </exclude>-->
|
||||||
|
<!-- </excludes>-->
|
||||||
|
<!-- </configuration>-->
|
||||||
|
<!-- </plugin>-->
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.aohe.scanservice;
|
||||||
|
|
||||||
|
import cn.hutool.core.net.NetUtil;
|
||||||
|
import org.aohe.scanservice.web.SocketServer;
|
||||||
|
import sun.nio.ch.Net;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) throws IOException, InterruptedException {
|
||||||
|
int port = 8997; // 843 flash policy port
|
||||||
|
//isInnerIP
|
||||||
|
|
||||||
|
SocketServer s = new SocketServer(port);
|
||||||
|
s.start();
|
||||||
|
System.out.println("scan-service started on port: " + s.getPort());
|
||||||
|
|
||||||
|
BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
while (true) {
|
||||||
|
String in = sysin.readLine();
|
||||||
|
s.broadcast(in);
|
||||||
|
if (in.equals("exit")) {
|
||||||
|
s.stop(1000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
//package org.aohe.scanservice;
|
||||||
|
//
|
||||||
|
//import org.springframework.boot.SpringApplication;
|
||||||
|
//import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
//
|
||||||
|
//@SpringBootApplication
|
||||||
|
//public class ScanServiceApplication {
|
||||||
|
//
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
// SpringApplication.run(ScanServiceApplication.class, args);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
|
@ -0,0 +1,129 @@
|
||||||
|
package org.aohe.scanservice.control;
|
||||||
|
|
||||||
|
import au.com.southsky.jfreesane.SaneDevice;
|
||||||
|
import au.com.southsky.jfreesane.SaneException;
|
||||||
|
import cn.hutool.core.codec.Base64;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aohe.scanservice.core.SaneSessionUtils;
|
||||||
|
import org.aohe.scanservice.result.R;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class SaneOperational {
|
||||||
|
|
||||||
|
public static String selectOperational(String path) {
|
||||||
|
|
||||||
|
JSONObject json = JSONObject.parse(path);
|
||||||
|
|
||||||
|
//操作符
|
||||||
|
String function = json.getString("function");
|
||||||
|
|
||||||
|
//参数符
|
||||||
|
JSONObject param = json.getJSONObject("params");
|
||||||
|
|
||||||
|
R r = R.ok();
|
||||||
|
try {
|
||||||
|
if("001001".equals(function)){
|
||||||
|
//获取扫描仪列表
|
||||||
|
r = getDeviceList();
|
||||||
|
} else if ("001002".equals(function)) {
|
||||||
|
//选择扫描仪
|
||||||
|
r = setScanner(param.getString("scannerId"));
|
||||||
|
}else if ("001003".equals(function)){
|
||||||
|
//获取扫描仪操作符列表
|
||||||
|
// r = getDeviceOperations();
|
||||||
|
}else if ("001004".equals(function)){
|
||||||
|
//r = setDeviceOperations();
|
||||||
|
}else if ("001007".equals(function)){
|
||||||
|
//r = setDeviceOperations(param);
|
||||||
|
}else if ("001008".equals(function)){
|
||||||
|
r = startScan(param);
|
||||||
|
}else if ("001012".equals(function)){
|
||||||
|
//closeTwSource();
|
||||||
|
}else if ("001013".equals(function)){
|
||||||
|
//closeTwSource();
|
||||||
|
}else if ("001015".equals(function)){
|
||||||
|
//r = startScan(param.getString("scannerId"),true);
|
||||||
|
}else if ("001016".equals(function)){
|
||||||
|
//r = startScan(param.getString("scannerId"),true);
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info("Error , ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return r.toJsonStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 001001 获取扫描仪列表
|
||||||
|
* @return 返回扫描仪列表
|
||||||
|
*/
|
||||||
|
public static R getDeviceList(){
|
||||||
|
try {
|
||||||
|
List<SaneDevice> saneDevices = SaneSessionUtils.getSaneDrivers();
|
||||||
|
List<String> names = saneDevices.stream().map(SaneDevice::getName).collect(Collectors.toList());
|
||||||
|
return R.ok(names);
|
||||||
|
} catch (IOException | SaneException e) {
|
||||||
|
log.error("Not found scan list", e);
|
||||||
|
return R.fail("Not found scan list");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String saneDrivers = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 001002 选择扫描仪
|
||||||
|
* @param scannerId 扫描仪id
|
||||||
|
* @return 返回成功
|
||||||
|
*/
|
||||||
|
public static R setScanner(String scannerId){
|
||||||
|
try {
|
||||||
|
if(saneDrivers == null){
|
||||||
|
saneDrivers = scannerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
SaneSessionUtils.setSaneDevice(scannerId);
|
||||||
|
return R.ok();
|
||||||
|
} catch (SaneException | IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 001007 设置扫描仪参数
|
||||||
|
* @param params 扫描仪参数
|
||||||
|
* @return 返回成功
|
||||||
|
*/
|
||||||
|
// public static R setDeviceOperations(JSONObject params){
|
||||||
|
// try {
|
||||||
|
// SaneSeesionUtils.setOption(params);
|
||||||
|
// } catch (TwainException e) {
|
||||||
|
// log.error("scan setting is not set", e);
|
||||||
|
// return R.fail("scan setting is not set, please select scan ");
|
||||||
|
// }
|
||||||
|
// return R.ok();
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static R startScan(JSONObject params){
|
||||||
|
try {
|
||||||
|
File files = SaneSessionUtils.getSaneFile();
|
||||||
|
Map<String,String> map = new HashMap<>();
|
||||||
|
map.put(files.getName(),Base64.encode(files));
|
||||||
|
List<Map<String,String>> list = new ArrayList<>();
|
||||||
|
list.add(map);
|
||||||
|
|
||||||
|
return R.ok(list);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,129 @@
|
||||||
|
package org.aohe.scanservice.control;
|
||||||
|
|
||||||
|
import cn.hutool.core.codec.Base64;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aohe.exceptions.TwainException;
|
||||||
|
import org.aohe.scanservice.core.TwainUtils;
|
||||||
|
import org.aohe.scanservice.result.R;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class TwainOperational{
|
||||||
|
|
||||||
|
public static String selectOperational(String path) {
|
||||||
|
JSONObject json = JSONObject.parse(path);
|
||||||
|
|
||||||
|
//操作符
|
||||||
|
String function = json.getString("function");
|
||||||
|
|
||||||
|
//参数符
|
||||||
|
JSONObject param = json.getJSONObject("params");
|
||||||
|
|
||||||
|
R r = R.ok();
|
||||||
|
try {
|
||||||
|
if("001001".equals(function)){
|
||||||
|
//获取扫描仪列表
|
||||||
|
r = getDeviceList();
|
||||||
|
} else if ("001002".equals(function)) {
|
||||||
|
//选择扫描仪
|
||||||
|
r = setScanner(param.getString("scannerId"));
|
||||||
|
}else if ("001003".equals(function)){
|
||||||
|
//获取扫描仪操作符列表
|
||||||
|
// r = getDeviceOperations();
|
||||||
|
}else if ("001004".equals(function)){
|
||||||
|
//r = setDeviceOperations();
|
||||||
|
}else if ("001007".equals(function)){
|
||||||
|
r = setDeviceOperations(param);
|
||||||
|
}else if ("001008".equals(function)){
|
||||||
|
r = startScan(param);
|
||||||
|
}else if ("001012".equals(function)){
|
||||||
|
//closeTwSource();
|
||||||
|
}else if ("001013".equals(function)){
|
||||||
|
//closeTwSource();
|
||||||
|
}else if ("001015".equals(function)){
|
||||||
|
//r = startScan(param.getString("scannerId"),true);
|
||||||
|
}else if ("001016".equals(function)){
|
||||||
|
//r = startScan(param.getString("scannerId"),true);
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info("Error , ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return r.toJsonStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 001001 获取扫描仪列表
|
||||||
|
* @return 返回扫描仪列表
|
||||||
|
*/
|
||||||
|
public static R getDeviceList(){
|
||||||
|
try {
|
||||||
|
return R.ok(TwainUtils.getDeviceList());
|
||||||
|
} catch (TwainException e) {
|
||||||
|
log.error("Not found scan list", e);
|
||||||
|
return R.fail("Not found scan list");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 001002 选择扫描仪
|
||||||
|
* @param scannerId 扫描仪id
|
||||||
|
* @return 返回成功
|
||||||
|
*/
|
||||||
|
public static R setScanner(String scannerId){
|
||||||
|
try {
|
||||||
|
TwainUtils.setDevice(scannerId);
|
||||||
|
return R.ok();
|
||||||
|
} catch (TwainException e) {
|
||||||
|
log.error("scan device is not found", e);
|
||||||
|
return R.fail("scan device is not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 001007 设置扫描仪参数
|
||||||
|
* @param params 扫描仪参数
|
||||||
|
* @return 返回成功
|
||||||
|
*/
|
||||||
|
public static R setDeviceOperations(JSONObject params){
|
||||||
|
try {
|
||||||
|
TwainUtils.setOption(params);
|
||||||
|
} catch (TwainException e) {
|
||||||
|
log.error("scan setting is not set", e);
|
||||||
|
return R.fail("scan setting is not set, please select scan ");
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static R startScan(JSONObject params){
|
||||||
|
List<Map<String, String>> base64Files;
|
||||||
|
try {
|
||||||
|
|
||||||
|
List<File> files;
|
||||||
|
if(params != null){
|
||||||
|
files = TwainUtils.scan(params.getString("scannerId"), params);
|
||||||
|
}else{
|
||||||
|
files = TwainUtils.scan();
|
||||||
|
}
|
||||||
|
|
||||||
|
base64Files = files.stream().map(t -> {
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put(t.getName(), Base64.encode(t));
|
||||||
|
return map;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
} catch (TwainException e) {
|
||||||
|
log.error("scan fail , device has problem", e);
|
||||||
|
return R.fail("scan fail , device has problem");
|
||||||
|
}
|
||||||
|
return R.ok(base64Files);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,174 @@
|
||||||
|
package org.aohe.scanservice.core;
|
||||||
|
|
||||||
|
import au.com.southsky.jfreesane.SaneDevice;
|
||||||
|
import au.com.southsky.jfreesane.SaneException;
|
||||||
|
import au.com.southsky.jfreesane.SaneSession;
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aohe.scanservice.utils.RemoteConfig;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class SaneSessionUtils {
|
||||||
|
|
||||||
|
private static final Object lock = new Object();
|
||||||
|
|
||||||
|
private static volatile SaneSession saneSession;
|
||||||
|
|
||||||
|
private static volatile SaneDevice saneDevice;
|
||||||
|
|
||||||
|
private static final RemoteConfig remoteConfig = RemoteConfig.getInstance();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取一个SaneSession实例,用于与SANE设备进行通信
|
||||||
|
* @return SaneSession实例
|
||||||
|
* @throws IOException 如果获取SaneSession实例时发生I/O错误
|
||||||
|
*/
|
||||||
|
public static SaneSession getSaneSession() throws IOException {
|
||||||
|
log.info("saneSession状态:{}", saneSession != null);
|
||||||
|
if (saneSession == null) {
|
||||||
|
synchronized(lock){
|
||||||
|
if (saneSession == null) {
|
||||||
|
log.info("jFreeSaneConfig:" + JSON.toJSONString(remoteConfig));
|
||||||
|
InetAddress address = InetAddress.getByName(remoteConfig.getIp());
|
||||||
|
saneSession = SaneSession.withRemoteSane(address);
|
||||||
|
log.info("初始化saneSession完成,状态:{}", saneSession != null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return saneSession;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭SaneSession对象,如果对象不为null
|
||||||
|
*/
|
||||||
|
public static void closeSaneSession() {
|
||||||
|
if (saneSession != null) {
|
||||||
|
try {
|
||||||
|
saneSession.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
saneSession = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有的SANE驱动器设备列表
|
||||||
|
*
|
||||||
|
* @return SANE驱动器设备列表
|
||||||
|
* @throws IOException 如果在通信中发生I/O错误
|
||||||
|
* @throws SaneException 如果在与SANE交互中发生错误
|
||||||
|
*/
|
||||||
|
public static List<SaneDevice> getSaneDrivers() throws IOException, SaneException {
|
||||||
|
return getSaneSession().listDevices();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置Sane设备
|
||||||
|
* @param name 设备名称
|
||||||
|
* @return 设备对象
|
||||||
|
* @throws IOException 输入/输出异常
|
||||||
|
* @throws SaneException Sane异常
|
||||||
|
*/
|
||||||
|
public static SaneDevice setSaneDevice(String name) throws IOException, SaneException {
|
||||||
|
if (saneDevice == null || !saneDevice.getName().equals(name)) {
|
||||||
|
if (saneDevice != null && saneDevice.isOpen()) {
|
||||||
|
// 关闭当前在使用的SANE设备
|
||||||
|
saneDevice.close();
|
||||||
|
}
|
||||||
|
saneDevice = saneSession
|
||||||
|
.listDevices().stream().filter(s -> name.equals(s.getName())).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
return saneDevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Sane设备(如果不存在则返回null)
|
||||||
|
* @return Sane设备
|
||||||
|
*/
|
||||||
|
public static SaneDevice getDevice() {
|
||||||
|
return saneDevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定名称的Sane设备,如果设备不存在则返回null
|
||||||
|
* @param name 设备名称
|
||||||
|
* @return 指定名称的Sane设备
|
||||||
|
* @throws RuntimeException 运行时异常
|
||||||
|
*/
|
||||||
|
public static SaneDevice getDevice(String name) {
|
||||||
|
try {
|
||||||
|
return setSaneDevice(name);
|
||||||
|
} catch (IOException | SaneException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取一个正常的文件
|
||||||
|
* 打开Sane设备
|
||||||
|
* 通过Sane设备获取图像
|
||||||
|
* 创建或更新最后访问时间的文件
|
||||||
|
* 将图像写入文件
|
||||||
|
* 返回文件
|
||||||
|
* @throws RuntimeException - 如果发生I/O错误
|
||||||
|
*/
|
||||||
|
public static File getSaneFile() throws IOException {
|
||||||
|
try {
|
||||||
|
saneDevice.open();
|
||||||
|
BufferedImage bufferedImage = saneDevice.acquireImage();
|
||||||
|
File file = FileUtil.createTempFile("sane","png",true);
|
||||||
|
ImageIO.write(bufferedImage, "png", file);
|
||||||
|
return file;
|
||||||
|
} catch (IOException | SaneException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}finally {
|
||||||
|
if(saneDevice != null){
|
||||||
|
saneDevice.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 释放资源
|
||||||
|
*/
|
||||||
|
public static void resource(){
|
||||||
|
try {
|
||||||
|
if(saneDevice != null){
|
||||||
|
closeSaneDevice();
|
||||||
|
}
|
||||||
|
if(saneSession != null){
|
||||||
|
closeSaneSession();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭Sane设备
|
||||||
|
*/
|
||||||
|
public static void closeSaneDevice() throws IOException {
|
||||||
|
if(saneDevice != null){
|
||||||
|
try {
|
||||||
|
saneDevice.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IOException(e);
|
||||||
|
}
|
||||||
|
saneDevice = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
package org.aohe.scanservice.core;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import org.aohe.core.twain.Twain;
|
||||||
|
import org.aohe.core.twain.TwainScanner;
|
||||||
|
import org.aohe.exceptions.TwainException;
|
||||||
|
import org.aohe.scan.Source;
|
||||||
|
import org.aohe.scan.SourceManager;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class TwainUtils {
|
||||||
|
|
||||||
|
private static String deviceName = null;
|
||||||
|
|
||||||
|
private static Collection<Source> sources = null;
|
||||||
|
|
||||||
|
private static Source source = null;
|
||||||
|
/**
|
||||||
|
* 获取设备列表
|
||||||
|
* @return 设备列表
|
||||||
|
* @throws TwainException 系统错误
|
||||||
|
*/
|
||||||
|
public static List<String> getDeviceList() throws TwainException {
|
||||||
|
sources = SourceManager.instance().getSources();
|
||||||
|
return sources.stream().map(Source::getName).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置设备
|
||||||
|
* @param name 设备名称
|
||||||
|
* @throws TwainException 系统错误
|
||||||
|
*/
|
||||||
|
public static void setDevice(String name) throws TwainException {
|
||||||
|
if(name != null && !name.equals(deviceName)){
|
||||||
|
for(Source s : getSources()){
|
||||||
|
if(StrUtil.equals(s.getName(), name)){
|
||||||
|
deviceName = name;
|
||||||
|
source = s;
|
||||||
|
//默认不使用系统UI
|
||||||
|
source.setSystemUI(false);
|
||||||
|
|
||||||
|
TwainScanner.getScanner().select(name);
|
||||||
|
Twain.getSourceManager().selectSource(name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(source == null){
|
||||||
|
throw new TwainException("scan device is not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BW - 0
|
||||||
|
* COLOR - 2
|
||||||
|
* GRAYSCALE - 1
|
||||||
|
* true ->auto
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* 设置参数
|
||||||
|
* @param params 参数 Dpi ->double 0-bw 2-color 1-gray true-auto
|
||||||
|
* @throws TwainException 系统错误
|
||||||
|
*/
|
||||||
|
public static void setOption(JSONObject params) throws TwainException {
|
||||||
|
if(source == null){
|
||||||
|
throw new TwainException("please first set device");
|
||||||
|
}
|
||||||
|
if(params == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Double key = params.getDouble("dpi");
|
||||||
|
if(key != null){
|
||||||
|
source.setDpi(key.intValue());
|
||||||
|
}
|
||||||
|
Integer mode = params.getInteger("mode");
|
||||||
|
if(mode != null){
|
||||||
|
switch (mode){
|
||||||
|
case 0:
|
||||||
|
source.setColor(Source.ColorMode.BW);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
source.setColor(Source.ColorMode.GRAYSCALE);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
default:
|
||||||
|
source.setColor(Source.ColorMode.COLOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Boolean paperMode = params.getBoolean("paperMode");
|
||||||
|
if(paperMode != null){
|
||||||
|
source.setAutoDocumentFeeder(paperMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
Boolean systemUI = params.getBoolean("systemUI");
|
||||||
|
if(systemUI != null){
|
||||||
|
source.setSystemUI(systemUI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描
|
||||||
|
* @param name 设备名称
|
||||||
|
* @param params 参数
|
||||||
|
* @return 文件列表
|
||||||
|
*/
|
||||||
|
public static List<File> scan(String name, JSONObject params) throws TwainException {
|
||||||
|
source = getSource(name);
|
||||||
|
setOption(params);
|
||||||
|
return source.scan();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用已选中的扫描仪扫描
|
||||||
|
* @return 文件列表
|
||||||
|
*/
|
||||||
|
public static List<File> scan() throws TwainException {
|
||||||
|
return scan(deviceName, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取设备
|
||||||
|
* @param name 设备名称
|
||||||
|
* @return 设备
|
||||||
|
*/
|
||||||
|
public static Source getSource(String name){
|
||||||
|
return sources.stream().filter(source -> source.getName().equals(name)).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Collection<Source> getSources() throws TwainException {
|
||||||
|
if(sources == null || sources.isEmpty()){
|
||||||
|
sources = SourceManager.instance().getSources();
|
||||||
|
}
|
||||||
|
return sources;
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static void main(String[] args) throws TwainException {
|
||||||
|
// Collection<Source> sda = SourceManager.instance().getSources();
|
||||||
|
// Source source = sda.stream().findFirst().get();
|
||||||
|
// source.setDpi(200);
|
||||||
|
// source.setColor(Source.ColorMode.COLOR);
|
||||||
|
// List<File> files = source.scan();
|
||||||
|
// System.out.println(files.get(0).getName());
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置
|
||||||
|
*/
|
||||||
|
public static void resource(){
|
||||||
|
deviceName = null;
|
||||||
|
sources = null;
|
||||||
|
source = null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package org.aohe.scanservice.result;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class R<T> {
|
||||||
|
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
private String msg;
|
||||||
|
|
||||||
|
private T data;
|
||||||
|
|
||||||
|
private boolean success;
|
||||||
|
|
||||||
|
public R (String code, String msg, T data, boolean success) {
|
||||||
|
this.code = code;
|
||||||
|
this.msg = msg;
|
||||||
|
this.data = data;
|
||||||
|
this.success = success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static R ok(Object data) {
|
||||||
|
return new R<>("200", "ok", data, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static R ok() {
|
||||||
|
return new R<>("200", "ok", null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static R fail(String msg) {
|
||||||
|
return new R<>("500", msg, null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toJsonStr() {
|
||||||
|
return JSONUtil.toJsonStr(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package org.aohe.scanservice.utils;
|
||||||
|
|
||||||
|
import cn.hutool.setting.Setting;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class RemoteConfig {
|
||||||
|
|
||||||
|
private String ip = "127.0.0.1";
|
||||||
|
|
||||||
|
RemoteConfig() {
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoteConfig(String ip) {
|
||||||
|
this.ip = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RemoteConfig getInstance(){
|
||||||
|
String ip = new Setting("config.setting").get("ip");
|
||||||
|
if(ip != null){
|
||||||
|
return new RemoteConfig(ip);
|
||||||
|
}
|
||||||
|
return new RemoteConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package org.aohe.scanservice.utils;
|
||||||
|
|
||||||
|
public class SystemUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断操作系统是否是 Windows
|
||||||
|
*
|
||||||
|
* @return true:操作系统是 Windows
|
||||||
|
* false:其它操作系统
|
||||||
|
*/
|
||||||
|
public static boolean isWindows() {
|
||||||
|
String osName = getOsName();
|
||||||
|
|
||||||
|
return osName != null && osName.startsWith("Windows");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断操作系统是否是 MacOS
|
||||||
|
*
|
||||||
|
* @return true:操作系统是 MacOS
|
||||||
|
* false:其它操作系统
|
||||||
|
*/
|
||||||
|
public static boolean isMacOs() {
|
||||||
|
String osName = getOsName();
|
||||||
|
|
||||||
|
return osName != null && osName.startsWith("Mac");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断操作系统是否是 Linux
|
||||||
|
*
|
||||||
|
* @return true:操作系统是 Linux
|
||||||
|
* false:其它操作系统
|
||||||
|
*/
|
||||||
|
public static boolean isLinux() {
|
||||||
|
String osName = getOsName();
|
||||||
|
|
||||||
|
return (osName != null && osName.startsWith("Linux")) || (!isWindows() && !isMacOs());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取操作系统名称
|
||||||
|
* @return os.name 属性值
|
||||||
|
*/
|
||||||
|
public static String getOsName() {
|
||||||
|
return System.getProperty("os.name");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
//package org.aohe.scanservice.web;
|
||||||
|
//
|
||||||
|
//import cn.hutool.system.SystemUtil;
|
||||||
|
//import jakarta.websocket.*;
|
||||||
|
//import jakarta.websocket.server.ServerEndpoint;
|
||||||
|
//import lombok.extern.slf4j.Slf4j;
|
||||||
|
//import org.aohe.scanservice.control.TwainOperational;
|
||||||
|
//import org.aohe.scanservice.result.R;
|
||||||
|
//import org.springframework.stereotype.Component;
|
||||||
|
//
|
||||||
|
//@Slf4j
|
||||||
|
//@ServerEndpoint("/scanSocket")// 接口路径 ws://localhost:8087/webSocket/userId;
|
||||||
|
//@Component
|
||||||
|
//public class ScanSocket {
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 链接成功调用的方法
|
||||||
|
// */
|
||||||
|
// @OnOpen
|
||||||
|
// public void onOpen() {
|
||||||
|
// log.info("客户端已接入,当前客户端系统为:{}", SystemUtil.getOsInfo().getName());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 链接关闭调用的方法
|
||||||
|
// */
|
||||||
|
// @OnClose
|
||||||
|
// public void onClose() {
|
||||||
|
// log.info("客户端已断开,客户端系统为:{}", SystemUtil.getOsInfo().getName());
|
||||||
|
// }
|
||||||
|
// /**
|
||||||
|
// * 收到客户端消息后调用的方法
|
||||||
|
// *
|
||||||
|
// * @param message
|
||||||
|
// */
|
||||||
|
// @OnMessage
|
||||||
|
// public String onMessage(String message) {
|
||||||
|
// log.info("【websocket 消息】收到客户端消息:"+message);
|
||||||
|
// String result ;
|
||||||
|
// if (SystemUtil.getOsInfo().isWindows()) {
|
||||||
|
// result = TwainOperational.selectOperational(message);
|
||||||
|
// } else if(SystemUtil.getOsInfo().isLinux()) {
|
||||||
|
// result = R.ok("还在更新,稍等...").toJsonStr();
|
||||||
|
// }else {
|
||||||
|
// result = R.fail("无对应操作系统").toJsonStr();
|
||||||
|
// }
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /** 发送错误时的处理
|
||||||
|
// * @param session
|
||||||
|
// * @param error
|
||||||
|
// */
|
||||||
|
// @OnError
|
||||||
|
// public void onError(Session session, Throwable error) {
|
||||||
|
// log.error("用户错误,原因:"+error.getMessage());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // 此为广播消息
|
||||||
|
// public void sendAllMessage(String message) {
|
||||||
|
// log.info("【websocket 消息】广播消息:"+message);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 此为单点消息
|
||||||
|
// public void sendOneMessage(String userId, String message) {
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 此为单点消息(多人)
|
||||||
|
// public void sendMoreMessage(String[] userIds, String message) {
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
|
@ -0,0 +1,92 @@
|
||||||
|
package org.aohe.scanservice.web;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import cn.hutool.log.Log;
|
||||||
|
import cn.hutool.log.LogFactory;
|
||||||
|
import org.aohe.scanservice.control.SaneOperational;
|
||||||
|
import org.aohe.scanservice.control.TwainOperational;
|
||||||
|
import org.aohe.scanservice.core.SaneSessionUtils;
|
||||||
|
import org.aohe.scanservice.core.TwainUtils;
|
||||||
|
import org.aohe.scanservice.result.R;
|
||||||
|
import org.aohe.scanservice.utils.SystemUtils;
|
||||||
|
import org.java_websocket.WebSocket;
|
||||||
|
import org.java_websocket.handshake.ClientHandshake;
|
||||||
|
import org.java_websocket.server.WebSocketServer;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
|
||||||
|
public class SocketServer extends WebSocketServer {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.get();
|
||||||
|
|
||||||
|
public SocketServer(int port) throws UnknownHostException {
|
||||||
|
super(new InetSocketAddress(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
public SocketServer(int port, String path) throws UnknownHostException {
|
||||||
|
super(new InetSocketAddress(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
public SocketServer(InetSocketAddress address) {
|
||||||
|
super(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onOpen(WebSocket conn, ClientHandshake handshake) {
|
||||||
|
conn.send("Welcome to the scan-server!"); // This method sends a message to the new client
|
||||||
|
//broadcast("new connection: " + handshake.getResourceDescriptor()); // This method sends a message to all clients connected
|
||||||
|
//System.out.println(conn.getRemoteSocketAddress().getAddress().getHostAddress() + " entered the room!");
|
||||||
|
log.info("client is open ,client system is: {}", SystemUtils.getOsName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
|
||||||
|
log.info("client is closed , client system is : {}", SystemUtils.getOsName());
|
||||||
|
//这里执行关闭扫描仪连接
|
||||||
|
if(SystemUtils.isWindows()){
|
||||||
|
TwainUtils.resource();
|
||||||
|
} else if (SystemUtils.isLinux()) {
|
||||||
|
SaneSessionUtils.resource();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(WebSocket conn, String message) {
|
||||||
|
log.info("User send Data: \n"+message);
|
||||||
|
String result;
|
||||||
|
if(!JSONUtil.isTypeJSON(message)){
|
||||||
|
result = R.fail("Illegal parameters, not of json type").toJsonStr();
|
||||||
|
}else {
|
||||||
|
if (SystemUtils.isWindows()) {
|
||||||
|
result = TwainOperational.selectOperational(message);
|
||||||
|
} else if(SystemUtils.isLinux()) {
|
||||||
|
result = SaneOperational.selectOperational(message);
|
||||||
|
}else {
|
||||||
|
result = R.fail("No corresponding operating system").toJsonStr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.info("Return data: \n"+result);
|
||||||
|
conn.send(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(WebSocket conn, Exception ex) {
|
||||||
|
log.error("error :"+ex.getMessage(),ex);
|
||||||
|
if (conn != null) {
|
||||||
|
//绑定不到就退出
|
||||||
|
//System.exit(0);
|
||||||
|
// some errors like port binding failed may not be assignable to a specific
|
||||||
|
// websocket
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
System.out.println("Server started!");
|
||||||
|
setConnectionLostTimeout(0);
|
||||||
|
setConnectionLostTimeout(100);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: org.aohe.scanservice.Main
|
||||||
|
|
|
@ -0,0 +1,171 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name":"[Ljava.lang.Object;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Callback"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.CallbackProxy",
|
||||||
|
"methods":[{"name":"callback","parameterTypes":["java.lang.Object[]"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.CallbackReference",
|
||||||
|
"methods":[{"name":"getCallback","parameterTypes":["java.lang.Class","com.sun.jna.Pointer","boolean"] }, {"name":"getFunctionPointer","parameterTypes":["com.sun.jna.Callback","boolean"] }, {"name":"getNativeString","parameterTypes":["java.lang.Object","boolean"] }, {"name":"initializeThread","parameterTypes":["com.sun.jna.Callback","com.sun.jna.CallbackReference$AttachOptions"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.CallbackReference$AttachOptions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.IntegerType",
|
||||||
|
"fields":[{"name":"value"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.JNIEnv"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Native",
|
||||||
|
"methods":[{"name":"dispose","parameterTypes":[] }, {"name":"fromNative","parameterTypes":["com.sun.jna.FromNativeConverter","java.lang.Object","java.lang.reflect.Method"] }, {"name":"fromNative","parameterTypes":["java.lang.Class","java.lang.Object"] }, {"name":"fromNative","parameterTypes":["java.lang.reflect.Method","java.lang.Object"] }, {"name":"nativeType","parameterTypes":["java.lang.Class"] }, {"name":"toNative","parameterTypes":["com.sun.jna.ToNativeConverter","java.lang.Object"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Native$ffi_callback",
|
||||||
|
"methods":[{"name":"invoke","parameterTypes":["long","long","long"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.NativeMapped",
|
||||||
|
"methods":[{"name":"toNative","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Pointer",
|
||||||
|
"fields":[{"name":"peer"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["long"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.PointerType",
|
||||||
|
"fields":[{"name":"pointer"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Structure",
|
||||||
|
"fields":[{"name":"memory"}, {"name":"typeInfo"}],
|
||||||
|
"methods":[{"name":"autoRead","parameterTypes":[] }, {"name":"autoWrite","parameterTypes":[] }, {"name":"getTypeInfo","parameterTypes":[] }, {"name":"newInstance","parameterTypes":["java.lang.Class","long"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Structure$ByValue"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Structure$FFIType$FFITypes",
|
||||||
|
"fields":[{"name":"ffi_type_double"}, {"name":"ffi_type_float"}, {"name":"ffi_type_longdouble"}, {"name":"ffi_type_pointer"}, {"name":"ffi_type_sint16"}, {"name":"ffi_type_sint32"}, {"name":"ffi_type_sint64"}, {"name":"ffi_type_sint8"}, {"name":"ffi_type_uint16"}, {"name":"ffi_type_uint32"}, {"name":"ffi_type_uint64"}, {"name":"ffi_type_uint8"}, {"name":"ffi_type_void"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.WString",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Boolean",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["boolean"] }, {"name":"getBoolean","parameterTypes":["java.lang.String"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Byte",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["byte"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Character",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["char"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Class",
|
||||||
|
"methods":[{"name":"getComponentType","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Double",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["double"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Float",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["float"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Integer",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["int"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Long",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["long"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Object",
|
||||||
|
"methods":[{"name":"toString","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.SecurityManager",
|
||||||
|
"fields":[{"name":"initialized"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Short",
|
||||||
|
"fields":[{"name":"TYPE"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["short"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.String",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["byte[]"] }, {"name":"<init>","parameterTypes":["byte[]","java.lang.String"] }, {"name":"getBytes","parameterTypes":[] }, {"name":"getBytes","parameterTypes":["java.lang.String"] }, {"name":"toCharArray","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.System",
|
||||||
|
"methods":[{"name":"getProperty","parameterTypes":["java.lang.String"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.UnsatisfiedLinkError",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Void",
|
||||||
|
"fields":[{"name":"TYPE"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.reflect.Method",
|
||||||
|
"methods":[{"name":"getParameterTypes","parameterTypes":[] }, {"name":"getReturnType","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.Buffer",
|
||||||
|
"methods":[{"name":"position","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.ByteBuffer",
|
||||||
|
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.CharBuffer",
|
||||||
|
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.DoubleBuffer",
|
||||||
|
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.FloatBuffer",
|
||||||
|
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.IntBuffer",
|
||||||
|
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.LongBuffer",
|
||||||
|
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.ShortBuffer",
|
||||||
|
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"sun.management.VMManagementImpl",
|
||||||
|
"fields":[{"name":"compTimeMonitoringSupport"}, {"name":"currentThreadCpuTimeSupport"}, {"name":"objectMonitorUsageSupport"}, {"name":"otherThreadCpuTimeSupport"}, {"name":"remoteDiagnosticCommandsSupport"}, {"name":"synchronizerUsageSupport"}, {"name":"threadAllocatedMemorySupport"}, {"name":"threadContentionMonitoringSupport"}]
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,8 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type":"agent-extracted",
|
||||||
|
"classes":[
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"interfaces":["com.sun.jna.platform.win32.User32"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"interfaces":["free.lucifer.jtwain.libs.Kernel32"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"interfaces":["free.lucifer.jtwain.libs.Win32Twain"]
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,221 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name":"[B",
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"[Ljava.lang.reflect.Method;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"byte",
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.alibaba.fastjson.JSONArray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.alibaba.fastjson.JSONObject"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.alibaba.fastjson2.JSONFactory$CacheItem",
|
||||||
|
"fields":[{"name":"bytes"}, {"name":"chars"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.alibaba.fastjson2.JSONObject",
|
||||||
|
"queryAllDeclaredConstructors":true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.alibaba.fastjson2.util.TypeUtils$Cache",
|
||||||
|
"fields":[{"name":"chars"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.CallbackProxy",
|
||||||
|
"methods":[{"name":"callback","parameterTypes":["java.lang.Object[]"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Structure$FFIType",
|
||||||
|
"allDeclaredFields":true,
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.Structure$FFIType$size_t",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$ATOM",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$HBRUSH",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$HCURSOR",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$HICON",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$HINSTANCE",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$HWND",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$LPARAM",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$LRESULT",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$POINT",
|
||||||
|
"allDeclaredFields":true,
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["com.sun.jna.Pointer"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinDef$WPARAM",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinNT$HANDLEByReference",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinUser$MSG",
|
||||||
|
"allDeclaredFields":true,
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinUser$WNDCLASSEX",
|
||||||
|
"allDeclaredFields":true,
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"com.sun.jna.platform.win32.WinUser$WindowProc",
|
||||||
|
"queryAllDeclaredMethods":true,
|
||||||
|
"queryAllPublicMethods":true,
|
||||||
|
"methods":[{"name":"callback","parameterTypes":["com.sun.jna.platform.win32.WinDef$HWND","int","com.sun.jna.platform.win32.WinDef$WPARAM","com.sun.jna.platform.win32.WinDef$LPARAM"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"free.lucifer.jtwain.TwainWndProc",
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"free.lucifer.jtwain.libs.Win32Twain$TW_IDENTITY",
|
||||||
|
"allDeclaredFields":true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"free.lucifer.jtwain.libs.Win32Twain$TW_VERSION",
|
||||||
|
"allDeclaredFields":true,
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"<init>","parameterTypes":["com.sun.jna.Pointer"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.beans.Transient"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.Object",
|
||||||
|
"allDeclaredFields":true,
|
||||||
|
"queryAllDeclaredMethods":true,
|
||||||
|
"methods":[{"name":"equals","parameterTypes":["java.lang.Object"] }, {"name":"hashCode","parameterTypes":[] }, {"name":"toString","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.String",
|
||||||
|
"fields":[{"name":"COMPACT_STRINGS"}, {"name":"coder"}, {"name":"value"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["byte[]","byte"] }, {"name":"coder","parameterTypes":[] }, {"name":"isASCII","parameterTypes":["byte[]"] }, {"name":"value","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.StringCoding",
|
||||||
|
"methods":[{"name":"hasNegatives","parameterTypes":["byte[]","int","int"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.invoke.MethodHandles$Lookup",
|
||||||
|
"fields":[{"name":"IMPL_LOOKUP"}],
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["java.lang.Class","java.lang.Class","int"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.management.ManagementFactory",
|
||||||
|
"methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.management.RuntimeMXBean",
|
||||||
|
"methods":[{"name":"getInputArguments","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.lang.reflect.Method",
|
||||||
|
"methods":[{"name":"isVarArgs","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.math.BigDecimal",
|
||||||
|
"fields":[{"name":"intCompact"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.math.BigInteger",
|
||||||
|
"fields":[{"name":"mag"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.nio.Buffer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.security.SecureRandomParameters"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.sql.Date"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.sql.Timestamp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.util.Collections$UnmodifiableCollection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.util.Collections$UnmodifiableMap"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.util.concurrent.atomic.AtomicBoolean",
|
||||||
|
"fields":[{"name":"value"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"java.util.concurrent.atomic.AtomicReference",
|
||||||
|
"fields":[{"name":"value"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"javax.sql.DataSource"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"javax.sql.RowSet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"org.aohe.scanservice.result.R",
|
||||||
|
"allDeclaredFields":true,
|
||||||
|
"queryAllDeclaredMethods":true,
|
||||||
|
"queryAllPublicMethods":true,
|
||||||
|
"methods":[{"name":"getCode","parameterTypes":[] }, {"name":"getData","parameterTypes":[] }, {"name":"getMsg","parameterTypes":[] }, {"name":"isSuccess","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"short",
|
||||||
|
"fields":[{"name":"OPTIONS"}, {"name":"STRING_ENCODING"}, {"name":"STRUCTURE_ALIGNMENT"}, {"name":"TYPE_MAPPER"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"sun.misc.Unsafe",
|
||||||
|
"fields":[{"name":"theUnsafe"}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"sun.security.provider.DRBG",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":["java.security.SecureRandomParameters"] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"sun.security.provider.SHA",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"sun.security.provider.SHA2$SHA256",
|
||||||
|
"methods":[{"name":"<init>","parameterTypes":[] }]
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"resources":{
|
||||||
|
"includes":[{
|
||||||
|
"pattern":"\\QMETA-INF/services/cn.hutool.log.LogFactory\\E"
|
||||||
|
}, {
|
||||||
|
"pattern":"\\Qcom/sun/jna/win32-x86-64/jnidispatch.dll\\E"
|
||||||
|
}]},
|
||||||
|
"bundles":[]
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"types":[
|
||||||
|
],
|
||||||
|
"lambdaCapturingTypes":[
|
||||||
|
],
|
||||||
|
"proxies":[
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
server:
|
||||||
|
port: 8997
|
|
@ -0,0 +1,2 @@
|
||||||
|
[remote]
|
||||||
|
ip = 127.0.0.1
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<!-- 日志存放路径 -->
|
||||||
|
<property name="log.path" value="./Logs/ScanService"/>
|
||||||
|
<!-- 日志输出格式 -->
|
||||||
|
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
|
||||||
|
|
||||||
|
<!-- 控制台输出 -->
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 全部日志输出 -->
|
||||||
|
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/scanService.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<maxHistory>60</maxHistory>
|
||||||
|
<totalSizeCap>20GB</totalSizeCap>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统模块日志级别控制 -->
|
||||||
|
<logger name="com.aohe" level="info"/>
|
||||||
|
<!-- Spring日志级别控制 -->
|
||||||
|
<logger name="org.springframework" level="warn"/>
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
|
|
Loading…
Reference in New Issue