]> git.basschouten.com Git - openhab-addons.git/blob
b8a960a66fcf9175b3d0592ccf7d1f436a90a482
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.omnilink.internal.discovery;
14
15 import java.util.ArrayList;
16 import java.util.Iterator;
17 import java.util.List;
18
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;
24
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;
29
30 /**
31  * @author Craig Hamilton - Initial contribution
32  *
33  * @param <T>
34  */
35 @NonNullByDefault
36 public class ObjectPropertyRequest<T extends ObjectProperties> implements Iterable<T> {
37     private final Logger logger = LoggerFactory.getLogger(ObjectPropertyRequest.class);
38
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);
42     }
43
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;
51
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;
60         this.offset = offset;
61     }
62
63     @Override
64     public Iterator<T> iterator() {
65         List<T> messages = new ArrayList<T>();
66         int currentObjectNumber = objectNumber;
67
68         while (true) {
69             try {
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));
75                     if (offset == 0) {
76                         break;
77                     } else if (offset == 1) {
78                         currentObjectNumber++;
79                     } else if (offset == -1) {
80                         currentObjectNumber--;
81                     }
82                 } else {
83                     break;
84                 }
85             } catch (OmniInvalidResponseException | OmniUnknownMessageTypeException | BridgeOfflineException e) {
86                 logger.warn("Error retrieving object properties: {}", e.getMessage());
87             }
88         }
89         return messages.iterator();
90     }
91
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;
100
101         private Builder(OmnilinkBridgeHandler bridgeHandler, ObjectPropertyRequests<T> request, int objectNumber,
102                 int offset) {
103             this.bridgeHandler = bridgeHandler;
104             this.request = request;
105             this.objectNumber = objectNumber;
106             this.offset = offset;
107         }
108
109         public Builder<T> selectNamed() {
110             this.filter1 = ObjectProperties.FILTER_1_NAMED;
111             return this;
112         }
113
114         public Builder<T> areaFilter(int area) {
115             this.filter2 = area;
116             return this;
117         }
118
119         public Builder<T> selectAnyLoad() {
120             this.filter3 = ObjectProperties.FILTER_3_ANY_LOAD;
121             return this;
122         }
123
124         public ObjectPropertyRequest<T> build() {
125             return new ObjectPropertyRequest<T>(bridgeHandler, request, objectNumber, filter1, filter2, filter3,
126                     offset);
127         }
128     }
129 }