diff --git a/.editorconfig b/.editorconfig index d70a9b032..1dfca740e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,5 +4,5 @@ indent_style = space indent_size = 4 trim_trailing_whitespace = true -[*.{yml, yaml}] +[*.{yml,yaml}] indent_size = 2 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d5a770378..3660fe492 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,10 +6,6 @@ updates: interval: "daily" labels: - "kind/dependencies" - ignore: - # As long as we support Java 8 - - dependency-name: "logback-classic" - update-types: [ "version-update:semver-major", "version-update:semver-minor" ] - package-ecosystem: "github-actions" directory: "/" schedule: diff --git a/.github/release-drafter-master.yml b/.github/release-drafter-master.yml index 1be06ba3d..ef2d4ba5a 100644 --- a/.github/release-drafter-master.yml +++ b/.github/release-drafter-master.yml @@ -1,24 +1,30 @@ filter-by-commitish: true -commitish: master +commitish: main template: | ## What's Changed $CHANGES categories: - title: '๐Ÿ’ฅ Breaking API Changes' - label: 'kind/breaking' + when: + label: 'kind/breaking' - title: '๐Ÿš€ Features & Enhancements' - labels: - - 'kind/enhancement' - - 'kind/feature' + when: + labels: + - 'kind/enhancement' + - 'kind/feature' - title: '๐Ÿ› Bug Fixes' - label: 'kind/bug' + when: + label: 'kind/bug' - title: '๐Ÿงน Refactor' - label: 'kind/refactor' + when: + label: 'kind/refactor' - title: '๐Ÿ“ Documentation' - label: 'kind/documentation' + when: + label: 'kind/documentation' - title: '๐Ÿ“ฆ Dependency Updates' - label: 'kind/dependencies' + when: + label: 'kind/dependencies' collapse-after: 5 change-template: '* (#$NUMBER) $TITLE by @$AUTHOR' exclude-labels: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f97669add..f39a485c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,12 +14,12 @@ jobs: java: [ 8, 11, 17 ] steps: - name: Check out code - uses: actions/checkout@v3.3.0 + uses: actions/checkout@v7.0.0 with: fetch-depth: 0 - name: Setup Java ${{ matrix.java }} - uses: actions/setup-java@v3.9.0 + uses: actions/setup-java@v5.3.0 with: distribution: temurin java-version: ${{ matrix.java }} diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 5d5dba7f2..9a019e555 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -3,7 +3,7 @@ name: Release Drafter on: push: branches: - - master + - main permissions: contents: read @@ -14,7 +14,7 @@ jobs: contents: write # for release-drafter to create a GitHub release runs-on: ubuntu-latest steps: - - uses: release-drafter/release-drafter@v5.22.0 + - uses: release-drafter/release-drafter@v7.4.0 with: config-name: release-drafter-master.yml env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9338b2968..d6fb05f29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,10 +9,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3.3.0 + uses: actions/checkout@v7.0.0 - name: Set up Java - uses: actions/setup-java@v3.9.0 + uses: actions/setup-java@v5.3.0 with: java-version: 8 distribution: temurin @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3.3.0 + uses: actions/checkout@v7.0.0 with: ref: master fetch-depth: 0 @@ -55,7 +55,7 @@ jobs: run: git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@v4.2.3 + uses: peter-evans/create-pull-request@v8.1.1 with: commit-message: Update versions to ${{ github.event.release.tag_name }} title: Update versions to ${{ github.event.release.tag_name }} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index bf82ff01c..000000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index dc3affce3..8dea6c227 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,18 +1,3 @@ -# 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. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip diff --git a/README.md b/README.md index cb768a53d..10005d85a 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,49 @@ -README for Asterisk-Java -======================== +# Asterisk-Java -INTRODUCTION ------------- +## Introduction -The Asterisk-Java package consists of a set of Java classes that allow you to easily build Java applications that interact with an [Asterisk PBX Server](http://asterisk.org). Asterisk-Java supports both interfaces that Asterisk provides for this scenario: The [FastAGI](https://wiki.asterisk.org/wiki/display/AST/Application_AGI) protocol and the [Manager API](https://wiki.asterisk.org/wiki/display/AST/The+Asterisk+Manager+TCP+IP+API). +The Asterisk-Java package consists of a set of Java classes that allow you to +easily build Java applications that interact with +an [Asterisk PBX Server](https://www.asterisk.org/). +Asterisk-Java supports both interfaces that Asterisk provides for this +scenario: +The [FastAGI](https://docs.asterisk.org/Latest_API/API_Documentation/Dialplan_Applications/AGI/) +protocol and +the [Manager API](https://docs.asterisk.org/Configuration/Interfaces/Asterisk-Manager-Interface-AMI/The-Asterisk-Manager-TCP-IP-API). -You can find the Java docs for the lastest version here: -[JavaDoc](https://javadoc.io/doc/org.asteriskjava/asterisk-java/2.0.2) +You can find the Java docs for the latest version here: +[Javadoc](https://javadoc.io/doc/org.asteriskjava/asterisk-java/latest) -FastAGI -------- -FastAGI lets you create a service that manages a call in a similar way to what a webserver handles a http request. FastAGI can be (and should be) used to replace dialplan. FastAGI is thousands of times faster than dialplan, easier to debug and lets you do call control in a language that you are familiar with. +### FastAGI -The FastAGI implementation supports all commands currently available from Asterisk. +FastAGI lets you create a service that manages a call in a similar way to how +a webserver handles an HTTP request. FastAGI can be (and should be) used to +replace dialplan. FastAGI is thousands of times faster than dialplan, easier to +debug and lets you do call control in a language that you are familiar with. -Manager API ------------ -The Manager API implementation supports receiving events from the Asterisk server (e.g. call progess, registered peers, channel state) and sending actions to Asterisk (e.g. originate call, agent login/logoff, start/stop voice recording). -If you like, the Manager API allows you start and manipulate calls. -A complete list of the available events and actions is available in the javadocs. +The FastAGI implementation supports all commands currently available from +Asterisk. -Activities ----------- -Activities are new to asterisk-java 2.0. The aim of Activities is to provide a high level interface to interactions with Asterisk. Whist Activities use both FastAGI and the Manager API you would normally consider Activities as a replacement for the Manager API. +### Manager API -Activities provide a simple and consistent method of interaction with Asterisk without having to worry about issues such as connection management and without having to understand the intricacies of Asterisk Manager Actions and Events. +The Manager API implementation supports receiving events from the Asterisk +server (e.g. call progress, registered peers, channel state) and sending actions +to Asterisk (e.g. originate call, agent login/logoff, start/stop voice +recording). +If you like, the Manager API allows you to start and manipulate calls. A +complete list of the available events and actions is available in the +[documentation](https://javadoc.io/doc/org.asteriskjava/asterisk-java/latest). + +### Activities + +Activities are new to asterisk-java 2.0. The aim of Activities is to provide a +high level interface to interactions with Asterisk. Whist Activities use both +FastAGI and the Manager API you would normally consider Activities as a +replacement for the Manager API. + +Activities provide a simple and consistent method of interaction with Asterisk +without having to worry about issues such as connection management and without +having to understand the intricacies of Asterisk Manager Actions and Events. [Getting Started](https://github.com/asterisk-java/asterisk-java/wiki/Getting-Started) @@ -35,67 +53,86 @@ Activities provide a simple and consistent method of interaction with Asterisk w [Examples](https://github.com/asterisk-java/asterisk-java/wiki/Examples) +--- + +## Getting Asterisk-Java + +Asterisk-Java is available +[on GitHub](https://github.com/asterisk-java/asterisk-java/releases). + +### Maven + +Asterisk-Java 3.x (Java 1.8 and Asterisk Version 10 thru 23) (master) -GETTING ASTERISK-JAVA ---------------------- +```xml -Asterisk-Java is available from [here](https://github.com/asterisk-java/asterisk-java/releases) + + org.asteriskjava + asterisk-java + 3.42.2 + +``` -Maven Dependency ----------------- +### Gradle -Asterisk-Java 3.x (Java 1.8 and Asterisk Version 10 thru 18) (master) +```text +implementation group: 'org.asteriskjava', name: 'asterisk-java', version: '3.42.2' +``` - - org.asteriskjava - asterisk-java - 3.37.0 - +### Installation from source -INSTALLATION FROM SOURCE ------------------------- +```text +git clone https://github.com/asterisk-java/asterisk-java.git +cd asterisk-java +mvn install +``` - git clone https://github.com/asterisk-java/asterisk-java.git - cd asterisk-java - mvn install +After the build is complete, the jar will then be built as +`target/asterisk-java.jar` in the `asterisk-java` directory. -After the build is complete, the jar will then be built as target/asterisk-java.jar in the asterisk-java directory. +## Example -EXAMPLE -------- +The file `examples/ExampleCallIn.java` will answer the call and playback the +audio file 'tt-monkeys'. -The file 'examples/ExampleCallIn.java' will answer the call and playback the audio file 'tt-monkeys'. +```java +import org.asteriskjava.fastagi.AgiChannel; +import org.asteriskjava.fastagi.AgiException; +import org.asteriskjava.fastagi.AgiRequest; +import org.asteriskjava.fastagi.BaseAgiScript; - import org.asteriskjava.fastagi.AgiChannel; - import org.asteriskjava.fastagi.AgiException; - import org.asteriskjava.fastagi.AgiRequest; - import org.asteriskjava.fastagi.BaseAgiScript; - /* Example incoming call handler - Answer call, speak message */ - public class ExampleCallIn extends BaseAgiScript { - public void service(AgiRequest request, AgiChannel channel) throws AgiException { - answer(); - exec("Playback", "tt-monkeys"); - hangup(); - } - } +/* Example incoming call handler. Answer call, speak message */ +public class ExampleCallIn extends BaseAgiScript { + public void service(AgiRequest request, AgiChannel channel) throws AgiException { + answer(); + exec("Playback", "tt-monkeys"); + hangup(); + } +} +``` -The file 'examples/fastagi.properties' maps your Asterisk diaplan context to the class you would like to invoke above. +The file `examples/fastagi.properties` maps your Asterisk dialplan context to +the class you would like to invoke above. - callin.agi = ExampleCallIn +```text +callin.agi = ExampleCallIn +``` -To compile and run do: +To compile and run: - javac -cp asterisk-java.jar ExampleCallIn.java - java -cp asterisk-java.jar org.asteriskjava.fastagi.DefaultAgiServer +```text +javac -cp asterisk-java.jar ExampleCallIn.java +java -cp asterisk-java.jar org.asteriskjava.fastagi.DefaultAgiServer +``` -SYSTEM REQUIREMENTS -------------------- +## System Requirements -Asterisk-Java needs a Java Virtual Machine of at least version 1.8 ([Java SE 8.0](http://www.oracle.com/technetwork/java/javase/downloads/index.html)). If you want to build the jar from source, you will -also need [Maven](http://maven.apache.org/). +Asterisk-Java needs a Java Virtual Machine of at least version +1.8 ([Java SE 8.0](https://docs.oracle.com/javase/8/)). +If you want to build the jar from source, you will also +need [Maven](https://maven.apache.org/). -LEGAL ------ +## Legal -Asterisk-Java is subject to the terms detailed in the license agreement accompanying it. +Asterisk-Java is subject to the terms detailed in the license agreement +accompanying it. diff --git a/bnd.bnd b/bnd.bnd index 23723bf1e..a2acf6699 100644 --- a/bnd.bnd +++ b/bnd.bnd @@ -9,8 +9,7 @@ Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt -exportcontents: !*.internal.*, * Import-Package: \ - javax.net,\ - javax.net.ssl,\ - javax.script,\ - org.apache.log4j;resolution:=optional,\ - org.slf4j;resolution:=optional + !org.asteriskjava.*,\ + org.apache.logging.log4j.*;resolution:=optional,\ + org.slf4j.*;resolution:=optional,\ + * diff --git a/mvnw b/mvnw index b7f064624..bd8896bf2 100755 --- a/mvnw +++ b/mvnw @@ -19,269 +19,277 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.1.1 -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.4 # # 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 +# 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 # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi +# 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 - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi +# 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 [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" + 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 +} -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 +} -# 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 +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:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# 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 <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.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${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; esac -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -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 -# 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"` +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 -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +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 -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 +# 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 [ -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" +# 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 - JAVACMD="`\\unset -f command; \\command -v java`" + 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 -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 +# 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 -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" -# 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 +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" fi +fi - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi fi - # end of workaround done - printf '%s' "$(cd "$basedir"; pwd)" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=$(find_maven_basedir "$(dirname $0)") -if [ -z "$BASE_DIR" ]; then - exit 1; + set -f fi -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $wrapperUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - QUIET="--quiet" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - QUIET="" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" - else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" - fi - [ $? -eq 0 ] || rm -f "$wrapperJarPath" - elif command -v curl > /dev/null; then - QUIET="--silent" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - QUIET="" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L - else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L - fi - [ $? -eq 0 ] || rm -f "$wrapperJarPath" - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$BASE_DIR/.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 - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" fi -########################################################################################## -# End of extension -########################################################################################## - -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 +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 474c9d6b7..5761d9489 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,187 +1,189 @@ -@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 http://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.1.1 -@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.1.1/maven-wrapper-3.1.1.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.1.1/maven-wrapper-3.1.1.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 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% +<# : 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 http://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.4 +@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-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/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_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::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 + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -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" diff --git a/pom.xml b/pom.xml index fe6e80e2f..30bea761a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,9 @@ - + 4.0.0 org.asteriskjava asterisk-java - 3.37.0 + 3.43.0-SNAPSHOT Asterisk-Java The free Java library for Asterisk PBX integration. @@ -52,7 +51,7 @@ S. Brett Sutton - martins + bsutton bsutton at noojee.com.au Noojee Telephony Solutions Pty Ltd +10 @@ -72,16 +71,23 @@ Piotr Olaszewski piotrooo - piotroo89_at_gmail.com + piotroo89 at gmail.com +1 + + Sean Bright + seanbright + sean at seanbright.com + -5 + scm:git:git@github.com:asterisk-java/asterisk-java.git scm:git:git@github.com:asterisk-java/asterisk-java.git https://github.com/asterisk-java/asterisk-java - + HEAD + UTF-8 @@ -91,19 +97,17 @@ com.google.guava guava - 31.1-jre + 33.5.0-jre org.slf4j slf4j-api - 2.0.6 - compile + 2.0.17 org.apache.logging.log4j log4j-core - 2.19.0 - provided + 2.25.4 org.reflections @@ -114,13 +118,13 @@ org.junit.jupiter junit-jupiter - 5.9.2 + 5.14.3 test org.assertj assertj-core - 3.24.2 + 3.27.7 test @@ -130,9 +134,9 @@ test - ch.qos.logback - logback-classic - 1.3.4 + org.slf4j + slf4j-simple + 2.0.17 test @@ -142,7 +146,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.5.0 ${project.build.outputDirectory}/META-INF/MANIFEST.MF @@ -167,7 +171,7 @@ org.apache.maven.plugins maven-release-plugin - 2.5.3 + 3.3.1 true false @@ -178,7 +182,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.10.1 + 3.15.0 1.8 1.8 @@ -187,12 +191,12 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M8 + 3.5.5 org.apache.maven.plugins maven-assembly-plugin - 3.4.2 + 3.8.0 ${project.basedir}/src/main/assembly/bin.xml @@ -220,7 +224,7 @@ org.apache.maven.plugins maven-source-plugin - 3.2.1 + 3.4.0 attach-sources @@ -233,7 +237,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.4.1 + 3.12.0 attach-javadocs @@ -270,7 +274,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.0.1 + 3.2.8 sign-artifacts @@ -292,11 +296,11 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.13 + 1.7.0 true ossrh - https://oss.sonatype.org/ + https://ossrh-staging-api.central.sonatype.com/ true diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF deleted file mode 100644 index 5e9495128..000000000 --- a/src/main/java/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: - diff --git a/src/main/java/org/asteriskjava/AsteriskVersion.java b/src/main/java/org/asteriskjava/AsteriskVersion.java index 04c9b103a..051141420 100644 --- a/src/main/java/org/asteriskjava/AsteriskVersion.java +++ b/src/main/java/org/asteriskjava/AsteriskVersion.java @@ -27,6 +27,11 @@ * @since 0.2 */ public class AsteriskVersion implements Comparable, Serializable { + private static final String VERSION_PATTERN_DEV = "^\\s*Asterisk GIT-master-.*"; + + private static final String VERSION_PATTERN_23 = "^\\s*Asterisk (GIT-)?23[-. ].*"; + private static final String VERSION_PATTERN_22 = "^\\s*Asterisk (GIT-)?22[-. ].*"; + private static final String VERSION_PATTERN_21 = "^\\s*Asterisk (GIT-)?21[-. ].*"; private static final String VERSION_PATTERN_20 = "^\\s*Asterisk (GIT-)?20[-. ].*"; private static final String VERSION_PATTERN_19 = "^\\s*Asterisk (GIT-)?19[-. ].*"; private static final String VERSION_PATTERN_18 = "^\\s*Asterisk (GIT-)?18[-. ].*"; @@ -39,7 +44,9 @@ public class AsteriskVersion implements Comparable, Serializabl private final String versionString; private final Pattern patterns[]; - private static final String VERSION_PATTERN_CERTIFIED_18 = "^\\s*Asterisk certified/(GIT-)?18[-. ].*"; + private static final String VERSION_PATTERN_CERTIFIED_22 = "^\\s*Asterisk certified-(GIT-)?22[-. ].*"; + private static final String VERSION_PATTERN_CERTIFIED_20 = "^\\s*Asterisk certified-(GIT-)?20[-. ].*"; + private static final String VERSION_PATTERN_CERTIFIED_18 = "^\\s*Asterisk certified[-/](GIT-)?18[-. ].*"; private static final String VERSION_PATTERN_CERTIFIED_16 = "^\\s*Asterisk certified/(GIT-)?16[-. ].*"; private static final String VERSION_PATTERN_CERTIFIED_13 = "^\\s*Asterisk certified/((SVN-branch|GIT)-)?13[-. ].*"; @@ -151,11 +158,32 @@ public class AsteriskVersion implements Comparable, Serializabl * * @since 3.36.2 */ - public static final AsteriskVersion ASTERISK_20 = new AsteriskVersion(2000, "Asterisk 20", VERSION_PATTERN_20); + public static final AsteriskVersion ASTERISK_20 = new AsteriskVersion(2000, "Asterisk 20", VERSION_PATTERN_20, VERSION_PATTERN_CERTIFIED_20); + + /** + * Represents the Asterisk 21 series. + * + * @since 3.40.0 + */ + public static final AsteriskVersion ASTERISK_21 = new AsteriskVersion(2100, "Asterisk 21", VERSION_PATTERN_21); + + /** + * Represents the Asterisk 22 series. + * + * @since 3.40.0 + */ + public static final AsteriskVersion ASTERISK_22 = new AsteriskVersion(2200, "Asterisk 22", VERSION_PATTERN_22, VERSION_PATTERN_CERTIFIED_22); + + /** + * Represents the Asterisk 23 series. + * + * @since 3.40.0 + */ + public static final AsteriskVersion ASTERISK_23 = new AsteriskVersion(2300, "Asterisk 23", VERSION_PATTERN_23, VERSION_PATTERN_DEV); private static final AsteriskVersion knownVersions[] = new AsteriskVersion[]{ - ASTERISK_20, ASTERISK_19, ASTERISK_18, ASTERISK_17, ASTERISK_16, ASTERISK_15, ASTERISK_14, ASTERISK_13, - ASTERISK_12, ASTERISK_11, ASTERISK_10, ASTERISK_1_8, ASTERISK_1_6 + ASTERISK_23, ASTERISK_22, ASTERISK_21, ASTERISK_20, ASTERISK_19, ASTERISK_18, ASTERISK_17, ASTERISK_16, + ASTERISK_15, ASTERISK_14, ASTERISK_13, ASTERISK_12, ASTERISK_11, ASTERISK_10, ASTERISK_1_8, ASTERISK_1_6 }; // current debian stable version, as of 09/10/2018 diff --git a/src/main/java/org/asteriskjava/Cli.java b/src/main/java/org/asteriskjava/Cli.java index bf905817b..56d2f2857 100644 --- a/src/main/java/org/asteriskjava/Cli.java +++ b/src/main/java/org/asteriskjava/Cli.java @@ -52,7 +52,7 @@ else if ("-a".equals(arg) || "-agi".equals(arg)) Integer port = null; try { - port = new Integer(args[1]); + port = Integer.parseInt(args[1], 10); } catch (NumberFormatException e) { diff --git a/src/main/java/org/asteriskjava/config/ConfigFileReader.java b/src/main/java/org/asteriskjava/config/ConfigFileReader.java index 3fde86bae..474266428 100644 --- a/src/main/java/org/asteriskjava/config/ConfigFileReader.java +++ b/src/main/java/org/asteriskjava/config/ConfigFileReader.java @@ -369,7 +369,7 @@ ConfigDirective parseDirective(String configfile, int lineno, String line) throw name = ""; } throw new MissingDirectiveParameterException(configfile, lineno, - "Directive '#%s' needs an argument (%s) at line %d of %s", name.toLowerCase(Locale.US), + "Directive '#%s' needs an argument (%s) at line %d of %s", name.toLowerCase(Locale.ENGLISH), "include".equalsIgnoreCase(name) ? "filename" : "/path/to/executable", lineno, configfile); } diff --git a/src/main/java/org/asteriskjava/live/AsteriskServer.java b/src/main/java/org/asteriskjava/live/AsteriskServer.java index 4eea8687d..6e2e2c13e 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/AsteriskServer.java @@ -333,12 +333,10 @@ void originateToApplicationAsync(String channel, String application, String data String getVersion() throws ManagerCommunicationException; /** - * <<<<<<< HEAD Returns the CVS revision of a given source file of this + * Returns the CVS revision of a given source file of this * Asterisk server.
- * ======= Returns the CVS revision of a given source file of this Asterisk - * server.
- * >>>>>>> refs/heads/release-1.1 For example getVersion("app_meetme.c") may - * return {1, 102} for CVS revision "1.102".
+ * For example getVersion("app_meetme.c") may return {1, 102} for + * CVS revision "1.102".
* Note that this feature is not available with Asterisk 1.0.x.
* You can use this feature if you need to write applications that behave * different depending on specific modules being available in a specific diff --git a/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java b/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java index 1f977a1ae..51930ad72 100644 --- a/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java +++ b/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java @@ -189,6 +189,9 @@ public void handleEvent(QueueMemberPausedEvent event) { public void handleEvent(QueueMemberRemovedEvent event) { } + public void handleEvent(QueueMemberRingInUseEvent event) { + } + public void handleEvent(RtcpReceivedEvent event) { } @@ -575,6 +578,33 @@ public void handleEvent(SkypeChatMessageEvent event) { public void handleEvent(SuccessfulAuthEvent event) { } + public void handleEvent(AuthMethodNotAllowedEvent event) { + } + + public void handleEvent(FailedACLEvent event) { + } + + public void handleEvent(InvalidTransportEvent event) { + } + + public void handleEvent(LoadAverageLimitEvent event) { + } + + public void handleEvent(MemoryLimitEvent event) { + } + + public void handleEvent(RequestNotAllowedEvent event) { + } + + public void handleEvent(RequestNotSupportedEvent event) { + } + + public void handleEvent(SessionLimitEvent event) { + } + + public void handleEvent(UnexpectedAddressEvent event) { + } + public void handleEvent(TransferEvent event) { } diff --git a/src/main/java/org/asteriskjava/manager/AsteriskMapping.java b/src/main/java/org/asteriskjava/manager/AsteriskMapping.java index aa4287c34..a1ac701b9 100644 --- a/src/main/java/org/asteriskjava/manager/AsteriskMapping.java +++ b/src/main/java/org/asteriskjava/manager/AsteriskMapping.java @@ -3,19 +3,23 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** - * Customized the mapping to Asterisk. In general the mapping is done implicitly based - * on reflection but there are certain action that are using headers with specical - * characters that can not be represented in Java. In those cases you can annotate - * the property (getter, setter or field) and provide the header name that Asterisk expects. + * Customize the mapping to Asterisk. In general the mapping is done implicitly + * based on reflection but there are certain actions that use headers with + * characters that are not valid in Java identifiers. In those cases you can + * annotate the property (getter, setter or field) and provide the header name + * that Asterisk sends or expects. + *

+ * Similarly, if an AMI event name contains characters that are not valid Java + * identifiers, the class itself can be decorated with this annotation to + * affect the mapping. * * @since 1.0.0 */ -@Target({METHOD, FIELD}) +@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface AsteriskMapping { String value(); diff --git a/src/main/java/org/asteriskjava/manager/action/FaxLicenseListAction.java b/src/main/java/org/asteriskjava/manager/action/FaxLicenseListAction.java new file mode 100644 index 000000000..1dd8d560d --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/action/FaxLicenseListAction.java @@ -0,0 +1,16 @@ +package org.asteriskjava.manager.action; + +import org.asteriskjava.manager.event.FaxLicenseListCompleteEvent; +import org.asteriskjava.manager.event.ResponseEvent; + +public final class FaxLicenseListAction extends AbstractManagerAction implements EventGeneratingAction { + @Override + public String getAction() { + return "FaxLicenseList"; + } + + @Override + public Class getActionCompleteEventClass() { + return FaxLicenseListCompleteEvent.class; + } +} diff --git a/src/main/java/org/asteriskjava/manager/action/FaxLicenseStatusAction.java b/src/main/java/org/asteriskjava/manager/action/FaxLicenseStatusAction.java new file mode 100644 index 000000000..5768ded9f --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/action/FaxLicenseStatusAction.java @@ -0,0 +1,12 @@ +package org.asteriskjava.manager.action; + +import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.manager.response.FaxLicenseStatusResponse; + +@ExpectedResponse(FaxLicenseStatusResponse.class) +public final class FaxLicenseStatusAction extends AbstractManagerAction { + @Override + public String getAction() { + return "FaxLicenseStatus"; + } +} diff --git a/src/main/java/org/asteriskjava/manager/action/HangupAction.java b/src/main/java/org/asteriskjava/manager/action/HangupAction.java index 2ea1fc3af..84cdd34fe 100644 --- a/src/main/java/org/asteriskjava/manager/action/HangupAction.java +++ b/src/main/java/org/asteriskjava/manager/action/HangupAction.java @@ -16,18 +16,31 @@ */ package org.asteriskjava.manager.action; +import org.asteriskjava.manager.event.ChannelsHungupListComplete; +import org.asteriskjava.manager.event.ResponseEvent; + /** - * The HangupAction causes Asterisk to hang up a given channel.

+ * The HangupAction causes Asterisk to hang up a given channel. + *

* Hangup with a cause code is only supported by Asterisk versions later than 1.6.2. + *

+ * If the provided channel is surrounded by {@code /forward slashes/}, Asterisk + * will interpret the value as a + * POSIX Extended Regular Expression (ERE), + * allowing multiple channels to be hung up at once. + *

+ * If you are passing a regular expression to this action, ensure that you also + * use one of the {@link org.asteriskjava.manager.ManagerConnection#sendEventGeneratingAction(EventGeneratingAction)} + * overloads to capture the response correctly. * * @author srt * @version $Id$ */ -public class HangupAction extends AbstractManagerAction { +public class HangupAction extends AbstractManagerAction implements EventGeneratingAction { /** * Serializable version identifier */ - static final long serialVersionUID = 0L; + private static final long serialVersionUID = -7534073930283445113L; private String channel; private Integer cause; @@ -42,22 +55,22 @@ public HangupAction() { /** * Creates a new HangupAction that hangs up the given channel. * - * @param channel the name of the channel to hangup. + * @param channelOrRegex the name of the channel to hangup. * @since 0.2 */ - public HangupAction(String channel) { - this.channel = channel; + public HangupAction(String channelOrRegex) { + this.channel = channelOrRegex; } /** * Creates a new HangupAction that hangs up the given channel with the given cause code. * - * @param channel the name of the channel to hangup. - * @param cause the cause code. The cause code must be >= 0 and <= 127. + * @param channelOrRegex the name of the channel to hangup. + * @param cause the cause code. The cause code must be >= 0 and <= 127. * @since 1.0.0 */ - public HangupAction(String channel, int cause) { - this.channel = channel; + public HangupAction(String channelOrRegex, int cause) { + this.channel = channelOrRegex; this.cause = cause; } @@ -108,4 +121,9 @@ public Integer getCause() { public void setCause(Integer cause) { this.cause = cause; } + + @Override + public Class getActionCompleteEventClass() { + return ChannelsHungupListComplete.class; + } } diff --git a/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java b/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java index 50ea790d5..c0b71995c 100644 --- a/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java +++ b/src/main/java/org/asteriskjava/manager/action/PlayDtmfAction.java @@ -36,6 +36,7 @@ public class PlayDtmfAction extends AbstractManagerAction { private String channel; private String digit; private Integer duration = null; + private Boolean receive; /** * Creates a new empty PlayDtmfAction. @@ -62,6 +63,26 @@ public String getAction() { return "PlayDTMF"; } + /** + * Returns the 'receive' property of this action. + * (since asterisk 16.7.0) + * + * @return the receive property, or null if not set + */ + public Boolean getReceive() { + return this.receive; + } + + /** + * Set the receive property of the action. + * (since asterisk 16.7.0) + * + * @param receive value for receive, or null to unset + */ + public void setReceive(Boolean receive) { + this.receive = receive; + } + /** * Returns the name of the channel to send the digit to. * diff --git a/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java b/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java index 61c394ec9..cf432bd03 100644 --- a/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java +++ b/src/main/java/org/asteriskjava/manager/action/QueueAddAction.java @@ -20,7 +20,8 @@ * The QueueAddAction adds a new member to a queue.

* It is implemented in apps/app_queue.c

* The memberName property was added in Asterisk 1.4, the - * stateInterface property in Asterisk 1.6. + * stateInterface property in Asterisk 1.6, + * the reason property in Asterisk 20. * * @author srt * @version $Id$ @@ -31,6 +32,7 @@ public class QueueAddAction extends AbstractManagerAction { private String iface; private Integer penalty; private Boolean paused; + private String reason; private String memberName; private String stateInterface; @@ -161,6 +163,26 @@ public Boolean getPaused() { public void setPaused(Boolean paused) { this.paused = paused; } + + /** + * Returns the queue member pause reason. + * Available since Asterisk 20. + * + * @return Pause reason. + */ + public String getReason() { + return reason; + } + + /** + * Sets the queue member pause reason. + * Available since Asterisk 20. + * + * @param reason. + */ + public void setReason(String reason) { + this.reason = reason; + } /** * Returns the name of the queue memeber (agent name).

diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java index 58f9fcf42..9a1353405 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java @@ -15,7 +15,8 @@ public abstract class AbstractBridgeEvent extends ManagerEvent { private String bridgeName; private String bridgeTechnology; private String accountCode; - private String bridgevideosourcemode; + private String bridgeVideoSource; + private String bridgeVideoSourceMode; AbstractBridgeEvent(Object source) { super(source); @@ -77,11 +78,19 @@ public void setAccountCode(String accountCode) { this.accountCode = accountCode; } + public String getBridgeVideoSource() { + return bridgeVideoSource; + } + + public void setBridgeVideoSource(String bridgeVideoSource) { + this.bridgeVideoSource = bridgeVideoSource; + } + public String getBridgevideosourcemode() { - return bridgevideosourcemode; + return bridgeVideoSourceMode; } - public void setBridgevideosourcemode(String bridgevideosourcemode) { - this.bridgevideosourcemode = bridgevideosourcemode; + public void setBridgevideosourcemode(String bridgeVideoSourceMode) { + this.bridgeVideoSourceMode = bridgeVideoSourceMode; } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java index 0a2bcbdce..cc969b029 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java @@ -26,11 +26,14 @@ * @version $Id$ */ public abstract class AbstractMeetMeEvent extends ManagerEvent { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2L; private String channel; private String uniqueId; private String meetMe; private Integer user; + private String language; + private String accountCode; + private String linkedId; /** * @param source @@ -143,4 +146,44 @@ public Integer getUser() { public void setUser(Integer userNum) { this.user = userNum; } + + /** + * Get the account code associated with the current channel. + * + * @return the channel's account code + */ + public String getAccountCode() { + return accountCode; + } + + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } + + /** + * Get the language associated with the current channel. + * + * @return the channel's language + */ + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + /** + * Get the linked ID of the channel, which ties this event to other related + * channel's events. + * + * @return the channel's linked ID + */ + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractSecurityEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractSecurityEvent.java new file mode 100644 index 000000000..c08a8329e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AbstractSecurityEvent.java @@ -0,0 +1,98 @@ +package org.asteriskjava.manager.event; + +public abstract class AbstractSecurityEvent extends ManagerEvent { + private String eventTv; + private String severity; + private String service; + private Integer eventVersion; + private String accountId; + private String sessionId; + private String localAddress; + private String remoteAddress; + private String module; + private String sessionTv; + + protected AbstractSecurityEvent(Object source) { + super(source); + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getEventTv() { + return eventTv; + } + + public void setEventTv(String eventTimestamp) { + this.eventTv = eventTimestamp; + } + + public Integer getEventVersion() { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) { + this.eventVersion = eventVersion; + } + + public String getLocalAddress() { + return localAddress; + } + + public void setLocalAddress(String localAddress) { + this.localAddress = localAddress; + } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getRemoteAddress() { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getSessionTv() { + return sessionTv; + } + + public void setSessionTv(String sessionTimestamp) { + this.sessionTv = sessionTimestamp; + } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AorDetail.java b/src/main/java/org/asteriskjava/manager/event/AorDetail.java index fa8f8cd8a..03fa0ce3c 100644 --- a/src/main/java/org/asteriskjava/manager/event/AorDetail.java +++ b/src/main/java/org/asteriskjava/manager/event/AorDetail.java @@ -40,6 +40,8 @@ public AorDetail(Object source) { private int totalContacts; private int contactsRegistered; private String endpointName; + private Boolean removeUnavailable; + private Boolean qualify2xxOnly; public String getObjectType() { return objectType; @@ -185,4 +187,20 @@ public void setEndpointName(String endpointName) { this.endpointName = endpointName; } + public Boolean isRemoveUnavailable() { + return removeUnavailable; + } + + public void setRemoveUnavailable(Boolean removeUnavailable) { + this.removeUnavailable = removeUnavailable; + } + + public Boolean isQualify2xxOnly() { + return qualify2xxOnly; + } + + public void setQualify2xxOnly(Boolean qualify2xxOnly) { + this.qualify2xxOnly = qualify2xxOnly; + } + } diff --git a/src/main/java/org/asteriskjava/manager/event/AuthMethodNotAllowedEvent.java b/src/main/java/org/asteriskjava/manager/event/AuthMethodNotAllowedEvent.java new file mode 100644 index 000000000..6eaa33565 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AuthMethodNotAllowedEvent.java @@ -0,0 +1,17 @@ +package org.asteriskjava.manager.event; + +public final class AuthMethodNotAllowedEvent extends AbstractSecurityEvent { + private String authMethod; + + public AuthMethodNotAllowedEvent(Object source) { + super(source); + } + + public String getAuthMethod() { + return authMethod; + } + + public void setAuthMethod(String value) { + this.authMethod = value; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeVideoSourceUpdateEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeVideoSourceUpdateEvent.java new file mode 100644 index 000000000..c2495f584 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeVideoSourceUpdateEvent.java @@ -0,0 +1,41 @@ +/* + * Copyright 2023 Hector Espert + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.asteriskjava.manager.event; + +/** + * Raised when the channel that is the source of video in a bridge changes. + */ +public class BridgeVideoSourceUpdateEvent extends AbstractBridgeEvent { + private String bridgePreviousVideoSource; + + public BridgeVideoSourceUpdateEvent(Object source) { + super(source); + } + + /** + * Gets the unique ID of the channel that was the video source. + * + * @return the unique ID of the channel that was the video source. + */ + public String getBridgePreviousVideoSource() { + return bridgePreviousVideoSource; + } + + public void setBridgePreviousVideoSource(String bridgePreviousVideoSource) { + this.bridgePreviousVideoSource = bridgePreviousVideoSource; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/CdrEvent.java b/src/main/java/org/asteriskjava/manager/event/CdrEvent.java index 7dc374750..fe15b41f5 100644 --- a/src/main/java/org/asteriskjava/manager/event/CdrEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CdrEvent.java @@ -19,6 +19,8 @@ import org.asteriskjava.util.DateUtil; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import java.util.TimeZone; /** @@ -66,12 +68,14 @@ public class CdrEvent extends ManagerEvent { private String uniqueId; private String userField; private String recordfile; + private Map dynamicProperties; /** * @param source */ public CdrEvent(Object source) { super(source); + dynamicProperties = new HashMap<>(); } /** @@ -521,4 +525,16 @@ public String getRecordfile() { public void setRecordfile(String recordfile) { this.recordfile = recordfile; } + + public Map getDynamicProperties() { + return dynamicProperties; + } + + public void setDynamicProperties(Map dynamicProperties) { + this.dynamicProperties = dynamicProperties; + } + + public void addDynamicProperties(String key, String value) { + this.dynamicProperties.put(key,value); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/CelEvent.java b/src/main/java/org/asteriskjava/manager/event/CelEvent.java index e8e25cacd..6eded008b 100644 --- a/src/main/java/org/asteriskjava/manager/event/CelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CelEvent.java @@ -2,7 +2,8 @@ /** * Raised when a Channel Event Log is generated for a channel. - * https://wiki.asterisk.org/wiki/display/AST/Asterisk+13+ManagerEvent_CEL + *

+ * Asterisk AMI Events: CEL */ public class CelEvent extends ManagerEvent { private static final long serialVersionUID = 1L; @@ -22,7 +23,11 @@ public class CelEvent extends ManagerEvent { public static final String CEL_EVENT_FORWARD = "FORWARD"; public static final String CEL_EVENT_LINKEDID_END = "LINKEDID_END"; public static final String CEL_EVENT_LOCAL_OPTIMIZE = "LOCAL_OPTIMIZE"; + public static final String CEL_EVENT_LOCAL_OPTIMIZE_BEGIN = "LOCAL_OPTIMIZE_BEGIN"; public static final String CEL_EVENT_USER_DEFINED = "USER_DEFINED"; + public static final String CEL_EVENT_STREAM_BEGIN = "STREAM_BEGIN"; + public static final String CEL_EVENT_STREAM_END = "STREAM_END"; + public static final String CEL_EVENT_DTMF = "DTMF"; private String eventName; private String accountCode; diff --git a/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java b/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java index 3c88d838a..877facde9 100644 --- a/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java @@ -10,13 +10,20 @@ public class ChallengeResponseFailedEvent extends ManagerEvent { /** * Serializable version identifier. */ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -4630209124005390153L; private String severity; private String eventversion; private String service; private String remoteaddress; private String localaddress; + private String accountId; + private String module; + private String sessiontv; + private String sessionId; + private String challange; + private String response; + private String expectedResponse; /** * @param source @@ -77,4 +84,60 @@ public void setEventtv(String eventv) { this.setTimestamp(t.doubleValue()); } } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getSessiontv() { + return sessiontv; + } + + public void setSessiontv(String sessiontv) { + this.sessiontv = sessiontv; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getChallange() { + return challange; + } + + public void setChallange(String challange) { + this.challange = challange; + } + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public String getExpectedResponse() { + return expectedResponse; + } + + public void setExpectedResponse(String expectedResponse) { + this.expectedResponse = expectedResponse; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java index c924266e9..a4e9256a8 100644 --- a/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java @@ -7,7 +7,7 @@ public class ChallengeSentEvent extends ManagerEvent { /** * */ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 8219597230372769610L; private String severity; private Integer eventVersion; private String accountId; @@ -17,6 +17,8 @@ public class ChallengeSentEvent extends ManagerEvent { private String localAddress; private String challenge; private String sessionId; + private String module; + private String sessiontv; public ChallengeSentEvent(Object source) { super(source); @@ -93,4 +95,20 @@ public String getSessionId() { public void setSessionId(String sessionId) { this.sessionId = sessionId; } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getSessiontv() { + return sessiontv; + } + + public void setSessiontv(String sessiontv) { + this.sessiontv = sessiontv; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/ChannelHungupEvent.java b/src/main/java/org/asteriskjava/manager/event/ChannelHungupEvent.java new file mode 100644 index 000000000..6992bfaa3 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/ChannelHungupEvent.java @@ -0,0 +1,38 @@ +package org.asteriskjava.manager.event; + +public class ChannelHungupEvent extends ResponseEvent { + /** + * Serial version identifier. + */ + private static final long serialVersionUID = -3439496042163782400L; + + private String channel; + + /** + * Constructs a ChannelHungupEvent + * + * @param source The object on which the Event initially occurred. + * @throws IllegalArgumentException if source is null. + */ + public ChannelHungupEvent(Object source) { + super(source); + } + + /** + * Get the name of the channel that was hung up. + * + * @return the name of the channel + */ + public String getChannel() { + return channel; + } + + /** + * Set the name of the channel that was hung up. + * + * @param channel the name of the channel + */ + public void setChannel(String channel) { + this.channel = channel; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/ChannelsHungupListComplete.java b/src/main/java/org/asteriskjava/manager/event/ChannelsHungupListComplete.java new file mode 100644 index 000000000..b5b42ad6d --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/ChannelsHungupListComplete.java @@ -0,0 +1,41 @@ +package org.asteriskjava.manager.event; + +public class ChannelsHungupListComplete extends ResponseEvent { + /** + * Serial version identifier. + */ + private static final long serialVersionUID = 2531650218749540207L; + private Integer listItems; + + /** + * Constructs a ChannelsHungupListComplete + * + * @param source The object on which the Event initially occurred. + * @throws IllegalArgumentException if source is null. + */ + public ChannelsHungupListComplete(Object source) { + super(source); + } + + /** + * Returns the number of ChannelHungup that have been reported. + * + * @return the number of ChannelHungup that have been reported. + */ + public Integer getListItems() { + return listItems; + } + + /** + * Sets the number of ChannelHungup that have been reported. + * + * @param listItems the number of ChannelHungup that have been reported. + */ + public void setListItems(Integer listItems) { + this.listItems = listItems; + } + + public void setEventList(String eventList) { + // This exists just to silence a warning, the value is always 'Complete' + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/ContactList.java b/src/main/java/org/asteriskjava/manager/event/ContactList.java index 8d23aca21..a83958265 100644 --- a/src/main/java/org/asteriskjava/manager/event/ContactList.java +++ b/src/main/java/org/asteriskjava/manager/event/ContactList.java @@ -54,6 +54,7 @@ public class ContactList extends ResponseEvent { String objecttype; String pruneonboot; ContactStatusEnum status; + Boolean qualify2xxOnly; /** * Creates a new instance. @@ -213,6 +214,14 @@ public void setStatus(String status) { } + public Boolean isQualify2xxOnly() { + return qualify2xxOnly; + } + + public void setQualify2xxOnly(Boolean qualify2xxOnly) { + this.qualify2xxOnly = qualify2xxOnly; + } + @Override public String toString() { return "ContactList [qualifyTimeout=" + qualifyTimeout + ", callid=" + callid + ", regserver=" + regserver @@ -220,7 +229,7 @@ public String toString() { + authenticatequalify + ", objectname=" + objectname + ", useragent=" + useragent + ", uri=" + uri + ", viaaddr=" + viaaddr + ", qualifyfrequency=" + qualifyfrequency + ", path=" + path + ", endpoint=" + endpoint + ", viaport=" + viaport + ", outboundproxy=" + outboundproxy + ", actionId=" + actionId - + ", objecttype=" + objecttype + ", pruneonboot=" + pruneonboot + ", status=" + status + "]\n"; + + ", objecttype=" + objecttype + ", pruneonboot=" + pruneonboot + ", status=" + status + ", qualify2xxOnly=" + qualify2xxOnly + "]\n"; } } diff --git a/src/main/java/org/asteriskjava/manager/event/ContactStatusDetail.java b/src/main/java/org/asteriskjava/manager/event/ContactStatusDetail.java index efdb18a78..08fca1cd1 100644 --- a/src/main/java/org/asteriskjava/manager/event/ContactStatusDetail.java +++ b/src/main/java/org/asteriskjava/manager/event/ContactStatusDetail.java @@ -34,6 +34,7 @@ public class ContactStatusDetail extends ResponseEvent { private String path; private int qualifyFrequency; private Float qualifyTimeout; + private Boolean qualify2xxOnly; public String getAor() { return aor; @@ -151,6 +152,14 @@ public void setQualifyTimeout(String qualifyTimeout) { this.qualifyTimeout = Float.parseFloat(qualifyTimeout); } + public Boolean isQualify2xxOnly() { + return qualify2xxOnly; + } + + public void setQualify2xxOnly(Boolean qualify2xxOnly) { + this.qualify2xxOnly = qualify2xxOnly; + } + public ContactStatusDetail(Object source) { super(source); } diff --git a/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java index 72134b028..40ab63d22 100644 --- a/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java @@ -8,11 +8,24 @@ public class DAHDIChannelEvent extends ManagerEvent { /** * */ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2L; + + private Integer dahdigroup; private String dahdichannel; private String dahdispan; private String uniqueid; private String channel; + private String language; + private String accountCode; + private String linkedId; + + public Integer getDahdigroup() { + return this.dahdigroup; + } + + public void setDahdigroup(Integer dahdigroup) { + this.dahdigroup = dahdigroup; + } public String getDahdichannel() { return dahdichannel; @@ -46,6 +59,30 @@ public void setChannel(String channel) { this.channel = channel; } + public String getLinkedId() { + return this.linkedId; + } + + public void setLinkedId(String linkedid) { + this.linkedId = linkedid; + } + + public String getLanguage() { + return this.language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getAccountCode() { + return this.accountCode; + } + + public void setAccountCode(String accountcode) { + this.accountCode = accountcode; + } + public DAHDIChannelEvent(Object source) { super(source); } diff --git a/src/main/java/org/asteriskjava/manager/event/FailedACLEvent.java b/src/main/java/org/asteriskjava/manager/event/FailedACLEvent.java new file mode 100644 index 000000000..8b7d19474 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/FailedACLEvent.java @@ -0,0 +1,17 @@ +package org.asteriskjava.manager.event; + +public final class FailedACLEvent extends AbstractSecurityEvent { + private String aclName; + + public FailedACLEvent(Object source) { + super(source); + } + + public String getAclName() { + return this.aclName; + } + + public void setAclName(String aclName) { + this.aclName = aclName; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/FaxDocumentStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/FaxDocumentStatusEvent.java index 0df1d28a6..894718ba6 100644 --- a/src/main/java/org/asteriskjava/manager/event/FaxDocumentStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/FaxDocumentStatusEvent.java @@ -41,6 +41,10 @@ public class FaxDocumentStatusEvent extends AbstractFaxEvent { private String remoteSid; private String remoteDis; + private String language; + private String accountCode; + private String linkedId; + private String uniqueId; public FaxDocumentStatusEvent(Object source) { super(source); @@ -302,6 +306,36 @@ public void setRemoteDis(String remoteDis) { this.remoteDis = remoteDis; } + public String getAccountCode() { + return accountCode; + } + + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/FaxLicenseEvent.java b/src/main/java/org/asteriskjava/manager/event/FaxLicenseEvent.java new file mode 100644 index 000000000..184e8d0d5 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/FaxLicenseEvent.java @@ -0,0 +1,64 @@ +package org.asteriskjava.manager.event; + +public final class FaxLicenseEvent extends ResponseEvent { + private String file; + private String key; + private String product; + private String hostId; + private Integer ports; + private String status; + + public FaxLicenseEvent(Object source) { + super(source); + } + + @Override + public String getFile() { + return file; + } + + @Override + public void setFile(String file) { + this.file = file; + } + + public String getHostId() { + return hostId; + } + + public void setHostId(String hostId) { + this.hostId = hostId; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Integer getPorts() { + return ports; + } + + public void setPorts(Integer ports) { + this.ports = ports; + } + + public String getProduct() { + return product; + } + + public void setProduct(String product) { + this.product = product; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/FaxLicenseListCompleteEvent.java b/src/main/java/org/asteriskjava/manager/event/FaxLicenseListCompleteEvent.java new file mode 100644 index 000000000..a4167232d --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/FaxLicenseListCompleteEvent.java @@ -0,0 +1,10 @@ +package org.asteriskjava.manager.event; + +import org.asteriskjava.manager.AsteriskMapping; + +@AsteriskMapping("FaxLicenseList complete") +public final class FaxLicenseListCompleteEvent extends ResponseEvent { + public FaxLicenseListCompleteEvent(Object source) { + super(source); + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java index 76aa6e8b4..1724fc197 100644 --- a/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java @@ -56,6 +56,11 @@ public class FaxStatusEvent extends AbstractFaxEvent { private String status; private String operation; + private String language; + private String accountCode; + private String linkedId; + private String uniqueId; + public FaxStatusEvent(Object source) { super(source); } @@ -494,5 +499,37 @@ public String getOperation() { public void setOperation(String operation) { this.operation = operation; } + + public String getAccountCode() { + return accountCode; + } + + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/HangupHandlerPushEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupHandlerPushEvent.java new file mode 100644 index 000000000..3925d4dc9 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/HangupHandlerPushEvent.java @@ -0,0 +1,78 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.asteriskjava.manager.event; + +/** + * A HangupHandlerPushEvent is triggered when a channel pushes a hangup handler. + *

+ * It is implemented in channel.c + * + * @author srt + * @version $Id$ + */ +public class HangupHandlerPushEvent extends AbstractChannelStateEvent { + /** + * Serializable version identifier. + */ + static final long serialVersionUID = 0L; + + private String language; + private String linkedId; + + private String handler; + + public HangupHandlerPushEvent(Object source) { + super(source); + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } + + public String getHandler() { + return handler; + } + + public void setHandler(String handler) { + this.handler = handler; + } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("HangupHandlerPush [language="); + builder.append(language); + builder.append(", linkedId="); + builder.append(linkedId); + builder.append(", accountCode="); + builder.append(accountCode); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/asteriskjava/manager/event/HangupHandlerRunEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupHandlerRunEvent.java new file mode 100644 index 000000000..dbdfbb486 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/HangupHandlerRunEvent.java @@ -0,0 +1,77 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.asteriskjava.manager.event; + +/** + * A HangupHandlerRunEvent is triggered when a hangup handler is run. + *

+ * It is implemented in channel.c + * + * @author srt + * @version $Id$ + */ +public class HangupHandlerRunEvent extends AbstractChannelStateEvent { + /** + * Serializable version identifier. + */ + static final long serialVersionUID = 0L; + + private String language; + private String linkedId; + private String handler; + + public HangupHandlerRunEvent(Object source) { + super(source); + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } + + public String getHandler() { + return handler; + } + + public void setHandler(String handler) { + this.handler = handler; + } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("HangupHandlerRun [language="); + builder.append(language); + builder.append(", linkedId="); + builder.append(linkedId); + builder.append(", accountCode="); + builder.append(accountCode); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidAccountId.java b/src/main/java/org/asteriskjava/manager/event/InvalidAccountId.java index be7bbe4c1..24db59dce 100644 --- a/src/main/java/org/asteriskjava/manager/event/InvalidAccountId.java +++ b/src/main/java/org/asteriskjava/manager/event/InvalidAccountId.java @@ -9,7 +9,7 @@ public class InvalidAccountId extends ManagerEvent { /** * */ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 7812041063040911614L; private String severity; private Integer eventVersion; private String eventtv; @@ -19,6 +19,8 @@ public class InvalidAccountId extends ManagerEvent { private String service; private String remoteAddress; private String event; + private String module; + private String sessiontv; public InvalidAccountId(Object source) { super(source); @@ -99,4 +101,20 @@ public String getEvent() { public void setEvent(String event) { this.event = event; } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getSessiontv() { + return sessiontv; + } + + public void setSessiontv(String sessiontv) { + this.sessiontv = sessiontv; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java index c0a9090a1..866dc725e 100644 --- a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java @@ -7,7 +7,7 @@ public class InvalidPasswordEvent extends ManagerEvent { /** * */ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -5161586187203331724L; private String severity; private Integer eventVersion; private String eventtv; @@ -19,6 +19,10 @@ public class InvalidPasswordEvent extends ManagerEvent { private String service; private String remoteAddress; private String challenge; + private String sessiontv; + private String localAddress; + private String sessionId; + private String module; public InvalidPasswordEvent(Object source) { super(source); @@ -111,4 +115,36 @@ public String getChallenge() { public void setChallenge(String challenge) { this.challenge = challenge; } + + public String getLocalAddress() { + return localAddress; + } + + public void setLocalAddress(String localAddress) { + this.localAddress = localAddress; + } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getSessiontv() { + return sessiontv; + } + + public void setSessiontv(String sessiontv) { + this.sessiontv = sessiontv; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidTransportEvent.java b/src/main/java/org/asteriskjava/manager/event/InvalidTransportEvent.java new file mode 100644 index 000000000..6a2e1c5d9 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/InvalidTransportEvent.java @@ -0,0 +1,17 @@ +package org.asteriskjava.manager.event; + +public final class InvalidTransportEvent extends AbstractSecurityEvent { + private String attemptedTransport; + + public InvalidTransportEvent(Object source) { + super(source); + } + + public String getAttemptedTransport() { + return attemptedTransport; + } + + public void setAttemptedTransport(String value) { + this.attemptedTransport = value; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/LoadAverageLimitEvent.java b/src/main/java/org/asteriskjava/manager/event/LoadAverageLimitEvent.java new file mode 100644 index 000000000..71aa38e24 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/LoadAverageLimitEvent.java @@ -0,0 +1,7 @@ +package org.asteriskjava.manager.event; + +public final class LoadAverageLimitEvent extends AbstractSecurityEvent { + public LoadAverageLimitEvent(Object source) { + super(source); + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index 13cce6f3d..1aaa100a1 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -37,7 +37,7 @@ public abstract class ManagerEvent extends EventObject { /** * Serializable version identifier. */ - static final long serialVersionUID = 2L; + private static final long serialVersionUID = 2L; protected String connectedLineNum; protected String connectedLineName; protected Integer priority; @@ -46,6 +46,7 @@ public abstract class ManagerEvent extends EventObject { protected String exten; protected String callerIdNum; protected String callerIdName; + protected Map channelVariables = Collections.emptyMap(); /** * Returns the Caller ID name of the caller's channel. @@ -127,6 +128,25 @@ public void setContext(String context) { this.context = context; } + /** + * Gets a map of channel variables sent with this manager event. + *

+ * These are only sent by Asterisk if it has been configured to do so in + * the manager configuration file (manager.conf). + * + * @return an unmodifiable map of channel variables and their values, never {@code null} + */ + public Map getChannelVariables() { + return channelVariables; + } + + public void setChanVariables(Map variables) { + if (variables == null) { + return; + } + this.channelVariables = Collections.unmodifiableMap(new HashMap<>(variables)); + } + protected String context; /** diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java index 360b4dd74..23cd9d626 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java @@ -33,10 +33,25 @@ public class MeetMeJoinEvent extends AbstractMeetMeEvent { */ private static final long serialVersionUID = 0L; + private Integer duration; + /** * @param source */ public MeetMeJoinEvent(Object source) { super(source); } + + /** + * Returns how long the user has been in the conference. + * + * @return the duration, in seconds, the user has been in the conference + */ + public Integer getDuration() { + return duration; + } + + public void setDuration(Integer duration) { + this.duration = duration; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeMuteEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeMuteEvent.java index bb14c8242..ec7fcc47e 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeMuteEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeMuteEvent.java @@ -29,8 +29,9 @@ public class MeetMeMuteEvent extends AbstractMeetMeEvent { /** * Serializable version identifier. */ - private static final long serialVersionUID = -8554403451985143184L; + private static final long serialVersionUID = 1664651272460031885L; + private Integer duration; private Boolean status; /** @@ -40,6 +41,19 @@ public MeetMeMuteEvent(Object source) { super(source); } + /** + * Returns how long the user has been in the conference. + * + * @return the duration, in seconds, the user has been in the conference + */ + public Integer getDuration() { + return duration; + } + + public void setDuration(Integer duration) { + this.duration = duration; + } + /** * Returns whether the user was muted or unmuted. * diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingEvent.java index d37dafcd9..bd2a32413 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingEvent.java @@ -32,14 +32,28 @@ public class MeetMeTalkingEvent extends AbstractMeetMeEvent { /** * Serializable version identifier. */ - private static final long serialVersionUID = -8554403451985143184L; + private static final long serialVersionUID = -1749014689947720722L; + private Integer duration; protected Boolean status = Boolean.TRUE; public MeetMeTalkingEvent(Object source) { super(source); } + /** + * Returns how long the user has been in the conference. + * + * @return the duration, in seconds, the user has been in the conference + */ + public Integer getDuration() { + return duration; + } + + public void setDuration(Integer duration) { + this.duration = duration; + } + /** * Returns whether the user has started or stopped talking.

* Until Asterisk 1.2 Asterisk used different events to indicate start diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingRequestEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingRequestEvent.java index ea1ad63ed..95729b194 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingRequestEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeTalkingRequestEvent.java @@ -16,27 +16,31 @@ */ package org.asteriskjava.manager.event; +import org.asteriskjava.manager.AsteriskMapping; + /** - * A MeetMeTalkingEvent is triggered when a muted user requests talking in a meet me - * conference.

- * To enable talker detection you must pass the option 'T' to the MeetMe application.

- * It is implemented in apps/app_meetme.c

- * Available since Asterisk 1.6 + * A MeetMeTalkRequestEvent is triggered when a muted user requests talking in + * a MeetMe conference. * * @author srt * @version $Id$ * @since 1.0.0 */ +@AsteriskMapping("MeetMeTalkRequest") public class MeetMeTalkingRequestEvent extends AbstractMeetMeEvent { /** * Serializable version identifier. */ - private static final long serialVersionUID = 0L; + private static final long serialVersionUID = 1L; private Boolean status; + private Integer duration; /** - * @param source + * Constructs a MeetMeTalkingRequestEvent + * + * @param source The object on which the Event initially occurred. + * @throws IllegalArgumentException if source is null. */ public MeetMeTalkingRequestEvent(Object source) { super(source); @@ -45,10 +49,24 @@ public MeetMeTalkingRequestEvent(Object source) { // see http://bugs.digium.com/view.php?id=9418 /** - * Returns whether the user has started or stopped requesting talking. + * The length of time (in seconds) that the MeetMe user has been in the + * conference at the time of this event + * + * @return the number of seconds this user has been in the conference. + */ + public Integer getDuration() { + return duration; + } + + public void setDuration(Integer duration) { + this.duration = duration; + } + + /** + * Returns whether the user has started or stopped requesting talking * - * @return true if ther user has started requesting talking, - * false if the user has stopped requesting talking. + * @return {@code true} if the user has started requesting talking, + * {@code false} if the user has stopped requesting talking. */ public Boolean getStatus() { return status; diff --git a/src/main/java/org/asteriskjava/manager/event/MemoryLimitEvent.java b/src/main/java/org/asteriskjava/manager/event/MemoryLimitEvent.java new file mode 100644 index 000000000..6b086fbe1 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/MemoryLimitEvent.java @@ -0,0 +1,7 @@ +package org.asteriskjava.manager.event; + +public final class MemoryLimitEvent extends AbstractSecurityEvent { + public MemoryLimitEvent(Object source) { + super(source); + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/QueueMemberAddedEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueMemberAddedEvent.java index b4644cc14..9bf217bc7 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueMemberAddedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueMemberAddedEvent.java @@ -40,6 +40,9 @@ public class QueueMemberAddedEvent extends AbstractQueueMemberEvent { private String stateinterface; private Boolean ringinuse; + private Integer logintime; + private Integer wrapuptime; + private Integer lastpause; public QueueMemberAddedEvent(Object source) { super(source); @@ -192,4 +195,28 @@ public Boolean getRinginuse() { public void setRinginuse(Boolean ringinuse) { this.ringinuse = ringinuse; } + + public Integer getLoginTime() { + return logintime; + } + + public void setLoginTime(Integer logintime) { + this.logintime = logintime; + } + + public Integer getWrapupTime() { + return wrapuptime; + } + + public void setWrapupTime(Integer wrapuptime) { + this.wrapuptime = wrapuptime; + } + + public Integer getLastPause() { + return lastpause; + } + + public void setLastPause(Integer lastpause) { + this.lastpause = lastpause; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/QueueMemberEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueMemberEvent.java index eb1ca075b..04f92ecd7 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueMemberEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueMemberEvent.java @@ -64,6 +64,7 @@ public class QueueMemberEvent extends ResponseEvent { private String pausedreason; private Integer wrapuptime; private String _interface; + private Integer logintime; /** * @param source @@ -396,4 +397,12 @@ public Integer getWrapuptime() { public void setWrapuptime(Integer wrapuptime) { this.wrapuptime = wrapuptime; } + + public Integer getLogintime() { + return logintime; + } + + public void setLogintime(Integer logintime) { + this.logintime = logintime; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/QueueMemberPauseEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueMemberPauseEvent.java index c39ab200e..80eb1be30 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueMemberPauseEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueMemberPauseEvent.java @@ -1,7 +1,15 @@ package org.asteriskjava.manager.event; +/** + * A QueueMemberPauseEvent is triggered when a queue member is paused or + * unpaused. + *

+ * Before the release of Asterisk 12, this event was called + * {@code QueueMemberPaused} but was erroneously changed in commit a2d02edc to + * {@code QueueMemberPause}. + */ public class QueueMemberPauseEvent extends QueueMemberPausedEvent { - private static final long serialVersionUID = 58564514209197321L; + private static final long serialVersionUID = 5184794168561845630L; // Logger logger = LogManager.getLogger(); String membership; @@ -14,6 +22,8 @@ public class QueueMemberPauseEvent extends QueueMemberPausedEvent { String stateInterface; Integer incall; String pausedreason; + Integer logintime; + Integer wrapuptime; public QueueMemberPauseEvent(Object source) { super(source); @@ -155,5 +165,39 @@ public void setPausedreason(String pausedreason) { this.pausedreason = pausedreason; } + /** + * Gets the login time + * + * @return the login time of the agent as a UNIX timestamp + */ + public Integer getLoginTime() { + return logintime; + } + + /** + * Sets the login time + * + * @param logintime the login time of the agent as a UNIX timestamp + */ + public void setLoginTime(Integer logintime) { + this.logintime = logintime; + } + /** + * Gets the agent's wrap up time + * + * @return the agent's wrap up time (in seconds) + */ + public Integer getWrapupTime() { + return wrapuptime; + } + + /** + * Sets the agent's wrap up time + * + * @param wrapuptime the agent's wrap up time (in seconds) + */ + public void setWrapupTime(Integer wrapuptime) { + this.wrapuptime = wrapuptime; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/QueueMemberPenaltyEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueMemberPenaltyEvent.java index e77d943d0..054a7cfcb 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueMemberPenaltyEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueMemberPenaltyEvent.java @@ -30,7 +30,8 @@ public class QueueMemberPenaltyEvent extends ManagerEvent { /** * Serializable version identifier. */ - private static final long serialVersionUID = 0L; + private static final long serialVersionUID = 2361464012968723903L; + private String queue; private String location; private Integer penalty; @@ -47,6 +48,7 @@ public class QueueMemberPenaltyEvent extends ManagerEvent { private Integer lastcall; private String membername; private Integer status; + private Integer logintime; /** * Creates a new instance. @@ -346,4 +348,22 @@ public Integer getPenalty() { public void setPenalty(Integer penalty) { this.penalty = penalty; } + + /** + * Gets the login time (as a UNIX timestamp) + * + * @return the login time of the agent + */ + public Integer getLoginTime() { + return logintime; + } + + /** + * Sets the login time (as a UNIX timestamp) + * + * @param logintime the login time of the agent + */ + public void setLoginTime(Integer logintime) { + this.logintime = logintime; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/QueueMemberRemovedEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueMemberRemovedEvent.java index d03a4e88b..9d9da69ba 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueMemberRemovedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueMemberRemovedEvent.java @@ -40,6 +40,9 @@ public class QueueMemberRemovedEvent extends AbstractQueueMemberEvent { Boolean ringinuse; Long lastcall; Integer status; + Integer logintime; + Integer wrapuptime; + Integer lastpause; public QueueMemberRemovedEvent(Object source) { @@ -124,4 +127,28 @@ public Integer getStatus() { public void setStatus(Integer status) { this.status = status; } + + public Integer getLoginTime() { + return logintime; + } + + public void setLoginTime(Integer logintime) { + this.logintime = logintime; + } + + public Integer getWrapupTime() { + return wrapuptime; + } + + public void setWrapupTime(Integer wrapuptime) { + this.wrapuptime = wrapuptime; + } + + public Integer getLastPause() { + return lastpause; + } + + public void setLastPause(Integer lastpause) { + this.lastpause = lastpause; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/QueueMemberRingInUseEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueMemberRingInUseEvent.java new file mode 100644 index 000000000..4d70cc714 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/QueueMemberRingInUseEvent.java @@ -0,0 +1,321 @@ +package org.asteriskjava.manager.event; + +public class QueueMemberRingInUseEvent extends ManagerEvent { + private static final long serialVersionUID = -631622399932926664L; + + private String queue; + private String memberName; + private String _interface; + private String stateInterface; + private String membership; + private Integer penalty; + private Integer callsTaken; + private Integer lastCall; + private Integer lastPause; + private Integer loginTime; + private Integer inCall; + private Integer status; + private Boolean paused; + private String pausedReason; + private Integer ringInUse; + private Integer wrapUpTime; + + /** + * Constructs a QueueMemberRingInUseEvent + * + * @param source The object on which the Event initially occurred. + * @throws IllegalArgumentException if source is null. + */ + public QueueMemberRingInUseEvent(Object source) { + super(source); + } + + /** + * Returns if the member is paused + * + * @return if the member is paused + */ + public Boolean getPaused() { + return paused; + } + + /** + * Sets if member is paused or not + * + * @param paused if paused + */ + public void setPaused(Boolean paused) { + this.paused = paused; + } + + /** + * Returns wrapuptime + * + * @return Returns wrapuptime + */ + public Integer getWrapuptime() { + return wrapUpTime; + } + + /** + * Sets wrapuptime + * + * @param wrapuptime the wrapuptime + */ + public void setWrapuptime(Integer wrapuptime) { + this.wrapUpTime = wrapuptime; + } + + /** + * Returns time in seconds when started last paused the queue member + * + * @return Returns time in seconds when started last paused the queue member + */ + public Integer getLastpause() { + return lastPause; + } + + /** + * Sets time in seconds when started last paused the queue member + * + * @param lastpause time in seconds when started last paused the queue member + */ + public void setLastpause(Integer lastpause) { + this.lastPause = lastpause; + } + + /** + * Returns the queue member's tech or location state + * + * @return the queue member's tech or location state + */ + public String getStateinterface() { + return stateInterface; + } + + /** + * Sets channel technology or location from which the member device changed + * + * @param stateinterface channel technology or location from which the member device changed + */ + public void setStateinterface(String stateinterface) { + this.stateInterface = stateinterface; + } + + /** + * Returns reason if set when paused + * + * @return reason if set when paused + */ + public String getPausedreason() { + return pausedReason; + } + + /** + * Sets reason if set when paused + * + * @param pausedreason reason if set when paused + */ + public void setPausedreason(String pausedreason) { + this.pausedReason = pausedreason; + } + + /** + * Returns if member is in call when event is raised + * + * @return if member is in call when event is raised + */ + public Integer getIncall() { + return inCall; + } + + /** + * Sets if member is in call when event is raised + * + * @param incall if member is in call when event is raised + */ + public void setIncall(Integer incall) { + this.inCall = incall; + } + + /** + * Returns membership in queue + * E.g. dynamic, realtime, static + * + * @return membership in queue + */ + public String getMembership() { + return membership; + } + + /** + * Sets membership in queue + * + * @param membership membership in queue + */ + public void setMembership(String membership) { + this.membership = membership; + } + + /** + * Returns queue member's tech or location name + * + * @return queue member's tech or location name + */ + public String getInterface() { + return _interface; + } + + /** + * Sets queue member's tech or location name + * + * @param _interface queue member's tech or location name + */ + public void setInterface(String _interface) { + this._interface = _interface; + } + + /** + * Returns number of calls this queue member has serviced + * + * @return number of calls this queue member has serviced + */ + public Integer getCallstaken() { + return callsTaken; + } + + /** + * Sets number of calls this queue member has serviced + * + * @param callstaken number of calls this queue member has serviced + */ + public void setCallstaken(Integer callstaken) { + this.callsTaken = callstaken; + } + + /** + * Returns member's ring in use setup + * + * @return member's ring in use setup + */ + public Integer getRinginuse() { + return ringInUse; + } + + /** + * Sets member's ring in use setup + * + * @param ringinuse member's ring in use setup + */ + public void setRinginuse(Integer ringinuse) { + this.ringInUse = ringinuse; + } + + /** + * Returns time this member last took a call, expressed in seconds + * + * @return time this member last took a call, expressed in seconds + */ + public Integer getLastcall() { + return lastCall; + } + + /** + * Sets time this member last took a call, expressed in seconds + * + * @param lastcall time this member last took a call, expressed in seconds + */ + public void setLastcall(Integer lastcall) { + this.lastCall = lastcall; + } + + /** + * Returns name of the queue member. + * + * @return name of the queue member. + */ + public String getMembername() { + return memberName; + } + + /** + * Sets name of the queue member. + * + * @param membername name of the queue member. + */ + public void setMembername(String membername) { + this.memberName = membername; + } + + /** + * Returns numeric device state status of the queue member + * + * @return numeric device state status of the queue member + */ + public Integer getStatus() { + return status; + } + + /** + * Sets numeric device state status of the queue member + * + * @param status numeric device state status of the queue member + */ + public void setStatus(Integer status) { + this.status = status; + } + + /** + * Returns the name of the queue. + * + * @return the name of the queue. + */ + public String getQueue() { + return queue; + } + + /** + * Sets the name of the queue. + * + * @param queue the name of the queue. + */ + public void setQueue(String queue) { + this.queue = queue; + } + + /** + * Returns the new penalty. + * + * @return the new penalty. + */ + public Integer getPenalty() { + return penalty; + } + + /** + * Sets the new penalty. + * + * @param penalty the new penalty. + */ + public void setPenalty(Integer penalty) { + this.penalty = penalty; + } + + /** + * Gets the login time + * + * @return the login time of the agent as a UNIX timestamp + */ + public Integer getLoginTime() { + return loginTime; + } + + /** + * Sets the login time + * + * @param logintime the login time of the agent as a UNIX timestamp + */ + public void setLoginTime(Integer logintime) { + this.loginTime = logintime; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java b/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java index 2585040db..a38c571e8 100644 --- a/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java @@ -14,6 +14,11 @@ public class ReceiveFaxEvent extends ManagerEvent { private Integer transferRate; private String fileName; + private String language; + private String accountCode; + private String linkedId; + private String uniqueId; + public ReceiveFaxEvent(Object source) { super(source); } @@ -81,4 +86,36 @@ public String getFileName() { public void setFileName(String fileName) { this.fileName = fileName; } + + public String getAccountCode() { + return accountCode; + } + + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/RegistryEvent.java b/src/main/java/org/asteriskjava/manager/event/RegistryEvent.java index 28ad6ca80..90b842413 100644 --- a/src/main/java/org/asteriskjava/manager/event/RegistryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/RegistryEvent.java @@ -45,6 +45,7 @@ public class RegistryEvent extends ManagerEvent { private String username; private String status; private String cause; + private String trunkname; /** * @param source @@ -229,4 +230,11 @@ public void setCause(String cause) { this.cause = cause; } + public String getTrunkname() { + return trunkname; + } + + public void setTrunkname(String trunkname) { + this.trunkname = trunkname; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/RequestBadFormatEvent.java b/src/main/java/org/asteriskjava/manager/event/RequestBadFormatEvent.java index cd2f96ce5..6895fbf47 100644 --- a/src/main/java/org/asteriskjava/manager/event/RequestBadFormatEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/RequestBadFormatEvent.java @@ -9,7 +9,7 @@ public class RequestBadFormatEvent extends ManagerEvent { /** * Serializable version identifier. */ - private final static long serialVersionUID = 12534663L; + private final static long serialVersionUID = -4626589852577838795L; private String severity; @@ -31,6 +31,10 @@ public class RequestBadFormatEvent extends ManagerEvent { private String remoteaddress; + private String module; + + private String requestparams; + public RequestBadFormatEvent(Object source) { super(source); } @@ -114,4 +118,20 @@ public String getRemoteaddress() { public void setRemoteaddress(String remoteaddress) { this.remoteaddress = remoteaddress; } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getRequestparams() { + return requestparams; + } + + public void setRequestparams(String requestparams) { + this.requestparams = requestparams; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/RequestNotAllowedEvent.java b/src/main/java/org/asteriskjava/manager/event/RequestNotAllowedEvent.java new file mode 100644 index 000000000..5aa323670 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/RequestNotAllowedEvent.java @@ -0,0 +1,26 @@ +package org.asteriskjava.manager.event; + +public final class RequestNotAllowedEvent extends AbstractSecurityEvent { + private String requestParams; + private String requestType; + + public RequestNotAllowedEvent(Object source) { + super(source); + } + + public Object getRequestParams() { + return requestParams; + } + + public void setRequestParams(String value) { + this.requestParams = value; + } + + public Object getRequestType() { + return requestType; + } + + public void setRequestType(String value) { + this.requestType = value; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/RequestNotSupportedEvent.java b/src/main/java/org/asteriskjava/manager/event/RequestNotSupportedEvent.java new file mode 100644 index 000000000..e84aa6245 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/RequestNotSupportedEvent.java @@ -0,0 +1,17 @@ +package org.asteriskjava.manager.event; + +public final class RequestNotSupportedEvent extends AbstractSecurityEvent { + private String requestType; + + public RequestNotSupportedEvent(Object source) { + super(source); + } + + public String getRequestType() { + return requestType; + } + + public void setRequestType(String value) { + this.requestType = value; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java b/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java index b0f3dcc37..11681ebae 100644 --- a/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java @@ -73,6 +73,7 @@ public class RtcpReceivedEvent extends AbstractRtcpEvent { private Long sentPackets; private Long sentrtp; private String accountCode; + private Double mes; public RtcpReceivedEvent(Object source) { @@ -380,5 +381,11 @@ public void setAccountCode(String accountCode) { this.accountCode = accountCode; } + public Double getMes() { + return mes; + } + public void setMes(Double mes) { + this.mes = mes; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/RtcpSentEvent.java b/src/main/java/org/asteriskjava/manager/event/RtcpSentEvent.java index ba130793d..188a7bf00 100644 --- a/src/main/java/org/asteriskjava/manager/event/RtcpSentEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/RtcpSentEvent.java @@ -58,6 +58,7 @@ public class RtcpSentEvent extends AbstractRtcpEvent { private Integer report0iaJitter; private Integer report0HighestSequence; private String accountCode; + private Double mes; public RtcpSentEvent(Object source) { super(source); @@ -328,4 +329,12 @@ public String getAccountCode() { public void setAccountCode(String accountCode) { this.accountCode = accountCode; } + + public Double getMes() { + return mes; + } + + public void setMes(Double mes) { + this.mes = mes; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java b/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java index 6398df053..7209364cc 100644 --- a/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java @@ -24,6 +24,7 @@ public class SendFaxEvent extends AbstractFaxEvent { * Serial version identifier. */ private static final long serialVersionUID = -1L; + private String channel; private String callerId; private String localStationId; private String remoteStationId; @@ -32,11 +33,24 @@ public class SendFaxEvent extends AbstractFaxEvent { private String transferRate; private String fileName; + private String language; + private String accountCode; + private String linkedId; + private String uniqueId; public SendFaxEvent(Object source) { super(source); } + @Override + public String getChannel() { + return channel; + } + + @Override + public void setChannel(String channel) { + this.channel = channel; + } /** * @return the callerId @@ -149,6 +163,36 @@ public void setFileName(String fileName) { this.fileName = fileName; } + public String getAccountCode() { + return accountCode; + } + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/SessionLimitEvent.java b/src/main/java/org/asteriskjava/manager/event/SessionLimitEvent.java new file mode 100644 index 000000000..f6debbfe2 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/SessionLimitEvent.java @@ -0,0 +1,7 @@ +package org.asteriskjava.manager.event; + +public final class SessionLimitEvent extends AbstractSecurityEvent { + public SessionLimitEvent(Object source) { + super(source); + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/SkypeChatMessageEvent.java b/src/main/java/org/asteriskjava/manager/event/SkypeChatMessageEvent.java index a4c597577..913241a1c 100644 --- a/src/main/java/org/asteriskjava/manager/event/SkypeChatMessageEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SkypeChatMessageEvent.java @@ -16,9 +16,8 @@ */ package org.asteriskjava.manager.event; -import org.asteriskjava.util.Base64; - import java.nio.charset.StandardCharsets; +import java.util.Base64; /** * A SkypeChatMessageEvent is triggered when a Skype Chat message is sent or @@ -107,6 +106,6 @@ public String getDecodedMessage() { if (message == null) { return null; } - return new String(Base64.base64ToByteArray(message), StandardCharsets.UTF_8); + return new String(Base64.getDecoder().decode(message), StandardCharsets.UTF_8); } } diff --git a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java index e8b533ddf..33a4ed511 100644 --- a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java @@ -7,7 +7,7 @@ public class SuccessfulAuthEvent extends ManagerEvent { /** * */ - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -1075176582208556468L; private String severity; private Integer eventVersion; private String accountId; @@ -18,6 +18,7 @@ public class SuccessfulAuthEvent extends ManagerEvent { private String remoteAddress; private String localAddress; private String sessionId; + private String module; public SuccessfulAuthEvent(Object source) { super(source); @@ -102,4 +103,12 @@ public String getSessionId() { public void setSessionId(String sessionId) { this.sessionId = sessionId; } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/T38FaxStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/T38FaxStatusEvent.java index 2ac0158ed..26f062513 100644 --- a/src/main/java/org/asteriskjava/manager/event/T38FaxStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/T38FaxStatusEvent.java @@ -39,6 +39,11 @@ public class T38FaxStatusEvent extends AbstractFaxEvent { private Integer minimumJitterSpace; private Integer unrecoverablePackets; + private String language; + private String accountCode; + private String linkedId; + private String uniqueId; + public T38FaxStatusEvent(Object source) { super(source); } @@ -271,6 +276,38 @@ public Integer getAverageRxDataRateInBps() { return averageRxDataRateStripped == null ? null : Integer.valueOf(averageRxDataRateStripped); } + public String getAccountCode() { + return accountCode; + } + + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getLinkedId() { + return linkedId; + } + + public void setLinkedId(String linkedId) { + this.linkedId = linkedId; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } + String stripUnit(String s) { if (s == null || s.length() == 0) { return null; diff --git a/src/main/java/org/asteriskjava/manager/event/UnexpectedAddressEvent.java b/src/main/java/org/asteriskjava/manager/event/UnexpectedAddressEvent.java new file mode 100644 index 000000000..7229bb2d6 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/UnexpectedAddressEvent.java @@ -0,0 +1,17 @@ +package org.asteriskjava.manager.event; + +public final class UnexpectedAddressEvent extends AbstractSecurityEvent { + private String expectedAddress; + + public UnexpectedAddressEvent(Object source) { + super(source); + } + + public String getExpectedAddress() { + return expectedAddress; + } + + public void setExpectedAddress(String value) { + this.expectedAddress = value; + } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java index 77f05d445..01f440d4c 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -293,7 +293,7 @@ private static String mapToAsterisk(Method getter) { // ok, no field } - return fieldName.toLowerCase(Locale.US); + return fieldName.toLowerCase(Locale.ENGLISH); } static String determineSetterName(String getterName) { diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index e7241e2f0..d007e63e8 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -15,6 +15,7 @@ */ package org.asteriskjava.manager.internal; +import org.asteriskjava.manager.AsteriskMapping; import org.asteriskjava.manager.event.*; import org.asteriskjava.manager.util.EventAttributesHelper; import org.asteriskjava.util.Log; @@ -60,14 +61,18 @@ private void registerBuiltinEventClasses() { } public final void registerEventClass(Class clazz) throws IllegalArgumentException { - String className; String eventType; - className = clazz.getName(); - eventType = className.substring(className.lastIndexOf('.') + 1).toLowerCase(Locale.ENGLISH); + AsteriskMapping annotation = clazz.getAnnotation(AsteriskMapping.class); + if (annotation == null) { + String className = clazz.getName(); + eventType = className.substring(className.lastIndexOf('.') + 1).toLowerCase(Locale.ENGLISH); - if (eventType.endsWith("event")) { - eventType = eventType.substring(0, eventType.length() - "event".length()); + if (eventType.endsWith("event")) { + eventType = eventType.substring(0, eventType.length() - "event".length()); + } + } else { + eventType = annotation.value().toLowerCase(Locale.ENGLISH); } if (UserEvent.class.isAssignableFrom(clazz) && !eventType.startsWith("userevent")) { @@ -107,7 +112,7 @@ public final void registerEventClass(String eventType, Class attributes) { return null; } - eventType = ((String) attributes.get("event")).toLowerCase(Locale.US); + eventType = ((String) attributes.get("event")).toLowerCase(Locale.ENGLISH); // Change in Asterisk 1.4 where the name of the UserEvent is sent as // property instead @@ -179,7 +184,7 @@ public ManagerEvent buildEvent(Object source, Map attributes) { return null; } - userEventType = ((String) attributes.get("userevent")).toLowerCase(Locale.US); + userEventType = ((String) attributes.get("userevent")).toLowerCase(Locale.ENGLISH); eventType = eventType + userEventType; } } diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 7cfbb8a7c..9feeac04b 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -67,18 +67,22 @@ public class ManagerConnectionImpl extends Lockable implements ManagerConnection // NOTE: identifier is AMI_VERSION, defined in include/asterisk/manager.h // AMI version consists of MAJOR.BREAKING.NON-BREAKING. private static final String[] SUPPORTED_AMI_VERSIONS = { - "2.6", // Asterisk 13 - "2.7", // Asterisk 13.2 - "2.8", // Asterisk >13.5 - "2.9", // Asterisk >13.3 - "3.1", // Asterisk =14.3 - "3.2", // Asterisk 14.4.0 - "4.0", // Asterisk 15 - "5.0", // Asterisk 16 - "6.0", // Asterisk 17 - "7.0", // Asterisk 18 - "8.0", // Asterisk 19 - "9.0", // Asterisk 20 + "2.6", // Asterisk 13 + "2.7", // Asterisk 13.2 + "2.8", // Asterisk >13.5 + "2.9", // Asterisk >13.3 + "3.1", // Asterisk =14.3 + "3.2", // Asterisk 14.4.0 + "4.0", // Asterisk 15 + "5.0", // Asterisk 16 + "6.0", // Asterisk 17 + "7.0", // Asterisk 18 + "8.0", // Asterisk 19 + "9.0", // Asterisk 20 + "10.0", // Asterisk 21 + "11.0", // Asterisk 22 + "12.0", // Asterisk 23 + "13.0", // Asterisk Dev }; private static final AtomicLong idCounter = new AtomicLong(0); diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java index efbc00535..c97f268ad 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerReaderImpl.java @@ -131,8 +131,8 @@ public void expectResponseClass(String internalActionId, Class 0) { - // begin of workaround for Astersik bug 13319 - // see AJ-77 - // Use this workaround only when line starts from "From " - // and "To " - int isFromAtStart = line.indexOf("From "); - int isToAtStart = line.indexOf("To "); - - int delimiterIndex = isFromAtStart == 0 || isToAtStart == 0 ? line.indexOf(" ") : line.indexOf(":"); - // end of workaround for Astersik bug 13319 - - int delimiterLength = 1; - - if (delimiterIndex > 0 && line.length() > delimiterIndex + delimiterLength) { - String name = line.substring(0, delimiterIndex).toLowerCase(Locale.ENGLISH).trim(); - String value = line.substring(delimiterIndex + delimiterLength).trim(); - - addToBuffer(buffer, name, value); - // TODO tracing - // logger.debug("Got name [" + name + "], value: [" + - // value + "]"); + if (!line.isEmpty()) { + String[] parts = line.split(":", 2); + if (parts.length == 2) { + parts[0] = parts[0].toLowerCase(Locale.ENGLISH).trim(); + parts[1] = parts[1].trim(); + if (!parts[0].isEmpty()) { + addToBuffer(buffer, parts[0], parts[1]); + // TODO tracing + // logger.debug("Got name [" + name + "], value: [" + value + "]"); + } } } diff --git a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java index 577843f08..c0a0b9371 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ResponseBuilderImpl.java @@ -19,12 +19,11 @@ import org.asteriskjava.manager.response.ManagerError; import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.manager.util.EventAttributesHelper; -import org.slf4j.Logger; +import org.asteriskjava.util.Log; +import org.asteriskjava.util.LogFactory; import java.util.*; -import static org.slf4j.LoggerFactory.getLogger; - /** * Default implementation of the ResponseBuilder interface. * @@ -33,7 +32,7 @@ * @see org.asteriskjava.manager.response.ManagerResponse */ class ResponseBuilderImpl implements ResponseBuilder { - private static final Logger logger = getLogger(ResponseBuilderImpl.class); + private static final Log logger = LogFactory.getLog(ResponseBuilderImpl.class); private static final Set ignoredAttributes = new HashSet<>(Arrays.asList( "attributes", "proxyresponse", ManagerReader.COMMAND_RESULT_RESPONSE_KEY)); diff --git a/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java b/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java index e7e233922..a61b9f2ea 100644 --- a/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/CoreSettingsResponse.java @@ -39,6 +39,7 @@ public class CoreSettingsResponse extends ManagerResponse { private Boolean coreRealtimeEnabled; private Boolean coreCdrEnabled; private Boolean coreHttpEnabled; + private Boolean soundsSearchCustomDir; /** * Returns the version of the Asterisk Manager Interface (AMI). For Asterisk 1.6 this is "1.1". @@ -152,4 +153,12 @@ public boolean isCoreHttpEnabled() { public void setCoreHttpEnabled(Boolean coreHttpEnabled) { this.coreHttpEnabled = coreHttpEnabled; } + + public boolean isSoundsSearchCustomDir() { + return soundsSearchCustomDir != null && soundsSearchCustomDir; + } + + public void setSoundsSearchCustomDir(Boolean soundsSearchCustomDir) { + this.soundsSearchCustomDir = soundsSearchCustomDir; + } } diff --git a/src/main/java/org/asteriskjava/manager/response/FaxLicenseStatusResponse.java b/src/main/java/org/asteriskjava/manager/response/FaxLicenseStatusResponse.java new file mode 100644 index 000000000..f7e91ef2e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/response/FaxLicenseStatusResponse.java @@ -0,0 +1,13 @@ +package org.asteriskjava.manager.response; + +public final class FaxLicenseStatusResponse extends ManagerResponse { + private Integer portsLicensed; + + public Integer getPortsLicensed() { + return portsLicensed; + } + + public void setPortsLicensed(Integer portsLicensed) { + this.portsLicensed = portsLicensed; + } +} diff --git a/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java b/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java index da4ec4a02..0c1f20b26 100644 --- a/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/GetConfigResponse.java @@ -54,7 +54,7 @@ public Map getCategories() { Map responseMap = super.getAttributes(); for (Entry response : responseMap.entrySet()) { String key = response.getKey(); - if (key.toLowerCase(Locale.US).contains("category")) { + if (key.toLowerCase(Locale.ENGLISH).contains("category")) { String[] keyParts = key.split("-"); // if it doesn't have at least category-XXXXXX, skip @@ -91,7 +91,7 @@ public Map getLines(int categoryNumber) { Map responseMap = super.getAttributes(); for (Entry response : responseMap.entrySet()) { String key = response.getKey(); - if (key.toLowerCase(Locale.US).contains("line")) { + if (key.toLowerCase(Locale.ENGLISH).contains("line")) { String[] keyParts = key.split("-"); // if it doesn't have at least line-XXXXXX-XXXXXX, skip diff --git a/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java b/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java index 66bdae04e..5e1469769 100644 --- a/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/MailboxCountResponse.java @@ -28,8 +28,9 @@ public class MailboxCountResponse extends ManagerResponse { /** * Serial version identifier */ - private static final long serialVersionUID = 7820598941277275838L; + private static final long serialVersionUID = 1408614199035675323L; private String mailbox; + private Integer urgMessages; private Integer newMessages; private Integer oldMessages; @@ -47,6 +48,20 @@ public void setMailbox(String mailbox) { this.mailbox = mailbox; } + /** + * Returns the number of urgent messages in the mailbox. + */ + public Integer getUrgMessages() { + return urgMessages; + } + + /** + * Sets the number of urgent messages in the mailbox. + */ + public void setUrgMessages(Integer urgMessages) { + this.urgMessages = urgMessages; + } + /** * Returns the number of new messages in the mailbox. */ diff --git a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java index 5d8013dc1..6f8d14907 100644 --- a/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java +++ b/src/main/java/org/asteriskjava/manager/util/EventAttributesHelper.java @@ -15,11 +15,13 @@ */ package org.asteriskjava.manager.util; +import org.asteriskjava.manager.event.CdrEvent; import org.asteriskjava.manager.event.UserEvent; import org.asteriskjava.manager.response.ManagerResponse; import org.asteriskjava.util.AstUtil; +import org.asteriskjava.util.Log; +import org.asteriskjava.util.LogFactory; import org.asteriskjava.util.ReflectionUtil; -import org.slf4j.Logger; import java.lang.reflect.Constructor; import java.lang.reflect.Method; @@ -28,13 +30,11 @@ import java.util.Map; import java.util.Set; -import static org.slf4j.LoggerFactory.getLogger; - /** * @author Piotr Olaszewski */ public class EventAttributesHelper { - private static final Logger logger = getLogger(EventAttributesHelper.class); + private static final Log logger = LogFactory.getLog(EventAttributesHelper.class); private EventAttributesHelper() { } @@ -81,12 +81,25 @@ public static void setAttributes(Object target, Map attributes, // it seems silly to warn if it's a user event -- maybe it was // intentional if (setter == null && !(target instanceof UserEvent) && !target.getClass().equals(ManagerResponse.class)) { - logger.warn("Unable to set property '" + entry.getKey() + "' to '" + entry.getValue() + "' on " - + target.getClass().getName() - + ": no setter. Please report at https://github.com/asterisk-java/asterisk-java/issues"); - for (Map.Entry entry2 : attributes.entrySet()) { - logger.debug("Key: " + entry2.getKey() + " Value: " + entry2.getValue()); + //CDR has dynamic properties + if (target instanceof CdrEvent) { + try { + Method addproperty= CdrEvent.class.getMethod("addDynamicProperties", String.class, String.class); + addproperty.invoke(target, entry.getKey(), entry.getValue().toString()); + } catch (Exception e) { + logger.error("Unable to set Dynamic CDR Property '" + entry.getKey() + "' to '" + entry.getValue(), e); + continue; + } + + } else { + logger.warn("Unable to set property '" + entry.getKey() + "' to '" + entry.getValue() + "' on " + + target.getClass().getName() + + ": no setter. Please report at https://github.com/asterisk-java/asterisk-java/issues"); + + for (Map.Entry entry2 : attributes.entrySet()) { + logger.debug("Key: " + entry2.getKey() + " Value: " + entry2.getValue()); + } } } diff --git a/src/main/java/org/asteriskjava/pbx/DefaultAsteriskSettings.java b/src/main/java/org/asteriskjava/pbx/DefaultAsteriskSettings.java index f4f85cbec..5dc7f73c2 100644 --- a/src/main/java/org/asteriskjava/pbx/DefaultAsteriskSettings.java +++ b/src/main/java/org/asteriskjava/pbx/DefaultAsteriskSettings.java @@ -28,7 +28,7 @@ public Integer getMeetmeBaseAddress() { // doesn't overlap any conference rooms you are currently running on your pbx. // You should probably allow 200 conference rooms here e.g. (3000-3200) // Actions like transfers (and conference calls) use a conference room. - return new Integer(3000); + return 3000; } @Override diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java index 22941bf19..454a2ff9d 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java @@ -35,7 +35,7 @@ public class CoherentEventFactory { // static initialiser static { - Set> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events", + Set> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events", ManagerEvent.class); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); diff --git a/src/main/java/org/asteriskjava/util/AstUtil.java b/src/main/java/org/asteriskjava/util/AstUtil.java index 0f0383b27..98640c110 100644 --- a/src/main/java/org/asteriskjava/util/AstUtil.java +++ b/src/main/java/org/asteriskjava/util/AstUtil.java @@ -86,7 +86,7 @@ public static boolean isTrue(Object o) { return (Boolean) o; } - return TRUE_LITERALS.contains(o.toString().toLowerCase(Locale.US)); + return TRUE_LITERALS.contains(o.toString().toLowerCase(Locale.ENGLISH)); } /** @@ -180,7 +180,7 @@ public static boolean isNull(Object s) { return false; } - return NULL_LITERALS.contains(((String) s).toLowerCase(Locale.US)); + return NULL_LITERALS.contains(((String) s).toLowerCase(Locale.ENGLISH)); } /** diff --git a/src/main/java/org/asteriskjava/util/Base64.java b/src/main/java/org/asteriskjava/util/Base64.java index e819c08d9..c327d7665 100644 --- a/src/main/java/org/asteriskjava/util/Base64.java +++ b/src/main/java/org/asteriskjava/util/Base64.java @@ -12,8 +12,11 @@ * and vice-versa.

* From java.util.prefs. * + * @deprecated Use {@link java.util.Base64} instead. + * * @author Josh Bloch */ +@Deprecated public class Base64 { private Base64() { diff --git a/src/main/java/org/asteriskjava/util/ReflectionUtil.java b/src/main/java/org/asteriskjava/util/ReflectionUtil.java index 0dfc844e0..86a32e252 100644 --- a/src/main/java/org/asteriskjava/util/ReflectionUtil.java +++ b/src/main/java/org/asteriskjava/util/ReflectionUtil.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.util; +import org.reflections.Reflections; + import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; @@ -30,6 +32,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Utility class that provides helper methods for reflection that is used by the @@ -132,7 +137,7 @@ private static Map getSettersInternal(Class clazz) { } // OK seems to be an setter - name = methodName.substring("set".length()).toLowerCase(Locale.US); + name = methodName.substring("set".length()).toLowerCase(Locale.ENGLISH); // if an event class implements a setter that exists in // ManagerEvent, then prefer the setter from the extending class @@ -157,52 +162,21 @@ private static Map getSettersInternal(Class clazz) { return accessors; } + private static final Pattern ILLEGAL_CHARS = Pattern.compile("[^a-z0-9]+"); + /** - * Strips all illegal charaters from the given lower case string. Illegal - * characters are all characters that are neither characters ('a' to 'z') + * Strips all illegal characters from the given lower case string. Illegal + * characters are all characters that are neither alphabetic ('a' to 'z') * nor digits ('0' to '9'). * * @param s the original string * @return the string with all illegal characters stripped */ public static String stripIllegalCharacters(String s) { - char c; - boolean needsStrip = false; - StringBuilder sb; - if (s == null) { return null; } - - for (int i = 0; i < s.length(); i++) { - c = s.charAt(i); - if (c >= '0' && c <= '9') { - // continue - } // NOPMD - else if (c >= 'a' && c <= 'z') { - // continue - } // NOPMD - else { - needsStrip = true; - break; - } - } - - if (!needsStrip) { - return s; - } - - sb = new StringBuilder(s.length()); - for (int i = 0; i < s.length(); i++) { - c = s.charAt(i); - if (c >= '0' && c <= '9') { - sb.append(c); - } else if (c >= 'a' && c <= 'z') { - sb.append(c); - } - } - - return sb.toString(); + return ILLEGAL_CHARS.matcher(s).replaceAll(""); } /** @@ -257,35 +231,24 @@ public static Object newInstance(String s) { private static final Log logger = LogFactory.getLog(ReflectionUtil.class); /** - * find and all non abstract classes that implement/extend - * baseClassOrInterface in the package packageName + * Find all non-abstract classes in the given package that + * implement/extend the provided type. * - * @param packageName - * @param baseClassOrInterface - * @return + * @param packageName the package to search + * @param baseClassOrInterface the supertype or interface to filter by + * @return a Set of types that implement or extend the provided type */ - @SuppressWarnings("unchecked") - public static Set> loadClasses(String packageName, Class baseClassOrInterface) { - Set> result = new HashSet<>(); - - try { - Set classNames = getClassNamesFromPackage(packageName); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - for (String className : classNames) { - try { - Class clazz = classLoader.loadClass(packageName + "." + className); - if (!Modifier.isAbstract(clazz.getModifiers()) && baseClassOrInterface.isAssignableFrom(clazz)) { - result.add((Class) clazz); - } - } catch (Throwable e) { - logger.error(e, e); - } - - } - logger.info("Loaded " + result.size()); - } catch (Exception e) { - logger.error(e, e); - } + public static Set> loadClasses(String packageName, Class baseClassOrInterface) { + Set> result = + Stream.concat( + Stream.of(baseClassOrInterface), + new Reflections(packageName) + .getSubTypesOf(baseClassOrInterface) + .stream()) + .filter(c -> !Modifier.isAbstract(c.getModifiers())) + .collect(Collectors.toSet()); + + logger.info("Loaded asd" + result.size()); return result; } diff --git a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java index 178a39dea..e50c6f0be 100644 --- a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java +++ b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java @@ -46,10 +46,8 @@ public class SocketConnectionFacadeImpl implements SocketConnectionFacade { private Trace trace; /** - * <<<<<<< HEAD Creates a new instance for use with the Manager API that - * uses UTF-8 as encoding and CRNL ("\r\n") as line delimiter. ======= - * Creates a new instance for use with the Manager API that uses CRNL - * ("\r\n") as line delimiter. >>>>>>> refs/heads/release-1.1 + * Creates a new instance for use with the Manager API that uses UTF-8 + * as the encoding and CRLF ("\r\n") as line delimiter. * * @param host the foreign host to connect to. * @param port the foreign port to connect to. @@ -64,7 +62,7 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou /** * Creates a new instance for use with the Manager API that uses the given - * encoding and CRNL ("\r\n") as line delimiter. + * encoding and CRLF ("\r\n") as line delimiter. * * @param host the foreign host to connect to. * @param port the foreign port to connect to. diff --git a/src/test/java/org/asteriskjava/AsteriskVersionTest.java b/src/test/java/org/asteriskjava/AsteriskVersionTest.java index 24f28bace..37fec6b02 100644 --- a/src/test/java/org/asteriskjava/AsteriskVersionTest.java +++ b/src/test/java/org/asteriskjava/AsteriskVersionTest.java @@ -31,8 +31,14 @@ void test15() { void test18() { assertTrue(AsteriskVersion.getDetermineVersionFromString("Asterisk 18.1.0").equals(AsteriskVersion.ASTERISK_18)); } + @Test void testCertified18() { assertTrue(AsteriskVersion.getDetermineVersionFromString("Asterisk certified/18.9-cert2").equals(AsteriskVersion.ASTERISK_18)); } + + @Test + void testCertified22() { + assertTrue(AsteriskVersion.getDetermineVersionFromString("Asterisk certified-22.8-cert2").equals(AsteriskVersion.ASTERISK_22)); + } } diff --git a/src/test/java/org/asteriskjava/fastagi/internal/AgiRequestImplTest.java b/src/test/java/org/asteriskjava/fastagi/internal/AgiRequestImplTest.java index 8b8bb985a..10a19be8f 100644 --- a/src/test/java/org/asteriskjava/fastagi/internal/AgiRequestImplTest.java +++ b/src/test/java/org/asteriskjava/fastagi/internal/AgiRequestImplTest.java @@ -66,7 +66,7 @@ void testBuildRequest() { assertEquals("9876", request.getRdnis(), "incorrect rdnis"); assertEquals("local", request.getContext(), "incorrect context"); assertEquals("8870", request.getExtension(), "incorrect extension"); - assertEquals(new Integer(1), request.getPriority(), "incorrect priority"); + assertEquals(Integer.valueOf(1), request.getPriority(), "incorrect priority"); assertEquals(Boolean.FALSE, request.getEnhanced(), "incorrect enhanced"); assertNull(request.getAccountCode(), "incorrect accountCode must not be set"); assertEquals(AsteriskVersion.ASTERISK_13, request.getAsteriskVersion(), "incorret Asterisk Version Number"); diff --git a/src/test/java/org/asteriskjava/manager/event/BridgeVideoSourceUpdateEventTest.java b/src/test/java/org/asteriskjava/manager/event/BridgeVideoSourceUpdateEventTest.java new file mode 100644 index 000000000..4331041a7 --- /dev/null +++ b/src/test/java/org/asteriskjava/manager/event/BridgeVideoSourceUpdateEventTest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Hector Espert + * + * Licensed 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.asteriskjava.manager.event; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.HashSet; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.asteriskjava.manager.util.EventAttributesHelper.setAttributes; + +class BridgeVideoSourceUpdateEventTest { + + @Test + void shouldCreateEvent() { + BridgeVideoSourceUpdateEvent bridgeVideoSourceUpdateEvent = new BridgeVideoSourceUpdateEvent(new Object()); + + HashMap attributes = new HashMap<>(); + attributes.put("bridgeuniqueid", "85f11e74-b0d9-4354-bc91-80782ee7a6a7"); + attributes.put("bridgepreviousvideosource", "e39cdee4-61a1-49b5-9656-96cef742806f"); + setAttributes(bridgeVideoSourceUpdateEvent, attributes, new HashSet<>()); + + assertThat(bridgeVideoSourceUpdateEvent.getBridgeUniqueId()) + .isEqualTo("85f11e74-b0d9-4354-bc91-80782ee7a6a7"); + assertThat(bridgeVideoSourceUpdateEvent.getBridgePreviousVideoSource()) + .isEqualTo("e39cdee4-61a1-49b5-9656-96cef742806f"); + } + +} \ No newline at end of file diff --git a/src/test/java/org/asteriskjava/manager/event/NewStateEventTest.java b/src/test/java/org/asteriskjava/manager/event/NewStateEventTest.java index 2cf0249e7..47e92601d 100644 --- a/src/test/java/org/asteriskjava/manager/event/NewStateEventTest.java +++ b/src/test/java/org/asteriskjava/manager/event/NewStateEventTest.java @@ -16,13 +16,13 @@ void setUp() { @Test void testWithState() { newStateEvent.setState("Ring"); - assertEquals(new Integer(4), newStateEvent.getChannelState()); + assertEquals(Integer.valueOf(4), newStateEvent.getChannelState()); assertEquals("Ring", newStateEvent.getChannelStateDesc()); } @Test void testWithUnknownState() { newStateEvent.setState("Unknown (4)"); - assertEquals(new Integer(4), newStateEvent.getChannelState()); + assertEquals(Integer.valueOf(4), newStateEvent.getChannelState()); } } diff --git a/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java b/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java index e4831a46f..c7485ea6a 100644 --- a/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java +++ b/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java @@ -17,14 +17,14 @@ void setUp() { void testFrom() { rtcpReceivedEvent.setFrom("192.168.0.1:1234"); assertEquals(rtcpReceivedEvent.getFromAddress().getHostAddress(), "192.168.0.1"); - assertEquals(new Integer(1234), rtcpReceivedEvent.getFromPort()); + assertEquals(Integer.valueOf(1234), rtcpReceivedEvent.getFromPort()); } @Test void testPt() { rtcpReceivedEvent.setPt("200(Sender Report)"); - assertEquals(new Long(200), rtcpReceivedEvent.getPt()); - assertEquals(new Long(RtcpReceivedEvent.PT_SENDER_REPORT), rtcpReceivedEvent.getPt()); + assertEquals(Long.valueOf(200), rtcpReceivedEvent.getPt()); + assertEquals(Long.valueOf(RtcpReceivedEvent.PT_SENDER_REPORT), rtcpReceivedEvent.getPt()); } @Test @@ -42,6 +42,6 @@ void testDlSrWithSpace() { @Test void testRtt() { rtcpReceivedEvent.setRtt("12345(sec)"); - assertEquals(new Double(12345), rtcpReceivedEvent.getRtt()); + assertEquals(Double.valueOf(12345), rtcpReceivedEvent.getRtt()); } } diff --git a/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java index c20318db3..19782a6d3 100644 --- a/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java @@ -357,7 +357,7 @@ void testBuildEventWithLong() { event = eventBuilder.buildEvent(this, properties); assertNotNull(event); - assertEquals(new Long(569108), ((MeetMeLeaveEvent) event).getDuration(), "Duration property not set correctly"); + assertEquals(Long.valueOf(569108), ((MeetMeLeaveEvent) event).getDuration(), "Duration property not set correctly"); } @Test diff --git a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java index eabb78d67..22bbb9f23 100644 --- a/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/ManagerReaderImplTest.java @@ -150,30 +150,6 @@ void testRunReceivingEventWithMapPropertyAndOnlyOneEntry() throws Exception { assertEquals(DisconnectEvent.class, dispatcher.dispatchedEvents.get(1).getClass(), "second event must be an DisconnectEvent"); } - @Test - void testWorkaroundForAsteriskBug13319() throws Exception { - when(socketConnectionFacade.readLine()) - .thenReturn("Event: RTCPReceived") - .thenReturn("From 192.168.0.1:1234") - .thenReturn("HighestSequence: 999") - .thenReturn("") - .thenReturn(null); - - managerReader.setSocket(socketConnectionFacade); - managerReader.run(); - - assertEquals(2, dispatcher.dispatchedEvents.size(), "not exactly two events dispatched"); - - assertEquals(RtcpReceivedEvent.class, dispatcher.dispatchedEvents.get(0).getClass(), "first event must be a RtcpReceivedEvent"); - - RtcpReceivedEvent rtcpReceivedEvent = (RtcpReceivedEvent) dispatcher.dispatchedEvents.get(0); - assertEquals("192.168.0.1", rtcpReceivedEvent.getFromAddress().getHostAddress(), "Invalid from address on RtcpReceivedEvent"); - assertEquals(new Integer(1234), rtcpReceivedEvent.getFromPort(), "Invalid from port on RtcpReceivedEvent"); - assertEquals(new Long(999), rtcpReceivedEvent.getHighestSequence(), "Invalid highest sequence on RtcpReceivedEvent"); - - assertEquals(DisconnectEvent.class, dispatcher.dispatchedEvents.get(1).getClass(), "second event must be a DisconnectEvent"); - } - // todo fix testRunReceivingUserEvent void XtestRunReceivingUserEvent() throws Exception { managerReader.registerEventClass(MyUserEvent.class); diff --git a/src/test/java/org/asteriskjava/util/internal/streamreader/FastScannerRandomTest.java b/src/test/java/org/asteriskjava/util/internal/streamreader/FastScannerRandomTest.java index eadce8739..328414419 100644 --- a/src/test/java/org/asteriskjava/util/internal/streamreader/FastScannerRandomTest.java +++ b/src/test/java/org/asteriskjava/util/internal/streamreader/FastScannerRandomTest.java @@ -1,6 +1,6 @@ package org.asteriskjava.util.internal.streamreader; -import ch.qos.logback.core.encoder.ByteArrayUtil; +import org.asteriskjava.manager.internal.ManagerUtil; import org.asteriskjava.util.internal.SocketConnectionFacadeImpl; import org.junit.jupiter.api.Test; @@ -72,8 +72,8 @@ void compare(String testData, Pattern pattern) throws IOException { if (!fastResult.equals(scannerResult)) { - System.out.println("Expected " + ByteArrayUtil.toHexString(scannerResult.getBytes())); - System.out.println("Got " + ByteArrayUtil.toHexString(fastResult.getBytes())); + System.out.println("Expected " + ManagerUtil.toHexString(scannerResult.getBytes())); + System.out.println("Got " + ManagerUtil.toHexString(fastResult.getBytes())); System.out.println("Error " + ctr); System.out.println("");