From 5a90d0ab107b4711b2b22aa3b2964ce7d669a216 Mon Sep 17 00:00:00 2001 From: Jordan Byrne Date: Sun, 10 Dec 2017 15:37:46 +1000 Subject: % Major Refactor of the base GT++ class. % Moved Config Handling to it's own class. % Renamed configSwitches.class to ConfigSwitches.class. + Added framework for Segment Analytics. --- .../api/analytics/AnalyticsLoggingPlugin.java | 37 ++++++++++++ .../gtPlusPlus/api/analytics/BlockingFlush.java | 67 ++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java create mode 100644 src/Java/gtPlusPlus/api/analytics/BlockingFlush.java (limited to 'src/Java/gtPlusPlus/api') diff --git a/src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java b/src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java new file mode 100644 index 0000000000..ec2537cbfd --- /dev/null +++ b/src/Java/gtPlusPlus/api/analytics/AnalyticsLoggingPlugin.java @@ -0,0 +1,37 @@ +package gtPlusPlus.api.analytics; + +import com.segment.analytics.Analytics; +import com.segment.analytics.Callback; +import com.segment.analytics.Log; +import com.segment.analytics.Plugin; +import com.segment.analytics.messages.Message; + +/** + * A {@link Plugin} implementation that redirects client logs to standard output and logs callback + * events. + */ +public class AnalyticsLoggingPlugin implements Plugin { + @Override public void configure(Analytics.Builder builder) { + builder.log(new Log() { + @Override public void print(Level level, String format, Object... args) { + System.out.println(level + ":\t" + String.format(format, args)); + } + + @Override public void print(Level level, Throwable error, String format, Object... args) { + System.out.println(level + ":\t" + String.format(format, args)); + System.out.println(error); + } + }); + + builder.callback(new Callback() { + @Override public void success(Message message) { + System.out.println("Uploaded " + message); + } + + @Override public void failure(Message message, Throwable throwable) { + System.out.println("Could not upload " + message); + System.out.println(throwable); + } + }); + } +} \ No newline at end of file diff --git a/src/Java/gtPlusPlus/api/analytics/BlockingFlush.java b/src/Java/gtPlusPlus/api/analytics/BlockingFlush.java new file mode 100644 index 0000000000..7dbf9cba06 --- /dev/null +++ b/src/Java/gtPlusPlus/api/analytics/BlockingFlush.java @@ -0,0 +1,67 @@ +package gtPlusPlus.api.analytics; + +import com.segment.analytics.Analytics; +import com.segment.analytics.Callback; +import com.segment.analytics.MessageTransformer; +import com.segment.analytics.Plugin; +import com.segment.analytics.messages.Message; +import com.segment.analytics.messages.MessageBuilder; +import java.util.concurrent.Phaser; + +/** + * The {@link Analytics} class doesn't come with a blocking {@link Analytics#flush()} implementation + * out of the box. It's trivial to build one using a {@link Phaser} that monitors requests and is + * able to block until they're uploaded. + * + *

+ * BlockingFlush blockingFlush = BlockingFlush.create();
+ * Analytics analytics = Analytics.builder(writeKey)
+ *      .plugin(blockingFlush)
+ *      .build();
+ *
+ * // Do some work.
+ *
+ * analytics.flush(); // Trigger a flush.
+ * blockingFlush.block(); // Block until the flush completes.
+ * analytics.shutdown(); // Shut down after the flush is complete.
+ * 
+ */ +public class BlockingFlush { + + public static BlockingFlush create() { + return new BlockingFlush(); + } + + BlockingFlush() { + this.phaser = new Phaser(1); + } + + final Phaser phaser; + + public Plugin plugin() { + return new Plugin() { + @Override public void configure(Analytics.Builder builder) { + builder.messageTransformer(new MessageTransformer() { + @Override public boolean transform(MessageBuilder builder) { + phaser.register(); + return true; + } + }); + + builder.callback(new Callback() { + @Override public void success(Message message) { + phaser.arrive(); + } + + @Override public void failure(Message message, Throwable throwable) { + phaser.arrive(); + } + }); + } + }; + } + + public void block() { + phaser.arriveAndAwaitAdvance(); + } +} \ No newline at end of file -- cgit