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