Quellcode durchsuchen

Initial prototype.

master
Chris Smith vor 6 Jahren
Commit
cfec926542

+ 4
- 0
.gitignore Datei anzeigen

@@ -0,0 +1,4 @@
1
+/build
2
+/out
3
+/.idea
4
+/.gradle

+ 34
- 0
build.gradle Datei anzeigen

@@ -0,0 +1,34 @@
1
+group 'com.dmdirc.x'
2
+version '1.0-SNAPSHOT'
3
+
4
+apply plugin: 'java'
5
+
6
+sourceCompatibility = 1.8
7
+
8
+repositories {
9
+    mavenCentral()
10
+    maven { url 'https://artifactory.dmdirc.com/artifactory/repo' }
11
+}
12
+
13
+dependencies {
14
+    testCompile group: 'junit', name: 'junit', version: '4.12'
15
+
16
+    compile group: 'net.engio', name: 'mbassador', version: '1.3.0'
17
+    compile group: 'de.odysseus.juel', name: 'juel-api', version: '2.2.7'
18
+    compile group: 'de.odysseus.juel', name: 'juel-impl', version: '2.2.7'
19
+    compile group: 'de.odysseus.juel', name: 'juel-spi', version: '2.2.7'
20
+
21
+    compile group: 'com.google.guava', name:'guava', version: '19.0'
22
+
23
+    compile group: 'com.dmdirc', name: 'parser-common', version: '0.8-351-g3a87922-SNAPSHOT'
24
+    compile group: 'com.dmdirc', name: 'parser-irc', version: '+'
25
+
26
+    compile group: 'com.squareup.dagger', name: 'dagger', version: '1.2.5'
27
+
28
+    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.8.2'
29
+    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.8.2'
30
+
31
+    compile group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.1.2'
32
+    compile group: 'io.reactivex.rxjava2', name: 'rxjavafx', version: '2.1.1'
33
+    compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.7-M5'
34
+}

BIN
gradle/wrapper/gradle-wrapper.jar Datei anzeigen


+ 6
- 0
gradle/wrapper/gradle-wrapper.properties Datei anzeigen

@@ -0,0 +1,6 @@
1
+#Sun Aug 13 14:52:58 BST 2017
2
+distributionBase=GRADLE_USER_HOME
3
+distributionPath=wrapper/dists
4
+zipStoreBase=GRADLE_USER_HOME
5
+zipStorePath=wrapper/dists
6
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-rc-2-all.zip

+ 172
- 0
gradlew Datei anzeigen

