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.tapocontrol.internal.helpers;
15 import static org.openhab.binding.tapocontrol.internal.helpers.TapoUtils.*;
17 import java.lang.reflect.Field;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.openhab.binding.tapocontrol.internal.constants.TapoErrorConstants;
23 import com.google.gson.Gson;
24 import com.google.gson.JsonObject;
27 * Class Handling TapoErrors
29 * @author Christian Wild - Initial contribution
32 public class TapoErrorHandler extends Exception {
33 private static final long serialVersionUID = 0L;
34 private Integer errorCode = 0;
35 private String errorMessage = "";
36 private String infoMessage = "";
37 private Gson gson = new Gson();
43 public TapoErrorHandler() {
49 * @param errorCode error code (number)
51 public TapoErrorHandler(Integer errorCode) {
52 raiseError(errorCode);
58 * @param errorCode error code (number)
59 * @param infoMessage optional info-message
61 public TapoErrorHandler(Integer errorCode, String infoMessage) {
62 raiseError(errorCode, infoMessage);
68 * @param exception Exception
70 public TapoErrorHandler(Exception ex) {
77 * @param exception Exception
78 * @param infoMessage optional info-message
80 public TapoErrorHandler(Exception ex, String infoMessage) {
81 raiseError(ex, infoMessage);
84 /***********************************
88 ************************************/
93 * @param errCode error Number (or constant ERR_CODE )
94 * @return error-message if set constant ERR_CODE_MSG. if not name of ERR_CODE is returned
96 private String getErrorMessage(Integer errCode) {
97 Field[] fields = TapoErrorConstants.class.getDeclaredFields();
98 /* loop ErrorConstants and search for code in value */
99 for (Field f : fields) {
100 String constName = f.getName();
102 Integer val = (Integer) f.get(this);
103 if (val != null && val.equals(errCode)) {
104 Field constantName = TapoErrorConstants.class.getDeclaredField(constName + "_MSG");
105 String msg = getValueOrDefault(constantName.get(null), "").toString();
106 if (msg.length() > 2) {
109 return infoMessage + " (" + constName + ")";
112 } catch (Exception e) {
116 return infoMessage + " (" + errCode.toString() + ")";
119 /***********************************
123 ************************************/
128 * @param errorCode error code (number)
130 public void raiseError(Integer errorCode) {
131 raiseError(errorCode, "");
137 * @param errorCode error code (number)
138 * @param infoMessage optional info-message
140 public void raiseError(Integer errorCode, String infoMessage) {
141 this.errorCode = errorCode;
142 this.infoMessage = infoMessage;
143 this.errorMessage = getErrorMessage(errorCode);
149 * @param exception Exception
151 public void raiseError(Exception ex) {
158 * @param exception Exception
159 * @param infoMessage optional info-message
161 public void raiseError(Exception ex, String infoMessage) {
162 this.errorCode = ex.hashCode();
163 this.infoMessage = infoMessage;
164 this.errorMessage = getValueOrDefault(ex.getMessage(), ex.toString());
168 * Take over tapoError
172 public void set(TapoErrorHandler tapoError) {
173 this.errorCode = tapoError.getNumber();
174 this.infoMessage = tapoError.getExtendedInfo();
175 this.errorMessage = getErrorMessage(this.errorCode);
181 public void reset() {
183 this.errorMessage = "";
184 this.infoMessage = "";
187 /***********************************
191 ************************************/
200 public String getMessage() {
201 return this.errorMessage;
205 * Get Error Message directly by error-number
208 * @return error message
210 public String getMessage(Integer errorCode) {
211 return getErrorMessage(errorCode);
217 * @return error code (integer)
219 public Integer getCode() {
220 return this.errorCode;
226 * @return error extended info
228 public String getExtendedInfo() {
229 return this.infoMessage;
235 * @return error number
237 public Integer getNumber() {
238 return this.errorCode;
244 * @return true if has error
246 public Boolean hasError() {
247 return this.errorCode != 0;
251 * Get JSON-Object with errror
253 * @return JsonObject with error-informations
255 public JsonObject getJson() {
257 json = gson.fromJson("{'error_code': '" + errorCode + "', 'error_message':'" + errorMessage + "'}",
260 json = new JsonObject();