Ensure ressources are freed.

A bit of code revamp

Signed-off-by: clinique <gael@lhopital.org>
This commit is contained in:
clinique 2024-12-21 15:20:10 +01:00
parent 563caa0762
commit e4b432bb6b
6 changed files with 42 additions and 45 deletions

View File

@ -120,6 +120,7 @@ public class Ipx800DeviceConnector extends Thread {
public void dispose() {
interrupt();
disconnect();
releaseParser();
}
/**
@ -185,6 +186,10 @@ public class Ipx800DeviceConnector extends Thread {
}
public void setParser(M2MMessageParser parser) {
this.messageParser = Optional.of(parser);
messageParser = Optional.of(parser);
}
public void releaseParser() {
messageParser = Optional.empty();
}
}

View File

@ -15,8 +15,7 @@ package org.openhab.binding.gce.internal.handler;
import static org.openhab.binding.gce.internal.GCEBindingConstants.*;
import java.time.Duration;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collection;
@ -82,7 +81,7 @@ public class Ipx800v3Handler extends BaseThingHandler implements Ipx800EventList
private final Map<String, PortData> portDatas = new HashMap<>();
private class LongPressEvaluator implements Runnable {
private final ZonedDateTime referenceTime;
private final Instant referenceTime;
private final String port;
private final String eventChannelId;
@ -121,7 +120,7 @@ public class Ipx800v3Handler extends BaseThingHandler implements Ipx800EventList
}
List<Channel> channels = new ArrayList<>(getThing().getChannels());
PortDefinition.asStream().forEach(portDefinition -> {
PortDefinition.AS_STREAM.forEach(portDefinition -> {
int nbElements = statusFile.getMaxNumberofNodeType(portDefinition);
for (int i = 0; i < nbElements; i++) {
ChannelUID portChannelUID = createChannels(portDefinition, i, channels);
@ -150,9 +149,12 @@ public class Ipx800v3Handler extends BaseThingHandler implements Ipx800EventList
connector.ifPresent(Ipx800DeviceConnector::dispose);
connector = Optional.empty();
parser.ifPresent(M2MMessageParser::dispose);
parser = Optional.empty();
portDatas.values().stream().forEach(PortData::dispose);
portDatas.clear();
super.dispose();
}
@ -209,7 +211,7 @@ public class Ipx800v3Handler extends BaseThingHandler implements Ipx800EventList
}
private boolean ignoreCondition(double newValue, PortData portData, Configuration configuration,
PortDefinition portDefinition, ZonedDateTime now) {
PortDefinition portDefinition, Instant now) {
if (!portData.isInitializing()) { // Always accept if portData is not initialized
double prevValue = portData.getValue();
if (newValue == prevValue) { // Always reject if the value did not change
@ -237,7 +239,7 @@ public class Ipx800v3Handler extends BaseThingHandler implements Ipx800EventList
String groupId = channel.getUID().getGroupId();
PortData portData = portDatas.get(channelId);
if (portData != null && groupId != null) {
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
Instant now = Instant.now();
long sinceLastChange = Duration.between(portData.getTimestamp(), now).toMillis();
Configuration configuration = channel.getConfiguration();
PortDefinition portDefinition = PortDefinition.fromGroupId(groupId);

View File

@ -44,6 +44,10 @@ public class M2MMessageParser {
connector.setParser(this);
}
public void dispose() {
connector.releaseParser();
}
/**
*
* @param data
@ -67,7 +71,7 @@ public class M2MMessageParser {
portNumShift = 0; // Align counters on 1 based array
case ANALOG: {
int portNumber = Integer.parseInt(statusPart[0].substring(1)) + portNumShift;
setStatus(portDefinition.getPortName() + portNumber, Double.parseDouble(statusPart[1]));
setStatus(portDefinition.portName + portNumber, Double.parseDouble(statusPart[1]));
}
}
}
@ -80,7 +84,7 @@ public class M2MMessageParser {
private void decodeDataLine(PortDefinition portDefinition, String data) {
for (int count = 0; count < data.length(); count++) {
setStatus(portDefinition.getPortName() + (count + 1), (double) data.charAt(count) - '0');
setStatus(portDefinition.portName + (count + 1), (double) data.charAt(count) - '0');
}
}
@ -94,7 +98,7 @@ public class M2MMessageParser {
this.expectedResponse = expectedResponse;
} else { // GetAnx or GetCountx
PortDefinition portType = PortDefinition.fromM2MCommand(expectedResponse);
this.expectedResponse = expectedResponse.replaceAll(portType.getM2mCommand(), portType.getPortName());
this.expectedResponse = expectedResponse.replaceAll(portType.m2mCommand, portType.portName);
}
}

View File

@ -12,7 +12,7 @@
*/
package org.openhab.binding.gce.internal.model;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.util.Optional;
import java.util.concurrent.ScheduledFuture;
@ -26,7 +26,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
@NonNullByDefault
public class PortData {
private double value = -1;
private ZonedDateTime timestamp = ZonedDateTime.now();
private Instant timestamp = Instant.now();
private Optional<ScheduledFuture<?>> pulsing = Optional.empty();
public void cancelPulsing() {
@ -38,7 +38,7 @@ public class PortData {
cancelPulsing();
}
public void setData(double value, ZonedDateTime timestamp) {
public void setData(double value, Instant timestamp) {
this.value = value;
this.timestamp = timestamp;
}
@ -47,7 +47,7 @@ public class PortData {
return value;
}
public ZonedDateTime getTimestamp() {
public Instant getTimestamp() {
return timestamp;
}

View File

@ -29,9 +29,9 @@ public enum PortDefinition {
RELAY("led", "O", "GetOut", 8),
CONTACT("btn", "I", "GetIn", 8);
private final String nodeName; // Name used in the status xml file
private final String portName; // Name used by the M2M protocol
private final String m2mCommand; // associated M2M command
public final String nodeName; // Name used in the status xml file
public final String portName; // Name used by the M2M protocol
public final String m2mCommand; // associated M2M command
private final int quantity; // base number of ports
PortDefinition(String nodeName, String portName, String m2mCommand, int quantity) {
@ -41,13 +41,7 @@ public enum PortDefinition {
this.quantity = quantity;
}
public String getNodeName() {
return nodeName;
}
public String getPortName() {
return portName;
}
public static final Stream<PortDefinition> AS_STREAM = Stream.of(PortDefinition.values());
@Override
public String toString() {
@ -58,20 +52,12 @@ public enum PortDefinition {
return id >= quantity;
}
public String getM2mCommand() {
return m2mCommand;
}
public static Stream<PortDefinition> asStream() {
return Stream.of(PortDefinition.values());
}
public static PortDefinition fromM2MCommand(String m2mCommand) {
return asStream().filter(v -> m2mCommand.startsWith(v.m2mCommand)).findFirst().get();
return AS_STREAM.filter(v -> m2mCommand.startsWith(v.m2mCommand)).findFirst().get();
}
public static PortDefinition fromPortName(String portName) {
return asStream().filter(v -> portName.startsWith(v.portName)).findFirst().get();
return AS_STREAM.filter(v -> portName.startsWith(v.portName)).findFirst().get();
}
public static PortDefinition fromGroupId(String groupId) {
@ -80,7 +66,7 @@ public enum PortDefinition {
public static String asChannelId(String portDefinition) {
String portKind = portDefinition.substring(0, 1);
PortDefinition result = asStream().filter(v -> v.portName.startsWith(portKind)).findFirst().get();
return result.toString() + "#" + portDefinition.substring(1);
PortDefinition result = AS_STREAM.filter(v -> v.portName.startsWith(portKind)).findFirst().get();
return "%s#%s".formatted(result.toString(), portDefinition.substring(1));
}
}

View File

@ -19,9 +19,9 @@ import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.ws.rs.HttpMethod;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@ -78,7 +78,7 @@ public class StatusFileInterpreter {
public void read() {
try {
String statusPage = HttpUtil.executeUrl("GET", url, 5000);
String statusPage = HttpUtil.executeUrl(HttpMethod.GET, url, 5000);
InputStream inputStream = new ByteArrayInputStream(statusPage.getBytes());
Document document = builder.parse(inputStream);
document.getDocumentElement().normalize();
@ -92,13 +92,13 @@ public class StatusFileInterpreter {
private void pushDatas() {
getRoot().ifPresent(root -> {
PortDefinition.asStream().forEach(portDefinition -> {
List<Node> xmlNodes = getMatchingNodes(root.getChildNodes(), portDefinition.getNodeName());
PortDefinition.AS_STREAM.forEach(portDefinition -> {
List<Node> xmlNodes = getMatchingNodes(root.getChildNodes(), portDefinition.nodeName);
xmlNodes.forEach(xmlNode -> {
String sPortNum = xmlNode.getNodeName().replace(portDefinition.getNodeName(), "");
String sPortNum = xmlNode.getNodeName().replace(portDefinition.nodeName, "");
int portNum = Integer.parseInt(sPortNum) + 1;
double value = Double.parseDouble(xmlNode.getTextContent().replace("dn", "1").replace("up", "0"));
listener.dataReceived(String.format("%s%d", portDefinition.getPortName(), portNum), value);
listener.dataReceived("%s%d".formatted(portDefinition.portName, portNum), value);
});
});
});
@ -113,12 +113,12 @@ public class StatusFileInterpreter {
private List<Node> getMatchingNodes(NodeList nodeList, String criteria) {
return IntStream.range(0, nodeList.getLength()).boxed().map(nodeList::item)
.filter(node -> node.getNodeName().startsWith(criteria)).sorted(Comparator.comparing(Node::getNodeName))
.collect(Collectors.toList());
.toList();
}
public int getMaxNumberofNodeType(PortDefinition portDefinition) {
return getRoot().map(root -> getMatchingNodes(root.getChildNodes(), portDefinition.getNodeName()).size())
.orElse(0);
return Objects.requireNonNull(getRoot()
.map(root -> getMatchingNodes(root.getChildNodes(), portDefinition.nodeName).size()).orElse(0));
}
private Optional<Element> getRoot() {