From c8319d6369ce372c87a4e9224cc4c40e2db17374 Mon Sep 17 00:00:00 2001 From: Mark Milligan Date: Fri, 29 Apr 2022 14:59:56 -0500 Subject: [PATCH] Migrating from from wiringpi to pigpio. This increases the sample rate by a factor of 3 and will allow creation of a board that can monitor over 30 breakers with a single raspberry pi. This is based on pi4j 2.0 which is in a beta status. I have fixed a few bugs in a local version of pi4j 2.0 to get it to work but I haven't submitted those changes to pi4j yet. This change requires a migration to Java 11 and will *NOT* be backwards compatible. Upgrading to this hub software will require that java 11 and pigpio be installed on the hub. This can be done from an ssh session with the following commands: apt-get update apt-get install openjdk-11-jre-headless apt-get install pigpio Alternatively, you can download a new sd image, reflash your sd card, and re-adopt your hub. --- .../lantern-config-currentmonitor/pom.xml | 20 ++-- currentmonitor/lantern-currentmonitor/pom.xml | 29 +++-- .../currentmonitor/BreakerSamples.java | 29 +++-- .../currentmonitor/CurrentMonitor.java | 111 +++++++----------- .../currentmonitor/MonitorApp.java | 52 ++++---- .../currentmonitor/MonitorConfig.java | 7 +- .../currentmonitor/adc/MCP3008.java | 36 ++++++ .../currentmonitor/adc/MCP3008Pin.java | 15 +++ .../src/main/resources/logback.xml | 1 + .../lantern-dataaccess-currentmonitor/pom.xml | 22 ++-- .../currentmonitor/CurrentMonitorDao.java | 1 + .../MongoCurrentMonitorDao.java | 20 +++- .../lantern-datamodel-currentmonitor/pom.xml | 18 +-- .../datamodel/currentmonitor/BreakerHub.java | 2 +- .../currentmonitor/EmailCredentials.java | 52 ++++++++ .../currentmonitor/EmailProvider.java | 6 + .../HubConfigCharacteristic.java | 2 +- .../currentmonitor/NetworkStatus.java | 4 + .../dao/EmailCredentialsSerializer.java | 48 ++++++++ ...om.lanternsoftware.util.dao.IDaoSerializer | 1 + .../lantern-service-currentmonitor/pom.xml | 31 +++-- .../currentmonitor/email/IEmailProvider.java | 7 ++ .../currentmonitor/email/MailJetProvider.java | 36 ++++++ .../email/SendGridProvider.java | 26 ++++ .../servlet/ResetPasswordServlet.java | 39 ++---- .../currentmonitor/util/GoogleAuthHelper.java | 2 +- currentmonitor/pom.xml | 11 +- pom.xml | 9 +- rules/lantern-dataaccess-rules/pom.xml | 18 +-- rules/lantern-datamodel-rules/pom.xml | 16 +-- rules/lantern-service-rules/pom.xml | 20 ++-- rules/pom.xml | 13 +- util/lantern-util-common/pom.xml | 12 +- util/lantern-util-dao-ephemeral/pom.xml | 12 +- .../util/dao/ephemeral/EphemeralProxy.java | 85 ++++++-------- util/lantern-util-dao-mongo/pom.xml | 12 +- util/lantern-util-dao/pom.xml | 12 +- .../util/dao/AbstractDaoProxy.java | 57 ++++----- .../util/dao/jdbc/JdbcProxy.java | 2 +- util/lantern-util-excel/pom.xml | 11 +- util/lantern-util-http/pom.xml | 12 +- util/lantern-util-servlet/pom.xml | 12 +- util/pom.xml | 11 +- zwave/lantern-datamodel-zwave/pom.xml | 16 +-- zwave/lantern-service-thermometer/pom.xml | 16 +-- zwave/lantern-service-zwave/pom.xml | 26 ++-- zwave/lantern-uirt/pom.xml | 16 +-- zwave/lantern-zwave/pom.xml | 16 +-- .../zwave/message/MessageEngine.java | 4 +- zwave/pom.xml | 13 +- 50 files changed, 637 insertions(+), 412 deletions(-) create mode 100644 currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008.java create mode 100644 currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008Pin.java create mode 100644 currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailCredentials.java create mode 100644 currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailProvider.java create mode 100644 currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/EmailCredentialsSerializer.java create mode 100644 currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/IEmailProvider.java create mode 100644 currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/MailJetProvider.java create mode 100644 currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/SendGridProvider.java diff --git a/currentmonitor/lantern-config-currentmonitor/pom.xml b/currentmonitor/lantern-config-currentmonitor/pom.xml index 66d3f95..81bd20f 100644 --- a/currentmonitor/lantern-config-currentmonitor/pom.xml +++ b/currentmonitor/lantern-config-currentmonitor/pom.xml @@ -1,15 +1,15 @@ 4.0.0 - com.lanternsoftware.currentmonitor lantern-config-currentmonitor jar - 1.0.0 + 1.1.0 lantern-config-currentmonitor - - 1.8 - 1.8 - + + com.lanternsoftware.currentmonitor + currentmonitor + 1.1.0 + @@ -25,12 +25,12 @@ com.lanternsoftware.util lantern-util-dao-mongo - 1.0.0 + ${util.version} com.lanternsoftware.util lantern-util-common - 1.0.0 + ${util.version} @@ -56,8 +56,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/currentmonitor/lantern-currentmonitor/pom.xml b/currentmonitor/lantern-currentmonitor/pom.xml index e2b3ff7..165c501 100644 --- a/currentmonitor/lantern-currentmonitor/pom.xml +++ b/currentmonitor/lantern-currentmonitor/pom.xml @@ -1,15 +1,15 @@ 4.0.0 - com.lanternsoftware.currentmonitor lantern-currentmonitor jar - 1.0.7 + 1.1.0 lantern-currentmonitor - - 1.8 - 1.8 - + + com.lanternsoftware.currentmonitor + currentmonitor + 1.1.0 + @@ -24,8 +24,13 @@ com.pi4j - pi4j-gpio-extension - 1.3 + pi4j-core + 2.2.0-SNAPSHOT + + + com.pi4j + pi4j-plugin-pigpio + 2.2.0-SNAPSHOT com.github.hypfvieh @@ -35,12 +40,12 @@ com.lanternsoftware.currentmonitor lantern-datamodel-currentmonitor - 1.0.0 + ${cm.version} com.lanternsoftware.util lantern-util-http - 1.0.0 + ${util.version} org.eclipse.paho @@ -71,8 +76,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/BreakerSamples.java b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/BreakerSamples.java index 8b171e4..aa9d46a 100644 --- a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/BreakerSamples.java +++ b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/BreakerSamples.java @@ -1,18 +1,19 @@ package com.lanternsoftware.currentmonitor; +import com.lanternsoftware.currentmonitor.adc.MCP3008Pin; import com.lanternsoftware.datamodel.currentmonitor.Breaker; -import com.pi4j.io.gpio.GpioPinAnalogInput; import java.util.List; public class BreakerSamples { private final Breaker breaker; - private final GpioPinAnalogInput voltagePin; - private final GpioPinAnalogInput currentPin; + private final MCP3008Pin voltagePin; + private final MCP3008Pin currentPin; private final List samples; + private int cycleCnt; private int sampleCnt; - public BreakerSamples(Breaker _breaker, GpioPinAnalogInput _voltagePin, GpioPinAnalogInput _currentPin, List _samples) { + public BreakerSamples(Breaker _breaker, MCP3008Pin _voltagePin, MCP3008Pin _currentPin, List _samples) { breaker = _breaker; voltagePin = _voltagePin; currentPin = _currentPin; @@ -23,11 +24,11 @@ public class BreakerSamples { return breaker; } - public GpioPinAnalogInput getVoltagePin() { + public MCP3008Pin getVoltagePin() { return voltagePin; } - public GpioPinAnalogInput getCurrentPin() { + public MCP3008Pin getCurrentPin() { return currentPin; } @@ -35,8 +36,20 @@ public class BreakerSamples { return samples; } - public PowerSample getSample(int _sample) { - return samples.get(_sample); + public void incrementCycleCnt() { + cycleCnt++; + } + + public PowerSample incrementSample() { + return samples.get(sampleCnt++); + } + + public int getCycleCnt() { + return cycleCnt; + } + + public void setCycleCnt(int _cycleCnt) { + cycleCnt = _cycleCnt; } public int getSampleCnt() { diff --git a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java index 21cfba6..07c0c76 100644 --- a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java +++ b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java @@ -1,23 +1,20 @@ package com.lanternsoftware.currentmonitor; +import com.lanternsoftware.currentmonitor.adc.MCP3008; +import com.lanternsoftware.currentmonitor.adc.MCP3008Pin; import com.lanternsoftware.datamodel.currentmonitor.Breaker; import com.lanternsoftware.datamodel.currentmonitor.BreakerHub; import com.lanternsoftware.datamodel.currentmonitor.BreakerPolarity; import com.lanternsoftware.datamodel.currentmonitor.BreakerPower; import com.lanternsoftware.util.CollectionUtils; import com.lanternsoftware.util.concurrency.ConcurrencyUtils; -import com.pi4j.gpio.extension.base.AdcGpioProvider; -import com.pi4j.gpio.extension.mcp.MCP3008GpioProvider; -import com.pi4j.gpio.extension.mcp.MCP3008Pin; -import com.pi4j.io.gpio.GpioController; -import com.pi4j.io.gpio.GpioFactory; -import com.pi4j.io.gpio.GpioPinAnalogInput; -import com.pi4j.io.spi.SpiChannel; -import com.pi4j.io.spi.SpiDevice; +import com.pi4j.Pi4J; +import com.pi4j.context.Context; +import com.pi4j.io.spi.Spi; +import com.pi4j.io.spi.SpiMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; @@ -30,22 +27,15 @@ import java.util.concurrent.Executors; public class CurrentMonitor { private static final Logger LOG = LoggerFactory.getLogger(CurrentMonitor.class); private static final int BATCH_CNT = 4; - private GpioController gpio; private final ExecutorService executor = Executors.newCachedThreadPool(); - private final Map chips = new HashMap<>(); - private final Map pins = new HashMap<>(); + private Context pi4j; + private final Map chips = new HashMap<>(); private Sampler sampler; private PowerListener listener; private boolean debug = false; public void start() { - try { - gpio = GpioFactory.getInstance(); - LOG.info("Current Monitor Started"); - } - catch (Throwable t) { - LOG.info("Failed to get gpio factory", t); - } + pi4j = Pi4J.newAutoContext(); } public void stop() { @@ -53,9 +43,12 @@ public class CurrentMonitor { ConcurrencyUtils.sleep(1000); executor.shutdown(); ConcurrencyUtils.sleep(1000); + for (MCP3008 mcp : chips.values()) { + mcp.shutdown(pi4j); + } + ConcurrencyUtils.sleep(1000); + pi4j.shutdown(); chips.clear(); - pins.clear(); - gpio.shutdown(); LOG.info("Power Monitor Service Stopped"); } @@ -64,10 +57,9 @@ public class CurrentMonitor { } public CalibrationResult calibrateVoltage(double _curCalibration) { - GpioPinAnalogInput voltagePin = getPin(0, 0); - if (voltagePin == null) - return null; - int maxSamples = 120000; + LOG.info("Calibrating Voltage"); + MCP3008Pin voltagePin = new MCP3008Pin(getChip(0), 0); + int maxSamples = 240000; CalibrationSample[] samples = new CalibrationSample[maxSamples]; int offset = 0; for (;offset < maxSamples; offset++) { @@ -77,7 +69,7 @@ public class CurrentMonitor { long intervalEnd = System.nanoTime() + 2000000000L; //Scan voltage for 2 seconds while (offset < maxSamples) { samples[offset].time = System.nanoTime(); - samples[offset].voltage = voltagePin.getValue(); + samples[offset].voltage = voltagePin.read(); offset++; if (samples[offset-1].time > intervalEnd) break; @@ -128,10 +120,12 @@ public class CurrentMonitor { stopMonitoring(); listener = _listener; List validBreakers = CollectionUtils.filter(_breakers, _b -> _b.getPort() > 0 && _b.getPort() < 16); - if (CollectionUtils.isEmpty(validBreakers)) + if (CollectionUtils.isEmpty(validBreakers)) { + LOG.error("No breakers found for hub number {}", _hub.getHub()); return; + } LOG.info("Monitoring {} breakers for hub {}", CollectionUtils.size(validBreakers), _hub.getHub()); - sampler = new Sampler(_hub, validBreakers, _intervalMs, 2); + sampler = new Sampler(_hub, validBreakers, _intervalMs, 5); LOG.info("Starting to monitor ports {}", CollectionUtils.transformToCommaSeparated(validBreakers, _b -> String.valueOf(_b.getPort()))); executor.submit(sampler); } @@ -140,34 +134,17 @@ public class CurrentMonitor { } } - private GpioPinAnalogInput getPin(int _chip, int _pin) { - GpioPinAnalogInput pin; - synchronized (pins) { - AdcGpioProvider chip = chips.get(_chip); - if (chip == null) { - SpiChannel channel = SpiChannel.getByNumber(_chip); - if (channel == null) - return null; - try { - chip = new MCP3008GpioProvider(channel, 1250000, SpiDevice.DEFAULT_SPI_MODE, false); - chips.put(_chip, chip); - } catch (IOException _e) { - LOG.error("Failed to connect to chip {}", _chip, _e); - return null; - } - } - int pinKey = pinKey(_chip, _pin); - pin = pins.get(pinKey); - if (pin == null) { - pin = gpio.provisionAnalogInputPin(chip, MCP3008Pin.ALL[_pin], String.valueOf(pinKey)); - pins.put(pinKey, pin); - } + private synchronized MCP3008 getChip(int _chip) { + MCP3008 chip = chips.get(_chip); + if (chip == null) { + String id = "SPI" + _chip; + LOG.info("Creating chip {}", id); + Spi spi = pi4j.create(Spi.newConfigBuilder(pi4j).mode(SpiMode.MODE_0).id(id).name("MCP3008_" + _chip).address(_chip).baud(810000).build()); + LOG.info("is open {}", spi.isOpen()); + chip = new MCP3008(spi); + chips.put(_chip, chip); } - return pin; - } - - private Integer pinKey(int _chip, int _pin) { - return (_chip*8)+_pin; + return chip; } public void submit(Runnable _runnable) { @@ -190,14 +167,14 @@ public class CurrentMonitor { public Sampler(BreakerHub _hub, List _breakers, int _intervalMs, int _concurrentBreakerCnt) { hub = _hub; - GpioPinAnalogInput voltagePin = getPin(0, 0); + MCP3008Pin voltagePin = new MCP3008Pin(getChip(0), 0); breakers = CollectionUtils.transform(_breakers, _b->{ LOG.info("Getting Chip {}, Pin {} for port {}", _b.getChip(), _b.getPin(), _b.getPort()); - GpioPinAnalogInput currentPin = getPin(_b.getChip(), _b.getPin()); + MCP3008Pin currentPin = new MCP3008Pin(getChip(_b.getChip()), _b.getPin()); List batches = new ArrayList<>(BATCH_CNT); for (int i=0; i samples = new ArrayList<>(30000/_breakers.size()); - for (int j=0; j<30000/_breakers.size(); j++) { + for (int j=0; j<60000/_breakers.size(); j++) { samples.add(new PowerSample()); } batches.add(new BreakerSamples(_b, voltagePin, currentPin, samples)); @@ -213,6 +190,7 @@ public class CurrentMonitor { long start = System.nanoTime(); long interval = 0; int cycle; + int curBreaker; BreakerSamples[] cycleBreakers = new BreakerSamples[concurrentBreakerCnt]; try { while (true) { @@ -227,22 +205,18 @@ public class CurrentMonitor { long intervalEnd = intervalStart + intervalNs; cycle = 0; final int batch = (int) (interval % BATCH_CNT); - int curBreaker; - for (curBreaker = 0; curBreaker < breakers.size(); curBreaker++) { - breakers.get(curBreaker).get(batch).setSampleCnt(0); - } while (System.nanoTime() < intervalEnd) { for (curBreaker = 0; curBreaker < concurrentBreakerCnt; curBreaker++) { cycleBreakers[curBreaker] = breakers.get(((cycle * concurrentBreakerCnt) + curBreaker) % breakers.size()).get(batch); + cycleBreakers[curBreaker].incrementCycleCnt(); } cycle++; long cycleEnd = intervalStart + (cycle * (intervalNs / hub.getFrequency())); while (System.nanoTime() < cycleEnd) { for (curBreaker = 0; curBreaker < concurrentBreakerCnt; curBreaker++) { - PowerSample sample = cycleBreakers[curBreaker].getSample(cycleBreakers[curBreaker].getSampleCnt()); - sample.voltage = cycleBreakers[curBreaker].getVoltagePin().getValue(); - sample.current = cycleBreakers[curBreaker].getCurrentPin().getValue(); - cycleBreakers[curBreaker].setSampleCnt(cycleBreakers[curBreaker].getSampleCnt()+1); + PowerSample sample = cycleBreakers[curBreaker].incrementSample(); + sample.voltage = cycleBreakers[curBreaker].getVoltagePin().read(); + sample.current = cycleBreakers[curBreaker].getCurrentPin().read(); } } } @@ -284,10 +258,11 @@ public class CurrentMonitor { if (debug) { synchronized (CurrentMonitor.this) { LOG.info("===========================Start Port {}", samples.getBreaker().getPort()); + LOG.info("Cycles: {}", samples.getCycleCnt()); LOG.info("Samples: {}", samples.getSampleCnt()); LOG.info("vMin: {}, vMax: {}, vOffset: {}", String.format("%.3f", CollectionUtils.getSmallest(validSamples, Comparator.comparing(_v -> _v.voltage)).voltage), String.format("%.3f", CollectionUtils.getLargest(validSamples, Comparator.comparing(_v -> _v.voltage)).voltage), String.format("%.3f", vOffset)); LOG.info("iMin: {}, iMax: {}, iOffset: {}", String.format("%.3f", CollectionUtils.getSmallest(validSamples, Comparator.comparing(_v -> _v.current)).current), String.format("%.3f", CollectionUtils.getLargest(validSamples, Comparator.comparing(_v -> _v.current)).current), String.format("%.3f", iOffset)); - double iRms = samples.getBreaker().getFinalCalibrationFactor() * Math.sqrt(CollectionUtils.mean(CollectionUtils.transform(validSamples, _p -> _p.current * _p.current))); + double iRms = hub.getPortCalibrationFactor() * samples.getBreaker().getFinalCalibrationFactor() * Math.sqrt(CollectionUtils.mean(CollectionUtils.transform(validSamples, _p -> _p.current * _p.current))); LOG.info("vRms: {}", String.format("%.3f", vRms)); LOG.info("iRms: {}", String.format("%.3f", iRms)); double apparentPower = vRms * iRms; @@ -298,6 +273,8 @@ public class CurrentMonitor { LOG.info("===========================End Port {}", samples.getBreaker().getPort()); } } + samples.setSampleCnt(0); + samples.setCycleCnt(0); listener.onPowerEvent(new BreakerPower(samples.getBreaker().getPanel(), samples.getBreaker().getSpace(), readTime, realPower, vRms)); } }); diff --git a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorApp.java b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorApp.java index ee63210..caa717e 100644 --- a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorApp.java +++ b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorApp.java @@ -35,12 +35,9 @@ import org.apache.http.entity.ContentType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.BufferedReader; -import java.io.Console; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.net.URL; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -210,8 +207,8 @@ public class MonitorApp { version = getVersionNumber(); config = DaoSerializer.parse(ResourceLoader.loadFileAsString(WORKING_DIR + "config.json"), MonitorConfig.class); if (config == null) { - LOG.error("Failed to load config file from {}", WORKING_DIR + "config.json"); - return; + config = new MonitorConfig(); + ResourceLoader.writeFile(WORKING_DIR + "config.json", DaoSerializer.toJson(config)); } pool = new HttpPool(10, 10, config.getSocketTimeout(), config.getConnectTimeout(), config.getSocketTimeout()); if (NullUtils.isNotEmpty(config.getHost())) @@ -219,8 +216,6 @@ public class MonitorApp { monitor.setDebug(config.isDebug()); monitor.start(); LEDFlasher.setLEDOn(false); - bluetoothConfig = new BluetoothConfig("Lantern Hub", bluetoothListener); - bluetoothConfig.start(); if (NullUtils.isNotEmpty(config.getAuthCode())) authCode = config.getAuthCode(); else if (NullUtils.isNotEmpty(host) && NullUtils.isNotEmpty(config.getUsername()) && NullUtils.isNotEmpty(config.getPassword())) { @@ -231,7 +226,8 @@ public class MonitorApp { if (NullUtils.isNotEmpty(config.getMqttBrokerUrl())) mqttPoster = new MqttPoster(config); if (NullUtils.isNotEmpty(host) && NullUtils.isNotEmpty(authCode)) { - while (true) { + int configAttempts = 0; + while (configAttempts < 5) { HttpGet get = new HttpGet(host + "config"); get.addHeader("auth_code", authCode); breakerConfig = DaoSerializer.parse(pool.executeToString(get), BreakerConfig.class); @@ -239,8 +235,11 @@ public class MonitorApp { break; LOG.error("Failed to load breaker config. Retrying in 5 seconds..."); ConcurrencyUtils.sleep(5000); + configAttempts++; } } + bluetoothConfig = new BluetoothConfig("Lantern Hub", bluetoothListener); + bluetoothConfig.start(); if ((mqttPoster != null) && (breakerConfig == null)) { LOG.info("Hub not configured by a Lantern Power Monitor server, defaulting to MQTT mode only"); BreakerHub hub = new BreakerHub(); @@ -266,13 +265,18 @@ public class MonitorApp { BreakerHub hub = breakerConfig.getHub(config.getHub()); if (hub != null) { if (config.isNeedsCalibration()) { - CalibrationResult cal = monitor.calibrateVoltage(hub.getVoltageCalibrationFactor()); - if (cal != null) { - hub.setVoltageCalibrationFactor(cal.getVoltageCalibrationFactor()); - hub.setFrequency(cal.getFrequency()); - config.setNeedsCalibration(false); - ResourceLoader.writeFile(WORKING_DIR + "config.json", DaoSerializer.toJson(config)); - post(DaoSerializer.toZipBson(breakerConfig), "config"); + try { + CalibrationResult cal = monitor.calibrateVoltage(hub.getVoltageCalibrationFactor()); + if (cal != null) { + hub.setVoltageCalibrationFactor(cal.getVoltageCalibrationFactor()); + hub.setFrequency(cal.getFrequency()); + config.setNeedsCalibration(false); + ResourceLoader.writeFile(WORKING_DIR + "config.json", DaoSerializer.toJson(config)); + post(DaoSerializer.toZipBson(breakerConfig), "config"); + } + } + catch (Throwable t) { + LOG.error("Exception trying to read from voltage pin", t); } } List breakers = breakerConfig.getBreakersForHub(config.getHub()); @@ -288,18 +292,10 @@ public class MonitorApp { monitor.stop(); pool.shutdown(); }, "Monitor Shutdown")); - Console c = System.console(); - BufferedReader reader = (c == null)?new BufferedReader(new InputStreamReader(System.in)):null; - while (running.get()) { - try { - String command = c != null ? c.readLine() : reader.readLine(); - if (NullUtils.isEqual("exit", command)) - break; - } - catch (Exception _e) { - LOG.error("Exception while reading from console input", _e); - break; - } + try { + monitor.wait(); + } catch (InterruptedException _e) { + LOG.error("Interrupted, shutting down", _e); } } @@ -360,7 +356,7 @@ public class MonitorApp { byte[] payload = DaoSerializer.toZipBson(minutePost); if (!post(payload, "power/hub")) { LOG.info("Failed Posting HubPowerMinute, writing cache"); - ResourceLoader.writeFile(WORKING_DIR + "cache/" + UUID.randomUUID().toString() + ".min", payload); + ResourceLoader.writeFile(WORKING_DIR + "cache/" + UUID.randomUUID() + ".min", payload); } } if (post != null) { diff --git a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorConfig.java b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorConfig.java index f2727da..438e9b7 100644 --- a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorConfig.java +++ b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/MonitorConfig.java @@ -2,6 +2,7 @@ package com.lanternsoftware.currentmonitor; import com.lanternsoftware.datamodel.currentmonitor.Breaker; +import com.lanternsoftware.util.NullUtils; import com.lanternsoftware.util.dao.annotations.DBSerializable; import java.util.List; @@ -12,11 +13,11 @@ public class MonitorConfig { private String authCode; private String username; private String password; - private int hub; + private int hub = -1; private boolean debug; private int connectTimeout; private int socketTimeout; - private boolean needsCalibration; + private boolean needsCalibration = true; private String mqttBrokerUrl; private String mqttUserName; private String mqttPassword; @@ -34,7 +35,7 @@ public class MonitorConfig { } public String getHost() { - return host; + return NullUtils.isEmpty(host) ? "https://lanternpowermonitor.com/" : host; } public void setHost(String _host) { diff --git a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008.java b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008.java new file mode 100644 index 0000000..f42e33f --- /dev/null +++ b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008.java @@ -0,0 +1,36 @@ +package com.lanternsoftware.currentmonitor.adc; + +import com.pi4j.context.Context; +import com.pi4j.io.spi.Spi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MCP3008 { + private static final Logger LOG = LoggerFactory.getLogger(MCP3008.class); + private static final byte[][] pins = new byte[8][]; + + private final Spi spi; + private final byte[] resp = new byte[3]; + + static { + for (int p = 0; p < 8; p++) { + pins[p] = new byte[]{1,(byte)(p + 8 << 4),0}; + } + } + + public MCP3008(Spi _spi) { + spi = _spi; + } + + public void shutdown(Context _pi4j) { + spi.close(); + spi.shutdown(_pi4j); + } + + public int readPin(int _pin) { + if (spi.transfer(pins[_pin], resp) > 2) { + return ((resp[1] & 0x03) << 8) + (resp[2] & 0xFF); + } + return 0; + } +} diff --git a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008Pin.java b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008Pin.java new file mode 100644 index 0000000..26d99c7 --- /dev/null +++ b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/adc/MCP3008Pin.java @@ -0,0 +1,15 @@ +package com.lanternsoftware.currentmonitor.adc; + +public class MCP3008Pin { + private final MCP3008 chip; + private final int pin; + + public MCP3008Pin(MCP3008 _chip, int _pin) { + chip = _chip; + pin = _pin; + } + + public int read() { + return chip.readPin(pin); + } +} diff --git a/currentmonitor/lantern-currentmonitor/src/main/resources/logback.xml b/currentmonitor/lantern-currentmonitor/src/main/resources/logback.xml index 939eaaa..b4a0684 100644 --- a/currentmonitor/lantern-currentmonitor/src/main/resources/logback.xml +++ b/currentmonitor/lantern-currentmonitor/src/main/resources/logback.xml @@ -21,6 +21,7 @@ + diff --git a/currentmonitor/lantern-dataaccess-currentmonitor/pom.xml b/currentmonitor/lantern-dataaccess-currentmonitor/pom.xml index 80a13dc..db45edc 100644 --- a/currentmonitor/lantern-dataaccess-currentmonitor/pom.xml +++ b/currentmonitor/lantern-dataaccess-currentmonitor/pom.xml @@ -1,31 +1,31 @@ 4.0.0 - com.lanternsoftware.currentmonitor lantern-dataaccess-currentmonitor jar - 1.0.0 + 1.1.0 lantern-dataaccess-currentmonitor - - 1.8 - 1.8 - + + com.lanternsoftware.currentmonitor + currentmonitor + 1.1.0 + com.lanternsoftware.currentmonitor lantern-datamodel-currentmonitor - 1.0.0 + ${cm.version} com.lanternsoftware.rules lantern-datamodel-rules - 1.0.0 + ${rules.version} com.lanternsoftware.util lantern-util-dao-mongo - 1.0.0 + ${util.version} org.mindrot @@ -56,8 +56,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/CurrentMonitorDao.java b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/CurrentMonitorDao.java index 7f60be1..e2a60f3 100644 --- a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/CurrentMonitorDao.java +++ b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/CurrentMonitorDao.java @@ -54,6 +54,7 @@ public interface CurrentMonitorDao { String getAuthCodeForEmail(String _email, TimeZone _tz); Account authCodeToAccount(String _authCode); AuthCode decryptAuthCode(String _authCode); + String exchangeAuthCode(String _authCode, int _acctId); Account putAccount(Account _account); Account getAccount(int _accountId); diff --git a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java index 473997d..cfa1bc3 100644 --- a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java +++ b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java @@ -90,6 +90,9 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { updateEnergySummaries(minute); } proxy.delete(DirtyMinute.class, new DaoQuery()); + if (!proxy.exists(Sequence.class, null)) { + proxy.save(new Sequence()); + } } public void shutdown() { @@ -303,7 +306,7 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { TimeZone tz = getTimeZoneForAccount(_accountId); Date month = DateUtils.getStartOfMonth(range.getStart(), tz); Date end = DateUtils.getEndOfMonth(range.getEnd(), tz); - while (month.before(end)) { + while ((month != null) && month.before(end)) { statuses.computeIfAbsent(month, _m->new ArchiveStatus(_accountId, _m, 0)); month = DateUtils.addMonths(month, 1, tz); } @@ -326,6 +329,8 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { TimeZone tz = getTimeZoneForAccount(_minute.getAccountId()); BreakerConfig config = getConfig(_minute.getAccountId()); BreakerGroup group = CollectionUtils.getFirst(config.getBreakerGroups()); + if (group == null) + return; Date day = DateUtils.getMidnightBefore(_minute.getMinuteAsDate(), tz); DebugTimer t2 = new DebugTimer("Updating energy", logger); EnergySummary energy = getEnergySummary(_minute.getAccountId(), group.getId(), EnergyViewMode.DAY, day); @@ -412,13 +417,13 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { putEnergySummary(summary); } - private void updateChargeSummary(BreakerConfig _config, EnergySummary _energySummary, TimeZone _tz) { + public void updateChargeSummary(BreakerConfig _config, EnergySummary _energySummary, TimeZone _tz) { Date lookback = null; for (BillingPlan p : CollectionUtils.makeNotNull(_config.getBillingPlans())) { Date cycleStart = p.getBillingCycleStart(_energySummary.getStart(), _tz); if (cycleStart.after(_energySummary.getStart())) cycleStart = DateUtils.addMonths(cycleStart, -1, _tz); - if ((lookback == null) || cycleStart.before(lookback)) + if ((lookback == null) || ((cycleStart != null) && cycleStart.before(lookback))) lookback = cycleStart; } if (lookback != null) { @@ -462,7 +467,7 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { Date yearMonthStart = yearStart; Set monthSummaryIds = new HashSet<>(); Date loopEnd = DateUtils.addDays(yearEnd, 1, _tz); - while (yearMonthStart.before(loopEnd)) { + while ((yearMonthStart != null) && yearMonthStart.before(loopEnd)) { Date billingStart = plan.getBillingCycleStart(yearMonthStart, _tz); if (DateUtils.isBetween(billingStart, yearStart, yearEnd)) monthSummaryIds.add(ChargeSummary.toId(rootGroup.getAccountId(), plan.getPlanId(), rootGroup.getId(), EnergyViewMode.MONTH, billingStart)); @@ -691,6 +696,11 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { return (account == null)?null:toAuthCode(account.getId(), account.getAuxiliaryAccountIds()); } + @Override + public String exchangeAuthCode(String _authCode, int _acctId) { + return null; + } + public String toAuthCode(int _acctId, List _auxAcctIds) { if (_acctId < 1) return null; @@ -777,6 +787,8 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { if (entity == null) return false; Account acct = getAccountByUsername(aes.decryptFromBase64ToString(_key)); + if (acct == null) + return false; acct.setPassword(_password); putAccount(acct); proxy.delete("password_reset", new DaoQuery("_id", _key)); diff --git a/currentmonitor/lantern-datamodel-currentmonitor/pom.xml b/currentmonitor/lantern-datamodel-currentmonitor/pom.xml index cf72be0..ebad97b 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/pom.xml +++ b/currentmonitor/lantern-datamodel-currentmonitor/pom.xml @@ -1,21 +1,21 @@ 4.0.0 - com.lanternsoftware.currentmonitor lantern-datamodel-currentmonitor jar - 1.0.0 + 1.1.0 lantern-datamodel-currentmonitor - - 1.8 - 1.8 - + + com.lanternsoftware.currentmonitor + currentmonitor + 1.1.0 + com.lanternsoftware.util lantern-util-dao - 1.0.0 + ${util.version} @@ -41,8 +41,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerHub.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerHub.java index d54251b..09b5ab2 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerHub.java +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerHub.java @@ -39,7 +39,7 @@ public class BreakerHub implements IIdentical { } public double getPortCalibrationFactor() { - return portCalibrationFactor == 0.0?1.25:portCalibrationFactor; + return portCalibrationFactor == 0.0?1.20:portCalibrationFactor; } public void setPortCalibrationFactor(double _portCalibrationFactor) { diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailCredentials.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailCredentials.java new file mode 100644 index 0000000..c7c1ce8 --- /dev/null +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailCredentials.java @@ -0,0 +1,52 @@ +package com.lanternsoftware.datamodel.currentmonitor; + +import com.lanternsoftware.util.dao.annotations.DBSerializable; + +@DBSerializable +public class EmailCredentials { + private EmailProvider provider; + private String apiKey; + private String apiSecret; + private String emailFrom; + private String serverUrlBase; + + public EmailProvider getProvider() { + return provider; + } + + public void setProvider(EmailProvider _provider) { + provider = _provider; + } + + public String getApiKey() { + return apiKey; + } + + public void setApiKey(String _apiKey) { + apiKey = _apiKey; + } + + public String getApiSecret() { + return apiSecret; + } + + public void setApiSecret(String _apiSecret) { + apiSecret = _apiSecret; + } + + public String getEmailFrom() { + return emailFrom; + } + + public void setEmailFrom(String _emailFrom) { + emailFrom = _emailFrom; + } + + public String getServerUrlBase() { + return serverUrlBase; + } + + public void setServerUrlBase(String _serverUrlBase) { + serverUrlBase = _serverUrlBase; + } +} diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailProvider.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailProvider.java new file mode 100644 index 0000000..2718c84 --- /dev/null +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/EmailProvider.java @@ -0,0 +1,6 @@ +package com.lanternsoftware.datamodel.currentmonitor; + +public enum EmailProvider { + SENDGRID, + MAILJET +} diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/HubConfigCharacteristic.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/HubConfigCharacteristic.java index 221b5c4..b7989f1 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/HubConfigCharacteristic.java +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/HubConfigCharacteristic.java @@ -21,7 +21,7 @@ public enum HubConfigCharacteristic { Shutdown(13, CharacteristicFlag.WRITE), Version(14, CharacteristicFlag.READ), Update(15, CharacteristicFlag.WRITE), - ReloadConfig(15, CharacteristicFlag.WRITE); + ReloadConfig(16, CharacteristicFlag.WRITE); public final int idx; public final UUID uuid; diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/NetworkStatus.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/NetworkStatus.java index 34a497b..b200947 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/NetworkStatus.java +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/NetworkStatus.java @@ -36,6 +36,10 @@ public class NetworkStatus { pingSuccessful = _pingSuccessful; } + public boolean isNetworkConnected() { + return isWifiConnected() || isEthernetConnected(); + } + public boolean isWifiConnected() { return CollectionUtils.isNotEmpty(wifiIPs); } diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/EmailCredentialsSerializer.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/EmailCredentialsSerializer.java new file mode 100644 index 0000000..aa02a5e --- /dev/null +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/EmailCredentialsSerializer.java @@ -0,0 +1,48 @@ +package com.lanternsoftware.datamodel.currentmonitor.dao; + +import com.lanternsoftware.datamodel.currentmonitor.EmailCredentials; +import com.lanternsoftware.datamodel.currentmonitor.EmailProvider; +import com.lanternsoftware.util.dao.AbstractDaoSerializer; +import com.lanternsoftware.util.dao.DaoEntity; +import com.lanternsoftware.util.dao.DaoProxyType; +import com.lanternsoftware.util.dao.DaoSerializer; +import java.util.Collections; +import java.util.List; + +public class EmailCredentialsSerializer extends AbstractDaoSerializer +{ + @Override + public Class getSupportedClass() + { + return EmailCredentials.class; + } + + @Override + public List getSupportedProxies() { + return Collections.singletonList(DaoProxyType.MONGO); + } + + @Override + public DaoEntity toDaoEntity(EmailCredentials _o) + { + DaoEntity d = new DaoEntity(); + d.put("provider", DaoSerializer.toEnumName(_o.getProvider())); + d.put("api_key", _o.getApiKey()); + d.put("api_secret", _o.getApiSecret()); + d.put("email_from", _o.getEmailFrom()); + d.put("server_url_base", _o.getServerUrlBase()); + return d; + } + + @Override + public EmailCredentials fromDaoEntity(DaoEntity _d) + { + EmailCredentials o = new EmailCredentials(); + o.setProvider(DaoSerializer.getEnum(_d, "provider", EmailProvider.class)); + o.setApiKey(DaoSerializer.getString(_d, "api_key")); + o.setApiSecret(DaoSerializer.getString(_d, "api_secret")); + o.setEmailFrom(DaoSerializer.getString(_d, "email_from")); + o.setServerUrlBase(DaoSerializer.getString(_d, "server_url_base")); + return o; + } +} \ No newline at end of file diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/resources/META-INF/services/com.lanternsoftware.util.dao.IDaoSerializer b/currentmonitor/lantern-datamodel-currentmonitor/src/main/resources/META-INF/services/com.lanternsoftware.util.dao.IDaoSerializer index c3d0dd6..96fc8ac 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/resources/META-INF/services/com.lanternsoftware.util.dao.IDaoSerializer +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/resources/META-INF/services/com.lanternsoftware.util.dao.IDaoSerializer @@ -15,6 +15,7 @@ com.lanternsoftware.datamodel.currentmonitor.dao.BreakerPowerSerializer com.lanternsoftware.datamodel.currentmonitor.dao.BreakerSerializer com.lanternsoftware.datamodel.currentmonitor.dao.ChargeSummarySerializer com.lanternsoftware.datamodel.currentmonitor.dao.ChargeTotalSerializer +com.lanternsoftware.datamodel.currentmonitor.dao.EmailCredentialsSerializer com.lanternsoftware.datamodel.currentmonitor.dao.EnergyBlockSerializer com.lanternsoftware.datamodel.currentmonitor.dao.EnergySummarySerializer com.lanternsoftware.datamodel.currentmonitor.dao.EnergyTotalSerializer diff --git a/currentmonitor/lantern-service-currentmonitor/pom.xml b/currentmonitor/lantern-service-currentmonitor/pom.xml index 550fa94..5661be9 100644 --- a/currentmonitor/lantern-service-currentmonitor/pom.xml +++ b/currentmonitor/lantern-service-currentmonitor/pom.xml @@ -1,16 +1,15 @@ - + 4.0.0 - com.lanternsoftware.currentmonitor lantern-service-currentmonitor war - 1.0.0 + 1.1.0 lantern-service-currentmonitor - - 1.8 - 1.8 - + + com.lanternsoftware.currentmonitor + currentmonitor + 1.1.0 + @@ -33,18 +32,18 @@ com.lanternsoftware.util lantern-util-servlet - 1.0.0 + ${util.version} com.lanternsoftware.util lantern-util-http - 1.0.0 + ${util.version} test com.lanternsoftware.rules lantern-service-rules - 1.0.0 + ${rules.version} com.google.api-client @@ -67,9 +66,9 @@ 1.2.3 - com.sendgrid - sendgrid-java - 4.7.2 + com.mailjet + mailjet-client + 4.2.0 @@ -95,8 +94,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/IEmailProvider.java b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/IEmailProvider.java new file mode 100644 index 0000000..310bf2a --- /dev/null +++ b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/IEmailProvider.java @@ -0,0 +1,7 @@ +package com.lanternsoftware.currentmonitor.email; + +import com.lanternsoftware.datamodel.currentmonitor.EmailCredentials; + +public interface IEmailProvider { + int sendTextEmail(EmailCredentials _credentials, String _to, String _subject, String _message); +} diff --git a/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/MailJetProvider.java b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/MailJetProvider.java new file mode 100644 index 0000000..930a80b --- /dev/null +++ b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/MailJetProvider.java @@ -0,0 +1,36 @@ +package com.lanternsoftware.currentmonitor.email; + +import com.lanternsoftware.datamodel.currentmonitor.EmailCredentials; +import com.mailjet.client.ClientOptions; +import com.mailjet.client.MailjetClient; +import com.mailjet.client.MailjetRequest; +import com.mailjet.client.MailjetResponse; +import com.mailjet.client.resource.Emailv31; +import org.json.JSONArray; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MailJetProvider implements IEmailProvider { + protected static final Logger LOG = LoggerFactory.getLogger(MailJetProvider.class); + + @Override + public int sendTextEmail(EmailCredentials _credentials, String _to, String _subject, String _message) { + MailjetClient client; + MailjetRequest request; + MailjetResponse response; + client = new MailjetClient(_credentials.getApiKey(), _credentials.getApiSecret(), new ClientOptions("v3.1")); + request = new MailjetRequest(Emailv31.resource).property(Emailv31.MESSAGES, new JSONArray().put(new JSONObject() + .put(Emailv31.Message.FROM, new JSONObject().put("Email", _credentials.getEmailFrom()).put("Name", "Lantern Power Monitor")) + .put(Emailv31.Message.TO, new JSONArray().put(new JSONObject().put("Email", _to))) + .put(Emailv31.Message.SUBJECT, _subject) + .put(Emailv31.Message.TEXTPART, _message))); + try { + response = client.post(request); + return response.getStatus(); + } catch (Exception _e) { + LOG.error("Failed to send email", _e); + return 500; + } + } +} diff --git a/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/SendGridProvider.java b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/SendGridProvider.java new file mode 100644 index 0000000..1039eb8 --- /dev/null +++ b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/email/SendGridProvider.java @@ -0,0 +1,26 @@ +package com.lanternsoftware.currentmonitor.email; + +import com.lanternsoftware.datamodel.currentmonitor.EmailCredentials; + +public class SendGridProvider implements IEmailProvider { + @Override + public int sendTextEmail(EmailCredentials _credentials, String _to, String _subject, String _message) { +/* Email to = new Email(email); + Content content = new Content("text/plain", "Reset your password using this link:\nhttps://lanternpowermonitor.com/currentmonitor/resetPassword/" + key); + Mail mail = new Mail(from, subject, to, content); + SendGrid sg = new SendGrid(api_key); + Request request = new Request(); + try { + request.setMethod(Method.POST); + request.setEndpoint("mail/send"); + request.setBody(mail.build()); + Response response = sg.api(request); + LOG.info("Password reset email status: {}\nfrom: {}\nto: {}\nkey: {}\nhost: {}", response.getStatusCode(), from.getEmail(), to.getEmail(), api_key, sg.getHost()); + zipBsonResponse(_resp, new DaoEntity("success", response.getStatusCode() == 200)); + } catch (IOException ex) { + LOG.error("Failed to send password reset email", ex); + _resp.setStatus(500); + }*/ + return 500; + } +} diff --git a/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/servlet/ResetPasswordServlet.java b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/servlet/ResetPasswordServlet.java index 7cb15e7..6499db9 100644 --- a/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/servlet/ResetPasswordServlet.java +++ b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/servlet/ResetPasswordServlet.java @@ -1,22 +1,19 @@ package com.lanternsoftware.currentmonitor.servlet; import com.lanternsoftware.currentmonitor.context.Globals; +import com.lanternsoftware.currentmonitor.email.IEmailProvider; +import com.lanternsoftware.currentmonitor.email.MailJetProvider; +import com.lanternsoftware.datamodel.currentmonitor.Account; +import com.lanternsoftware.datamodel.currentmonitor.EmailCredentials; import com.lanternsoftware.util.CollectionUtils; -import com.lanternsoftware.util.external.LanternFiles; import com.lanternsoftware.util.NullUtils; import com.lanternsoftware.util.ResourceLoader; import com.lanternsoftware.util.dao.DaoEntity; import com.lanternsoftware.util.dao.DaoSerializer; import com.lanternsoftware.util.email.EmailValidator; +import com.lanternsoftware.util.external.LanternFiles; import com.lanternsoftware.util.servlet.FreemarkerConfigUtil; import com.lanternsoftware.util.servlet.FreemarkerServlet; -import com.sendgrid.Method; -import com.sendgrid.Request; -import com.sendgrid.Response; -import com.sendgrid.SendGrid; -import com.sendgrid.helpers.mail.Mail; -import com.sendgrid.helpers.mail.objects.Content; -import com.sendgrid.helpers.mail.objects.Email; import freemarker.template.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,13 +22,13 @@ import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.MediaType; -import java.io.IOException; @WebServlet("/resetPassword/*") public class ResetPasswordServlet extends FreemarkerServlet { protected static final Logger LOG = LoggerFactory.getLogger(ResetPasswordServlet.class); protected static final Configuration CONFIG = FreemarkerConfigUtil.createConfig(ResetPasswordServlet.class, "/templates", 100); - protected static final String api_key = ResourceLoader.loadFileAsString(LanternFiles.CONFIG_PATH + "sendgrid.txt"); + protected static final EmailCredentials credentials = DaoSerializer.parse(ResourceLoader.loadFileAsString(LanternFiles.CONFIG_PATH + "email.json"), EmailCredentials.class); + protected static final IEmailProvider provider = new MailJetProvider(); @Override protected Configuration getFreemarkerConfig() { @@ -63,25 +60,11 @@ public class ResetPasswordServlet extends FreemarkerServlet { } else { DaoEntity payload = getRequestZipBson(_req); String email = DaoSerializer.getString(payload, "email"); - if (EmailValidator.getInstance().isValid(email)) { + Account account = Globals.dao.getAccountByUsername(email); + if ((account != null) && EmailValidator.getInstance().isValid(email)) { String key = Globals.dao.addPasswordResetKey(email); - Email from = new Email("mark.milligan@lanternsoftware.com"); - String subject = "Password Reset - Lantern Power Monitor"; - Email to = new Email(email); - Content content = new Content("text/plain", "Reset your password using this link:\nhttps://lanternpowermonitor.com/currentmonitor/resetPassword/" + key); - Mail mail = new Mail(from, subject, to, content); - SendGrid sg = new SendGrid(api_key); - Request request = new Request(); - try { - request.setMethod(Method.POST); - request.setEndpoint("mail/send"); - request.setBody(mail.build()); - Response response = sg.api(request); - zipBsonResponse(_resp, new DaoEntity("success", response.getStatusCode() == 200)); - } catch (IOException ex) { - LOG.error("Failed to send password reset email", ex); - _resp.setStatus(500); - } + int status = provider.sendTextEmail(credentials, email, "Password Reset - Lantern Power Monitor", "Reset your password using this link:\n" + credentials.getServerUrlBase() + "resetPassword/" + key); + zipBsonResponse(_resp, new DaoEntity("success", status == 200)); } else _resp.setStatus(400); diff --git a/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/util/GoogleAuthHelper.java b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/util/GoogleAuthHelper.java index 6185fdd..39ca351 100644 --- a/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/util/GoogleAuthHelper.java +++ b/currentmonitor/lantern-service-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/util/GoogleAuthHelper.java @@ -6,10 +6,10 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.lanternsoftware.currentmonitor.context.Globals; -import com.lanternsoftware.util.external.LanternFiles; import com.lanternsoftware.util.ResourceLoader; import com.lanternsoftware.util.dao.DaoEntity; import com.lanternsoftware.util.dao.DaoSerializer; +import com.lanternsoftware.util.external.LanternFiles; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/currentmonitor/pom.xml b/currentmonitor/pom.xml index bfc8e1f..46dd3de 100644 --- a/currentmonitor/pom.xml +++ b/currentmonitor/pom.xml @@ -4,12 +4,13 @@ com.lanternsoftware.currentmonitor currentmonitor currentmonitor - 1.0.0 + 1.1.0 - - 1.8 - 1.8 - + + com.lanternsoftware + LanternPowerMonitor + 1.0.0 + lantern-config-currentmonitor diff --git a/pom.xml b/pom.xml index 93b94d2..e413959 100644 --- a/pom.xml +++ b/pom.xml @@ -7,8 +7,13 @@ 1.0.0 - 1.8 - 1.8 + 11 + 11 + UTF-8 + 1.1.0 + 1.0.0 + 1.0.0 + 1.0.0 diff --git a/rules/lantern-dataaccess-rules/pom.xml b/rules/lantern-dataaccess-rules/pom.xml index 725a824..012beb5 100644 --- a/rules/lantern-dataaccess-rules/pom.xml +++ b/rules/lantern-dataaccess-rules/pom.xml @@ -1,26 +1,26 @@ 4.0.0 - com.lanternsoftware.rules lantern-dataaccess-rules jar 1.0.0 lantern-dataaccess-rules - - 1.8 - 1.8 - + + com.lanternsoftware.rules + rules + 1.0.0 + com.lanternsoftware.rules lantern-datamodel-rules - 1.0.0 + ${rules.version} com.lanternsoftware.util lantern-util-dao-mongo - 1.0.0 + ${util.version} @@ -46,8 +46,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/rules/lantern-datamodel-rules/pom.xml b/rules/lantern-datamodel-rules/pom.xml index 5c84ae6..63349d8 100644 --- a/rules/lantern-datamodel-rules/pom.xml +++ b/rules/lantern-datamodel-rules/pom.xml @@ -1,21 +1,21 @@ 4.0.0 - com.lanternsoftware.rules lantern-datamodel-rules jar 1.0.0 lantern-datamodel-rules - - 1.8 - 1.8 - + + com.lanternsoftware.rules + rules + 1.0.0 + com.lanternsoftware.util lantern-util-dao - 1.0.0 + ${util.version} @@ -41,8 +41,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/rules/lantern-service-rules/pom.xml b/rules/lantern-service-rules/pom.xml index 1196897..a64c55a 100644 --- a/rules/lantern-service-rules/pom.xml +++ b/rules/lantern-service-rules/pom.xml @@ -1,16 +1,16 @@ 4.0.0 - com.lanternsoftware.rules lantern-service-rules jar 1.0.0 lantern-service-rules - - 1.8 - 1.8 - + + com.lanternsoftware.rules + rules + 1.0.0 + @@ -37,17 +37,17 @@ com.lanternsoftware.rules lantern-dataaccess-rules - 1.0.0 + ${rules.version} com.lanternsoftware.currentmonitor lantern-dataaccess-currentmonitor - 1.0.0 + ${cm.version} com.lanternsoftware.util lantern-util-servlet - 1.0.0 + ${util.version} javax @@ -84,8 +84,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/rules/pom.xml b/rules/pom.xml index 47c9545..9f605cd 100644 --- a/rules/pom.xml +++ b/rules/pom.xml @@ -2,14 +2,15 @@ 4.0.0 pom com.lanternsoftware.rules - rules-reactor - rules-reactor + rules + rules 1.0.0 - - 1.8 - 1.8 - + + com.lanternsoftware + LanternPowerMonitor + 1.0.0 + lantern-dataaccess-rules diff --git a/util/lantern-util-common/pom.xml b/util/lantern-util-common/pom.xml index dc2d50c..c9ae072 100644 --- a/util/lantern-util-common/pom.xml +++ b/util/lantern-util-common/pom.xml @@ -1,13 +1,17 @@ 4.0.0 - - com.lanternsoftware.util lantern-util-common lantern-util-common 1.0.0 jar + + com.lanternsoftware.util + util + 1.0.0 + + commons-io @@ -43,8 +47,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/util/lantern-util-dao-ephemeral/pom.xml b/util/lantern-util-dao-ephemeral/pom.xml index 73d7db5..29e7a91 100644 --- a/util/lantern-util-dao-ephemeral/pom.xml +++ b/util/lantern-util-dao-ephemeral/pom.xml @@ -1,13 +1,17 @@ 4.0.0 - - com.lanternsoftware.util lantern-util-dao-ephemeral lantern-util-dao-ephemeral 1.0.0 jar + + com.lanternsoftware.util + util + 1.0.0 + + ${project.groupId} @@ -38,8 +42,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/util/lantern-util-dao-ephemeral/src/main/java/com/lanternsoftware/util/dao/ephemeral/EphemeralProxy.java b/util/lantern-util-dao-ephemeral/src/main/java/com/lanternsoftware/util/dao/ephemeral/EphemeralProxy.java index d0b68a0..f649f2b 100644 --- a/util/lantern-util-dao-ephemeral/src/main/java/com/lanternsoftware/util/dao/ephemeral/EphemeralProxy.java +++ b/util/lantern-util-dao-ephemeral/src/main/java/com/lanternsoftware/util/dao/ephemeral/EphemeralProxy.java @@ -1,30 +1,27 @@ package com.lanternsoftware.util.dao.ephemeral; -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; - +import com.lanternsoftware.util.CollectionUtils; +import com.lanternsoftware.util.IFilter; +import com.lanternsoftware.util.NullUtils; +import com.lanternsoftware.util.ResourceLoader; import com.lanternsoftware.util.dao.AbstractDaoProxy; import com.lanternsoftware.util.dao.DaoEntity; import com.lanternsoftware.util.dao.DaoProxyType; import com.lanternsoftware.util.dao.DaoQuery; import com.lanternsoftware.util.dao.DaoSerializer; import com.lanternsoftware.util.dao.DaoSort; +import com.lanternsoftware.util.dao.annotations.PrimaryKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.lanternsoftware.util.CollectionUtils; -import com.lanternsoftware.util.IFilter; -import com.lanternsoftware.util.ITransformer; -import com.lanternsoftware.util.NullUtils; -import com.lanternsoftware.util.ResourceLoader; -import com.lanternsoftware.util.dao.annotations.PrimaryKey; +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; public class EphemeralProxy extends AbstractDaoProxy { private static final Logger LOG = LoggerFactory.getLogger(EphemeralProxy.class); @@ -42,16 +39,19 @@ public class EphemeralProxy extends AbstractDaoProxy { try { File file = new File(_path); if (file.isDirectory()) { - for (File child : file.listFiles()) { - if (child.getName().endsWith(".json")) { - Class clazz = null; - try { - clazz = Class.forName(child.getName().substring(0, child.getName().length()-5)); - } catch (ClassNotFoundException _e) { - continue; + File[] files = file.listFiles(); + if (files != null) { + for (File child : files) { + if (child.getName().endsWith(".json")) { + Class clazz; + try { + clazz = Class.forName(child.getName().substring(0, child.getName().length() - 5)); + } catch (ClassNotFoundException _e) { + continue; + } + List entities = DaoSerializer.parseList(NullUtils.toString(ResourceLoader.loadFile(child))); + proxy.save(clazz, entities); } - List entities = DaoSerializer.parseList(NullUtils.toString(ResourceLoader.loadFile(child))); - proxy.save(clazz, entities); } } } @@ -108,18 +108,14 @@ public class EphemeralProxy extends AbstractDaoProxy { @Override public synchronized void update(Class _class, DaoQuery _query, DaoEntity _changes) { for (DaoEntity entity : queryForEntities(DaoSerializer.getTableName(_class, getType()), _query)) { - for (Entry change : _changes.entrySet()) { - entity.put(change.getKey(), change.getValue()); - } + entity.putAll(_changes); } } @Override public synchronized T updateOne(Class _class, DaoQuery _query, DaoEntity _changes) { DaoEntity entity = CollectionUtils.getFirst(queryForEntities(DaoSerializer.getTableName(_class, getType()), _query)); - for (Entry change : _changes.entrySet()) { - entity.put(change.getKey(), change.getValue()); - } + entity.putAll(_changes); return DaoSerializer.fromDaoEntity(entity, _class); } @@ -152,18 +148,12 @@ public class EphemeralProxy extends AbstractDaoProxy { } } else if (value instanceof Integer) { if (((Integer) value) == 0) { - value = new Long(getNextSequence()).intValue(); - + value = Long.valueOf(getNextSequence()).intValue(); } } _entity.put(key, value); } - pk = CollectionUtils.commaSeparated(CollectionUtils.transform(CollectionUtils.getAll(_entity, _primaryKeys), new ITransformer() { - @Override - public String transform(Object _o) { - return DaoSerializer.toString(_o); - } - })); + pk = CollectionUtils.commaSeparated(CollectionUtils.transform(CollectionUtils.getAll(_entity, _primaryKeys), DaoSerializer::toString)); } else pk = DaoSerializer.getString(_entity, "_id"); @@ -187,12 +177,7 @@ public class EphemeralProxy extends AbstractDaoProxy { IFilter filter = new QueryFilter(_query); Map table = tables.get(_tableName); if (table != null) { - Iterator iter = table.values().iterator(); - while (iter.hasNext()) { - DaoEntity entity = iter.next(); - if (filter.isFiltered(entity)) - iter.remove(); - } + table.values().removeIf(filter::isFiltered); } return true; } @@ -241,16 +226,16 @@ public class EphemeralProxy extends AbstractDaoProxy { if ((comp != null) && !DaoSerializer.getString(_daoEntity, qual.getKey()).toLowerCase().contains(((String) comp).toLowerCase())) return false; comp = child.get("$equalssIgnoreCase"); - if ((comp != null) && !DaoSerializer.getString(_daoEntity, qual.getKey()).toLowerCase().equals(((String) comp).toLowerCase())) + if ((comp != null) && !DaoSerializer.getString(_daoEntity, qual.getKey()).equalsIgnoreCase(((String) comp))) return false; comp = child.get("$startsWithIgnoreCase"); if ((comp != null) && !DaoSerializer.getString(_daoEntity, qual.getKey()).toLowerCase().startsWith(((String) comp).toLowerCase())) return false; comp = child.get("$in"); - if ((comp != null) && !in(_daoEntity.get(qual.getKey()), (Collection) comp)) + if ((comp != null) && !in(_daoEntity.get(qual.getKey()), (Collection) comp)) return false; comp = child.get("$nin"); - if ((comp != null) && in(_daoEntity.get(qual.getKey()), (Collection) comp)) + if ((comp != null) && in(_daoEntity.get(qual.getKey()), (Collection) comp)) return false; } else if ((qual.getValue() instanceof String) && NullUtils.isEqual(qual.getValue(), "$null")) { @@ -268,10 +253,10 @@ public class EphemeralProxy extends AbstractDaoProxy { } } - private boolean in(Object field, Collection qual) { + private boolean in(Object field, Collection qual) { for (Object qualObject : qual) { if (field instanceof Collection) { - for (Object fieldObject : (Collection) field) { + for (Object fieldObject : (Collection) field) { if (NullUtils.isEqual(fieldObject, qualObject)) return true; } diff --git a/util/lantern-util-dao-mongo/pom.xml b/util/lantern-util-dao-mongo/pom.xml index aa028c6..205eb1f 100644 --- a/util/lantern-util-dao-mongo/pom.xml +++ b/util/lantern-util-dao-mongo/pom.xml @@ -1,13 +1,17 @@ 4.0.0 - - com.lanternsoftware.util lantern-util-dao-mongo lantern-util-dao-mongo 1.0.0 jar + + com.lanternsoftware.util + util + 1.0.0 + + ${project.groupId} @@ -43,8 +47,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/util/lantern-util-dao/pom.xml b/util/lantern-util-dao/pom.xml index 2862f69..bb86f7c 100644 --- a/util/lantern-util-dao/pom.xml +++ b/util/lantern-util-dao/pom.xml @@ -1,13 +1,17 @@ 4.0.0 - - com.lanternsoftware.util lantern-util-dao lantern-util-dao 1.0.0 jar + + com.lanternsoftware.util + util + 1.0.0 + + ${project.groupId} @@ -38,8 +42,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/AbstractDaoProxy.java b/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/AbstractDaoProxy.java index 2d1dae4..2035e91 100644 --- a/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/AbstractDaoProxy.java +++ b/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/AbstractDaoProxy.java @@ -1,6 +1,8 @@ package com.lanternsoftware.util.dao; -import java.util.Arrays; +import com.lanternsoftware.util.CollectionUtils; +import com.lanternsoftware.util.NullUtils; + import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -11,10 +13,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import com.lanternsoftware.util.CollectionUtils; -import com.lanternsoftware.util.ITransformer; -import com.lanternsoftware.util.NullUtils; - public abstract class AbstractDaoProxy implements IDaoProxy { private ExecutorService executor; private int maxThreads = 50; @@ -57,37 +55,37 @@ public abstract class AbstractDaoProxy implements IDaoProxy { @Override public Future> queryAsync(Class _class, DaoQuery _query) { - return submit(new QueryExecution(this, _class, _query)); + return submit(new QueryExecution<>(this, _class, _query)); } @Override public Future> queryAsync(Class _class, DaoQuery _query, DaoSort _sort) { - return submit(new QueryExecution(this, _class, _query, _sort)); + return submit(new QueryExecution<>(this, _class, _query, _sort)); } @Override public Future> queryAsync(Class _class, DaoQuery _query, Collection _fields) { - return submit(new QueryExecution(this, _class, _query, _fields)); + return submit(new QueryExecution<>(this, _class, _query, _fields)); } @Override public Future> queryAsync(Class _class, DaoQuery _query, Collection _fields, DaoSort _sort) { - return submit(new QueryExecution(this, _class, _query, _fields, _sort)); + return submit(new QueryExecution<>(this, _class, _query, _fields, _sort)); } @Override public Future> queryWithFinalizer(Class _class, DaoQuery _query, Collection _fields, DaoSort _sort, QueryFinalizer _finalizer) { - return submit(new QueryFinalizerExecution(this, _class, _query, _fields, _sort, _finalizer)); + return submit(new QueryFinalizerExecution<>(this, _class, _query, _fields, _sort, _finalizer)); } @Override public DaoPage queryPage(Class _class, DaoQuery _query, Collection _fields, DaoSort _sort, int _offset, int _count) { - return new DaoPage(query(_class, _query, _fields, _sort, _offset, _count), count(_class, _query)); + return new DaoPage<>(query(_class, _query, _fields, _sort, _offset, _count), count(_class, _query)); } @Override public DaoPage queryForEntitiesPage(String _tableName, DaoQuery _query, Collection _fields, DaoSort _sort, int _offset, int _count) { - return new DaoPage(queryForEntities(_tableName, _query, _fields, _sort, _offset, _count), count(_tableName, _query)); + return new DaoPage<>(queryForEntities(_tableName, _query, _fields, _sort, _offset, _count), count(_tableName, _query)); } @Override @@ -112,22 +110,22 @@ public abstract class AbstractDaoProxy implements IDaoProxy { @Override public Future queryOneAsync(Class _class, DaoQuery _query) { - return submit(new QueryOneExecution(this, _class, _query)); + return submit(new QueryOneExecution<>(this, _class, _query)); } @Override public Future queryOneAsync(Class _class, DaoQuery _query, DaoSort _sort) { - return submit(new QueryOneExecution(this, _class, _query, _sort)); + return submit(new QueryOneExecution<>(this, _class, _query, _sort)); } @Override public Future queryOneAsync(Class _class, DaoQuery _query, Collection _fields) { - return submit(new QueryOneExecution(this, _class, _query, _fields)); + return submit(new QueryOneExecution<>(this, _class, _query, _fields)); } @Override public Future queryOneAsync(Class _class, DaoQuery _query, Collection _fields, DaoSort _sort) { - return submit(new QueryOneExecution(this, _class, _query, _fields, _sort)); + return submit(new QueryOneExecution<>(this, _class, _query, _fields, _sort)); } @Override @@ -157,7 +155,7 @@ public abstract class AbstractDaoProxy implements IDaoProxy { @Override public DaoPage queryImportantPage(Class _class, DaoQuery _query, DaoSort _sort, int _offset, int _count) { - return new DaoPage(queryImportant(_class, _query, _sort, _offset, _count), count(_class, _query)); + return new DaoPage<>(queryImportant(_class, _query, _sort, _offset, _count), count(_class, _query)); } @Override @@ -247,22 +245,12 @@ public abstract class AbstractDaoProxy implements IDaoProxy { @Override public List queryForField(Class _class, DaoQuery _query, final String _field, DaoSort _sort) { - return CollectionUtils.transform(queryForEntities(DaoSerializer.getTableName(_class, getType()), _query, Arrays.asList(_field), _sort), new ITransformer() { - @Override - public String transform(DaoEntity _daoEntity) { - return DaoSerializer.getString(_daoEntity, _field); - } - }); + return CollectionUtils.transform(queryForEntities(DaoSerializer.getTableName(_class, getType()), _query, List.of(_field), _sort), _daoEntity -> DaoSerializer.getString(_daoEntity, _field)); } @Override public List queryForField(String _tableName, DaoQuery _query, final String _field) { - return CollectionUtils.transform(queryForEntities(_tableName, _query, Arrays.asList(_field)), new ITransformer() { - @Override - public String transform(DaoEntity _daoEntity) { - return DaoSerializer.getString(_daoEntity, _field); - } - }); + return CollectionUtils.transform(queryForEntities(_tableName, _query, List.of(_field)), _daoEntity -> DaoSerializer.getString(_daoEntity, _field)); } @Override @@ -272,7 +260,7 @@ public abstract class AbstractDaoProxy implements IDaoProxy { @Override public Map save(Collection _objects) { - Map ids = new HashMap(); + Map ids = new HashMap<>(); for (T o : _objects) { String id = save(o); if (NullUtils.isNotEmpty(id)) @@ -284,6 +272,8 @@ public abstract class AbstractDaoProxy implements IDaoProxy { @Override public Map save(Class _class, Collection _entities) { Map ids = new HashMap<>(); + if (_entities == null) + return ids; for (DaoEntity e : _entities) { ids.put(saveEntity(_class, e), e); } @@ -328,12 +318,7 @@ public abstract class AbstractDaoProxy implements IDaoProxy { } protected List toObjects(List _entities, final Class _class) { - return CollectionUtils.transform(_entities, new ITransformer() { - @Override - public T transform(DaoEntity _daoEntity) { - return DaoSerializer.fromDaoEntity(_daoEntity, _class, getType()); - } - }); + return CollectionUtils.transform(_entities, _daoEntity -> DaoSerializer.fromDaoEntity(_daoEntity, _class, getType())); } protected DaoQuery prepareQuery(DaoQuery _query) { if (queryPreparer == null) diff --git a/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/jdbc/JdbcProxy.java b/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/jdbc/JdbcProxy.java index 5f345da..adce1e8 100644 --- a/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/jdbc/JdbcProxy.java +++ b/util/lantern-util-dao/src/main/java/com/lanternsoftware/util/dao/jdbc/JdbcProxy.java @@ -49,7 +49,7 @@ public class JdbcProxy extends AbstractJdbcProxy { else driver = "oracle.jdbc.driver.OracleDriver"; try { - DriverManager.registerDriver(Class.forName(driver).asSubclass(Driver.class).newInstance()); + DriverManager.registerDriver(Class.forName(driver).asSubclass(Driver.class).getDeclaredConstructor().newInstance()); JdbcProxy proxy = new JdbcProxy(DriverManager.getConnection(_connectionString, _username, _password)); proxy.databaseType = _type; return proxy; diff --git a/util/lantern-util-excel/pom.xml b/util/lantern-util-excel/pom.xml index 97b2353..c7a33fe 100644 --- a/util/lantern-util-excel/pom.xml +++ b/util/lantern-util-excel/pom.xml @@ -2,12 +2,17 @@ 4.0.0 - com.lanternsoftware.util lantern-util-excel lantern-util-excel 1.0.0 jar + + com.lanternsoftware.util + util + 1.0.0 + + com.lanternsoftware.util @@ -38,8 +43,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/util/lantern-util-http/pom.xml b/util/lantern-util-http/pom.xml index bb77d09..32171b9 100644 --- a/util/lantern-util-http/pom.xml +++ b/util/lantern-util-http/pom.xml @@ -1,13 +1,17 @@ 4.0.0 - - com.lanternsoftware.util lantern-util-http lantern-util-http 1.0.0 jar + + com.lanternsoftware.util + util + 1.0.0 + + ${project.groupId} @@ -48,8 +52,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/util/lantern-util-servlet/pom.xml b/util/lantern-util-servlet/pom.xml index 18d32cc..95aee0e 100644 --- a/util/lantern-util-servlet/pom.xml +++ b/util/lantern-util-servlet/pom.xml @@ -1,13 +1,17 @@ 4.0.0 - - com.lanternsoftware.util lantern-util-servlet lantern-util-servlet 1.0.0 jar + + com.lanternsoftware.util + util + 1.0.0 + + ${project.groupId} @@ -44,8 +48,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/util/pom.xml b/util/pom.xml index 389f7a4..a185dbb 100644 --- a/util/pom.xml +++ b/util/pom.xml @@ -1,18 +1,17 @@ 4.0.0 - com.lanternsoftware.util util util 1.0.0 pom - - UTF-8 - 1.8 - 1.8 - + + com.lanternsoftware + LanternPowerMonitor + 1.0.0 + lantern-util-common diff --git a/zwave/lantern-datamodel-zwave/pom.xml b/zwave/lantern-datamodel-zwave/pom.xml index a7e0089..baf03b0 100644 --- a/zwave/lantern-datamodel-zwave/pom.xml +++ b/zwave/lantern-datamodel-zwave/pom.xml @@ -1,21 +1,21 @@ 4.0.0 - com.lanternsoftware.zwave lantern-datamodel-zwave jar 1.0.0 lantern-datamodel-zwave - - 1.8 - 1.8 - + + com.lanternsoftware.zwave + zwave + 1.0.0 + com.lanternsoftware.util lantern-util-dao - 1.0.0 + ${util.version} @@ -41,8 +41,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/zwave/lantern-service-thermometer/pom.xml b/zwave/lantern-service-thermometer/pom.xml index ead746e..ee52513 100644 --- a/zwave/lantern-service-thermometer/pom.xml +++ b/zwave/lantern-service-thermometer/pom.xml @@ -1,22 +1,22 @@ 4.0.0 - com.lanternsoftware.thermometer lantern-service-thermometer war 1.0.0 lantern-service-thermometer - - 1.8 - 1.8 - + + com.lanternsoftware.zwave + zwave + 1.0.0 + com.lanternsoftware.util lantern-util-servlet - 1.0.0 + ${util.version} javax @@ -69,8 +69,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/zwave/lantern-service-zwave/pom.xml b/zwave/lantern-service-zwave/pom.xml index 06e808a..cf8b537 100644 --- a/zwave/lantern-service-zwave/pom.xml +++ b/zwave/lantern-service-zwave/pom.xml @@ -1,27 +1,27 @@ 4.0.0 - com.lanternsoftware.zwave lantern-service-zwave war 1.0.0 lantern-service-zwave - - 1.8 - 1.8 - + + com.lanternsoftware.zwave + zwave + 1.0.0 + com.lanternsoftware.zwave lantern-datamodel-zwave - 1.0.0 + ${zw.version} com.lanternsoftware.currentmonitor lantern-datamodel-currentmonitor - 1.0.0 + ${cm.version} com.pi4j @@ -31,22 +31,22 @@ com.lanternsoftware.zwave lantern-zwave - 1.0.0 + ${zw.version} com.lanternsoftware.rules lantern-datamodel-rules - 1.0.0 + ${rules.version} com.lanternsoftware.util lantern-util-dao-mongo - 1.0.0 + ${util.version} com.lanternsoftware.util lantern-util-http - 1.0.0 + ${util.version} ch.qos.logback @@ -83,8 +83,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/zwave/lantern-uirt/pom.xml b/zwave/lantern-uirt/pom.xml index afee37e..3e4aa2f 100644 --- a/zwave/lantern-uirt/pom.xml +++ b/zwave/lantern-uirt/pom.xml @@ -1,21 +1,21 @@ 4.0.0 - com.lanternsoftware.zwave lantern-uirt jar 1.0.0 lantern-uirt - - 1.8 - 1.8 - + + com.lanternsoftware.zwave + zwave + 1.0.0 + com.lanternsoftware.util lantern-util-dao - 1.0.0 + ${util.version} net.java.dev.jna @@ -46,8 +46,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/zwave/lantern-zwave/pom.xml b/zwave/lantern-zwave/pom.xml index a333cf9..a6c5b3e 100644 --- a/zwave/lantern-zwave/pom.xml +++ b/zwave/lantern-zwave/pom.xml @@ -1,15 +1,15 @@ 4.0.0 - com.lanternsoftware.zwave lantern-zwave jar 1.0.0 lantern-zwave - - 1.8 - 1.8 - + + com.lanternsoftware.zwave + zwave + 1.0.0 + @@ -31,7 +31,7 @@ com.lanternsoftware.util lantern-util-dao - 1.0.0 + ${util.version} @@ -57,8 +57,8 @@ true true UTF-8 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} diff --git a/zwave/lantern-zwave/src/main/java/com/lanternsoftware/zwave/message/MessageEngine.java b/zwave/lantern-zwave/src/main/java/com/lanternsoftware/zwave/message/MessageEngine.java index c24357d..78563ab 100644 --- a/zwave/lantern-zwave/src/main/java/com/lanternsoftware/zwave/message/MessageEngine.java +++ b/zwave/lantern-zwave/src/main/java/com/lanternsoftware/zwave/message/MessageEngine.java @@ -19,7 +19,7 @@ public abstract class MessageEngine { for (Message m : ServiceLoader.load(Message.class)) { messages.put(m.getKey(), m); } - for (IMessageSubscriber s : ServiceLoader.load(IMessageSubscriber.class)) { + for (IMessageSubscriber s : ServiceLoader.load(IMessageSubscriber.class)) { subscribe(s); } } @@ -50,7 +50,7 @@ public abstract class MessageEngine { return null; } try { - Message ret = message.getClass().newInstance(); + Message ret = message.getClass().getDeclaredConstructor().newInstance(); ret.fromPayload(_data); return ret; } catch (Exception _e) { diff --git a/zwave/pom.xml b/zwave/pom.xml index 2e9738e..225a8e0 100644 --- a/zwave/pom.xml +++ b/zwave/pom.xml @@ -2,14 +2,15 @@ 4.0.0 pom com.lanternsoftware.zwave - zwave-reactor - zwave-reactor + zwave + zwave 1.0.0 - - 1.8 - 1.8 - + + com.lanternsoftware + LanternPowerMonitor + 1.0.0 + lantern-datamodel-zwave