@@ -0,0 +1,172 @@
1
+#!/usr/bin/env sh
2
+
3
+##############################################################################
4
+##
5
+##  Gradle start up script for UN*X
6
+##
7
+##############################################################################
8
+
9
+# Attempt to set APP_HOME
10
+# Resolve links: $0 may be a link
11
+PRG="$0"
12
+# Need this for relative symlinks.
13
+while [ -h "$PRG" ] ; do
14
+    ls=`ls -ld "$PRG"`
15
+    link=`expr "$ls" : '.*-> \(.*\)$'`
16
+    if expr "$link" : '/.*' > /dev/null; then
17
+        PRG="$link"
18
+    else
19
+        PRG=`dirname "$PRG"`"/$link"
20
+    fi
21
+done
22
+SAVED="`pwd`"
23
+cd "`dirname \"$PRG\"`/" >/dev/null
24
+APP_HOME="`pwd -P`"
25
+cd "$SAVED" >/dev/null
26
+
27
+APP_NAME="Gradle"
28
+APP_BASE_NAME=`basename "$0"`
29
+
30
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31
+DEFAULT_JVM_OPTS=""
32
+
33
+# Use the maximum available, or set MAX_FD != -1 to use that value.
34
+MAX_FD="maximum"
35
+
36
+warn ( ) {
37
+    echo "$*"
38
+}
39
+
40
+die ( ) {
41
+    echo
42
+    echo "$*"
43
+    echo
44
+    exit 1
45
+}
46
+
47
+# OS specific support (must be 'true' or 'false').
48
+cygwin=false
49
+msys=false
50
+darwin=false
51
+nonstop=false
52
+case "`uname`" in
53
+  CYGWIN* )
54
+    cygwin=true
55
+    ;;
56
+  Darwin* )
57
+    darwin=true
58
+    ;;
59
+  MINGW* )
60
+    msys=true
61
+    ;;
62
+  NONSTOP* )
63
+    nonstop=true
64
+    ;;
65
+esac
66
+
67
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68
+
69
+# Determine the Java command to use to start the JVM.
70
+if [ -n "$JAVA_HOME" ] ; then
71
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72
+        # IBM's JDK on AIX uses strange locations for the executables
73
+        JAVACMD="$JAVA_HOME/jre/sh/java"
74
+    else
75
+        JAVACMD="$JAVA_HOME/bin/java"
76
+    fi
77
+    if [ ! -x "$JAVACMD" ] ; then
78
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79
+
80
+Please set the JAVA_HOME variable in your environment to match the
81
+location of your Java installation."
82
+    fi
83
+else
84
+    JAVACMD="java"
85
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86
+
87
+Please set the JAVA_HOME variable in your environment to match the
88
+location of your Java installation."
89
+fi
90
+
91
+# Increase the maximum file descriptors if we can.
92
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93
+    MAX_FD_LIMIT=`ulimit -H -n`
94
+    if [ $? -eq 0 ] ; then
95
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96
+            MAX_FD="$MAX_FD_LIMIT"
97
+        fi
98
+        ulimit -n $MAX_FD
99
+        if [ $? -ne 0 ] ; then
100
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
101
+        fi
102
+    else
103
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104
+    fi
105
+fi
106
+
107
+# For Darwin, add options to specify how the application appears in the dock
108
+if $darwin; then
109
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110
+fi
111
+
112
+# For Cygwin, switch paths to Windows format before running java
113
+if $cygwin ; then
114
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116
+    JAVACMD=`cygpath --unix "$JAVACMD"`
117
+
118
+    # We build the pattern for arguments to be converted via cygpath
119
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120
+    SEP=""
121
+    for dir in $ROOTDIRSRAW ; do
122
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
123
+        SEP="|"
124
+    done
125
+    OURCYGPATTERN="(^($ROOTDIRS))"
126
+    # Add a user-defined pattern to the cygpath arguments
127
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129
+    fi
130
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
131
+    i=0
132
+    for arg in "$@" ; do
133
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
135
+
136
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
137
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138
+        else
139
+            eval `echo args$i`="\"$arg\""
140
+        fi
141
+        i=$((i+1))
142
+    done
143
+    case $i in
144
+        (0) set -- ;;
145
+        (1) set -- "$args0" ;;
146
+        (2) set -- "$args0" "$args1" ;;
147
+        (3) set -- "$args0" "$args1" "$args2" ;;
148
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154
+    esac
155
+fi
156
+
157
+# Escape application args
158
+save ( ) {
159
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160
+    echo " "
161
+}
162
+APP_ARGS=$(save "$@")
163
+
164
+# Collect all arguments for the java command, following the shell quoting and substitution rules
165
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166
+
167
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169
+  cd "$(dirname "$0")"
170
+fi
171
+
172
+exec "$JAVACMD" "$@"

+ 84
- 0
gradlew.bat Datei anzeigen

