2 * Copyright (c) 2010-2023 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.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder;
15 import java.util.concurrent.locks.Lock;
16 import java.util.concurrent.locks.ReentrantLock;
18 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.constants.ExeptionConstants;
19 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.constants.InterfaceKeys;
20 import org.openhab.binding.digitalstrom.internal.lib.serverconnection.simpledsrequestbuilder.constants.ParameterKeys;
21 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.impl.DSID;
24 * The {@link SimpleRequestBuilder} build a request string.<br>
26 * <i><b>Code example</b><br>
27 * String requestString = {@link SimpleRequestBuilder}.{@link #buildNewRequest(String)}.<br>
28 * <span style="padding-left:14em">{@link #addRequestClass(String)}.<br>
30 * <span style="padding-left:14em">{@link #addFunction(String)}.<br>
32 * <span style="padding-left:14em">{@link #addParameter(String, String)}. (optional)<br>
34 * <span style="padding-left:14em">{@link #addParameter(String, String)}. (optional)<br>
36 * <span style="padding-left:14em">{@link #buildRequestString()};<br>
39 * @author Michael Ochel - Initial contribution
40 * @author Matthias Siegele - Initial contribution
42 public class SimpleRequestBuilder {
45 private boolean functionIsChosen = false;
46 private boolean parameterIsAdded = false;
47 private boolean classIsChosen = false;
49 private String request;
50 private static SimpleRequestBuilder builder;
51 private static final Lock LOCK = new ReentrantLock();
53 private SimpleRequestBuilder() {
57 * Returns a {@link SimpleRequestBuilder} with the given intefaceKey as chosen request-interface.
59 * @param interfaceKey must not be null
60 * @return simpleRequestBuilder with chosen interface
61 * @throws NullArgumentException if the interfaceKey is null
63 public static SimpleRequestBuilder buildNewRequest(String interfaceKey) throws IllegalArgumentException {
64 if (builder == null) {
65 builder = new SimpleRequestBuilder();
68 return builder.buildNewRequestInt(interfaceKey);
72 * Returns a {@link SimpleRequestBuilder} with the intefaceKey "Json" as chosen request-interface and adds the given
73 * requestClass to the request-string.
75 * @param requestClassKey must not be null
76 * @return simpleRequestBuilder with chosen requestClass
77 * @throws IllegalArgumentException if a requestClass is already chosen
78 * @throws NullArgumentException if the requestClassKey is null
80 public static SimpleRequestBuilder buildNewJsonRequest(String requestClassKey) throws IllegalArgumentException {
81 return buildNewRequest(InterfaceKeys.JSON).addRequestClass(requestClassKey);
84 private SimpleRequestBuilder buildNewRequestInt(String interfaceKey) {
85 if (interfaceKey == null) {
86 throw new IllegalArgumentException("interfaceKey is null");
88 request = "/" + interfaceKey + "/";
89 classIsChosen = false;
90 functionIsChosen = false;
91 parameterIsAdded = false;
96 * Adds a requestClass to the request-string.
98 * @param requestClassKey must not be null
99 * @return simpleRequestBuilder with chosen requestClass
100 * @throws IllegalArgumentException if a requestClass is already chosen
101 * @throws NullArgumentException if the requestClassKey is null
103 public SimpleRequestBuilder addRequestClass(String requestClassKey) throws IllegalArgumentException {
104 return builder.addRequestClassInt(requestClassKey);
107 private SimpleRequestBuilder addRequestClassInt(String requestClassKey) {
108 if (!classIsChosen && requestClassKey != null) {
109 classIsChosen = true;
110 request = request + requestClassKey + "/";
112 if (!classIsChosen) {
113 throw new IllegalArgumentException(ExeptionConstants.CLASS_ALREADY_ADDED);
115 throw new IllegalArgumentException("requestClassKey is null");
122 * Adds a function to the request-string.
124 * @param functionKey must not be null
125 * @return SimpleRequestBuilder with chosen function
126 * @throws IllegalArgumentException if a function is already chosen
127 * @throws NullArgumentException if the functionKey is null
129 public SimpleRequestBuilder addFunction(String functionKey) throws IllegalArgumentException {
130 return builder.addFunctionInt(functionKey);
133 private SimpleRequestBuilder addFunctionInt(String functionKey) {
134 if (!classIsChosen) {
135 throw new IllegalArgumentException(ExeptionConstants.NO_CLASS_ADDED);
137 if (!functionIsChosen) {
138 if (functionKey != null) {
139 functionIsChosen = true;
140 request = request + functionKey;
142 throw new IllegalArgumentException("functionKey is null");
145 throw new IllegalArgumentException(ExeptionConstants.FUNCTION_ALLREADY_ADDED);
151 * Adds a parameter to the request-string, if the parameter value is not null.
153 * @param parameterKey must not be null
154 * @param parameterValue can be null
155 * @return SimpleRequestBuilder with added parameter
156 * @throws IllegalArgumentException if no class and function added
157 * @throws NullArgumentException if the parameterKey is null
159 public SimpleRequestBuilder addParameter(String parameterKey, String parameterValue)
160 throws IllegalArgumentException {
161 return builder.addParameterInt(parameterKey, parameterValue);
165 * Adds the default parameter for zone-requests to the request-string, if the parameter value is not null.
167 * @param sessionToken
170 * @return SimpleRequestBuilder with added parameter
171 * @throws IllegalArgumentException if no class and function added
172 * @throws NullArgumentException if the parameterKey is null
174 public SimpleRequestBuilder addDefaultZoneParameter(String sessionToken, Integer zoneID, String zoneName)
175 throws IllegalArgumentException {
176 return addParameter(ParameterKeys.TOKEN, sessionToken).addParameter(ParameterKeys.ID, objectToString(zoneID))
177 .addParameter(ParameterKeys.NAME, zoneName);
181 * Adds a parameter for group-requests t the request-string, if the parameter value is not null.
183 * @param sessionToken
186 * @return SimpleRequestBuilder with added parameter
187 * @throws IllegalArgumentException if no class and function added
188 * @throws NullArgumentException if the parameterKey is null
190 public SimpleRequestBuilder addDefaultGroupParameter(String sessionToken, Short groupID, String groupName)
191 throws IllegalArgumentException {
192 return addParameter(ParameterKeys.TOKEN, sessionToken)
193 .addParameter(ParameterKeys.GROUP_ID, objectToString(groupID))
194 .addParameter(ParameterKeys.GROUP_NAME, groupName);
198 * Adds a parameter for zone-group-requests t the request-string, if the parameter value is not null.
200 * @param sessionToken
205 * @return SimpleRequestBuilder with added parameter
206 * @throws IllegalArgumentException if no class and function added
207 * @throws NullArgumentException if the parameterKey is null
209 public SimpleRequestBuilder addDefaultZoneGroupParameter(String sessionToken, Integer zoneID, String zoneName,
210 Short groupID, String groupName) throws IllegalArgumentException {
211 return addDefaultZoneParameter(sessionToken, zoneID, zoneName)
212 .addParameter(ParameterKeys.GROUP_ID, objectToString(groupID))
213 .addParameter(ParameterKeys.GROUP_NAME, groupName);
217 * Adds a parameter for device-requests the request-string, if the parameter value is not null.
219 * @param sessionToken
223 * @return SimpleRequestBuilder with added parameter
224 * @throws IllegalArgumentException if no class and function added
225 * @throws NullArgumentException if the parameterKey is null
227 public SimpleRequestBuilder addDefaultDeviceParameter(String sessionToken, DSID dsid, String dSUID, String name)
228 throws IllegalArgumentException {
229 return addParameter(ParameterKeys.TOKEN, sessionToken).addParameter(ParameterKeys.DSID, objectToString(dsid))
230 .addParameter(ParameterKeys.DSUID, dSUID).addParameter(ParameterKeys.NAME, name);
233 private SimpleRequestBuilder addParameterInt(String parameterKey, String parameterValue) {
235 if (parameterKey == null) {
236 throw new IllegalArgumentException("parameterKey is null");
238 if (parameterValue != null) {
239 if (!parameterIsAdded) {
240 parameterIsAdded = true;
241 request = request + "?" + parameterKey + "=" + parameterValue;
243 request = request + "&" + parameterKey + "=" + parameterValue;
251 * Returns the request string.
253 * @return request string
254 * @throws IllegalArgumentException if no class or function is added.
256 public String buildRequestString() throws IllegalArgumentException {
257 String request = builder.buildRequestStringInt();
262 private String buildRequestStringInt() {
263 return allRight() ? request : null;
266 private boolean allRight() {
267 if (!classIsChosen) {
268 throw new IllegalArgumentException(ExeptionConstants.NO_CLASS_ADDED);
270 if (!functionIsChosen) {
271 throw new IllegalArgumentException(ExeptionConstants.NO_FUNCTION);
277 * Convert an {@link Object} to a {@link String} or null, if the obj was null or it was a negative {@link Number}.
279 * @param obj can be null
280 * @return the {@link String} or null
282 public static String objectToString(Object obj) {
286 if (obj instanceof DSID id) {
287 return id.getValue();
289 if (obj instanceof Number number) {
290 return number.intValue() > -1 ? obj.toString() : null;
292 return obj.toString();
298 * @see java.lang.Object#equals()
300 public boolean equals(SimpleRequestBuilder builder) {
301 return this.request.contains(builder.request);