diff --git a/.classpath b/.classpath deleted file mode 100644 index 512a74ba..00000000 --- a/.classpath +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.directory b/.directory deleted file mode 100644 index 0a926dd5..00000000 --- a/.directory +++ /dev/null @@ -1,4 +0,0 @@ -[Dolphin] -Timestamp=2015,9,8,20,39,49 -Version=3 -ViewMode=1 diff --git a/.gitignore b/.gitignore index dc47dc6a..6633be8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,35 @@ -*.class +### JetBrains template +.idea/ /classes* /product* -/bin* +out/ .directory -.settings \ No newline at end of file +.settings + +## File-based project format: +*.iws +*.iml + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +### Java template +*.class +*.log +# Package Files # +*.jar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +### Gradle template +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml deleted file mode 100644 index c4c95431..00000000 --- a/.idea/codeStyleSettings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 96cc43ef..9c276ab9 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,22 +1,9 @@ - - - - - - - - - - - - - - - - - + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index 049cafef..00000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/copyright/sdrtrunk.xml b/.idea/copyright/sdrtrunk.xml deleted file mode 100644 index d2ce33df..00000000 --- a/.idea/copyright/sdrtrunk.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 2c55e21a..05483570 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,43 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.idea/modules.xml b/.idea/modules.xml index 071dc2cc..f67d0d5b 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,9 @@ - + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index e96534fb..00000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 0dc6f92c..fef64bf1 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -11,6 +11,6 @@ - + \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index 7accc076..00000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - sdrtrunk - - - - - - org.eclipse.xtext.ui.shared.xtextBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.xtext.ui.shared.xtextNature - - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index a698e596..00000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/CHANGELOG b/CHANGELOG index 7ab1b516..89e692b0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,18 @@ +0.3.3 20171225 + - Changes build system from ant to gradle. Thanks to: Roman Tsypuk https://github.com/tsypuk + - Adds LIST and ID3 metadata to wav audio recordings -0.3.0-beta1 20170129 +0.3.2 20171105 + - Resolves issue with tuner frequency adjustments that was causing channel processing + to lockup and show persistent 'overflow' state in each channel status + - Resolves issue with broadcastify 'mountpoint-in-use' error handling and updates + memory usage logging + - Resolves issue with Shoutcast 2 login error + +0.3.1 20171009 + - Resolves Java 9 incompatibility issues + +0.3.0 20170922 - REQUIRES: Java 8 (or newer) for compatibility and eventual changeover to JavaFX - FEATURE: audio streaming - adds capability to stream to multiple remote broadcast servers (Broadcastify, Icecast v2.3 and v2.4+, and Shoutcast V1 and V2). Each @@ -34,7 +47,7 @@ - Updated Baseband (I/Q) recording at 48 kHz - Added Airspy tuner support - New traffic channel pool manager for trunked call following - - P25 Decoder for C4FM and LSM with trunked call following and audio + - P25 Decoder for C4FM and LSM with trunked call following and audio decoding via the JMBE library - Updated MPT1327 decoder and trunked call following. - Updated spectral and waterfall display with zoom (2-64x) and pan and automatic diff --git a/README.md b/README.md index f8a2fa96..3b10f06e 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,47 @@ A cross-platform java application for decoding, monitoring, recording and stream ![sdrtrunk Application Overview - Version 0.3.0](https://github.com/DSheirer/sdrtrunk/wiki/images/ApplicationOverview_V0.3.0.png) **Figure 1:** sdrtrunk **Version 0.3.0** Application Screenshot + +# Instructions: +## Build the project +Project uses gradle as build system. You can build it with locally installed gradle or if you do not have/want install gradle you can use preconfigured linux/windows wrapper. +### Build with locally installed gradle 4.3.1 +``` +gradle clean buildSdr +``` +### Build with preconfigured wrapper for linux/windows +Linux +``` +./gradlew clean buildSdr +``` +Windows +``` +gradle.bat clean buildSdr +``` +This would add gradle, download all project dependencies and build JAR + +## Development +All dependencies/versions are controlled from build.gradle. +To change the new release version tag of artifact - change property: +``` +version = '0.3.2' +``` + +## Run SDRTrunk +SDRTrunk is packed into single uber-jar file. There is need to have folders with dependecies and +adding them with classpath. Just run with java. +### Use Java8 +``` +java -jar build/libs/sdr-trunk-all-0.3.2.jar +``` + +## TODO ITEMS + +- [x] Move project to gradle build +- [x] Changed folders structure, based on java project +- [x] Dependencies are moved to gradle and versions are updated +- [x] Create uberJAR with all dependencies +- [ ] Some dependencies left in imports folder. Find them and include into gradle +- [ ] Move images into resources of project +- [ ] Add tests to project. This would guarantee that after refactoring part of functionality is not broken +- [ ] Create modular OOP system (radio-module, gui, web-ui, etc). This would allow to use RADIO modules to call from CLI, GUI or Web UI. And use SDRTrunk as dependency for other projects. \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..5683c54c --- /dev/null +++ b/build.gradle @@ -0,0 +1,73 @@ +buildscript { + repositories { + jcenter() + mavenCentral() + } + dependencies { + } +} + +apply plugin: 'java' +apply plugin: 'idea' + +repositories { + jcenter() + mavenCentral() +} + +version = '0.3.3-beta.2' +sourceCompatibility = 1.8 + +sourceSets { + main.java.srcDirs 'src/main' + test.java.srcDirs 'src/test' +} + +idea { + module { + downloadJavadoc = true + downloadSources = true + } +} + +dependencies { + testCompile 'junit:junit:4.12' + testCompile 'org.assertj:assertj-core:3.8.0' + compile fileTree(dir: 'imports', include: '*.jar') + compile 'org.apache.commons:commons-lang3:3.7' + compile 'org.apache.commons:commons-io:1.3.2' + compile 'org.slf4j:slf4j-api:1.7.25' + compile 'ch.qos.logback:logback-core:1.2.3' + compile 'ch.qos.logback:logback-classic:1.2.3' + compile 'com.miglayout:miglayout-swing:5.0' + + compile 'org.usb4java:usb4java-javax:1.2.0' + compile 'org.usb4java:usb4java:1.2.0' + compile 'org.usb4java:libusb4java:1.2.0' + compile 'javax.usb:usb-api:1.0.2' + compile 'com.github.wendykierp:JTransforms:3.1' + compile 'pl.edu.icm:JLargeArrays:1.6' + compile 'net.coderazzi:tablefilter-swing:5.3.1' + compile 'com.jidesoft:jide-oss:3.4.3' + compile 'org.apache.mina:mina-core:2.0.16' + compile 'org.apache.mina:mina-http:2.0.16' + compile 'org.apache.axis:axis-jaxrpc:1.4' + compile 'org.apache.axis:axis:1.4' + compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.3' +} + +task wrapper(type: Wrapper) { + gradleVersion = '4.3.1' +} + +task buildSdr(type: Jar) { + manifest { + attributes 'Implementation-Title': 'SdrTrunk project', + 'Implementation-Version': version, + 'Main-Class': 'io.github.dsheirer.gui.SDRTrunk', + 'Class-Path': 'jmbe-0.3.2.jar jmbe-0.3.3.jar' + } + baseName = project.name + '-all' + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} diff --git a/build/build.xml b/build/build.xml deleted file mode 100644 index e9f50f4c..00000000 --- a/build/build.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - Ant build script for SDRTrunk Decoder Application - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/logback.xml b/config/logback.xml deleted file mode 100644 index 9fe5f368..00000000 --- a/config/logback.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - ${user.home}/SDRTrunk/logs/sdrtrunk_app.log - - - ${user.home}/SDRTrunk/logs/%d{yyyyMMdd}_sdrtrunk_app.log - 10 - - - %-25(%d{yyyyMMdd HHmmss.SSS} [%thread]) %-5level %logger{30} - %msg%n - - - - - - - - - - %-12(%d{HH:mm:ss.SSS}) %-5level %logger{25} - %msg%n - - - - - - - - - - - \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..6b6ea3ab Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..34c937c9 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-bin.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..cccdd3d5 --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..e95643d6 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/images/.directory b/images/.directory deleted file mode 100644 index 4d114620..00000000 --- a/images/.directory +++ /dev/null @@ -1,4 +0,0 @@ -[Dolphin] -PreviewsShown=true -Timestamp=2013,9,20,8,54,21 -Version=3 diff --git a/imports/.directory b/imports/.directory deleted file mode 100644 index 2154816a..00000000 --- a/imports/.directory +++ /dev/null @@ -1,4 +0,0 @@ -[Dolphin] -Timestamp=2013,4,7,10,12,39 -Version=3 -ViewMode=1 diff --git a/imports/JLargeArrays-1.2.jar b/imports/JLargeArrays-1.2.jar deleted file mode 100644 index 7be7a5da..00000000 Binary files a/imports/JLargeArrays-1.2.jar and /dev/null differ diff --git a/imports/JTransforms-3.0.jar b/imports/JTransforms-3.0.jar deleted file mode 100644 index 9cc2e3f3..00000000 Binary files a/imports/JTransforms-3.0.jar and /dev/null differ diff --git a/imports/activation-1.1.jar b/imports/activation-1.1.jar deleted file mode 100644 index 53f82a1c..00000000 Binary files a/imports/activation-1.1.jar and /dev/null differ diff --git a/imports/axis.jar b/imports/axis.jar deleted file mode 100644 index 20b09a59..00000000 Binary files a/imports/axis.jar and /dev/null differ diff --git a/imports/commons-codec-1.9.jar b/imports/commons-codec-1.9.jar deleted file mode 100644 index ef35f1c5..00000000 Binary files a/imports/commons-codec-1.9.jar and /dev/null differ diff --git a/imports/commons-discovery-0.2.jar b/imports/commons-discovery-0.2.jar deleted file mode 100644 index b8855484..00000000 Binary files a/imports/commons-discovery-0.2.jar and /dev/null differ diff --git a/imports/commons-io-2.4.jar b/imports/commons-io-2.4.jar deleted file mode 100644 index 90035a4f..00000000 Binary files a/imports/commons-io-2.4.jar and /dev/null differ diff --git a/imports/commons-lang3-3.2.1.jar b/imports/commons-lang3-3.2.1.jar deleted file mode 100644 index 6bf4f93c..00000000 Binary files a/imports/commons-lang3-3.2.1.jar and /dev/null differ diff --git a/imports/commons-logging-1.2.jar b/imports/commons-logging-1.2.jar deleted file mode 100644 index 93a3b9f6..00000000 Binary files a/imports/commons-logging-1.2.jar and /dev/null differ diff --git a/imports/java-mail-1.4.jar b/imports/java-mail-1.4.jar deleted file mode 100644 index e6f70832..00000000 Binary files a/imports/java-mail-1.4.jar and /dev/null differ diff --git a/imports/javassist-3.20.0-GA.jar b/imports/javassist-3.20.0-GA.jar deleted file mode 100644 index 0f1ff725..00000000 Binary files a/imports/javassist-3.20.0-GA.jar and /dev/null differ diff --git a/imports/jaxrpc.jar b/imports/jaxrpc.jar deleted file mode 100644 index a2c13d9a..00000000 Binary files a/imports/jaxrpc.jar and /dev/null differ diff --git a/imports/jide-oss-3.5.15.jar b/imports/jide-oss-3.5.15.jar deleted file mode 100644 index 18b5acfa..00000000 Binary files a/imports/jide-oss-3.5.15.jar and /dev/null differ diff --git a/imports/jsr80-1.0.1.jar b/imports/jsr80-1.0.1.jar deleted file mode 100644 index ead7cbef..00000000 Binary files a/imports/jsr80-1.0.1.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-linux-aarch64.jar b/imports/libusb4java-1.2.0-linux-aarch64.jar deleted file mode 100644 index 61a2e742..00000000 Binary files a/imports/libusb4java-1.2.0-linux-aarch64.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-linux-arm.jar b/imports/libusb4java-1.2.0-linux-arm.jar deleted file mode 100644 index cb29774c..00000000 Binary files a/imports/libusb4java-1.2.0-linux-arm.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-linux-ppc.jar b/imports/libusb4java-1.2.0-linux-ppc.jar deleted file mode 100644 index f094b27d..00000000 Binary files a/imports/libusb4java-1.2.0-linux-ppc.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-linux-x86.jar b/imports/libusb4java-1.2.0-linux-x86.jar deleted file mode 100644 index 16ac5385..00000000 Binary files a/imports/libusb4java-1.2.0-linux-x86.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-linux-x86_64.jar b/imports/libusb4java-1.2.0-linux-x86_64.jar deleted file mode 100644 index 4652525e..00000000 Binary files a/imports/libusb4java-1.2.0-linux-x86_64.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-osx-x86.jar b/imports/libusb4java-1.2.0-osx-x86.jar deleted file mode 100644 index d4168ca5..00000000 Binary files a/imports/libusb4java-1.2.0-osx-x86.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-osx-x86_64.jar b/imports/libusb4java-1.2.0-osx-x86_64.jar deleted file mode 100644 index c2d4e2c5..00000000 Binary files a/imports/libusb4java-1.2.0-osx-x86_64.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-windows-x86.jar b/imports/libusb4java-1.2.0-windows-x86.jar deleted file mode 100644 index 58461996..00000000 Binary files a/imports/libusb4java-1.2.0-windows-x86.jar and /dev/null differ diff --git a/imports/libusb4java-1.2.0-windows-x86_64.jar b/imports/libusb4java-1.2.0-windows-x86_64.jar deleted file mode 100644 index 56b9d657..00000000 Binary files a/imports/libusb4java-1.2.0-windows-x86_64.jar and /dev/null differ diff --git a/imports/logback-classic-1.1.2.jar b/imports/logback-classic-1.1.2.jar deleted file mode 100644 index 3d5d0fff..00000000 Binary files a/imports/logback-classic-1.1.2.jar and /dev/null differ diff --git a/imports/logback-core-1.1.2.jar b/imports/logback-core-1.1.2.jar deleted file mode 100644 index 575aec5e..00000000 Binary files a/imports/logback-core-1.1.2.jar and /dev/null differ diff --git a/imports/miglayout-4.0-swing.jar b/imports/miglayout-4.0-swing.jar deleted file mode 100644 index 7b6a22ca..00000000 Binary files a/imports/miglayout-4.0-swing.jar and /dev/null differ diff --git a/imports/mina-core-2.0.16.jar b/imports/mina-core-2.0.16.jar deleted file mode 100644 index 0e6d9883..00000000 Binary files a/imports/mina-core-2.0.16.jar and /dev/null differ diff --git a/imports/mina-http-2.0.16.jar b/imports/mina-http-2.0.16.jar deleted file mode 100644 index 62a5efcc..00000000 Binary files a/imports/mina-http-2.0.16.jar and /dev/null differ diff --git a/imports/slf4j-api-1.7.21.jar b/imports/slf4j-api-1.7.21.jar deleted file mode 100644 index 2a5c33ec..00000000 Binary files a/imports/slf4j-api-1.7.21.jar and /dev/null differ diff --git a/imports/tablefilter-swing-5.2.1.jar b/imports/tablefilter-swing-5.2.1.jar deleted file mode 100644 index a7d26029..00000000 Binary files a/imports/tablefilter-swing-5.2.1.jar and /dev/null differ diff --git a/imports/usb-api-1.0.2.jar b/imports/usb-api-1.0.2.jar deleted file mode 100644 index 7abd6f70..00000000 Binary files a/imports/usb-api-1.0.2.jar and /dev/null differ diff --git a/imports/usb4java-1.2.0.jar b/imports/usb4java-1.2.0.jar deleted file mode 100644 index fa6128d7..00000000 Binary files a/imports/usb4java-1.2.0.jar and /dev/null differ diff --git a/imports/usb4java-javax-1.2.0.jar b/imports/usb4java-javax-1.2.0.jar deleted file mode 100644 index 9c2ba2a5..00000000 Binary files a/imports/usb4java-javax-1.2.0.jar and /dev/null differ diff --git a/scripts/run_sdrtrunk_linux.sh b/scripts/run_sdrtrunk_linux.sh deleted file mode 100755 index b0d2ff65..00000000 --- a/scripts/run_sdrtrunk_linux.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -java -version - -# Test for java version 9 -JAVA_9=$(java -version 2>&1 | grep -i version | sed 's/.* "\([9]\).*/\1/') - -if [ -z ${JAVA_9+x} ]; then - echo Using Java 9 program options - # Java 9 uses the G1 garbage collector by default and requires that we specify the - # java.xml.bind package since it's been removed from the java se core library - java -cp "*:libs/*" --add-modules java.xml.bind gui.SDRTrunk; -else - echo Using Java 8 program options - java -XX:+UseG1GC -cp "*:libs/*" gui.SDRTrunk; -fi diff --git a/scripts/run_sdrtrunk_windows.bat b/scripts/run_sdrtrunk_windows.bat deleted file mode 100644 index 1c38bd44..00000000 --- a/scripts/run_sdrtrunk_windows.bat +++ /dev/null @@ -1,25 +0,0 @@ -@echo off - -java -version - -SETLOCAL ENABLEDELAYEDEXPANSION - -for /f "usebackq tokens=3" %%a in (`java -version 2^>^&1 ^| find "version"`) do ( - rem set b to the unquoted version string parsed from the java version command - set b=%%~a - - rem set c to the first character of the unquoted version string - set c=!b:~0,1! - - if !c! equ 9 ( - echo Using Java 9 options - java -cp "SDRTrunk.jar;*;libs/*;config/*;images/*" --add-modules java.xml.bind gui.SDRTrunk - ) else ( - echo Using Java 8 options - java -XX:+UseG1GC -cp "SDRTrunk.jar;*;libs/*;config/*;images/*" gui.SDRTrunk - ) -) - -ENDLOCAL - -@echo on diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..e592e50e --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'sdr-trunk' \ No newline at end of file diff --git a/src/.directory b/src/.directory deleted file mode 100644 index a931c4fe..00000000 --- a/src/.directory +++ /dev/null @@ -1,4 +0,0 @@ -[Dolphin] -Timestamp=2015,9,1,6,42,59 -Version=3 -ViewMode=1 diff --git a/src/alias/Alias.java b/src/alias/Alias.java deleted file mode 100644 index 8f8b5ba5..00000000 --- a/src/alias/Alias.java +++ /dev/null @@ -1,354 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014-2016 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.bind.annotation.XmlTransient; - -import alias.action.AliasAction; -import alias.id.AliasID; -import alias.id.AliasIDType; -import alias.id.broadcast.BroadcastChannel; -import alias.id.nonrecordable.NonRecordable; -import alias.id.priority.Priority; - -@XmlSeeAlso( { AliasID.class, AliasAction.class } ) -@XmlRootElement( name = "alias" ) -public class Alias -{ - private String mList; - private String mGroup; - private String mName; - private int mColor; - private String mIconName; - private List mAliasIDs = new ArrayList(); - private List mAliasActions = new ArrayList(); - - public Alias() - { - } - - public Alias( String name ) - { - mName = name; - } - - public String toString() - { - return getName(); - } - - @XmlAttribute( name="name" ) - public String getName() - { - return mName; - } - - public void setName( String name ) - { - mName = name; - } - - @XmlAttribute( name="list" ) - public String getList() - { - return mList; - } - - public void setList( String list ) - { - mList = list; - } - - public boolean hasList() - { - return mList != null; - } - - @XmlAttribute( name="group" ) - public String getGroup() - { - return mGroup; - } - - public void setGroup( String group ) - { - mGroup = group; - } - - public boolean hasGroup() - { - return mGroup != null; - } - - @XmlAttribute - public int getColor() - { - return mColor; - } - - public void setColor( int color ) - { - mColor = color; - } - - public Color getDisplayColor() - { - return new Color( getColor() ); - } - - @XmlAttribute - public String getIconName() - { - return mIconName; - } - - public void setIconName( String iconName ) - { - mIconName = iconName; - } - - @XmlElement( name="id" ) - public List getId() - { - return mAliasIDs; - } - - public void setId( ArrayList id ) - { - mAliasIDs = id; - } - - public void addAliasID( AliasID id ) - { - mAliasIDs.add( id ); - } - - public void removeAliasID( AliasID id ) - { - mAliasIDs.remove( id ); - } - - @XmlElement( name="action" ) - public List getAction() - { - return mAliasActions; - } - - public void setAction( List actions ) - { - mAliasActions = actions; - } - - public void addAliasAction( AliasAction action ) - { - mAliasActions.add( action ); - } - - public void removeAliasAction( AliasAction action ) - { - mAliasActions.remove( action ); - } - - public boolean hasActions() - { - return !mAliasActions.isEmpty(); - } - - /** - * Perform any validation/cleanup actions on this alias. - */ - public void validate() - { - } - /** - * Returns the priority level of this alias, if defined, or the default priority - */ - @XmlTransient - public int getCallPriority() - { - for( AliasID id: mAliasIDs ) - { - if( id.getType() == AliasIDType.PRIORITY) - { - return ((Priority)id).getPriority(); - } - } - - return Priority.DEFAULT_PRIORITY; - } - - public boolean hasCallPriority() - { - for( AliasID id: mAliasIDs ) - { - if( id.getType() == AliasIDType.PRIORITY) - { - return true; - } - } - - return false; - } - - /** - * Sets or updates the call priority - */ - public void setCallPriority( int priority ) - { - if( priority == Priority.DO_NOT_MONITOR || - ( Priority.MIN_PRIORITY <= priority && priority <= Priority.MAX_PRIORITY ) ) - { - for( AliasID id: mAliasIDs ) - { - if( id.getType() == AliasIDType.PRIORITY) - { - ((Priority)id).setPriority( priority ); - return; - } - } - - //If we don't find a priority id, create one - Priority p = new Priority(); - p.setPriority( priority ); - addAliasID( p ); - } - } - - /** - * Inspects the alias for a non-recordable alias id. Default is true; - */ - @XmlTransient - public boolean isRecordable() - { - for( AliasID id: getId() ) - { - if( id.getType() == AliasIDType.NON_RECORDABLE) - { - return false; - } - } - - return true; - } - - /** - * Sets or removes the non-recordable alias ID for this alias. - */ - public void setRecordable( boolean recordable ) - { - if( recordable ) - { - AliasID toRemove = null; - - for( AliasID id: getId() ) - { - if( id.getType() == AliasIDType.NON_RECORDABLE) - { - toRemove = id; - break; - } - } - - if( toRemove != null ) - { - removeAliasID( toRemove ); - } - } - else - { - for( AliasID id: getId() ) - { - if( id.getType() == AliasIDType.NON_RECORDABLE) - { - return; - } - } - - addAliasID( new NonRecordable() ); - } - } - - /** - * Inspects the alias for broadcast channel/streamable alias ids. Default is false; - */ - @XmlTransient - public boolean isStreamable() - { - for( AliasID id: getId() ) - { - if( id.getType() == AliasIDType.BROADCAST_CHANNEL) - { - return true; - } - } - - return false; - } - - /** - * List of broadcast channels specified for this alias. - */ - @XmlTransient - public Set getBroadcastChannels() - { - Set broadcastChannels = new TreeSet<>(); - - for(AliasID id: getId()) - { - if(id.getType() == AliasIDType.BROADCAST_CHANNEL) - { - broadcastChannels.add((BroadcastChannel)id); - } - } - - return broadcastChannels; - } - - /** - * Indicates if this alias contains a broadcast channel alias id with the channel name. - */ - public boolean hasBroadcastChannel(String channel) - { - if(channel == null || channel.isEmpty()) - { - return false; - } - - for(AliasID id: getId()) - { - if(id.getType() == AliasIDType.BROADCAST_CHANNEL && - ((BroadcastChannel)id).getChannelName().contentEquals(channel)) - { - return true; - } - } - - return false; - } -} diff --git a/src/alias/action/AliasAction.java b/src/alias/action/AliasAction.java deleted file mode 100644 index c353da28..00000000 --- a/src/alias/action/AliasAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * sdrtrunk - * Copyright (C) 2014-2017 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * - ******************************************************************************/ -package alias.action; - -import alias.Alias; -import alias.action.beep.BeepAction; -import alias.action.clip.ClipAction; -import alias.action.script.ScriptAction; -import message.Message; - -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.bind.annotation.XmlTransient; -import java.util.concurrent.ScheduledExecutorService; - -/** - * Alias action defines an action to execute when an alias is detected active. - */ -@XmlSeeAlso( { BeepAction.class, ClipAction.class, ScriptAction.class } ) -@XmlRootElement( name = "action" ) -public abstract class AliasAction -{ - public AliasAction() - { - } - - @XmlTransient - public abstract AliasActionType getType(); - - /** - * Task to execute when an alias action is defined. The message argument is - * the original message containing one or more aliases that have an alias - * action attached. The alias argument is the parent alias containing the - * alias action. - */ - public abstract void execute( ScheduledExecutorService scheduledExecutorService, Alias alias, Message message ); - - /** - * Dismiss a persistent alias action - */ - public abstract void dismiss( boolean reset ); -} diff --git a/src/alias/action/beep/BeepAction.java b/src/alias/action/beep/BeepAction.java deleted file mode 100644 index 65ebd2bd..00000000 --- a/src/alias/action/beep/BeepAction.java +++ /dev/null @@ -1,28 +0,0 @@ -package alias.action.beep; - -import message.Message; -import alias.Alias; -import alias.action.AliasActionType; -import alias.action.RecurringAction; - -public class BeepAction extends RecurringAction -{ - - @Override - public AliasActionType getType() - { - return AliasActionType.BEEP; - } - - @Override - public void performAction( Alias alias, Message message ) - { - System.out.println( "\007" ); - } - - @Override - public String toString() - { - return "Beep"; - } -} diff --git a/src/alias/action/clip/ClipAction.java b/src/alias/action/clip/ClipAction.java deleted file mode 100644 index dd338d96..00000000 --- a/src/alias/action/clip/ClipAction.java +++ /dev/null @@ -1,110 +0,0 @@ -package alias.action.clip; - -import java.io.File; - -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.Clip; -import javax.xml.bind.annotation.XmlTransient; - -import message.Message; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import alias.Alias; -import alias.action.AliasActionType; -import alias.action.RecurringAction; - -public class ClipAction extends RecurringAction -{ - private final static Logger mLog = LoggerFactory.getLogger( ClipAction.class ); - - private String mFilePath; - - @XmlTransient - private Clip mClip; - - public ClipAction() - { - } - - @Override - public AliasActionType getType() - { - return AliasActionType.CLIP; - } - - public String getPath() - { - return mFilePath; - } - - public void setPath( String path ) - { - mFilePath = path; - } - - @Override - public void performAction( Alias alias, Message message ) - { - try - { - play(); - } - catch( Exception e ) - { - mLog.error( "Couldn't play audio clip", e ); - } - } - - public void play() throws Exception - { - try - { - if( mFilePath != null ) - { - if( mClip == null ) - { - mClip = AudioSystem.getClip(); - - AudioInputStream ais = - AudioSystem.getAudioInputStream( new File( mFilePath ) ); - - mClip.open( ais ); - } - - if( mClip.isRunning() ) - { - mClip.stop(); - } - - mClip.setFramePosition( 0 ); - - mClip.start(); - } - } - catch( Exception e ) - { - mClip = null; - - mLog.error( "Error playing sound clip [" + mFilePath + "] - " + e.getMessage() ); - - throw e; - } - } - - - @Override - public String toString() - { - if( mFilePath == null ) - { - return "Play Clip"; - } - else - { - return "Play Clip: " + mFilePath; - } - } -} diff --git a/src/alias/action/script/ScriptAction.java b/src/alias/action/script/ScriptAction.java deleted file mode 100644 index 8dcfb55f..00000000 --- a/src/alias/action/script/ScriptAction.java +++ /dev/null @@ -1,98 +0,0 @@ -package alias.action.script; - -import java.io.BufferedReader; -import java.io.InputStreamReader; - -import message.Message; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import alias.Alias; -import alias.action.AliasActionType; -import alias.action.RecurringAction; - -public class ScriptAction extends RecurringAction -{ - private final static Logger mLog = LoggerFactory.getLogger( ScriptAction.class ); - - private String mScript; - - public ScriptAction() - { - } - - @Override - public AliasActionType getType() - { - return AliasActionType.SCRIPT; - } - - public String getScript() - { - return mScript; - } - - public void setScript( String script ) - { - mScript = script; - } - - @Override - public void performAction( Alias alias, Message message ) - { - try - { - play(); - } - catch( Exception e ) - { - mLog.error( "Couldn't execute script [" + mScript + "]", e ); - } - } - - public void play() throws Exception - { - if( mScript != null ) - { - ProcessBuilder pb = new ProcessBuilder( mScript ); - - pb.redirectErrorStream( true ); - - Process p = pb.start(); - - int exitCode = p.waitFor(); - - BufferedReader reader = new BufferedReader( - new InputStreamReader( p.getInputStream() ) ); - - String line = ""; - - StringBuilder sb = new StringBuilder(); - - while( ( line = reader.readLine() ) != null ) - { - sb.append(line + "\n"); - } - - if( exitCode != 0 ) - { - throw new RuntimeException( "Exit Code: " + exitCode + - " Console:" + sb.toString() ); - } - } - } - - @Override - public String toString() - { - if( mScript == null ) - { - return "Run Script"; - } - else - { - return "Run Script: " + mScript; - } - } -} diff --git a/src/alias/id/AliasID.java b/src/alias/id/AliasID.java deleted file mode 100644 index 25eff7d5..00000000 --- a/src/alias/id/AliasID.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014-2016 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id; - -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.bind.annotation.XmlTransient; - -import alias.id.broadcast.BroadcastChannel; -import playlist.version1.Group; -import alias.id.esn.Esn; -import alias.id.fleetsync.FleetsyncID; -import alias.id.lojack.LoJackFunctionAndID; -import alias.id.mdc.MDC1200ID; -import alias.id.mobileID.Min; -import alias.id.mpt1327.MPT1327ID; -import alias.id.nonrecordable.NonRecordable; -import alias.id.priority.Priority; -import alias.id.siteID.SiteID; -import alias.id.status.StatusID; -import alias.id.talkgroup.TalkgroupID; -import alias.id.uniqueID.UniqueID; - -@SuppressWarnings( "deprecation" ) -@XmlSeeAlso( {BroadcastChannel.class, Esn.class, FleetsyncID.class, Group.class, LoJackFunctionAndID.class, - MDC1200ID.class, Min.class, MPT1327ID.class, NonRecordable.class, - Priority.class, SiteID.class, StatusID.class, TalkgroupID.class, - UniqueID.class } ) -@XmlRootElement( name = "id" ) -public abstract class AliasID -{ - public AliasID() - { - } - - public abstract AliasIDType getType(); - - public abstract boolean matches( AliasID id ); - - @XmlTransient - public abstract boolean isValid(); -} diff --git a/src/alias/id/lojack/LoJackFunctionAndID.java b/src/alias/id/lojack/LoJackFunctionAndID.java deleted file mode 100644 index f2cc8c80..00000000 --- a/src/alias/id/lojack/LoJackFunctionAndID.java +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2015 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.lojack; - -import javax.xml.bind.annotation.XmlAttribute; - -import module.decode.lj1200.LJ1200Message; -import module.decode.lj1200.LJ1200Message.Function; -import alias.id.AliasID; -import alias.id.AliasIDType; - -public class LoJackFunctionAndID extends AliasID -{ - private LJ1200Message.Function mFunction = Function.F0_UNKNOWN; - private String mID = "*****"; - - public LoJackFunctionAndID() - { - } - - @XmlAttribute( name="id" ) - public String getID() - { - return mID; - } - - public void setID( String id ) - { - mID = id; - } - - @XmlAttribute( name="function" ) - public Function getFunction() - { - return mFunction; - } - - public void setFunction( Function function ) - { - mFunction = function; - } - - @Override - public boolean isValid() - { - return mFunction != null && mID != null; - } - - public String toString() - { - return "LoJack FUNC: " + mFunction.getLabel() + " ID:" + ( mID == null ? "" : mID ); - } - - /** - * Indicates if the function and id combination match this alias id - */ - public boolean matches( Function function, String id ) - { - return mFunction == function && - mID != null && - id != null && - id.matches( mID.replace( "*", ".?" ) ); - } - - @Override - public boolean matches( AliasID id ) - { - boolean retVal = false; - - if( mID != null && id instanceof LoJackFunctionAndID ) - { - LoJackFunctionAndID otherLojack = (LoJackFunctionAndID)id; - - if( otherLojack.getFunction() == mFunction ) - { - //Create a pattern - replace * wildcards with regex single-char wildcard - String pattern = mID.replace( "*", ".?" ); - - retVal = otherLojack.getID().matches( pattern ); - } - } - - return retVal; - } - - @Override - public AliasIDType getType() - { - return AliasIDType.LOJACK; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result - + ( ( mFunction == null ) ? 0 : mFunction.hashCode() ); - result = prime * result + ( ( mID == null ) ? 0 : mID.hashCode() ); - return result; - } - - @Override - public boolean equals( Object obj ) - { - if ( this == obj ) - return true; - if ( obj == null ) - return false; - if ( getClass() != obj.getClass() ) - return false; - LoJackFunctionAndID other = (LoJackFunctionAndID) obj; - if ( mFunction != other.mFunction ) - return false; - if ( mID == null ) - { - if ( other.mID != null ) - return false; - } else if ( !mID.equals( other.mID ) ) - return false; - return true; - } -} diff --git a/src/alias/id/mdc/MDC1200ID.java b/src/alias/id/mdc/MDC1200ID.java deleted file mode 100644 index 731b1153..00000000 --- a/src/alias/id/mdc/MDC1200ID.java +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.mdc; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; - - -public class MDC1200ID extends AliasID -{ - private String mID; - - public MDC1200ID() - { - } - - @XmlAttribute - public String getIdent() - { - return mID; - } - - public void setIdent( String ident ) - { - mID = ident; - } - - @Override - public boolean isValid() - { - return mID != null; - } - - public String toString() - { - return "MDC-1200: " + mID; - } - - @Override - public boolean matches( AliasID id ) - { - boolean retVal = false; - - if( mID != null && id instanceof MDC1200ID ) - { - MDC1200ID tgid = (MDC1200ID)id; - - //Create a pattern - replace * wildcards with regex single-char wildcard - String pattern = mID.replace( "*", ".?" ); - - retVal = tgid.getIdent().matches( pattern ); - } - - return retVal; - } - - @Override - public AliasIDType getType() - { - return AliasIDType.MDC1200; - } -} diff --git a/src/alias/id/mobileID/Min.java b/src/alias/id/mobileID/Min.java deleted file mode 100644 index bba33fdd..00000000 --- a/src/alias/id/mobileID/Min.java +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.mobileID; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; - -/** - * Mobile ID Number - */ -public class Min extends AliasID -{ - private String mMin; - - public Min() - { - } - - @XmlAttribute - public String getMin() - { - return mMin; - } - - public void setMin( String min ) - { - mMin = min; - } - - @Override - public boolean isValid() - { - return mMin != null; - } - - public String toString() - { - return "MIN: " + mMin; - } - - @Override - public boolean matches( AliasID id ) - { - boolean retVal = false; - - if( mMin != null && id instanceof Min ) - { - Min min = (Min)id; - - //Create a pattern - replace * wildcards with regex single-char wildcard - String pattern = mMin.replace( "*", ".?" ); - - retVal = min.getMin().matches( pattern ); - } - - return retVal; - } - - @Override - public AliasIDType getType() - { - return AliasIDType.MIN; - } -} diff --git a/src/alias/id/mpt1327/MPT1327ID.java b/src/alias/id/mpt1327/MPT1327ID.java deleted file mode 100644 index 12b45d52..00000000 --- a/src/alias/id/mpt1327/MPT1327ID.java +++ /dev/null @@ -1,78 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.mpt1327; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; - -public class MPT1327ID extends AliasID -{ - private String mID; - - public MPT1327ID() - { - } - - @XmlAttribute - public String getIdent() - { - return mID; - } - - public void setIdent( String ident ) - { - mID = ident; - } - - @Override - public boolean isValid() - { - return mID != null; - } - - public String toString() - { - return "MPT-1327: " + mID; - } - - @Override - public boolean matches( AliasID id ) - { - boolean retVal = false; - - if( mID != null && id instanceof MPT1327ID ) - { - MPT1327ID tgid = (MPT1327ID)id; - - //Create a pattern - replace * wildcards with regex single-char wildcard - String pattern = mID.replace( "*", ".?" ); - - retVal = tgid.getIdent().matches( pattern ); - } - - return retVal; - } - - @Override - public AliasIDType getType() - { - return AliasIDType.MPT1327; - } -} diff --git a/src/alias/id/nonrecordable/NonRecordable.java b/src/alias/id/nonrecordable/NonRecordable.java deleted file mode 100644 index c881c360..00000000 --- a/src/alias/id/nonrecordable/NonRecordable.java +++ /dev/null @@ -1,31 +0,0 @@ -package alias.id.nonrecordable; - -import alias.id.AliasID; -import alias.id.AliasIDType; - -public class NonRecordable extends AliasID -{ - @Override - public AliasIDType getType() - { - return AliasIDType.NON_RECORDABLE; - } - - @Override - public boolean isValid() - { - return true; - } - - @Override - public boolean matches( AliasID id ) - { - return false; - } - - @Override - public String toString() - { - return "Audio Non-Recordable"; - } -} diff --git a/src/alias/id/priority/Priority.java b/src/alias/id/priority/Priority.java deleted file mode 100644 index 9243db45..00000000 --- a/src/alias/id/priority/Priority.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.priority; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; - -/** - * Specifies an (audio) priority level for this alias. - */ -public class Priority extends AliasID -{ - public static final int DO_NOT_MONITOR = -1; - public static final int SELECTED_PRIORITY = 0; - public static final int MIN_PRIORITY = 1; - public static final int MAX_PRIORITY = 100; - public static final int DEFAULT_PRIORITY = 100; - - private int mPriority = DEFAULT_PRIORITY; - - public Priority() - { - } - - @Override - public boolean isValid() - { - return true; - } - - /** - * Indicates the associated alias should not be monitored or tracked. - */ - public boolean isDoNotMonitor() - { - return mPriority == DO_NOT_MONITOR; - } - - @XmlAttribute - public int getPriority() - { - return mPriority; - } - - public void setPriority( int priority ) - { - mPriority = priority; - } - - public String toString() - { - return "Audio Priority: " + ( isDoNotMonitor() ? "Do Not Monitor" : mPriority ); - } - - @Override - public boolean matches( AliasID id ) - { - return false; - } - - @Override - public AliasIDType getType() - { - return AliasIDType.PRIORITY; - } -} diff --git a/src/alias/id/siteID/SiteID.java b/src/alias/id/siteID/SiteID.java deleted file mode 100644 index a16008e1..00000000 --- a/src/alias/id/siteID/SiteID.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.siteID; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; - -public class SiteID extends AliasID -{ - private String mSite; - - public SiteID() - { - } - - @XmlAttribute - public String getSite() - { - return mSite; - } - - public void setSite( String site ) - { - mSite = site; - } - - @Override - public boolean isValid() - { - return mSite != null; - } - - public String toString() - { - return "Site: " + mSite; - } - - @Override - public boolean matches( AliasID otherID ) - { - return otherID != null && - otherID instanceof SiteID && - getSite().contentEquals( ( (SiteID)otherID).getSite() ); - } - - @Override - public AliasIDType getType() - { - return AliasIDType.SITE; - } -} diff --git a/src/alias/id/status/StatusID.java b/src/alias/id/status/StatusID.java deleted file mode 100644 index 71ccb5d8..00000000 --- a/src/alias/id/status/StatusID.java +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.status; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; - -public class StatusID extends AliasID -{ - private int mStatus; - - public StatusID() - { - } - - @XmlAttribute - public int getStatus() - { - return mStatus; - } - - public void setStatus( int status ) - { - this.mStatus = status; - } - - @Override - public boolean isValid() - { - return true; - } - - public String toString() - { - return "Status: " + String.format( "%03d", mStatus ); - } - - @Override - public boolean matches( AliasID id ) - { - boolean retVal = false; - - if( id instanceof StatusID ) - { - StatusID statusId = (StatusID)id; - - retVal = ( mStatus == statusId.getStatus() ); - } - - return retVal; - } - - @Override - public AliasIDType getType() - { - return AliasIDType.STATUS; - } -} diff --git a/src/alias/id/uniqueID/UniqueID.java b/src/alias/id/uniqueID/UniqueID.java deleted file mode 100644 index 69302b38..00000000 --- a/src/alias/id/uniqueID/UniqueID.java +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package alias.id.uniqueID; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; - -public class UniqueID extends AliasID -{ - private int mUid; - - public UniqueID() - { - } - - @XmlAttribute - public int getUid() - { - return mUid; - } - - public void setUid( int uid ) - { - this.mUid = uid; - } - - @Override - public boolean isValid() - { - return true; - } - - public String toString() - { - return "UniqueID: " + mUid; - } - - @Override - public boolean matches( AliasID id ) - { - boolean retVal = false; - - if( id instanceof UniqueID ) - { - UniqueID uid = (UniqueID)id; - - retVal = mUid == uid.getUid(); - } - - return retVal; - } - - @Override - public AliasIDType getType() - { - return AliasIDType.LTR_NET_UID; - } -} diff --git a/src/controller/channel/map/ChannelMap.java b/src/controller/channel/map/ChannelMap.java deleted file mode 100644 index 107280f8..00000000 --- a/src/controller/channel/map/ChannelMap.java +++ /dev/null @@ -1,145 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package controller.channel.map; - -import java.util.ArrayList; -import java.util.List; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.bind.annotation.XmlTransient; - -@XmlSeeAlso( { ChannelRange.class } ) -public class ChannelMap -{ - private String mName; - private boolean mInvalid = false; - - private List mRanges = new ArrayList(); - - public ChannelMap() - { - this( "New Channel Map" ); - } - - public ChannelMap( String name ) - { - mName = name; - } - - public ChannelMap copyOf() - { - ChannelMap map = new ChannelMap( new String( mName ) ); - - for( ChannelRange range: mRanges ) - { - map.addRange( range.copyOf() ); - } - - return map; - } - - @XmlTransient - public boolean isInvalid() - { - return mInvalid; - } - - public String toString() - { - return mName + ( mInvalid ? " - Error" : "" ); - } - - @XmlElement( name = "range" ) - public List getRanges() - { - return mRanges; - } - - public void setRanges( List ranges ) - { - mRanges = ranges; - - validate(); - } - - @XmlAttribute - public String getName() - { - return mName; - } - - public void setName( String name ) - { - mName = name; - } - - public long getFrequency( int channelNumber ) - { - for( ChannelRange range: mRanges ) - { - if( range.hasChannel( channelNumber ) ) - { - return range.getFrequency( channelNumber ); - } - } - - return 0; - } - - /** - * Validates each of the channel ranges for overlap - */ - private void validate() - { - mInvalid = false; - - for( int x = 0; x < mRanges.size(); x++ ) - { - if( !mRanges.get( x ).isValid() ) - { - mInvalid = true; - } - - for( int y = x + 1; y < mRanges.size(); y++ ) - { - if( mRanges.get( x ).overlaps( mRanges.get( y ) ) ) - { - mInvalid = true; - } - } - } - } - - - public void addRange( ChannelRange range ) - { - mRanges.add( range ); - - validate(); - } - - public void removeRange( ChannelRange range ) - { - mRanges.remove( range ); - - validate(); - } - -} diff --git a/src/controller/channel/map/ChannelRange.java b/src/controller/channel/map/ChannelRange.java deleted file mode 100644 index 5e086b89..00000000 --- a/src/controller/channel/map/ChannelRange.java +++ /dev/null @@ -1,186 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014-2016 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package controller.channel.map; - -import java.text.DecimalFormat; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; -import javax.xml.bind.annotation.XmlType; - -@XmlRootElement -@XmlType( name = "range" ) -public class ChannelRange -{ - private static final DecimalFormat FREQUENCY_FORMATTER = new DecimalFormat( "#.0000" ); - - private int mFirst = 1; - private int mLast = 1023; - private int mBase = 450000000; - private int mSize = 12500; - - private boolean mOverlapping = false; - - public ChannelRange() - { - } - - public ChannelRange( int first, int last, int base, int size ) - { - mFirst = first; - mLast = last; - mBase = base; - mSize = size; - } - - public ChannelRange copyOf() - { - return new ChannelRange( mFirst, mLast, mBase, mSize ); - } - - public String getDescription() - { - StringBuilder sb = new StringBuilder(); - - if( isValid() ) - { - sb.append( "First: " ); - sb.append( mFirst + "=" ); - - long frequency = getFrequency( mFirst ); - - sb.append( FREQUENCY_FORMATTER.format( (double)frequency / 1E6D ) ); - sb.append( " Last: " ); - sb.append( mLast + "=" ); - - frequency = getFrequency( mLast ); - sb.append( FREQUENCY_FORMATTER.format( (double)frequency / 1E6D ) ); - sb.append( " MHz" ); - } - else - { - sb.append( "First channel must be smaller than last channel" ); - } - - if( isOverlapping() ) - { - if( sb.length() > 0 ) - { - sb.append( ", " ); - } - - sb.append( "Overlap!" ); - } - - return sb.toString(); - } - - public boolean isValid() - { - return mFirst < mLast; - } - - public boolean overlaps( ChannelRange other ) - { - return ( mFirst <= other.mFirst && other.mFirst <= mLast ) || - ( mFirst <= other.mLast && other.mLast <= mLast ) || - ( mFirst <= other.mFirst && other.mLast <= mLast ) || - ( other.mFirst <= mFirst && mLast <= other.mLast ); - } - - @XmlTransient - public boolean isOverlapping() - { - return mOverlapping; - } - - public void setOverlapping( boolean overlapping ) - { - mOverlapping = overlapping; - } - - public boolean hasChannel( int channel ) - { - return mFirst <= channel && channel <= mLast; - } - - public long getFrequency( int channel ) - { - if( hasChannel( channel ) ) - { - return mBase + ( ( channel - mFirst ) * mSize ); - } - else - { - return 0; - } - } - - @XmlAttribute( name = "first" ) - public int getFirstChannelNumber() - { - return mFirst; - } - - public void setFirstChannelNumber( int first ) - { - mFirst = first; - } - - @XmlAttribute( name = "last" ) - public void setLastChannelNumber( int last ) - { - mLast = last; - } - - public int getLastChannelNumber() - { - return mLast; - } - - /** - * Sets the base frequency - * @param base frequency in hertz - */ - @XmlAttribute( name = "base" ) - public void setBase( int base ) - { - mBase = base; - } - - public int getBase() - { - return mBase; - } - - /** - * Sets the channel size - * @param size in hertz - */ - @XmlAttribute( name = "size" ) - public void setSize( int size ) - { - mSize = size; - } - - public int getSize() - { - return mSize; - } -} diff --git a/src/controller/config/Configuration.java b/src/controller/config/Configuration.java deleted file mode 100644 index 53bc1929..00000000 --- a/src/controller/config/Configuration.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - ******************************************************************************/ -package controller.config; - -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSeeAlso; - -import module.decode.config.AuxDecodeConfiguration; -import module.decode.config.DecodeConfiguration; -import module.log.config.EventLogConfiguration; -import record.config.RecordConfiguration; -import source.config.SourceConfiguration; - -@XmlSeeAlso( { AuxDecodeConfiguration.class, - DecodeConfiguration.class, - EventLogConfiguration.class, - RecordConfiguration.class, - SourceConfiguration.class } ) -@XmlRootElement( name = "configuration" ) -public abstract class Configuration -{ - public Configuration() - { - } -} diff --git a/src/main/java/io/github/dsheirer/alias/Alias.java b/src/main/java/io/github/dsheirer/alias/Alias.java new file mode 100644 index 00000000..588995cd --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/Alias.java @@ -0,0 +1,351 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014-2016 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import io.github.dsheirer.alias.action.AliasAction; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannel; +import io.github.dsheirer.alias.id.nonrecordable.NonRecordable; +import io.github.dsheirer.alias.id.priority.Priority; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +@JacksonXmlRootElement(localName = "alias") +public class Alias +{ + private String mList; + private String mGroup; + private String mName; + private int mColor; + private String mIconName; + private List mAliasIDs = new ArrayList(); + private List mAliasActions = new ArrayList(); + + public Alias() + { + } + + public Alias(String name) + { + mName = name; + } + + public String toString() + { + return getName(); + } + + @JacksonXmlProperty(isAttribute = true, localName = "name") + public String getName() + { + return mName; + } + + public void setName(String name) + { + mName = name; + } + + @JacksonXmlProperty(isAttribute = true, localName = "list") + public String getList() + { + return mList; + } + + public void setList(String list) + { + mList = list; + } + + public boolean hasList() + { + return mList != null; + } + + @JacksonXmlProperty(isAttribute = true, localName = "group") + public String getGroup() + { + return mGroup; + } + + public void setGroup(String group) + { + mGroup = group; + } + + public boolean hasGroup() + { + return mGroup != null; + } + + @JacksonXmlProperty(isAttribute = true, localName = "color") + public int getColor() + { + return mColor; + } + + public void setColor(int color) + { + mColor = color; + } + + @JsonIgnore + public Color getDisplayColor() + { + return new Color(getColor()); + } + + @JacksonXmlProperty(isAttribute = true, localName = "iconName") + public String getIconName() + { + return mIconName; + } + + public void setIconName(String iconName) + { + mIconName = iconName; + } + + @JacksonXmlProperty(isAttribute = false, localName = "id") + public List getId() + { + return mAliasIDs; + } + + public void setId(ArrayList id) + { + mAliasIDs = id; + } + + public void addAliasID(AliasID id) + { + mAliasIDs.add(id); + } + + public void removeAliasID(AliasID id) + { + mAliasIDs.remove(id); + } + + @JacksonXmlProperty(isAttribute = false, localName = "action") + public List getAction() + { + return mAliasActions; + } + + public void setAction(List actions) + { + mAliasActions = actions; + } + + public void addAliasAction(AliasAction action) + { + mAliasActions.add(action); + } + + public void removeAliasAction(AliasAction action) + { + mAliasActions.remove(action); + } + + public boolean hasActions() + { + return !mAliasActions.isEmpty(); + } + + /** + * Perform any validation/cleanup actions on this alias. + */ + public void validate() + { + } + + /** + * Returns the priority level of this alias, if defined, or the default priority + */ + @JsonIgnore + public int getCallPriority() + { + for(AliasID id : mAliasIDs) + { + if(id.getType() == AliasIDType.PRIORITY) + { + return ((Priority)id).getPriority(); + } + } + + return Priority.DEFAULT_PRIORITY; + } + + public boolean hasCallPriority() + { + for(AliasID id : mAliasIDs) + { + if(id.getType() == AliasIDType.PRIORITY) + { + return true; + } + } + + return false; + } + + /** + * Sets or updates the call priority + */ + public void setCallPriority(int priority) + { + if(priority == Priority.DO_NOT_MONITOR || + (Priority.MIN_PRIORITY <= priority && priority <= Priority.MAX_PRIORITY)) + { + for(AliasID id : mAliasIDs) + { + if(id.getType() == AliasIDType.PRIORITY) + { + ((Priority)id).setPriority(priority); + return; + } + } + + //If we don't find a priority id, create one + Priority p = new Priority(); + p.setPriority(priority); + addAliasID(p); + } + } + + /** + * Inspects the alias for a non-recordable alias id. Default is true; + */ + @JsonIgnore + public boolean isRecordable() + { + for(AliasID id : getId()) + { + if(id.getType() == AliasIDType.NON_RECORDABLE) + { + return false; + } + } + + return true; + } + + /** + * Sets or removes the non-recordable alias ID for this alias. + */ + public void setRecordable(boolean recordable) + { + if(recordable) + { + AliasID toRemove = null; + + for(AliasID id : getId()) + { + if(id.getType() == AliasIDType.NON_RECORDABLE) + { + toRemove = id; + break; + } + } + + if(toRemove != null) + { + removeAliasID(toRemove); + } + } + else + { + for(AliasID id : getId()) + { + if(id.getType() == AliasIDType.NON_RECORDABLE) + { + return; + } + } + + addAliasID(new NonRecordable()); + } + } + + /** + * Inspects the alias for broadcast channel/streamable alias ids. Default is false; + */ + @JsonIgnore + public boolean isStreamable() + { + for(AliasID id : getId()) + { + if(id.getType() == AliasIDType.BROADCAST_CHANNEL) + { + return true; + } + } + + return false; + } + + /** + * List of broadcast channels specified for this alias. + */ + @JsonIgnore + public Set getBroadcastChannels() + { + Set broadcastChannels = new TreeSet<>(); + + for(AliasID id : getId()) + { + if(id.getType() == AliasIDType.BROADCAST_CHANNEL) + { + broadcastChannels.add((BroadcastChannel)id); + } + } + + return broadcastChannels; + } + + /** + * Indicates if this alias contains a broadcast channel alias id with the channel name. + */ + public boolean hasBroadcastChannel(String channel) + { + if(channel == null || channel.isEmpty()) + { + return false; + } + + for(AliasID id : getId()) + { + if(id.getType() == AliasIDType.BROADCAST_CHANNEL && + ((BroadcastChannel)id).getChannelName().contentEquals(channel)) + { + return true; + } + } + + return false; + } +} diff --git a/src/alias/AliasController.java b/src/main/java/io/github/dsheirer/alias/AliasController.java similarity index 98% rename from src/alias/AliasController.java rename to src/main/java/io/github/dsheirer/alias/AliasController.java index 7dc27ccf..48f6935c 100644 --- a/src/alias/AliasController.java +++ b/src/main/java/io/github/dsheirer/alias/AliasController.java @@ -1,9 +1,9 @@ -package alias; +package io.github.dsheirer.alias; -import audio.broadcast.BroadcastModel; import com.jidesoft.swing.JideSplitPane; -import gui.editor.Editor; -import icon.IconManager; +import io.github.dsheirer.audio.broadcast.BroadcastModel; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.icon.IconManager; import net.coderazzi.filters.gui.AutoChoices; import net.coderazzi.filters.gui.TableFilterHeader; import net.miginfocom.swing.MigLayout; diff --git a/src/alias/AliasEditor.java b/src/main/java/io/github/dsheirer/alias/AliasEditor.java similarity index 91% rename from src/alias/AliasEditor.java rename to src/main/java/io/github/dsheirer/alias/AliasEditor.java index 706ef5e4..a6df0774 100644 --- a/src/alias/AliasEditor.java +++ b/src/main/java/io/github/dsheirer/alias/AliasEditor.java @@ -15,27 +15,21 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; - -import audio.broadcast.BroadcastModel; -import gui.editor.Editor; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JSeparator; - -import icon.IconManager; -import net.miginfocom.swing.MigLayout; -import sample.Listener; -import settings.SettingsManager; -import alias.action.AliasActionEditor; -import alias.id.AliasIdentifierEditor; +package io.github.dsheirer.alias; import com.jidesoft.swing.JideTabbedPane; +import io.github.dsheirer.alias.action.AliasActionEditor; +import io.github.dsheirer.alias.id.AliasIdentifierEditor; +import io.github.dsheirer.audio.broadcast.BroadcastModel; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.sample.Listener; +import net.miginfocom.swing.MigLayout; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; public class AliasEditor extends Editor implements ActionListener, Listener diff --git a/src/alias/AliasEvent.java b/src/main/java/io/github/dsheirer/alias/AliasEvent.java similarity index 97% rename from src/alias/AliasEvent.java rename to src/main/java/io/github/dsheirer/alias/AliasEvent.java index c1cacd74..f0370ae6 100644 --- a/src/alias/AliasEvent.java +++ b/src/main/java/io/github/dsheirer/alias/AliasEvent.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package io.github.dsheirer.alias; public class AliasEvent { diff --git a/src/alias/AliasFactory.java b/src/main/java/io/github/dsheirer/alias/AliasFactory.java similarity index 76% rename from src/alias/AliasFactory.java rename to src/main/java/io/github/dsheirer/alias/AliasFactory.java index 7acb920e..ad28d053 100644 --- a/src/alias/AliasFactory.java +++ b/src/main/java/io/github/dsheirer/alias/AliasFactory.java @@ -15,47 +15,47 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package io.github.dsheirer.alias; -import alias.action.AliasAction; -import alias.action.AliasActionType; -import alias.action.beep.BeepAction; -import alias.action.beep.BeepActionEditor; -import alias.action.clip.ClipAction; -import alias.action.clip.ClipActionEditor; -import alias.action.script.ScriptAction; -import alias.action.script.ScriptActionEditor; -import alias.id.AliasID; -import alias.id.AliasIDType; -import alias.id.broadcast.BroadcastChannel; -import alias.id.broadcast.BroadcastChannelEditor; -import alias.id.esn.ESNEditor; -import alias.id.esn.Esn; -import alias.id.fleetsync.FleetsyncID; -import alias.id.fleetsync.FleetsyncIDEditor; -import alias.id.lojack.LoJackFunctionAndID; -import alias.id.lojack.LoJackIDEditor; -import alias.id.mdc.MDC1200ID; -import alias.id.mdc.MDC1200IDEditor; -import alias.id.mobileID.MINEditor; -import alias.id.mobileID.Min; -import alias.id.mpt1327.MPT1327ID; -import alias.id.mpt1327.MPT1327IDEditor; -import alias.id.nonrecordable.NonRecordable; -import alias.id.nonrecordable.NonRecordableEditor; -import alias.id.priority.Priority; -import alias.id.priority.PriorityEditor; -import alias.id.siteID.SiteID; -import alias.id.siteID.SiteIDEditor; -import alias.id.status.StatusID; -import alias.id.status.StatusIDEditor; -import alias.id.talkgroup.TalkgroupID; -import alias.id.talkgroup.TalkgroupIDEditor; -import alias.id.uniqueID.UniqueID; -import alias.id.uniqueID.UniqueIDEditor; -import audio.broadcast.BroadcastModel; -import gui.editor.Editor; -import gui.editor.EmptyEditor; +import io.github.dsheirer.alias.action.AliasAction; +import io.github.dsheirer.alias.action.AliasActionType; +import io.github.dsheirer.alias.action.beep.BeepAction; +import io.github.dsheirer.alias.action.beep.BeepActionEditor; +import io.github.dsheirer.alias.action.clip.ClipAction; +import io.github.dsheirer.alias.action.clip.ClipActionEditor; +import io.github.dsheirer.alias.action.script.ScriptAction; +import io.github.dsheirer.alias.action.script.ScriptActionEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannel; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannelEditor; +import io.github.dsheirer.alias.id.esn.ESNEditor; +import io.github.dsheirer.alias.id.esn.Esn; +import io.github.dsheirer.alias.id.fleetsync.FleetsyncID; +import io.github.dsheirer.alias.id.fleetsync.FleetsyncIDEditor; +import io.github.dsheirer.alias.id.lojack.LoJackFunctionAndID; +import io.github.dsheirer.alias.id.lojack.LoJackIDEditor; +import io.github.dsheirer.alias.id.mdc.MDC1200ID; +import io.github.dsheirer.alias.id.mdc.MDC1200IDEditor; +import io.github.dsheirer.alias.id.mobileID.MINEditor; +import io.github.dsheirer.alias.id.mobileID.Min; +import io.github.dsheirer.alias.id.mpt1327.MPT1327ID; +import io.github.dsheirer.alias.id.mpt1327.MPT1327IDEditor; +import io.github.dsheirer.alias.id.nonrecordable.NonRecordable; +import io.github.dsheirer.alias.id.nonrecordable.NonRecordableEditor; +import io.github.dsheirer.alias.id.priority.Priority; +import io.github.dsheirer.alias.id.priority.PriorityEditor; +import io.github.dsheirer.alias.id.siteID.SiteID; +import io.github.dsheirer.alias.id.siteID.SiteIDEditor; +import io.github.dsheirer.alias.id.status.StatusID; +import io.github.dsheirer.alias.id.status.StatusIDEditor; +import io.github.dsheirer.alias.id.talkgroup.TalkgroupID; +import io.github.dsheirer.alias.id.talkgroup.TalkgroupIDEditor; +import io.github.dsheirer.alias.id.uniqueID.UniqueID; +import io.github.dsheirer.alias.id.uniqueID.UniqueIDEditor; +import io.github.dsheirer.audio.broadcast.BroadcastModel; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.gui.editor.EmptyEditor; public class AliasFactory { @@ -138,7 +138,7 @@ public class AliasFactory { return new BeepAction(); } - else if( action instanceof ClipAction ) + else if( action instanceof ClipAction) { ClipAction originalClip = (ClipAction)action; ClipAction copyClip = new ClipAction(); diff --git a/src/alias/AliasList.java b/src/main/java/io/github/dsheirer/alias/AliasList.java similarity index 95% rename from src/alias/AliasList.java rename to src/main/java/io/github/dsheirer/alias/AliasList.java index 44a2b2e9..b51503bf 100644 --- a/src/alias/AliasList.java +++ b/src/main/java/io/github/dsheirer/alias/AliasList.java @@ -16,26 +16,26 @@ * along with this program. If not, see * ******************************************************************************/ -package alias; +package io.github.dsheirer.alias; -import alias.id.AliasID; -import alias.id.WildcardID; -import alias.id.esn.Esn; -import alias.id.fleetsync.FleetsyncID; -import alias.id.lojack.LoJackFunctionAndID; -import alias.id.mdc.MDC1200ID; -import alias.id.mobileID.Min; -import alias.id.mpt1327.MPT1327ID; -import alias.id.siteID.SiteID; -import alias.id.status.StatusID; -import alias.id.talkgroup.TalkgroupID; -import alias.id.uniqueID.UniqueID; -import module.decode.lj1200.LJ1200Message.Function; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.WildcardID; +import io.github.dsheirer.alias.id.esn.Esn; +import io.github.dsheirer.alias.id.fleetsync.FleetsyncID; +import io.github.dsheirer.alias.id.lojack.LoJackFunctionAndID; +import io.github.dsheirer.alias.id.mdc.MDC1200ID; +import io.github.dsheirer.alias.id.mobileID.Min; +import io.github.dsheirer.alias.id.mpt1327.MPT1327ID; +import io.github.dsheirer.alias.id.siteID.SiteID; +import io.github.dsheirer.alias.id.status.StatusID; +import io.github.dsheirer.alias.id.talkgroup.TalkgroupID; +import io.github.dsheirer.alias.id.uniqueID.UniqueID; +import io.github.dsheirer.module.decode.lj1200.LJ1200Message; +import io.github.dsheirer.sample.Listener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sample.Listener; -import javax.xml.bind.annotation.XmlAttribute; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -486,7 +486,7 @@ public class AliasList implements Listener /** * Lookup alias by lojack function and ID */ - public Alias getLoJackAlias(Function function, String id) + public Alias getLoJackAlias(LJ1200Message.Function function, String id) { if(id != null) { @@ -625,7 +625,7 @@ public class AliasList implements Listener /** * Alias list name */ - @XmlAttribute + @JacksonXmlProperty(isAttribute = true, localName = "name") public String getName() { return mName; diff --git a/src/alias/AliasModel.java b/src/main/java/io/github/dsheirer/alias/AliasModel.java similarity index 95% rename from src/alias/AliasModel.java rename to src/main/java/io/github/dsheirer/alias/AliasModel.java index 1389d299..2a62f05f 100644 --- a/src/alias/AliasModel.java +++ b/src/main/java/io/github/dsheirer/alias/AliasModel.java @@ -15,12 +15,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package io.github.dsheirer.alias; -import alias.AliasEvent.Event; -import alias.id.broadcast.BroadcastChannel; -import sample.Broadcaster; -import sample.Listener; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannel; +import io.github.dsheirer.sample.Broadcaster; +import io.github.dsheirer.sample.Listener; import javax.swing.table.AbstractTableModel; import java.util.ArrayList; @@ -188,7 +187,7 @@ public class AliasModel extends AbstractTableModel fireTableRowsInserted(index, index); - broadcast(new AliasEvent(alias, Event.ADD)); + broadcast(new AliasEvent(alias, AliasEvent.Event.ADD)); return index; } @@ -209,7 +208,7 @@ public class AliasModel extends AbstractTableModel fireTableRowsDeleted(index, index); - broadcast(new AliasEvent(alias, Event.DELETE)); + broadcast(new AliasEvent(alias, AliasEvent.Event.DELETE)); } } @@ -328,7 +327,7 @@ public class AliasModel extends AbstractTableModel alias.validate(); } - if(event.getEvent() == Event.CHANGE) + if(event.getEvent() == AliasEvent.Event.CHANGE) { int index = mAliases.indexOf(event.getAlias()); diff --git a/src/alias/AliasNameEditor.java b/src/main/java/io/github/dsheirer/alias/AliasNameEditor.java similarity index 96% rename from src/alias/AliasNameEditor.java rename to src/main/java/io/github/dsheirer/alias/AliasNameEditor.java index 3c205941..6fcc06aa 100644 --- a/src/alias/AliasNameEditor.java +++ b/src/main/java/io/github/dsheirer/alias/AliasNameEditor.java @@ -16,14 +16,13 @@ * along with this program. If not, see * ******************************************************************************/ -package alias; +package io.github.dsheirer.alias; -import alias.AliasEvent.Event; -import gui.editor.Editor; -import icon.Icon; -import icon.IconListCellRenderer; -import icon.IconManager; -import icon.IconTableModel; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.icon.Icon; +import io.github.dsheirer.icon.IconListCellRenderer; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.icon.IconTableModel; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -328,7 +327,7 @@ public class AliasNameEditor extends Editor setModified(false); //Broadcast an alias change event to save the updates - mAliasModel.broadcast(new AliasEvent(getItem(), Event.CHANGE)); + mAliasModel.broadcast(new AliasEvent(getItem(), AliasEvent.Event.CHANGE)); } } } diff --git a/src/alias/ComponentEditor.java b/src/main/java/io/github/dsheirer/alias/ComponentEditor.java similarity index 98% rename from src/alias/ComponentEditor.java rename to src/main/java/io/github/dsheirer/alias/ComponentEditor.java index 9cc909bf..7bae5fcf 100644 --- a/src/alias/ComponentEditor.java +++ b/src/main/java/io/github/dsheirer/alias/ComponentEditor.java @@ -15,9 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias; +package io.github.dsheirer.alias; -import javax.swing.JPanel; +import javax.swing.*; import javax.swing.event.DocumentListener; public abstract class ComponentEditor extends JPanel implements DocumentListener @@ -86,7 +86,7 @@ public abstract class ComponentEditor extends JPanel implements DocumentListe public abstract void save(); /** - * Reloads the editor contents from the source component and resets the + * Reloads the editor contents from the source component and resets the * modified flag */ public void reset() diff --git a/src/alias/ComponentValidationException.java b/src/main/java/io/github/dsheirer/alias/ComponentValidationException.java similarity index 88% rename from src/alias/ComponentValidationException.java rename to src/main/java/io/github/dsheirer/alias/ComponentValidationException.java index bfa8d925..9bf0445a 100644 --- a/src/alias/ComponentValidationException.java +++ b/src/main/java/io/github/dsheirer/alias/ComponentValidationException.java @@ -1,4 +1,4 @@ -package alias; +package io.github.dsheirer.alias; public class ComponentValidationException extends Exception { diff --git a/src/alias/MultipleAliasEditor.java b/src/main/java/io/github/dsheirer/alias/MultipleAliasEditor.java similarity index 95% rename from src/alias/MultipleAliasEditor.java rename to src/main/java/io/github/dsheirer/alias/MultipleAliasEditor.java index 796379b4..472911fc 100644 --- a/src/alias/MultipleAliasEditor.java +++ b/src/main/java/io/github/dsheirer/alias/MultipleAliasEditor.java @@ -1,18 +1,17 @@ -package alias; +package io.github.dsheirer.alias; -import alias.AliasEvent.Event; -import alias.id.AliasIDType; -import alias.id.broadcast.BroadcastChannel; -import alias.id.priority.Priority; -import audio.broadcast.BroadcastModel; -import gui.editor.Editor; -import icon.Icon; -import icon.IconListCellRenderer; -import icon.IconManager; +import io.github.dsheirer.alias.id.AliasIDType; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannel; +import io.github.dsheirer.alias.id.priority.Priority; +import io.github.dsheirer.audio.broadcast.BroadcastModel; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.icon.Icon; +import io.github.dsheirer.icon.IconListCellRenderer; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.sample.Listener; import net.miginfocom.swing.MigLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sample.Listener; import javax.swing.*; import javax.swing.event.ChangeEvent; @@ -430,7 +429,7 @@ public class MultipleAliasEditor extends Editor> for (Alias alias : aliases) { //Broadcast an alias change event to save the updates - mAliasModel.broadcast(new AliasEvent(alias, Event.CHANGE)); + mAliasModel.broadcast(new AliasEvent(alias, AliasEvent.Event.CHANGE)); } } } @@ -438,7 +437,7 @@ public class MultipleAliasEditor extends Editor> @Override public void receive(AliasEvent event) { - if (event.getEvent() == Event.DELETE && + if (event.getEvent() == AliasEvent.Event.DELETE && hasItem() && getAliases().contains(event.getAlias())) { diff --git a/src/alias/PatchGroupAlias.java b/src/main/java/io/github/dsheirer/alias/PatchGroupAlias.java similarity index 96% rename from src/alias/PatchGroupAlias.java rename to src/main/java/io/github/dsheirer/alias/PatchGroupAlias.java index bb7e347a..9350fec8 100644 --- a/src/alias/PatchGroupAlias.java +++ b/src/main/java/io/github/dsheirer/alias/PatchGroupAlias.java @@ -16,18 +16,16 @@ * along with this program. If not, see * ******************************************************************************/ -package alias; +package io.github.dsheirer.alias; -import alias.action.AliasAction; -import alias.id.AliasID; -import alias.id.AliasIDType; -import alias.id.broadcast.BroadcastChannel; -import alias.id.priority.Priority; -import alias.id.talkgroup.TalkgroupID; -import gui.SDRTrunk; +import io.github.dsheirer.alias.action.AliasAction; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannel; +import io.github.dsheirer.alias.id.priority.Priority; +import io.github.dsheirer.alias.id.talkgroup.TalkgroupID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import playlist.version1.System; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/io/github/dsheirer/alias/action/AliasAction.java b/src/main/java/io/github/dsheirer/alias/action/AliasAction.java new file mode 100644 index 00000000..ae514992 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/action/AliasAction.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * sdrtrunk + * Copyright (C) 2014-2017 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + * + ******************************************************************************/ +package io.github.dsheirer.alias.action; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.alias.action.beep.BeepAction; +import io.github.dsheirer.alias.action.clip.ClipAction; +import io.github.dsheirer.alias.action.script.ScriptAction; +import io.github.dsheirer.message.Message; + +import java.util.concurrent.ScheduledExecutorService; + +/** + * Alias action defines an action to execute when an alias is detected active. + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = BeepAction.class, name="beepAction"), + @JsonSubTypes.Type(value = ClipAction.class, name = "clipAction"), + @JsonSubTypes.Type(value = RecurringAction.class, name = "recurringAction"), + @JsonSubTypes.Type(value = ScriptAction.class, name = "scriptAction") +}) +@JacksonXmlRootElement(localName = "action") +public abstract class AliasAction +{ + public AliasAction() + { + } + + @JsonIgnore + public abstract AliasActionType getType(); + + /** + * Task to execute when an alias action is defined. The message argument is + * the original message containing one or more aliases that have an alias + * action attached. The alias argument is the parent alias containing the + * alias action. + */ + public abstract void execute(ScheduledExecutorService scheduledExecutorService, Alias alias, Message message); + + /** + * Dismiss a persistent alias action + */ + public abstract void dismiss(boolean reset); +} diff --git a/src/alias/action/AliasActionEditor.java b/src/main/java/io/github/dsheirer/alias/action/AliasActionEditor.java similarity index 93% rename from src/alias/action/AliasActionEditor.java rename to src/main/java/io/github/dsheirer/alias/action/AliasActionEditor.java index f4d41aa9..388a5ea9 100644 --- a/src/alias/action/AliasActionEditor.java +++ b/src/main/java/io/github/dsheirer/alias/action/AliasActionEditor.java @@ -15,12 +15,21 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.action; +package io.github.dsheirer.alias.action; -import gui.editor.Editor; -import gui.editor.EmptyEditor; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.alias.AliasEvent; +import io.github.dsheirer.alias.AliasEvent.Event; +import io.github.dsheirer.alias.AliasFactory; +import io.github.dsheirer.alias.AliasModel; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.gui.editor.EmptyEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.EventQueue; +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -29,26 +38,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import javax.swing.DefaultListModel; -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.ListModel; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.miginfocom.swing.MigLayout; -import alias.Alias; -import alias.AliasEvent; -import alias.AliasEvent.Event; -import alias.AliasFactory; -import alias.AliasModel; - public class AliasActionEditor extends Editor { private static final long serialVersionUID = 1L; @@ -277,7 +266,7 @@ public class AliasActionEditor extends Editor { int option = JOptionPane.showConfirmDialog( EditorContainer.this, - "Action settings have changed. Do you want to save these changes?", + "Action settings have changed. Do you want to save these changes?", "Save Changes?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ); diff --git a/src/alias/action/AliasActionListener.java b/src/main/java/io/github/dsheirer/alias/action/AliasActionListener.java similarity index 93% rename from src/alias/action/AliasActionListener.java rename to src/main/java/io/github/dsheirer/alias/action/AliasActionListener.java index a967e446..36e863d7 100644 --- a/src/alias/action/AliasActionListener.java +++ b/src/main/java/io/github/dsheirer/alias/action/AliasActionListener.java @@ -15,9 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.action; +package io.github.dsheirer.alias.action; -import alias.AliasEvent; +import io.github.dsheirer.alias.AliasEvent; /** * Interface for receiving alias events. Each listener will receive diff --git a/src/alias/action/AliasActionManager.java b/src/main/java/io/github/dsheirer/alias/action/AliasActionManager.java similarity index 91% rename from src/alias/action/AliasActionManager.java rename to src/main/java/io/github/dsheirer/alias/action/AliasActionManager.java index 0ba644d1..760122cb 100644 --- a/src/alias/action/AliasActionManager.java +++ b/src/main/java/io/github/dsheirer/alias/action/AliasActionManager.java @@ -16,12 +16,12 @@ * along with this program. If not, see * ******************************************************************************/ -package alias.action; +package io.github.dsheirer.alias.action; -import alias.Alias; -import message.Message; -import sample.Listener; -import util.ThreadPool; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.message.Message; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.util.ThreadPool; import java.util.List; diff --git a/src/alias/action/AliasActionType.java b/src/main/java/io/github/dsheirer/alias/action/AliasActionType.java similarity index 96% rename from src/alias/action/AliasActionType.java rename to src/main/java/io/github/dsheirer/alias/action/AliasActionType.java index b54ddb06..eee09f23 100644 --- a/src/alias/action/AliasActionType.java +++ b/src/main/java/io/github/dsheirer/alias/action/AliasActionType.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.action; +package io.github.dsheirer.alias.action; public enum AliasActionType { diff --git a/src/alias/action/RecurringAction.java b/src/main/java/io/github/dsheirer/alias/action/RecurringAction.java similarity index 88% rename from src/alias/action/RecurringAction.java rename to src/main/java/io/github/dsheirer/alias/action/RecurringAction.java index c8e54d62..8847eddf 100644 --- a/src/alias/action/RecurringAction.java +++ b/src/main/java/io/github/dsheirer/alias/action/RecurringAction.java @@ -1,11 +1,11 @@ -package alias.action; +package io.github.dsheirer.alias.action; -import alias.Alias; -import message.Message; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.message.Message; import javax.swing.*; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlTransient; import java.awt.*; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -14,11 +14,11 @@ import java.util.concurrent.atomic.AtomicBoolean; public abstract class RecurringAction extends AliasAction { - @XmlTransient + @JsonIgnore protected AtomicBoolean mRunning = new AtomicBoolean(false); - @XmlTransient + @JsonIgnore private ScheduledFuture mPerpetualAction; - @XmlTransient + @JsonIgnore protected ScheduledExecutorService mScheduledExecutorService; protected Interval mInterval = Interval.ONCE; @@ -107,7 +107,7 @@ public abstract class RecurringAction extends AliasAction } } - @XmlAttribute + @JacksonXmlProperty(isAttribute = true, localName = "period") public int getPeriod() { return mPeriod; @@ -118,7 +118,7 @@ public abstract class RecurringAction extends AliasAction mPeriod = period; } - @XmlAttribute + @JacksonXmlProperty(isAttribute = true, localName = "interval") public Interval getInterval() { return mInterval; @@ -164,8 +164,8 @@ public abstract class RecurringAction extends AliasAction @Override public void run() { - /* Don't use the performThreadedAction() method, since this is - * already running in a separate thread */ + /* Don't use the performThreadedAction() method, since this is + * already running in a separate thread */ performAction(mAlias, mMessage); } } diff --git a/src/main/java/io/github/dsheirer/alias/action/beep/BeepAction.java b/src/main/java/io/github/dsheirer/alias/action/beep/BeepAction.java new file mode 100644 index 00000000..6a0717ac --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/action/beep/BeepAction.java @@ -0,0 +1,30 @@ +package io.github.dsheirer.alias.action.beep; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.alias.action.AliasActionType; +import io.github.dsheirer.alias.action.RecurringAction; +import io.github.dsheirer.message.Message; + +public class BeepAction extends RecurringAction +{ + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasActionType getType() + { + return AliasActionType.BEEP; + } + + @Override + public void performAction(Alias alias, Message message ) + { + System.out.println( "\007" ); + } + + @Override + public String toString() + { + return "Beep"; + } +} diff --git a/src/alias/action/beep/BeepActionEditor.java b/src/main/java/io/github/dsheirer/alias/action/beep/BeepActionEditor.java similarity index 86% rename from src/alias/action/beep/BeepActionEditor.java rename to src/main/java/io/github/dsheirer/alias/action/beep/BeepActionEditor.java index 1f47f9aa..109eea70 100644 --- a/src/alias/action/beep/BeepActionEditor.java +++ b/src/main/java/io/github/dsheirer/alias/action/beep/BeepActionEditor.java @@ -15,30 +15,22 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.action.beep; +package io.github.dsheirer.alias.action.beep; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.action.AliasAction; +import io.github.dsheirer.alias.action.RecurringAction; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JSlider; -import javax.swing.SpinnerModel; -import javax.swing.SpinnerNumberModel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.miginfocom.swing.MigLayout; -import alias.action.AliasAction; -import alias.action.RecurringAction.Interval; - public class BeepActionEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -57,7 +49,7 @@ public class BeepActionEditor extends DocumentListenerEditor + "for 15 seconds after you click OK.
" + ""; - private JComboBox mComboInterval; + private JComboBox mComboInterval; private JSlider mPeriodSlider; private JLabel mPeriodSliderLabel; @@ -84,20 +76,20 @@ public class BeepActionEditor extends DocumentListenerEditor add( new JLabel( "Beep Interval:" ) ); - mComboInterval = new JComboBox( Interval.values() ); + mComboInterval = new JComboBox( RecurringAction.Interval.values() ); mComboInterval.setToolTipText( HELP_TEXT ); mComboInterval.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { - Interval selected = mComboInterval + RecurringAction.Interval selected = mComboInterval .getItemAt( mComboInterval.getSelectedIndex() ); if( selected != null ) { /* Enable/disable period spinner based on selection */ - boolean enabled = selected != Interval.ONCE; + boolean enabled = selected != RecurringAction.Interval.ONCE; mPeriodSlider.setEnabled( enabled ); mPeriodSliderLabel.setEnabled( enabled ); @@ -163,11 +155,11 @@ public class BeepActionEditor extends DocumentListenerEditor { BeepAction beep = getBeepAction(); - Interval interval = beep.getInterval(); + RecurringAction.Interval interval = beep.getInterval(); mComboInterval.setSelectedItem( interval ); - boolean enabled = interval != Interval.ONCE; + boolean enabled = interval != RecurringAction.Interval.ONCE; mPeriodSliderLabel.setEnabled( enabled ); mPeriodSlider.setEnabled( enabled ); @@ -184,7 +176,7 @@ public class BeepActionEditor extends DocumentListenerEditor { BeepAction beep = getBeepAction(); - beep.setInterval( (Interval)mComboInterval.getSelectedItem() ); + beep.setInterval( (RecurringAction.Interval)mComboInterval.getSelectedItem() ); beep.setPeriod( mPeriodSlider.getValue() ); } diff --git a/src/main/java/io/github/dsheirer/alias/action/clip/ClipAction.java b/src/main/java/io/github/dsheirer/alias/action/clip/ClipAction.java new file mode 100644 index 00000000..15807304 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/action/clip/ClipAction.java @@ -0,0 +1,109 @@ +package io.github.dsheirer.alias.action.clip; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.alias.action.AliasActionType; +import io.github.dsheirer.alias.action.RecurringAction; +import io.github.dsheirer.message.Message; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import java.io.File; + +public class ClipAction extends RecurringAction +{ + private final static Logger mLog = LoggerFactory.getLogger(ClipAction.class); + + private String mFilePath; + + @JsonIgnore + private Clip mClip; + + public ClipAction() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasActionType getType() + { + return AliasActionType.CLIP; + } + + public String getPath() + { + return mFilePath; + } + + public void setPath(String path) + { + mFilePath = path; + } + + @Override + public void performAction(Alias alias, Message message) + { + try + { + play(); + } + catch(Exception e) + { + mLog.error("Couldn't play audio clip", e); + } + } + + public void play() throws Exception + { + try + { + if(mFilePath != null) + { + if(mClip == null) + { + mClip = AudioSystem.getClip(); + + AudioInputStream ais = + AudioSystem.getAudioInputStream(new File(mFilePath)); + + mClip.open(ais); + } + + if(mClip.isRunning()) + { + mClip.stop(); + } + + mClip.setFramePosition(0); + + mClip.start(); + } + } + catch(Exception e) + { + mClip = null; + + mLog.error("Error playing sound clip [" + mFilePath + "] - " + e.getMessage()); + + throw e; + } + } + + + @Override + public String toString() + { + if(mFilePath == null) + { + return "Play Clip"; + } + else + { + return "Play Clip: " + mFilePath; + } + } +} diff --git a/src/alias/action/clip/ClipActionEditor.java b/src/main/java/io/github/dsheirer/alias/action/clip/ClipActionEditor.java similarity index 88% rename from src/alias/action/clip/ClipActionEditor.java rename to src/main/java/io/github/dsheirer/alias/action/clip/ClipActionEditor.java index 83b09cc2..b8d31a0a 100644 --- a/src/alias/action/clip/ClipActionEditor.java +++ b/src/main/java/io/github/dsheirer/alias/action/clip/ClipActionEditor.java @@ -15,34 +15,23 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.action.clip; +package io.github.dsheirer.alias.action.clip; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.action.AliasAction; +import io.github.dsheirer.alias.action.RecurringAction; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JSlider; -import javax.swing.JTextField; -import javax.swing.SpinnerModel; -import javax.swing.SpinnerNumberModel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.miginfocom.swing.MigLayout; -import alias.action.AliasAction; -import alias.action.RecurringAction.Interval; - public class ClipActionEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -62,7 +51,7 @@ public class ClipActionEditor extends DocumentListenerEditor + "for 15 seconds after you click OK.
" + ""; - private JComboBox mComboInterval; + private JComboBox mComboInterval; private JSlider mPeriodSlider; private JLabel mPeriodSliderLabel; private JTextField mTextFilePath; @@ -90,20 +79,20 @@ public class ClipActionEditor extends DocumentListenerEditor add( new JLabel( "Play Interval:" ) ); - mComboInterval = new JComboBox( Interval.values() ); + mComboInterval = new JComboBox( RecurringAction.Interval.values() ); mComboInterval.setToolTipText( HELP_TEXT ); mComboInterval.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { - Interval selected = mComboInterval + RecurringAction.Interval selected = mComboInterval .getItemAt( mComboInterval.getSelectedIndex() ); if( selected != null ) { /* Enable/disable period slider based on selection */ - boolean enabled = selected != Interval.ONCE; + boolean enabled = selected != RecurringAction.Interval.ONCE; mPeriodSlider.setEnabled( enabled ); mPeriodSliderLabel.setEnabled( enabled ); @@ -186,7 +175,7 @@ public class ClipActionEditor extends DocumentListenerEditor if( path == null || path.trim().isEmpty() ) { JOptionPane.showMessageDialog( ClipActionEditor.this, - "Please select an audio file", PLEASE_SELECT_A_FILE, + "Please select an audio file", PLEASE_SELECT_A_FILE, JOptionPane.ERROR_MESSAGE ); } else @@ -218,7 +207,7 @@ public class ClipActionEditor extends DocumentListenerEditor catch( Exception e1 ) { JOptionPane.showMessageDialog( ClipActionEditor.this, - "Couldn't play audio clip [" + e1.getMessage() + "]", + "Couldn't play audio clip [" + e1.getMessage() + "]", "Error", JOptionPane.ERROR_MESSAGE ); } } @@ -254,11 +243,11 @@ public class ClipActionEditor extends DocumentListenerEditor { ClipAction clip = getClipAction(); - Interval interval = clip.getInterval(); + RecurringAction.Interval interval = clip.getInterval(); mComboInterval.setSelectedItem( interval ); - boolean enabled = interval != Interval.ONCE; + boolean enabled = interval != RecurringAction.Interval.ONCE; mPeriodSliderLabel.setEnabled( enabled ); mPeriodSlider.setEnabled( enabled ); @@ -286,7 +275,7 @@ public class ClipActionEditor extends DocumentListenerEditor { ClipAction script = getClipAction(); - script.setInterval( (Interval)mComboInterval.getSelectedItem() ); + script.setInterval( (RecurringAction.Interval)mComboInterval.getSelectedItem() ); script.setPeriod( mPeriodSlider.getValue() ); script.setPath( mTextFilePath.getText() ); } diff --git a/src/main/java/io/github/dsheirer/alias/action/script/ScriptAction.java b/src/main/java/io/github/dsheirer/alias/action/script/ScriptAction.java new file mode 100644 index 00000000..9aa920c2 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/action/script/ScriptAction.java @@ -0,0 +1,98 @@ +package io.github.dsheirer.alias.action.script; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.alias.action.AliasActionType; +import io.github.dsheirer.alias.action.RecurringAction; +import io.github.dsheirer.message.Message; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class ScriptAction extends RecurringAction +{ + private final static Logger mLog = LoggerFactory.getLogger(ScriptAction.class); + + private String mScript; + + public ScriptAction() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasActionType getType() + { + return AliasActionType.SCRIPT; + } + + public String getScript() + { + return mScript; + } + + public void setScript(String script) + { + mScript = script; + } + + @Override + public void performAction(Alias alias, Message message) + { + try + { + play(); + } + catch(Exception e) + { + mLog.error("Couldn't execute script [" + mScript + "]", e); + } + } + + public void play() throws Exception + { + if(mScript != null) + { + ProcessBuilder pb = new ProcessBuilder(mScript); + + pb.redirectErrorStream(true); + + Process p = pb.start(); + + int exitCode = p.waitFor(); + + BufferedReader reader = new BufferedReader( + new InputStreamReader(p.getInputStream())); + + String line = ""; + + StringBuilder sb = new StringBuilder(); + + while((line = reader.readLine()) != null) + { + sb.append(line + "\n"); + } + + if(exitCode != 0) + { + throw new RuntimeException("Exit Code: " + exitCode + + " Console:" + sb.toString()); + } + } + } + + @Override + public String toString() + { + if(mScript == null) + { + return "Run Script"; + } + else + { + return "Run Script: " + mScript; + } + } +} diff --git a/src/alias/action/script/ScriptActionEditor.java b/src/main/java/io/github/dsheirer/alias/action/script/ScriptActionEditor.java similarity index 89% rename from src/alias/action/script/ScriptActionEditor.java rename to src/main/java/io/github/dsheirer/alias/action/script/ScriptActionEditor.java index a0593e42..533f1941 100644 --- a/src/alias/action/script/ScriptActionEditor.java +++ b/src/main/java/io/github/dsheirer/alias/action/script/ScriptActionEditor.java @@ -15,34 +15,23 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.action.script; +package io.github.dsheirer.alias.action.script; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.action.AliasAction; +import io.github.dsheirer.alias.action.RecurringAction; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JSlider; -import javax.swing.JTextField; -import javax.swing.SpinnerModel; -import javax.swing.SpinnerNumberModel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.miginfocom.swing.MigLayout; -import alias.action.AliasAction; -import alias.action.RecurringAction.Interval; - public class ScriptActionEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; @@ -62,7 +51,7 @@ public class ScriptActionEditor extends DocumentListenerEditor + "for 15 seconds after you click OK.
" + ""; - private JComboBox mComboInterval; + private JComboBox mComboInterval; private JSlider mPeriodSlider; private JLabel mPeriodSliderLabel; private JTextField mTextFilePath; @@ -90,20 +79,20 @@ public class ScriptActionEditor extends DocumentListenerEditor add( new JLabel( "Run Interval:" ) ); - mComboInterval = new JComboBox( Interval.values() ); + mComboInterval = new JComboBox( RecurringAction.Interval.values() ); mComboInterval.setToolTipText( HELP_TEXT ); mComboInterval.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { - Interval selected = mComboInterval + RecurringAction.Interval selected = mComboInterval .getItemAt( mComboInterval.getSelectedIndex() ); if( selected != null ) { /* Enable/disable period slider based on selection */ - boolean enabled = selected != Interval.ONCE; + boolean enabled = selected != RecurringAction.Interval.ONCE; mPeriodSlider.setEnabled( enabled ); mPeriodSliderLabel.setEnabled( enabled ); @@ -250,11 +239,11 @@ public class ScriptActionEditor extends DocumentListenerEditor { ScriptAction script = getScriptAction(); - Interval interval = script.getInterval(); + RecurringAction.Interval interval = script.getInterval(); mComboInterval.setSelectedItem( interval ); - boolean enabled = interval != Interval.ONCE; + boolean enabled = interval != RecurringAction.Interval.ONCE; mPeriodSliderLabel.setEnabled( enabled ); mPeriodSlider.setEnabled( enabled ); @@ -282,7 +271,7 @@ public class ScriptActionEditor extends DocumentListenerEditor { ScriptAction script = getScriptAction(); - script.setInterval( (Interval)mComboInterval.getSelectedItem() ); + script.setInterval( (RecurringAction.Interval)mComboInterval.getSelectedItem() ); script.setPeriod( mPeriodSlider.getValue() ); script.setScript( mTextFilePath.getText() ); } diff --git a/src/main/java/io/github/dsheirer/alias/id/AliasID.java b/src/main/java/io/github/dsheirer/alias/id/AliasID.java new file mode 100644 index 00000000..0534f4a2 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/AliasID.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014-2016 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannel; +import io.github.dsheirer.alias.id.esn.Esn; +import io.github.dsheirer.alias.id.fleetsync.FleetsyncID; +import io.github.dsheirer.alias.id.lojack.LoJackFunctionAndID; +import io.github.dsheirer.alias.id.mdc.MDC1200ID; +import io.github.dsheirer.alias.id.mobileID.Min; +import io.github.dsheirer.alias.id.mpt1327.MPT1327ID; +import io.github.dsheirer.alias.id.nonrecordable.NonRecordable; +import io.github.dsheirer.alias.id.priority.Priority; +import io.github.dsheirer.alias.id.siteID.SiteID; +import io.github.dsheirer.alias.id.status.StatusID; +import io.github.dsheirer.alias.id.talkgroup.TalkgroupID; +import io.github.dsheirer.alias.id.uniqueID.UniqueID; + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.PROPERTY, property="type") +@JsonSubTypes({ + @JsonSubTypes.Type(value=BroadcastChannel.class, name="broadcastChannel"), + @JsonSubTypes.Type(value=Esn.class, name="esn"), + @JsonSubTypes.Type(value=FleetsyncID.class, name="fleetsyncID"), + @JsonSubTypes.Type(value = LoJackFunctionAndID.class, name = "loJackFunctionAndID"), + @JsonSubTypes.Type(value = MDC1200ID.class, name = "mdc1200ID"), + @JsonSubTypes.Type(value = Min.class, name = "min"), + @JsonSubTypes.Type(value = MPT1327ID.class, name = "mpt1327ID"), + @JsonSubTypes.Type(value = NonRecordable.class, name = "nonRecordable"), + @JsonSubTypes.Type(value = Priority.class, name = "priority"), + @JsonSubTypes.Type(value = SiteID.class, name = "siteID"), + @JsonSubTypes.Type(value = StatusID.class, name = "statusID"), + @JsonSubTypes.Type(value = TalkgroupID.class, name = "talkgroupID"), + @JsonSubTypes.Type(value = UniqueID.class, name = "uniqueID") +}) +@JacksonXmlRootElement( localName = "id" ) +public abstract class AliasID +{ + public AliasID() + { + } + + @JsonIgnore + public abstract AliasIDType getType(); + + public abstract boolean matches( AliasID id ); + + @JsonIgnore + public abstract boolean isValid(); +} diff --git a/src/alias/id/AliasIDType.java b/src/main/java/io/github/dsheirer/alias/id/AliasIDType.java similarity index 97% rename from src/alias/id/AliasIDType.java rename to src/main/java/io/github/dsheirer/alias/id/AliasIDType.java index 6a71ff4f..bd95471e 100644 --- a/src/alias/id/AliasIDType.java +++ b/src/main/java/io/github/dsheirer/alias/id/AliasIDType.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id; +package io.github.dsheirer.alias.id; public enum AliasIDType { diff --git a/src/alias/id/AliasIdentifierEditor.java b/src/main/java/io/github/dsheirer/alias/id/AliasIdentifierEditor.java similarity index 92% rename from src/alias/id/AliasIdentifierEditor.java rename to src/main/java/io/github/dsheirer/alias/id/AliasIdentifierEditor.java index 0c20517d..d0d68901 100644 --- a/src/alias/id/AliasIdentifierEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/AliasIdentifierEditor.java @@ -15,13 +15,21 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id; +package io.github.dsheirer.alias.id; -import audio.broadcast.BroadcastModel; -import gui.editor.Editor; -import gui.editor.EmptyEditor; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.alias.AliasEvent; +import io.github.dsheirer.alias.AliasFactory; +import io.github.dsheirer.alias.AliasModel; +import io.github.dsheirer.audio.broadcast.BroadcastModel; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.gui.editor.EmptyEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.EventQueue; +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -30,26 +38,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import javax.swing.DefaultListModel; -import javax.swing.JButton; -import javax.swing.JList; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.ListModel; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.miginfocom.swing.MigLayout; -import alias.Alias; -import alias.AliasEvent; -import alias.AliasEvent.Event; -import alias.AliasFactory; -import alias.AliasModel; - public class AliasIdentifierEditor extends Editor { private static final long serialVersionUID = 1L; @@ -204,7 +192,7 @@ public class AliasIdentifierEditor extends Editor alias.removeAliasID( selected ); - mAliasModel.broadcast( new AliasEvent( alias, Event.CHANGE ) ); + mAliasModel.broadcast( new AliasEvent( alias, AliasEvent.Event.CHANGE ) ); setItem( alias ); } @@ -263,7 +251,7 @@ public class AliasIdentifierEditor extends Editor if( hasItem() ) { - mAliasModel.broadcast( new AliasEvent( getItem(), Event.CHANGE ) ); + mAliasModel.broadcast( new AliasEvent( getItem(), AliasEvent.Event.CHANGE ) ); } } } @@ -307,7 +295,7 @@ public class AliasIdentifierEditor extends Editor { int option = JOptionPane.showConfirmDialog( EditorContainer.this, - "Identifier settings have changed. Do you want to save these changes?", + "Identifier settings have changed. Do you want to save these changes?", "Save Changes?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ); diff --git a/src/alias/id/WildcardID.java b/src/main/java/io/github/dsheirer/alias/id/WildcardID.java similarity index 99% rename from src/alias/id/WildcardID.java rename to src/main/java/io/github/dsheirer/alias/id/WildcardID.java index c5f47086..96d9a60b 100644 --- a/src/alias/id/WildcardID.java +++ b/src/main/java/io/github/dsheirer/alias/id/WildcardID.java @@ -16,7 +16,7 @@ * along with this program. If not, see * ******************************************************************************/ -package alias.id; +package io.github.dsheirer.alias.id; import org.apache.commons.lang3.Validate; diff --git a/src/alias/id/broadcast/BroadcastChannel.java b/src/main/java/io/github/dsheirer/alias/id/broadcast/BroadcastChannel.java similarity index 88% rename from src/alias/id/broadcast/BroadcastChannel.java rename to src/main/java/io/github/dsheirer/alias/id/broadcast/BroadcastChannel.java index 59a32090..d3aec77c 100644 --- a/src/alias/id/broadcast/BroadcastChannel.java +++ b/src/main/java/io/github/dsheirer/alias/id/broadcast/BroadcastChannel.java @@ -16,12 +16,11 @@ * along with this program. If not, see * ******************************************************************************/ -package alias.id.broadcast; +package io.github.dsheirer.alias.id.broadcast; -import alias.id.AliasID; -import alias.id.AliasIDType; - -import javax.xml.bind.annotation.XmlAttribute; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; public class BroadcastChannel extends AliasID implements Comparable { @@ -83,7 +82,7 @@ public class BroadcastChannel extends AliasID implements Comparable * ******************************************************************************/ -package alias.id.broadcast; +package io.github.dsheirer.alias.id.broadcast; -import alias.id.AliasID; -import audio.broadcast.BroadcastConfiguration; -import audio.broadcast.BroadcastModel; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.audio.broadcast.BroadcastConfiguration; +import io.github.dsheirer.audio.broadcast.BroadcastModel; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; import net.miginfocom.swing.MigLayout; import javax.swing.*; diff --git a/src/alias/id/esn/ESNEditor.java b/src/main/java/io/github/dsheirer/alias/id/esn/ESNEditor.java similarity index 92% rename from src/alias/id/esn/ESNEditor.java rename to src/main/java/io/github/dsheirer/alias/id/esn/ESNEditor.java index fd36ed47..06675ffc 100644 --- a/src/alias/id/esn/ESNEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/esn/ESNEditor.java @@ -15,22 +15,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.esn; +package io.github.dsheirer.alias.id.esn; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class ESNEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/alias/id/esn/Esn.java b/src/main/java/io/github/dsheirer/alias/id/esn/Esn.java similarity index 81% rename from src/alias/id/esn/Esn.java rename to src/main/java/io/github/dsheirer/alias/id/esn/Esn.java index 5e2b5fc1..656c7793 100644 --- a/src/alias/id/esn/Esn.java +++ b/src/main/java/io/github/dsheirer/alias/id/esn/Esn.java @@ -15,12 +15,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.esn; +package io.github.dsheirer.alias.id.esn; -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; public class Esn extends AliasID { @@ -30,7 +29,7 @@ public class Esn extends AliasID { } - @XmlAttribute + @JacksonXmlProperty(isAttribute = true, localName = "esn") public String getEsn() { return mEsn; @@ -70,6 +69,7 @@ public class Esn extends AliasID return retVal; } + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") @Override public AliasIDType getType() { diff --git a/src/alias/id/fleetsync/FleetsyncID.java b/src/main/java/io/github/dsheirer/alias/id/fleetsync/FleetsyncID.java similarity index 81% rename from src/alias/id/fleetsync/FleetsyncID.java rename to src/main/java/io/github/dsheirer/alias/id/fleetsync/FleetsyncID.java index 22b00872..19473bdf 100644 --- a/src/alias/id/fleetsync/FleetsyncID.java +++ b/src/main/java/io/github/dsheirer/alias/id/fleetsync/FleetsyncID.java @@ -15,13 +15,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.fleetsync; - -import javax.xml.bind.annotation.XmlAttribute; - -import alias.id.AliasID; -import alias.id.AliasIDType; +package io.github.dsheirer.alias.id.fleetsync; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; public class FleetsyncID extends AliasID { @@ -31,7 +29,7 @@ public class FleetsyncID extends AliasID { } - @XmlAttribute + @JacksonXmlProperty(isAttribute = true, localName = "ident") public String getIdent() { return mID; @@ -71,6 +69,7 @@ public class FleetsyncID extends AliasID return retVal; } + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") @Override public AliasIDType getType() { diff --git a/src/alias/id/fleetsync/FleetsyncIDEditor.java b/src/main/java/io/github/dsheirer/alias/id/fleetsync/FleetsyncIDEditor.java similarity index 92% rename from src/alias/id/fleetsync/FleetsyncIDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/fleetsync/FleetsyncIDEditor.java index 64f8f531..89fe739c 100644 --- a/src/alias/id/fleetsync/FleetsyncIDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/fleetsync/FleetsyncIDEditor.java @@ -15,27 +15,19 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.fleetsync; - -import gui.editor.DocumentListenerEditor; - -import java.awt.Color; -import java.awt.Cursor; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.text.MaskFormatter; +package io.github.dsheirer.alias.id.fleetsync; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; import net.miginfocom.swing.MigLayout; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import alias.id.AliasID; +import javax.swing.*; +import javax.swing.text.MaskFormatter; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; public class FleetsyncIDEditor extends DocumentListenerEditor { diff --git a/src/main/java/io/github/dsheirer/alias/id/lojack/LoJackFunctionAndID.java b/src/main/java/io/github/dsheirer/alias/id/lojack/LoJackFunctionAndID.java new file mode 100644 index 00000000..95f15688 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/lojack/LoJackFunctionAndID.java @@ -0,0 +1,151 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2015 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id.lojack; + + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; +import io.github.dsheirer.module.decode.lj1200.LJ1200Message; + +public class LoJackFunctionAndID extends AliasID +{ + private LJ1200Message.Function mFunction = LJ1200Message.Function.F0_UNKNOWN; + private String mID = "*****"; + + public LoJackFunctionAndID() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "id") + public String getID() + { + return mID; + } + + public void setID(String id) + { + mID = id; + } + + @JacksonXmlProperty(isAttribute = true, localName = "function") + public LJ1200Message.Function getFunction() + { + return mFunction; + } + + public void setFunction(LJ1200Message.Function function) + { + mFunction = function; + } + + @Override + public boolean isValid() + { + return mFunction != null && mID != null; + } + + public String toString() + { + return "LoJack FUNC: " + mFunction.getLabel() + " ID:" + (mID == null ? "" : mID); + } + + /** + * Indicates if the function and id combination match this alias id + */ + public boolean matches(LJ1200Message.Function function, String id) + { + return mFunction == function && + mID != null && + id != null && + id.matches(mID.replace("*", ".?")); + } + + @Override + public boolean matches(AliasID id) + { + boolean retVal = false; + + if(mID != null && id instanceof LoJackFunctionAndID) + { + LoJackFunctionAndID otherLojack = (LoJackFunctionAndID)id; + + if(otherLojack.getFunction() == mFunction) + { + //Create a pattern - replace * wildcards with regex single-char wildcard + String pattern = mID.replace("*", ".?"); + + retVal = otherLojack.getID().matches(pattern); + } + } + + return retVal; + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.LOJACK; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + + ((mFunction == null) ? 0 : mFunction.hashCode()); + result = prime * result + ((mID == null) ? 0 : mID.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if(this == obj) + { + return true; + } + if(obj == null) + { + return false; + } + if(getClass() != obj.getClass()) + { + return false; + } + LoJackFunctionAndID other = (LoJackFunctionAndID)obj; + if(mFunction != other.mFunction) + { + return false; + } + if(mID == null) + { + if(other.mID != null) + { + return false; + } + } + else if(!mID.equals(other.mID)) + { + return false; + } + return true; + } +} diff --git a/src/alias/id/lojack/LoJackIDEditor.java b/src/main/java/io/github/dsheirer/alias/id/lojack/LoJackIDEditor.java similarity index 91% rename from src/alias/id/lojack/LoJackIDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/lojack/LoJackIDEditor.java index 8c13e60e..85e9fc8e 100644 --- a/src/alias/id/lojack/LoJackIDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/lojack/LoJackIDEditor.java @@ -15,29 +15,22 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.lojack; +package io.github.dsheirer.alias.id.lojack; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import io.github.dsheirer.module.decode.lj1200.LJ1200Message; +import io.github.dsheirer.module.decode.lj1200.LJ1200Message.Function; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.text.MaskFormatter; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JComboBox; -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.text.MaskFormatter; - -import module.decode.lj1200.LJ1200Message; -import module.decode.lj1200.LJ1200Message.Function; -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class LoJackIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/main/java/io/github/dsheirer/alias/id/mdc/MDC1200ID.java b/src/main/java/io/github/dsheirer/alias/id/mdc/MDC1200ID.java new file mode 100644 index 00000000..e8f50df7 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/mdc/MDC1200ID.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id.mdc; + + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; + +public class MDC1200ID extends AliasID +{ + private String mID; + + public MDC1200ID() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "ident") + public String getIdent() + { + return mID; + } + + public void setIdent(String ident) + { + mID = ident; + } + + @Override + public boolean isValid() + { + return mID != null; + } + + public String toString() + { + return "MDC-1200: " + mID; + } + + @Override + public boolean matches(AliasID id) + { + boolean retVal = false; + + if(mID != null && id instanceof MDC1200ID) + { + MDC1200ID tgid = (MDC1200ID)id; + + //Create a pattern - replace * wildcards with regex single-char wildcard + String pattern = mID.replace("*", ".?"); + + retVal = tgid.getIdent().matches(pattern); + } + + return retVal; + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.MDC1200; + } +} diff --git a/src/alias/id/mdc/MDC1200IDEditor.java b/src/main/java/io/github/dsheirer/alias/id/mdc/MDC1200IDEditor.java similarity index 92% rename from src/alias/id/mdc/MDC1200IDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/mdc/MDC1200IDEditor.java index 21437cb9..e688421e 100644 --- a/src/alias/id/mdc/MDC1200IDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/mdc/MDC1200IDEditor.java @@ -15,24 +15,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.mdc; +package io.github.dsheirer.alias.id.mdc; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.text.MaskFormatter; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.text.MaskFormatter; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class MDC1200IDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/alias/id/mobileID/MINEditor.java b/src/main/java/io/github/dsheirer/alias/id/mobileID/MINEditor.java similarity index 91% rename from src/alias/id/mobileID/MINEditor.java rename to src/main/java/io/github/dsheirer/alias/id/mobileID/MINEditor.java index 6244ff69..ff2a4f8d 100644 --- a/src/alias/id/mobileID/MINEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/mobileID/MINEditor.java @@ -15,24 +15,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.mobileID; +package io.github.dsheirer.alias.id.mobileID; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.text.MaskFormatter; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.text.MaskFormatter; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class MINEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/main/java/io/github/dsheirer/alias/id/mobileID/Min.java b/src/main/java/io/github/dsheirer/alias/id/mobileID/Min.java new file mode 100644 index 00000000..aec0eb72 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/mobileID/Min.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id.mobileID; + + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; + +/** + * Mobile ID Number + */ +public class Min extends AliasID +{ + private String mMin; + + public Min() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "min") + public String getMin() + { + return mMin; + } + + public void setMin(String min) + { + mMin = min; + } + + @Override + public boolean isValid() + { + return mMin != null; + } + + public String toString() + { + return "MIN: " + mMin; + } + + @Override + public boolean matches(AliasID id) + { + boolean retVal = false; + + if(mMin != null && id instanceof Min) + { + Min min = (Min)id; + + //Create a pattern - replace * wildcards with regex single-char wildcard + String pattern = mMin.replace("*", ".?"); + + retVal = min.getMin().matches(pattern); + } + + return retVal; + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.MIN; + } +} diff --git a/src/main/java/io/github/dsheirer/alias/id/mpt1327/MPT1327ID.java b/src/main/java/io/github/dsheirer/alias/id/mpt1327/MPT1327ID.java new file mode 100644 index 00000000..53208bbb --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/mpt1327/MPT1327ID.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id.mpt1327; + + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; + +public class MPT1327ID extends AliasID +{ + private String mID; + + public MPT1327ID() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "ident") + public String getIdent() + { + return mID; + } + + public void setIdent(String ident) + { + mID = ident; + } + + @Override + public boolean isValid() + { + return mID != null; + } + + public String toString() + { + return "MPT-1327: " + mID; + } + + @Override + public boolean matches(AliasID id) + { + boolean retVal = false; + + if(mID != null && id instanceof MPT1327ID) + { + MPT1327ID tgid = (MPT1327ID)id; + + //Create a pattern - replace * wildcards with regex single-char wildcard + String pattern = mID.replace("*", ".?"); + + retVal = tgid.getIdent().matches(pattern); + } + + return retVal; + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.MPT1327; + } +} diff --git a/src/alias/id/mpt1327/MPT1327IDEditor.java b/src/main/java/io/github/dsheirer/alias/id/mpt1327/MPT1327IDEditor.java similarity index 92% rename from src/alias/id/mpt1327/MPT1327IDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/mpt1327/MPT1327IDEditor.java index 4bbfc8fe..6ce3ccad 100644 --- a/src/alias/id/mpt1327/MPT1327IDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/mpt1327/MPT1327IDEditor.java @@ -15,24 +15,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.mpt1327; +package io.github.dsheirer.alias.id.mpt1327; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.text.MaskFormatter; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.text.MaskFormatter; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class MPT1327IDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/main/java/io/github/dsheirer/alias/id/nonrecordable/NonRecordable.java b/src/main/java/io/github/dsheirer/alias/id/nonrecordable/NonRecordable.java new file mode 100644 index 00000000..b6a2fcb9 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/nonrecordable/NonRecordable.java @@ -0,0 +1,33 @@ +package io.github.dsheirer.alias.id.nonrecordable; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; + +public class NonRecordable extends AliasID +{ + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.NON_RECORDABLE; + } + + @Override + public boolean isValid() + { + return true; + } + + @Override + public boolean matches(AliasID id) + { + return false; + } + + @Override + public String toString() + { + return "Audio Non-Recordable"; + } +} diff --git a/src/alias/id/nonrecordable/NonRecordableEditor.java b/src/main/java/io/github/dsheirer/alias/id/nonrecordable/NonRecordableEditor.java similarity index 91% rename from src/alias/id/nonrecordable/NonRecordableEditor.java rename to src/main/java/io/github/dsheirer/alias/id/nonrecordable/NonRecordableEditor.java index 6f402371..02726cc9 100644 --- a/src/alias/id/nonrecordable/NonRecordableEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/nonrecordable/NonRecordableEditor.java @@ -15,21 +15,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.nonrecordable; +package io.github.dsheirer.alias.id.nonrecordable; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class NonRecordableEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/main/java/io/github/dsheirer/alias/id/priority/Priority.java b/src/main/java/io/github/dsheirer/alias/id/priority/Priority.java new file mode 100644 index 00000000..6184c8ff --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/priority/Priority.java @@ -0,0 +1,85 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id.priority; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; + +/** + * Specifies an (audio) priority level for this alias. + */ +public class Priority extends AliasID +{ + public static final int DO_NOT_MONITOR = -1; + public static final int SELECTED_PRIORITY = 0; + public static final int MIN_PRIORITY = 1; + public static final int MAX_PRIORITY = 100; + public static final int DEFAULT_PRIORITY = 100; + + private int mPriority = DEFAULT_PRIORITY; + + public Priority() + { + } + + @Override + public boolean isValid() + { + return true; + } + + /** + * Indicates the associated alias should not be monitored or tracked. + */ + @JsonIgnore + public boolean isDoNotMonitor() + { + return mPriority == DO_NOT_MONITOR; + } + + @JacksonXmlProperty(isAttribute = true, localName = "priority") + public int getPriority() + { + return mPriority; + } + + public void setPriority(int priority) + { + mPriority = priority; + } + + public String toString() + { + return "Audio Priority: " + (isDoNotMonitor() ? "Do Not Monitor" : mPriority); + } + + @Override + public boolean matches(AliasID id) + { + return false; + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.PRIORITY; + } +} diff --git a/src/alias/id/priority/PriorityEditor.java b/src/main/java/io/github/dsheirer/alias/id/priority/PriorityEditor.java similarity index 94% rename from src/alias/id/priority/PriorityEditor.java rename to src/main/java/io/github/dsheirer/alias/id/priority/PriorityEditor.java index 5b797991..767625c5 100644 --- a/src/alias/id/priority/PriorityEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/priority/PriorityEditor.java @@ -15,23 +15,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.priority; +package io.github.dsheirer.alias.id.priority; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JSlider; +import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; public class PriorityEditor extends DocumentListenerEditor { diff --git a/src/playlist/version1/System.java b/src/main/java/io/github/dsheirer/alias/id/siteID/SiteID.java similarity index 50% rename from src/playlist/version1/System.java rename to src/main/java/io/github/dsheirer/alias/id/siteID/SiteID.java index 548bff7d..acf3016e 100644 --- a/src/playlist/version1/System.java +++ b/src/main/java/io/github/dsheirer/alias/id/siteID/SiteID.java @@ -1,84 +1,68 @@ /******************************************************************************* * SDR Trunk * Copyright (C) 2014 Dennis Sheirer - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package playlist.version1; +package io.github.dsheirer.alias.id.siteID; -import java.util.ArrayList; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSeeAlso; - -@XmlSeeAlso( { Site.class } ) -@XmlRootElement( name = "system" ) -@Deprecated -public class System +public class SiteID extends AliasID { - private String mName; - private ArrayList mSite = new ArrayList(); + private String mSite; - public System() + public SiteID() { - this( "New System" ); } - - public System( String name ) - { - mName = name; - } - - @XmlAttribute - public String getName() - { - return mName; - } - - public void setName( String name ) - { - mName = name; - } - - public ArrayList getSite() + + @JacksonXmlProperty(isAttribute = true, localName = "site") + public String getSite() { return mSite; } - - public void setSite( ArrayList sites ) + + public void setSite(String site) { - mSite = sites; + mSite = site; } - - public void addSite( Site site ) + + @Override + public boolean isValid() { - mSite.add( site ); + return mSite != null; } - - public void removeSite( Site site ) - { - mSite.remove( site ); - } - - public void clearSites() - { - mSite.clear(); - } - + public String toString() { - return mName; + return "Site: " + mSite; + } + + @Override + public boolean matches(AliasID otherID) + { + return otherID != null && + otherID instanceof SiteID && + getSite().contentEquals(((SiteID)otherID).getSite()); + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.SITE; } } diff --git a/src/alias/id/siteID/SiteIDEditor.java b/src/main/java/io/github/dsheirer/alias/id/siteID/SiteIDEditor.java similarity index 92% rename from src/alias/id/siteID/SiteIDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/siteID/SiteIDEditor.java index 7df5fa7a..aa87fcee 100644 --- a/src/alias/id/siteID/SiteIDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/siteID/SiteIDEditor.java @@ -15,22 +15,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.siteID; +package io.github.dsheirer.alias.id.siteID; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class SiteIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/main/java/io/github/dsheirer/alias/id/status/StatusID.java b/src/main/java/io/github/dsheirer/alias/id/status/StatusID.java new file mode 100644 index 00000000..24050b1a --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/status/StatusID.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id.status; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; + +public class StatusID extends AliasID +{ + private int mStatus; + + public StatusID() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "status") + public int getStatus() + { + return mStatus; + } + + public void setStatus(int status) + { + this.mStatus = status; + } + + @Override + public boolean isValid() + { + return true; + } + + public String toString() + { + return "Status: " + String.format("%03d", mStatus); + } + + @Override + public boolean matches(AliasID id) + { + boolean retVal = false; + + if(id instanceof StatusID) + { + StatusID statusId = (StatusID)id; + + retVal = (mStatus == statusId.getStatus()); + } + + return retVal; + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.STATUS; + } +} diff --git a/src/alias/id/status/StatusIDEditor.java b/src/main/java/io/github/dsheirer/alias/id/status/StatusIDEditor.java similarity index 92% rename from src/alias/id/status/StatusIDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/status/StatusIDEditor.java index e4dc8e3d..69a4b996 100644 --- a/src/alias/id/status/StatusIDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/status/StatusIDEditor.java @@ -15,24 +15,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.status; +package io.github.dsheirer.alias.id.status; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import javax.swing.text.MaskFormatter; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JFormattedTextField; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; -import javax.swing.text.MaskFormatter; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class StatusIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/alias/id/talkgroup/TalkgroupID.java b/src/main/java/io/github/dsheirer/alias/id/talkgroup/TalkgroupID.java similarity index 81% rename from src/alias/id/talkgroup/TalkgroupID.java rename to src/main/java/io/github/dsheirer/alias/id/talkgroup/TalkgroupID.java index cb2e8097..c70accbd 100644 --- a/src/alias/id/talkgroup/TalkgroupID.java +++ b/src/main/java/io/github/dsheirer/alias/id/talkgroup/TalkgroupID.java @@ -15,13 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.talkgroup; +package io.github.dsheirer.alias.id.talkgroup; -import alias.id.AliasID; -import alias.id.AliasIDType; - -import javax.xml.bind.annotation.XmlAttribute; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; public class TalkgroupID extends AliasID { @@ -37,7 +36,7 @@ public class TalkgroupID extends AliasID mTalkgroup = talkgroup; } - @XmlAttribute + @JacksonXmlProperty(isAttribute = true, localName = "talkgroup") public String getTalkgroup() { return mTalkgroup; @@ -70,7 +69,7 @@ public class TalkgroupID extends AliasID if(id instanceof TalkgroupID) { - TalkgroupID tgid = (TalkgroupID) id; + TalkgroupID tgid = (TalkgroupID)id; //Create a pattern - replace * wildcards with regex single-char wildcard String pattern = mTalkgroup.replace("*", ".?"); @@ -81,6 +80,7 @@ public class TalkgroupID extends AliasID return retVal; } + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") @Override public AliasIDType getType() { diff --git a/src/alias/id/talkgroup/TalkgroupIDEditor.java b/src/main/java/io/github/dsheirer/alias/id/talkgroup/TalkgroupIDEditor.java similarity index 92% rename from src/alias/id/talkgroup/TalkgroupIDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/talkgroup/TalkgroupIDEditor.java index 6a63faf6..8cf061c5 100644 --- a/src/alias/id/talkgroup/TalkgroupIDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/talkgroup/TalkgroupIDEditor.java @@ -15,22 +15,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.talkgroup; +package io.github.dsheirer.alias.id.talkgroup; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class TalkgroupIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/main/java/io/github/dsheirer/alias/id/uniqueID/UniqueID.java b/src/main/java/io/github/dsheirer/alias/id/uniqueID/UniqueID.java new file mode 100644 index 00000000..5b2e1f77 --- /dev/null +++ b/src/main/java/io/github/dsheirer/alias/id/uniqueID/UniqueID.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package io.github.dsheirer.alias.id.uniqueID; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.alias.id.AliasIDType; + +public class UniqueID extends AliasID +{ + private int mUid; + + public UniqueID() + { + } + + @JacksonXmlProperty(isAttribute = true, localName = "uid") + public int getUid() + { + return mUid; + } + + public void setUid(int uid) + { + this.mUid = uid; + } + + @Override + public boolean isValid() + { + return true; + } + + public String toString() + { + return "UniqueID: " + mUid; + } + + @Override + public boolean matches(AliasID id) + { + boolean retVal = false; + + if(id instanceof UniqueID) + { + UniqueID uid = (UniqueID)id; + + retVal = mUid == uid.getUid(); + } + + return retVal; + } + + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") + @Override + public AliasIDType getType() + { + return AliasIDType.LTR_NET_UID; + } +} diff --git a/src/alias/id/uniqueID/UniqueIDEditor.java b/src/main/java/io/github/dsheirer/alias/id/uniqueID/UniqueIDEditor.java similarity index 92% rename from src/alias/id/uniqueID/UniqueIDEditor.java rename to src/main/java/io/github/dsheirer/alias/id/uniqueID/UniqueIDEditor.java index ea0aa3be..01053c51 100644 --- a/src/alias/id/uniqueID/UniqueIDEditor.java +++ b/src/main/java/io/github/dsheirer/alias/id/uniqueID/UniqueIDEditor.java @@ -15,22 +15,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package alias.id.uniqueID; +package io.github.dsheirer.alias.id.uniqueID; -import gui.editor.DocumentListenerEditor; +import io.github.dsheirer.alias.id.AliasID; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import net.miginfocom.swing.MigLayout; -import java.awt.Color; -import java.awt.Cursor; +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JTextField; - -import net.miginfocom.swing.MigLayout; -import alias.id.AliasID; - public class UniqueIDEditor extends DocumentListenerEditor { private static final long serialVersionUID = 1L; diff --git a/src/audio/AudioChannelPanel.java b/src/main/java/io/github/dsheirer/audio/AudioChannelPanel.java similarity index 93% rename from src/audio/AudioChannelPanel.java rename to src/main/java/io/github/dsheirer/audio/AudioChannelPanel.java index 8d659173..7e6c1aa3 100644 --- a/src/audio/AudioChannelPanel.java +++ b/src/main/java/io/github/dsheirer/audio/AudioChannelPanel.java @@ -16,22 +16,21 @@ * along with this program. If not, see * ******************************************************************************/ -package audio; +package io.github.dsheirer.audio; -import alias.Alias; -import audio.output.AudioOutput; -import channel.metadata.Metadata; -import icon.IconManager; +import io.github.dsheirer.alias.Alias; +import io.github.dsheirer.audio.output.AudioOutput; +import io.github.dsheirer.channel.metadata.Metadata; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.properties.SystemProperties; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.settings.ColorSetting; +import io.github.dsheirer.settings.Setting; +import io.github.dsheirer.settings.SettingChangeListener; +import io.github.dsheirer.settings.SettingsManager; import net.miginfocom.swing.MigLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import properties.SystemProperties; -import sample.Listener; -import settings.ColorSetting; -import settings.ColorSetting.ColorSettingName; -import settings.Setting; -import settings.SettingChangeListener; -import settings.SettingsManager; import javax.swing.*; import java.awt.*; diff --git a/src/audio/AudioChannelsPanel.java b/src/main/java/io/github/dsheirer/audio/AudioChannelsPanel.java similarity index 92% rename from src/audio/AudioChannelsPanel.java rename to src/main/java/io/github/dsheirer/audio/AudioChannelsPanel.java index ebfc1b9b..a3db071b 100644 --- a/src/audio/AudioChannelsPanel.java +++ b/src/main/java/io/github/dsheirer/audio/AudioChannelsPanel.java @@ -16,12 +16,12 @@ * along with this program. If not, see * ******************************************************************************/ -package audio; +package io.github.dsheirer.audio; -import audio.output.AudioOutput; -import icon.IconManager; +import io.github.dsheirer.audio.output.AudioOutput; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.settings.SettingsManager; import net.miginfocom.swing.MigLayout; -import settings.SettingsManager; import javax.swing.*; import java.awt.*; diff --git a/src/audio/AudioEvent.java b/src/main/java/io/github/dsheirer/audio/AudioEvent.java similarity index 93% rename from src/audio/AudioEvent.java rename to src/main/java/io/github/dsheirer/audio/AudioEvent.java index ca166059..c77a6ea2 100644 --- a/src/audio/AudioEvent.java +++ b/src/main/java/io/github/dsheirer/audio/AudioEvent.java @@ -1,4 +1,4 @@ -package audio; +package io.github.dsheirer.audio; public class AudioEvent { diff --git a/src/audio/AudioException.java b/src/main/java/io/github/dsheirer/audio/AudioException.java similarity index 89% rename from src/audio/AudioException.java rename to src/main/java/io/github/dsheirer/audio/AudioException.java index 365b605c..f3374b34 100644 --- a/src/audio/AudioException.java +++ b/src/main/java/io/github/dsheirer/audio/AudioException.java @@ -1,4 +1,4 @@ -package audio; +package io.github.dsheirer.audio; public class AudioException extends Exception { diff --git a/src/audio/AudioFormats.java b/src/main/java/io/github/dsheirer/audio/AudioFormats.java similarity index 98% rename from src/audio/AudioFormats.java rename to src/main/java/io/github/dsheirer/audio/AudioFormats.java index ac859f54..c6cbed82 100644 --- a/src/audio/AudioFormats.java +++ b/src/main/java/io/github/dsheirer/audio/AudioFormats.java @@ -1,4 +1,4 @@ -package audio; +package io.github.dsheirer.audio; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.DataLine; @@ -72,13 +72,13 @@ public class AudioFormats LITTLE_ENDIAN ); /** - * Source Data Line Info for a 48 kHz, 16-bits signed PCM one channel + * Source Data Line Info for a 48 kHz, 16-bits signed PCM one channel */ public static final Line.Info MONO_SOURCE_DATALINE_INFO = new DataLine.Info( SourceDataLine.class, PCM_SIGNED_8KHZ_16BITS_MONO); /** - * Source Data Line Info for a 48 kHz, 16-bits signed PCM two channels + * Source Data Line Info for a 48 kHz, 16-bits signed PCM two channels */ public static final Line.Info STEREO_SOURCE_DATALINE_INFO = new DataLine.Info( SourceDataLine.class, PCM_SIGNED_8KHZ_16BITS_STEREO); diff --git a/src/audio/AudioManager.java b/src/main/java/io/github/dsheirer/audio/AudioManager.java similarity index 96% rename from src/audio/AudioManager.java rename to src/main/java/io/github/dsheirer/audio/AudioManager.java index 4d6c57ac..c0f1d877 100644 --- a/src/audio/AudioManager.java +++ b/src/main/java/io/github/dsheirer/audio/AudioManager.java @@ -16,21 +16,20 @@ * along with this program. If not, see * ******************************************************************************/ -package audio; +package io.github.dsheirer.audio; -import audio.AudioEvent.Type; -import audio.output.AudioOutput; -import audio.output.MonoAudioOutput; -import audio.output.StereoAudioOutput; +import io.github.dsheirer.audio.output.AudioOutput; +import io.github.dsheirer.audio.output.MonoAudioOutput; +import io.github.dsheirer.audio.output.StereoAudioOutput; +import io.github.dsheirer.properties.SystemProperties; +import io.github.dsheirer.sample.Broadcaster; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.source.mixer.MixerChannel; +import io.github.dsheirer.source.mixer.MixerChannelConfiguration; +import io.github.dsheirer.source.mixer.MixerManager; +import io.github.dsheirer.util.ThreadPool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import properties.SystemProperties; -import sample.Broadcaster; -import sample.Listener; -import source.mixer.MixerChannel; -import source.mixer.MixerChannelConfiguration; -import source.mixer.MixerManager; -import util.ThreadPool; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Mixer; @@ -54,10 +53,10 @@ public class AudioManager implements Listener, IAudioController public static final String AUDIO_MIXER_PROPERTY = "audio.manager.mixer"; public static final AudioEvent CONFIGURATION_CHANGE_STARTED = - new AudioEvent(Type.AUDIO_CONFIGURATION_CHANGE_STARTED, null); + new AudioEvent(AudioEvent.Type.AUDIO_CONFIGURATION_CHANGE_STARTED, null); public static final AudioEvent CONFIGURATION_CHANGE_COMPLETE = - new AudioEvent(Type.AUDIO_CONFIGURATION_CHANGE_COMPLETE, null); + new AudioEvent(AudioEvent.Type.AUDIO_CONFIGURATION_CHANGE_COMPLETE, null); private LinkedTransferQueue mAudioPacketQueue = new LinkedTransferQueue<>(); private Map mChannelConnectionMap = new HashMap<>(); diff --git a/src/main/java/io/github/dsheirer/audio/AudioModule.java b/src/main/java/io/github/dsheirer/audio/AudioModule.java new file mode 100644 index 00000000..369dd8ed --- /dev/null +++ b/src/main/java/io/github/dsheirer/audio/AudioModule.java @@ -0,0 +1,188 @@ +/******************************************************************************* + * sdrtrunk + * Copyright (C) 2014-2017 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + * + ******************************************************************************/ +package io.github.dsheirer.audio; + +import io.github.dsheirer.audio.squelch.ISquelchStateListener; +import io.github.dsheirer.audio.squelch.SquelchState; +import io.github.dsheirer.channel.metadata.Metadata; +import io.github.dsheirer.dsp.filter.design.FilterDesignException; +import io.github.dsheirer.dsp.filter.fir.FIRFilterSpecification; +import io.github.dsheirer.dsp.filter.fir.remez.RemezFIRFilterDesigner; +import io.github.dsheirer.dsp.filter.polyphase.PolyphaseFIRDecimatingFilter_RB; +import io.github.dsheirer.module.Module; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.sample.real.IFilteredRealBufferListener; +import io.github.dsheirer.sample.real.RealBuffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ScheduledExecutorService; + +/** + * Provides packaging of demodulated audio sample buffers into audio packets for + * broadcast to registered audio packet listeners. Includes audio packet + * metadata in constructed audio packets. + * + * Incorporates audio squelch state listener to control if audio packets are + * broadcast or ignored. + */ +public class AudioModule extends Module implements IAudioPacketProvider, IFilteredRealBufferListener, + ISquelchStateListener, Listener +{ + protected static final Logger mLog = LoggerFactory.getLogger(AudioModule.class); + + private static float[] mDecimationCoefficients; + + static + { + //Band-pass filter to both decimate (48kHz to 8kHz) and block 0 - 300 Hz (LTR signalling). + FIRFilterSpecification specification = FIRFilterSpecification.bandPassBuilder() + .sampleRate(48000) + .stopFrequency1(150) + .passFrequencyBegin(300) + .passFrequencyEnd(3500) + .stopFrequency2(4000) + .stopRipple(0.0004) + .passRipple(0.008) + .build(); + + RemezFIRFilterDesigner designer = new RemezFIRFilterDesigner(specification); + + try + { + if(!designer.isValid()) + { + throw new FilterDesignException("Couldn't design the audio decimation filter"); + } + + mDecimationCoefficients = designer.getImpulseResponse(); + } + catch(FilterDesignException e) + { + mLog.debug("Error designing filter", e); + } + } + + private SquelchStateListener mSquelchStateListener = new SquelchStateListener(); + private SquelchState mSquelchState = SquelchState.SQUELCH; + private Listener mAudioPacketListener; + private PolyphaseFIRDecimatingFilter_RB mAudioDecimationFilter; + private Metadata mMetadata; + + public AudioModule(Metadata metadata) + { + mMetadata = metadata; + + mAudioDecimationFilter = new PolyphaseFIRDecimatingFilter_RB(mDecimationCoefficients, 6, 2.0f); + mAudioDecimationFilter.setListener(new Listener() + { + @Override + public void receive(RealBuffer realBuffer) + { + if(mAudioPacketListener != null) + { + AudioPacket packet = new AudioPacket(realBuffer.getSamples(), mMetadata.copyOf()); + mAudioPacketListener.receive(packet); + } + } + }); + } + + @Override + public void dispose() + { + mSquelchStateListener = null; + mAudioPacketListener = null; + } + + @Override + public void reset() + { + } + + @Override + public void start(ScheduledExecutorService executor) + { + /* No start operations provided */ + } + + @Override + public void stop() + { + /* Issue an end audio packet in case a recorder is still rolling */ + if(mAudioPacketListener != null) + { + mAudioPacketListener.receive(new AudioPacket(AudioPacket.Type.END, mMetadata.copyOf())); + } + } + + /** + * Processes demodulated audio samples into audio packets with current audio + * metadata and sends to the registered listener + */ + @Override + public void receive(RealBuffer buffer) + { + if(mAudioPacketListener != null && mSquelchState == SquelchState.UNSQUELCH) + { + mAudioDecimationFilter.receive(buffer); + } + } + + @Override + public Listener getFilteredRealBufferListener() + { + return this; + } + + @Override + public void setAudioPacketListener(Listener listener) + { + mAudioPacketListener = listener; + } + + @Override + public void removeAudioPacketListener() + { + mAudioPacketListener = null; + } + + @Override + public Listener getSquelchStateListener() + { + return mSquelchStateListener; + } + + /** + * Wrapper for squelch state listener + */ + public class SquelchStateListener implements Listener + { + @Override + public void receive(SquelchState state) + { + if(state == SquelchState.SQUELCH && mAudioPacketListener != null) + { + mAudioPacketListener.receive(new AudioPacket(AudioPacket.Type.END, mMetadata.copyOf())); + } + + mSquelchState = state; + } + } +} diff --git a/src/audio/AudioPacket.java b/src/main/java/io/github/dsheirer/audio/AudioPacket.java similarity index 92% rename from src/audio/AudioPacket.java rename to src/main/java/io/github/dsheirer/audio/AudioPacket.java index aa655975..a57f2bdb 100644 --- a/src/audio/AudioPacket.java +++ b/src/main/java/io/github/dsheirer/audio/AudioPacket.java @@ -16,10 +16,10 @@ * along with this program. If not, see * ******************************************************************************/ -package audio; +package io.github.dsheirer.audio; -import channel.metadata.Metadata; -import sample.real.RealBuffer; +import io.github.dsheirer.channel.metadata.Metadata; +import io.github.dsheirer.sample.real.RealBuffer; public class AudioPacket { diff --git a/src/audio/AudioPacketRateCounter.java b/src/main/java/io/github/dsheirer/audio/AudioPacketRateCounter.java similarity index 92% rename from src/audio/AudioPacketRateCounter.java rename to src/main/java/io/github/dsheirer/audio/AudioPacketRateCounter.java index 99835a90..fbc7ea0d 100644 --- a/src/audio/AudioPacketRateCounter.java +++ b/src/main/java/io/github/dsheirer/audio/AudioPacketRateCounter.java @@ -1,10 +1,9 @@ -package audio; +package io.github.dsheirer.audio; +import io.github.dsheirer.sample.Listener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sample.Listener; - public class AudioPacketRateCounter implements Listener { private final static Logger mLog = diff --git a/src/audio/AudioPanel.java b/src/main/java/io/github/dsheirer/audio/AudioPanel.java similarity index 94% rename from src/audio/AudioPanel.java rename to src/main/java/io/github/dsheirer/audio/AudioPanel.java index e91ecacf..83adc861 100644 --- a/src/audio/AudioPanel.java +++ b/src/main/java/io/github/dsheirer/audio/AudioPanel.java @@ -16,23 +16,32 @@ * along with this program. If not, see * ******************************************************************************/ -package audio; +package io.github.dsheirer.audio; -import audio.output.AudioOutput; -import icon.IconManager; +import io.github.dsheirer.audio.output.AudioOutput; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.settings.SettingsManager; +import io.github.dsheirer.source.SourceManager; +import io.github.dsheirer.source.mixer.MixerChannelConfiguration; import net.miginfocom.swing.MigLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sample.Listener; -import settings.SettingsManager; -import source.SourceManager; -import source.mixer.MixerChannelConfiguration; import javax.sound.sampled.FloatControl; -import javax.swing.*; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JSlider; +import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.*; +import java.awt.Color; +import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; @@ -44,10 +53,8 @@ public class AudioPanel extends JPanel implements Listener private static final Logger mLog = LoggerFactory.getLogger(AudioPanel.class); - private static ImageIcon MUTED_ICON = IconManager.getScaledIcon( - new ImageIcon("images/audio_muted.png"), 20); - private static ImageIcon UNMUTED_ICON = IconManager.getScaledIcon( - new ImageIcon("images/audio_unmuted.png"), 20); + private static ImageIcon MUTED_ICON = IconManager.getScaledIcon("/images/audio_muted.png", 20); + private static ImageIcon UNMUTED_ICON = IconManager.getScaledIcon("/images/audio_unmuted.png", 20); private IconManager mIconManager; private SettingsManager mSettingsManager; diff --git a/src/audio/AudioUtils.java b/src/main/java/io/github/dsheirer/audio/AudioUtils.java similarity index 95% rename from src/audio/AudioUtils.java rename to src/main/java/io/github/dsheirer/audio/AudioUtils.java index fac396f9..08b4d3d8 100644 --- a/src/audio/AudioUtils.java +++ b/src/main/java/io/github/dsheirer/audio/AudioUtils.java @@ -16,12 +16,11 @@ * along with this program. If not, see * ******************************************************************************/ -package audio; +package io.github.dsheirer.audio; +import io.github.dsheirer.sample.ConversionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import record.wave.RealBufferWaveRecorder; -import sample.ConversionUtils; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/src/audio/IAudioController.java b/src/main/java/io/github/dsheirer/audio/IAudioController.java similarity index 76% rename from src/audio/IAudioController.java rename to src/main/java/io/github/dsheirer/audio/IAudioController.java index 4b12b6d0..a6fe007b 100644 --- a/src/audio/IAudioController.java +++ b/src/main/java/io/github/dsheirer/audio/IAudioController.java @@ -1,11 +1,11 @@ -package audio; +package io.github.dsheirer.audio; + +import io.github.dsheirer.audio.output.AudioOutput; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.source.mixer.MixerChannelConfiguration; import java.util.List; -import sample.Listener; -import source.mixer.MixerChannelConfiguration; -import audio.output.AudioOutput; - /** * Interface for controlling one or more audio channels */ diff --git a/src/audio/IAudioPacketListener.java b/src/main/java/io/github/dsheirer/audio/IAudioPacketListener.java similarity index 56% rename from src/audio/IAudioPacketListener.java rename to src/main/java/io/github/dsheirer/audio/IAudioPacketListener.java index 298f5e1c..96833a73 100644 --- a/src/audio/IAudioPacketListener.java +++ b/src/main/java/io/github/dsheirer/audio/IAudioPacketListener.java @@ -1,6 +1,6 @@ -package audio; +package io.github.dsheirer.audio; -import sample.Listener; +import io.github.dsheirer.sample.Listener; public interface IAudioPacketListener { diff --git a/src/audio/IAudioPacketProvider.java b/src/main/java/io/github/dsheirer/audio/IAudioPacketProvider.java similarity index 67% rename from src/audio/IAudioPacketProvider.java rename to src/main/java/io/github/dsheirer/audio/IAudioPacketProvider.java index 47f4b0be..b6623cee 100644 --- a/src/audio/IAudioPacketProvider.java +++ b/src/main/java/io/github/dsheirer/audio/IAudioPacketProvider.java @@ -1,6 +1,6 @@ -package audio; +package io.github.dsheirer.audio; -import sample.Listener; +import io.github.dsheirer.sample.Listener; public interface IAudioPacketProvider { diff --git a/src/audio/InversionFrequency.java b/src/main/java/io/github/dsheirer/audio/InversionFrequency.java similarity index 97% rename from src/audio/InversionFrequency.java rename to src/main/java/io/github/dsheirer/audio/InversionFrequency.java index da493f19..071dc8bd 100644 --- a/src/audio/InversionFrequency.java +++ b/src/main/java/io/github/dsheirer/audio/InversionFrequency.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package audio; +package io.github.dsheirer.audio; /** * Standard voice inversion foldover frequencies diff --git a/src/audio/broadcast/AudioBroadcaster.java b/src/main/java/io/github/dsheirer/audio/broadcast/AudioBroadcaster.java similarity index 98% rename from src/audio/broadcast/AudioBroadcaster.java rename to src/main/java/io/github/dsheirer/audio/broadcast/AudioBroadcaster.java index 3cb4c309..413bbdf1 100644 --- a/src/audio/broadcast/AudioBroadcaster.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/AudioBroadcaster.java @@ -16,14 +16,14 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; -import audio.convert.ISilenceGenerator; -import channel.metadata.Metadata; +import io.github.dsheirer.audio.convert.ISilenceGenerator; +import io.github.dsheirer.channel.metadata.Metadata; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.util.ThreadPool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sample.Listener; -import util.ThreadPool; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/src/audio/broadcast/AudioRecording.java b/src/main/java/io/github/dsheirer/audio/broadcast/AudioRecording.java similarity index 97% rename from src/audio/broadcast/AudioRecording.java rename to src/main/java/io/github/dsheirer/audio/broadcast/AudioRecording.java index f80a0c66..5edbe272 100644 --- a/src/audio/broadcast/AudioRecording.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/AudioRecording.java @@ -16,9 +16,9 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; -import channel.metadata.Metadata; +import io.github.dsheirer.channel.metadata.Metadata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/audio/broadcast/BroadcastConfiguration.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastConfiguration.java similarity index 78% rename from src/audio/broadcast/BroadcastConfiguration.java rename to src/main/java/io/github/dsheirer/audio/broadcast/BroadcastConfiguration.java index 2a2ee63b..220416e5 100644 --- a/src/audio/broadcast/BroadcastConfiguration.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastConfiguration.java @@ -16,27 +16,27 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; -import audio.broadcast.broadcastify.BroadcastifyConfiguration; -import audio.broadcast.icecast.IcecastHTTPConfiguration; -import audio.broadcast.icecast.IcecastTCPConfiguration; -import audio.broadcast.shoutcast.v1.ShoutcastV1Configuration; -import audio.broadcast.shoutcast.v2.ShoutcastV2Configuration; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import io.github.dsheirer.audio.broadcast.icecast.IcecastConfiguration; +import io.github.dsheirer.audio.broadcast.shoutcast.v1.ShoutcastV1Configuration; +import io.github.dsheirer.audio.broadcast.shoutcast.v2.ShoutcastV2Configuration; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.bind.annotation.XmlTransient; import java.net.InetSocketAddress; import java.net.SocketAddress; -@XmlSeeAlso({BroadcastifyConfiguration.class, - IcecastTCPConfiguration.class, - IcecastHTTPConfiguration.class, - ShoutcastV1Configuration.class, - ShoutcastV2Configuration.class}) -@XmlRootElement(name = "stream") +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = IcecastConfiguration.class, name="icecastConfiguration"), + @JsonSubTypes.Type(value = ShoutcastV1Configuration.class, name="shoutcastV1Configuration"), + @JsonSubTypes.Type(value = ShoutcastV2Configuration.class, name="shoutcastV2Configuration"), +}) +@JacksonXmlRootElement(localName = "stream") public abstract class BroadcastConfiguration { private BroadcastFormat mBroadcastFormat = BroadcastFormat.MP3; @@ -69,13 +69,18 @@ public abstract class BroadcastConfiguration /** * Broadcast server type */ - @XmlAttribute(name = "type") + @JacksonXmlProperty(isAttribute = true, localName = "type", namespace = "http://www.w3.org/2001/XMLSchema-instance") public abstract BroadcastServerType getBroadcastServerType(); + private void setBroadcastServerType(BroadcastServerType type) + { + //Do nothing + } + /** * Name identifying this broadcastAudio configuration. */ - @XmlAttribute(name = "name") + @JacksonXmlProperty(isAttribute = true, localName = "name") public String getName() { return mName; @@ -102,7 +107,7 @@ public abstract class BroadcastConfiguration /** * BROADCAST server host name. */ - @XmlAttribute(name = "host") + @JacksonXmlProperty(isAttribute = true, localName = "host") public String getHost() { return mHost; @@ -129,7 +134,7 @@ public abstract class BroadcastConfiguration /** * BROADCAST server port number; */ - @XmlAttribute(name = "port") + @JacksonXmlProperty(isAttribute = true, localName = "port") public int getPort() { return mPort; @@ -153,6 +158,7 @@ public abstract class BroadcastConfiguration return mPort > 0; } + @JsonIgnore public SocketAddress getAddress() { return new InetSocketAddress(getHost(), getPort()); @@ -161,7 +167,7 @@ public abstract class BroadcastConfiguration /** * Password to authenticate with the streaming server. */ - @XmlAttribute(name = "password") + @JacksonXmlProperty(isAttribute = true, localName = "password") public String getPassword() { return mPassword; @@ -188,7 +194,7 @@ public abstract class BroadcastConfiguration /** * Audio broadcastAudio content type (e.g. mp3) */ - @XmlAttribute(name = "format") + @JacksonXmlProperty(isAttribute = false, localName = "format") public BroadcastFormat getBroadcastFormat() { return mBroadcastFormat; @@ -202,7 +208,7 @@ public abstract class BroadcastConfiguration /** * Audio broadcastAudio delay from recording start until the audio file is broadcastAudio to the server. */ - @XmlAttribute(name = "delay") + @JacksonXmlProperty(isAttribute = true, localName = "delay") public long getDelay() { return mDelay; @@ -222,7 +228,7 @@ public abstract class BroadcastConfiguration * queue awaiting streaming before it is purged from the queue. This value is in addition to the delay setting. * @return age in milliseconds */ - @XmlAttribute(name = "maximum_recording_age") + @JacksonXmlProperty(isAttribute = true, localName = "maximum_recording_age") public long getMaximumRecordingAge() { return mMaximumRecordingAge; @@ -241,7 +247,7 @@ public abstract class BroadcastConfiguration /** * Indicates if this broadcaster is enable, meaning that it will automatically connect on startup. */ - @XmlAttribute(name = "enabled") + @JacksonXmlProperty(isAttribute = true, localName = "enabled") public boolean isEnabled() { return mEnabled; @@ -293,7 +299,7 @@ public abstract class BroadcastConfiguration * Indicates if this configuration is valid. A minimal check will ensure that it contains at least a hostname and * port number. */ - @XmlTransient + @JsonIgnore public boolean isValid() { return mHost != null && mPort > 0; diff --git a/src/audio/broadcast/BroadcastConfigurationEditor.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastConfigurationEditor.java similarity index 95% rename from src/audio/broadcast/BroadcastConfigurationEditor.java rename to src/main/java/io/github/dsheirer/audio/broadcast/BroadcastConfigurationEditor.java index 4c1b5f71..bb5b9a18 100644 --- a/src/audio/broadcast/BroadcastConfigurationEditor.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastConfigurationEditor.java @@ -16,11 +16,11 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; -import alias.AliasModel; -import gui.editor.DocumentListenerEditor; -import icon.IconManager; +import io.github.dsheirer.alias.AliasModel; +import io.github.dsheirer.gui.editor.DocumentListenerEditor; +import io.github.dsheirer.icon.IconManager; import javax.swing.*; diff --git a/src/audio/broadcast/BroadcastEvent.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastEvent.java similarity index 98% rename from src/audio/broadcast/BroadcastEvent.java rename to src/main/java/io/github/dsheirer/audio/broadcast/BroadcastEvent.java index f7fc4cff..802c9814 100644 --- a/src/audio/broadcast/BroadcastEvent.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastEvent.java @@ -16,7 +16,7 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; public class BroadcastEvent { diff --git a/src/audio/broadcast/BroadcastFactory.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFactory.java similarity index 80% rename from src/audio/broadcast/BroadcastFactory.java rename to src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFactory.java index 75caef3b..85f6e43c 100644 --- a/src/audio/broadcast/BroadcastFactory.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFactory.java @@ -16,34 +16,34 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; -import alias.AliasModel; -import audio.broadcast.broadcastify.BroadcastifyConfiguration; -import audio.broadcast.broadcastify.BroadcastifyConfigurationEditor; -import audio.broadcast.icecast.IcecastHTTPAudioBroadcaster; -import audio.broadcast.icecast.IcecastHTTPConfiguration; -import audio.broadcast.icecast.IcecastHTTPConfigurationEditor; -import audio.broadcast.icecast.IcecastTCPAudioBroadcaster; -import audio.broadcast.icecast.IcecastTCPConfiguration; -import audio.broadcast.icecast.IcecastTCPConfigurationEditor; -import audio.broadcast.shoutcast.v1.ShoutcastV1AudioBroadcaster; -import audio.broadcast.shoutcast.v1.ShoutcastV1Configuration; -import audio.broadcast.shoutcast.v1.ShoutcastV1ConfigurationEditor; -import audio.broadcast.shoutcast.v2.ShoutcastV2AudioBroadcaster; -import audio.broadcast.shoutcast.v2.ShoutcastV2Configuration; -import audio.broadcast.shoutcast.v2.ShoutcastV2ConfigurationEditor; -import audio.convert.IAudioConverter; -import audio.convert.ISilenceGenerator; -import audio.convert.MP3AudioConverter; -import audio.convert.MP3SilenceGenerator; -import gui.editor.Editor; -import gui.editor.EmptyEditor; -import icon.IconManager; +import io.github.dsheirer.alias.AliasModel; +import io.github.dsheirer.audio.broadcast.broadcastify.BroadcastifyConfiguration; +import io.github.dsheirer.audio.broadcast.broadcastify.BroadcastifyConfigurationEditor; +import io.github.dsheirer.audio.broadcast.icecast.IcecastHTTPAudioBroadcaster; +import io.github.dsheirer.audio.broadcast.icecast.IcecastHTTPConfiguration; +import io.github.dsheirer.audio.broadcast.icecast.IcecastHTTPConfigurationEditor; +import io.github.dsheirer.audio.broadcast.icecast.IcecastTCPAudioBroadcaster; +import io.github.dsheirer.audio.broadcast.icecast.IcecastTCPConfiguration; +import io.github.dsheirer.audio.broadcast.icecast.IcecastTCPConfigurationEditor; +import io.github.dsheirer.audio.broadcast.shoutcast.v1.ShoutcastV1AudioBroadcaster; +import io.github.dsheirer.audio.broadcast.shoutcast.v1.ShoutcastV1Configuration; +import io.github.dsheirer.audio.broadcast.shoutcast.v1.ShoutcastV1ConfigurationEditor; +import io.github.dsheirer.audio.broadcast.shoutcast.v2.ShoutcastV2AudioBroadcaster; +import io.github.dsheirer.audio.broadcast.shoutcast.v2.ShoutcastV2Configuration; +import io.github.dsheirer.audio.broadcast.shoutcast.v2.ShoutcastV2ConfigurationEditor; +import io.github.dsheirer.audio.convert.IAudioConverter; +import io.github.dsheirer.audio.convert.ISilenceGenerator; +import io.github.dsheirer.audio.convert.MP3AudioConverter; +import io.github.dsheirer.audio.convert.MP3SilenceGenerator; +import io.github.dsheirer.gui.editor.Editor; +import io.github.dsheirer.gui.editor.EmptyEditor; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.record.AudioRecorder; +import io.github.dsheirer.record.mp3.MP3Recorder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import record.AudioRecorder; -import record.mp3.MP3Recorder; import java.nio.file.Path; diff --git a/src/audio/broadcast/BroadcastFormat.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFormat.java similarity index 96% rename from src/audio/broadcast/BroadcastFormat.java rename to src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFormat.java index 134423bd..a02020a7 100644 --- a/src/audio/broadcast/BroadcastFormat.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFormat.java @@ -16,7 +16,7 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; public enum BroadcastFormat { diff --git a/src/audio/broadcast/BroadcastModel.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastModel.java similarity index 98% rename from src/audio/broadcast/BroadcastModel.java rename to src/main/java/io/github/dsheirer/audio/broadcast/BroadcastModel.java index 04f64f76..fc7c9eac 100644 --- a/src/audio/broadcast/BroadcastModel.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastModel.java @@ -16,20 +16,20 @@ * along with this program. If not, see * ******************************************************************************/ -package audio.broadcast; +package io.github.dsheirer.audio.broadcast; -import alias.id.broadcast.BroadcastChannel; -import audio.AudioPacket; -import channel.metadata.Metadata; -import icon.IconManager; +import io.github.dsheirer.alias.id.broadcast.BroadcastChannel; +import io.github.dsheirer.audio.AudioPacket; +import io.github.dsheirer.channel.metadata.Metadata; +import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.properties.SystemProperties; +import io.github.dsheirer.sample.Broadcaster; +import io.github.dsheirer.sample.Listener; +import io.github.dsheirer.util.ThreadPool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import properties.SystemProperties; -import sample.Broadcaster; -import sample.Listener; -import util.ThreadPool; -import javax.swing.*; +import javax.swing.ImageIcon; import javax.swing.table.AbstractTableModel; import java.io.IOException; import java.nio.file.DirectoryStream; @@ -519,7 +519,7 @@ public class BroadcastModel extends AbstractTableModel implements Listener