@@ -0,0 +1,84 @@
1
+@if "%DEBUG%" == "" @echo off
2
+@rem ##########################################################################
3
+@rem
4
+@rem  Gradle startup script for Windows
5
+@rem
6
+@rem ##########################################################################
7
+
8
+@rem Set local scope for the variables with windows NT shell
9
+if "%OS%"=="Windows_NT" setlocal
10
+
11
+set DIRNAME=%~dp0
12
+if "%DIRNAME%" == "" set DIRNAME=.
13
+set APP_BASE_NAME=%~n0
14
+set APP_HOME=%DIRNAME%
15
+
16
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17
+set DEFAULT_JVM_OPTS=
18
+
19
+@rem Find java.exe
20
+if defined JAVA_HOME goto findJavaFromJavaHome
21
+
22
+set JAVA_EXE=java.exe
23
+%JAVA_EXE% -version >NUL 2>&1
24
+if "%ERRORLEVEL%" == "0" goto init
25
+
26
+echo.
27
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28
+echo.
29
+echo Please set the JAVA_HOME variable in your environment to match the
30
+echo location of your Java installation.
31
+
32
+goto fail
33
+
34
+:findJavaFromJavaHome
35
+set JAVA_HOME=%JAVA_HOME:"=%
36
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37
+
38
+if exist "%JAVA_EXE%" goto init
39
+
40
+echo.
41
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42
+echo.
43
+echo Please set the JAVA_HOME variable in your environment to match the
44
+echo location of your Java installation.
45
+
46
+goto fail
47
+
48
+:init
49
+@rem Get command-line arguments, handling Windows variants
50
+
51
+if not "%OS%" == "Windows_NT" goto win9xME_args
52
+
53
+:win9xME_args
54
+@rem Slurp the command line arguments.
55
+set CMD_LINE_ARGS=
56
+set _SKIP=2
57
+
58
+:win9xME_args_slurp
59
+if "x%~1" == "x" goto execute
60
+
61
+set CMD_LINE_ARGS=%*
62
+
63
+:execute
64
+@rem Setup the command line
65
+
66
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67
+
68
+@rem Execute Gradle
69
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70
+
71
+:end
72
+@rem End local scope for the variables with windows NT shell
73
+if "%ERRORLEVEL%"=="0" goto mainEnd
74
+
75
+:fail
76
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77
+rem the _cmd.exe /c_ return code!
78
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79
+exit /b 1
80
+
81
+:mainEnd
82
+if "%OS%"=="Windows_NT" endlocal
83
+
84
+:omega

+ 2
- 0
settings.gradle Datei anzeigen

@@ -0,0 +1,2 @@
1
+rootProject.name = 'client'
2
+

+ 82
- 0
src/main/java/com/dmdirc/x/client/Main.java Datei anzeigen

@@ -0,0 +1,82 @@
1
+package com.dmdirc.x.client;
2
+
3
+import com.dmdirc.parser.common.MyInfo;
4
+import com.dmdirc.parser.events.ChannelEvent;
5
+import com.dmdirc.parser.events.ChannelMessageEvent;
6
+import com.dmdirc.parser.events.ParserEvent;
7
+import com.dmdirc.parser.irc.IRCParser;
8
+import com.dmdirc.x.parser.ObservableParser;
9
+import io.reactivex.Observable;
10
+import io.reactivex.rxjavafx.schedulers.JavaFxScheduler;
11
+import java.net.URI;
12
+import javafx.application.Application;
13
+import javafx.scene.Scene;
14
+import javafx.scene.layout.StackPane;
15
+import javafx.stage.Stage;
16
+import org.apache.logging.log4j.LogManager;
17
+import org.apache.logging.log4j.Logger;
18
+import org.fxmisc.richtext.StyleClassedTextArea;
19
+
20
+public class Main {
21
+
22
+    private static final Logger logger = LogManager.getLogger(Main.class);
23
+
24
+    public static void main(String... args) {
25
+        Application.launch(HelloWorld.class, args);
26
+    }
27
+
28
+    public static class HelloWorld extends Application {
29
+
30
+        private StyleClassedTextArea area;
31
+
32
+        @Override
33
+        public void start(Stage primaryStage) {
34
+            area = new StyleClassedTextArea();
35
+            area.insertText(0, "Hello");
36
+
37
+            StackPane root = new StackPane();
38
+            root.getChildren().add(area);
39
+
40
+            Scene scene = new Scene(root, 300, 250);
41
+
42
+            primaryStage.setTitle("Hello World!");
43
+            primaryStage.setScene(scene);
44
+            primaryStage.show();
45
+
46
+            MyInfo info = new MyInfo();
47
+            info.setNickname(getParameters().getNamed().getOrDefault("nick", "luser"));
48
+            IRCParser parser = new IRCParser(info, URI.create(getParameters().getNamed().get("uri")));
49
+            ObservableParser observableParser = new ObservableParser(parser);
50
+            parser.connect();
51
+
52
+            observableParser.eventObservable().subscribe(this::handleEvent);
53
+            observableParser.eventObservable()
54
+                    .filter(e -> e instanceof ChannelEvent)
55
+                    .map(e -> (ChannelEvent) e)
56
+                    .filter(c -> c.getChannel().getName().equalsIgnoreCase(
57
+                            getParameters().getNamed().getOrDefault("channel", "#dmdirc")))
58
+                    .filter(e -> e instanceof ChannelMessageEvent)
59
+                    .map(e -> (ChannelMessageEvent) e)
60
+                    .map(e -> e.getClient().getClient().getNickname() + "> " + e.getMessage())
61
+                    .observeOn(JavaFxScheduler.platform())
62
+                    .subscribe(this::handleChannelEvent);
63
+
64
+            Observable.range(0, 250000)
65
+                    .map(String::valueOf)
66
+                    .observeOn(JavaFxScheduler.platform())
67
+                    .subscribe(this::handleChannelEvent);
68
+        }
69
+
70
+
71
+        private void handleEvent(ParserEvent event) {
72
+            //logger.debug("Received event {}", event.getClass().getName());
73
+        }
74
+
75
+        private void handleChannelEvent(String line) {
76
+            int length = area.getLength();
77
+            area.insertText(length, "\n" + line);
78
+        }
79
+
80
+    }
81
+
82
+}

