2 * Copyright (c) 2010-2024 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.omnilink.internal.discovery;
15 import java.util.ArrayList;
16 import java.util.Iterator;
17 import java.util.List;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.openhab.binding.omnilink.internal.exceptions.BridgeOfflineException;
21 import org.openhab.binding.omnilink.internal.handler.OmnilinkBridgeHandler;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 import com.digitaldan.jomnilinkII.Message;
26 import com.digitaldan.jomnilinkII.MessageTypes.ObjectProperties;
27 import com.digitaldan.jomnilinkII.OmniInvalidResponseException;
28 import com.digitaldan.jomnilinkII.OmniUnknownMessageTypeException;
31 * @author Craig Hamilton - Initial contribution
36 public class ObjectPropertyRequest<T extends ObjectProperties> implements Iterable<T> {
37 private final Logger logger = LoggerFactory.getLogger(ObjectPropertyRequest.class);
39 public static <T extends ObjectProperties, U extends ObjectPropertyRequests<T>> Builder<T> builder(
40 OmnilinkBridgeHandler bridgeHandler, U request, int objectNumber, int offset) {
41 return new Builder<>(bridgeHandler, request, objectNumber, offset);
44 private final OmnilinkBridgeHandler bridgeHandler;
45 private final ObjectPropertyRequests<T> request;
46 private final int objectNumber;
47 private final int filter1;
48 private final int filter2;
49 private final int filter3;
50 private final int offset;
52 private ObjectPropertyRequest(OmnilinkBridgeHandler bridgeHandler, ObjectPropertyRequests<T> request,
53 int objectNumber, int filter1, int filter2, int filter3, int offset) {
54 this.bridgeHandler = bridgeHandler;
55 this.request = request;
56 this.objectNumber = objectNumber;
57 this.filter1 = filter1;
58 this.filter2 = filter2;
59 this.filter3 = filter3;
64 public Iterator<T> iterator() {
65 List<T> messages = new ArrayList<T>();
66 int currentObjectNumber = objectNumber;
70 Message message = bridgeHandler.reqObjectProperties(request.getPropertyRequest(), currentObjectNumber,
71 offset, filter1, filter2, filter3);
72 if (message.getMessageType() == Message.MESG_TYPE_OBJ_PROP) {
73 ObjectProperties objectProperties = (ObjectProperties) message;
74 messages.add(request.getResponseType().cast(objectProperties));
77 } else if (offset == 1) {
78 currentObjectNumber++;
79 } else if (offset == -1) {
80 currentObjectNumber--;
85 } catch (OmniInvalidResponseException | OmniUnknownMessageTypeException | BridgeOfflineException e) {
86 logger.warn("Error retrieving object properties: {}", e.getMessage());
89 return messages.iterator();
92 public static class Builder<T extends ObjectProperties> {
93 private final OmnilinkBridgeHandler bridgeHandler;
94 private final ObjectPropertyRequests<T> request;
95 private final int objectNumber;
96 private final int offset;
97 private int filter1 = ObjectProperties.FILTER_1_NONE;
98 private int filter2 = ObjectProperties.FILTER_2_NONE;
99 private int filter3 = ObjectProperties.FILTER_3_NONE;
101 private Builder(OmnilinkBridgeHandler bridgeHandler, ObjectPropertyRequests<T> request, int objectNumber,
103 this.bridgeHandler = bridgeHandler;
104 this.request = request;
105 this.objectNumber = objectNumber;
106 this.offset = offset;
109 public Builder<T> selectNamed() {
110 this.filter1 = ObjectProperties.FILTER_1_NAMED;
114 public Builder<T> areaFilter(int area) {
119 public Builder<T> selectAnyLoad() {
120 this.filter3 = ObjectProperties.FILTER_3_ANY_LOAD;
124 public ObjectPropertyRequest<T> build() {
125 return new ObjectPropertyRequest<T>(bridgeHandler, request, objectNumber, filter1, filter2, filter3,