+ 53
- 0
src/main/java/com/dmdirc/x/parser/ObservableParser.java Datei anzeigen

@@ -0,0 +1,53 @@
1
+package com.dmdirc.x.parser;
2
+
3
+import com.dmdirc.parser.events.ParserEvent;
4
+import com.dmdirc.parser.interfaces.Parser;
5
+import io.reactivex.Observable;
6
+import io.reactivex.ObservableEmitter;
7
+import net.engio.mbassy.listener.Handler;
8
+import net.engio.mbassy.listener.Listener;
9
+import net.engio.mbassy.listener.References;
10
+import org.apache.logging.log4j.LogManager;
11
+import org.apache.logging.log4j.Logger;
12
+
13
+public class ObservableParser {
14
+
15
+    private static final Logger logger = LogManager.getLogger(ObservableParser.class);
16
+
17
+    private final Parser parser;
18
+    private Observable<ParserEvent> observable;
19
+
20
+    public ObservableParser(final Parser parser) {
21
+        this.parser = parser;
22
+    }
23
+
24
+    public Observable<ParserEvent> eventObservable() {
25
+        if (observable == null) {
26
+            observable = Observable.create(e -> {
27
+                logger.info("Creating new observable!");
28
+                CallbackListener listener = new CallbackListener(e);
29
+                parser.getCallbackManager().subscribe(listener);
30
+                e.setCancellable(() -> parser.getCallbackManager().unsubscribe(listener));
31
+            });
32
+        }
33
+        return observable;
34
+    }
35
+
36
+    @Listener(references = References.Strong)
37
+    private static final class CallbackListener {
38
+
39
+        private final ObservableEmitter<ParserEvent> emitter;
40
+
41
+        private CallbackListener(final ObservableEmitter<ParserEvent> emitter) {
42
+            this.emitter = emitter;
43
+        }
44
+
45
+        @Handler
46
+        public void handleEvent(final ParserEvent parserEvent) {
47
+            logger.trace("Emitting event of type {}", parserEvent.getClass().getSimpleName());
48
+            emitter.onNext(parserEvent);
49
+        }
50
+
51
+    }
52
+
53
+}

+ 13
- 0
src/main/resources/log4j2.xml Datei anzeigen

@@ -0,0 +1,13 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Configuration status="WARN">
3
+    <Appenders>
4
+        <Console name="Console" target="SYSTEM_OUT">
5
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
6
+        </Console>
7
+    </Appenders>
8
+    <Loggers>
9
+        <Root level="trace">
10
+            <AppenderRef ref="Console"/>
11
+        </Root>
12
+    </Loggers>
13
+</Configuration>