]> git.basschouten.com Git - openhab-addons.git/blob
611b2bdd7a005710899b17da6a552de40170dc73
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.ecovacs.internal.api.commands;
14
15 import java.io.StringWriter;
16
17 import javax.xml.parsers.DocumentBuilderFactory;
18 import javax.xml.parsers.ParserConfigurationException;
19 import javax.xml.transform.OutputKeys;
20 import javax.xml.transform.Transformer;
21 import javax.xml.transform.TransformerException;
22 import javax.xml.transform.TransformerFactory;
23 import javax.xml.transform.dom.DOMSource;
24 import javax.xml.transform.stream.StreamResult;
25
26 import org.eclipse.jdt.annotation.NonNullByDefault;
27 import org.eclipse.jdt.annotation.Nullable;
28 import org.openhab.binding.ecovacs.internal.api.impl.ProtocolVersion;
29 import org.openhab.binding.ecovacs.internal.api.impl.dto.request.portal.PortalIotCommandRequest.JsonPayloadHeader;
30 import org.openhab.binding.ecovacs.internal.api.impl.dto.response.portal.AbstractPortalIotCommandResponse;
31 import org.openhab.binding.ecovacs.internal.api.util.DataParsingException;
32 import org.w3c.dom.Document;
33 import org.w3c.dom.Element;
34
35 import com.google.gson.Gson;
36 import com.google.gson.JsonElement;
37 import com.google.gson.JsonObject;
38
39 /**
40  * @author Danny Baumann - Initial contribution
41  */
42 @NonNullByDefault
43 public abstract class IotDeviceCommand<RESPONSETYPE> {
44     protected IotDeviceCommand() {
45     }
46
47     public abstract String getName(ProtocolVersion version);
48
49     public final String getXmlPayload(@Nullable String id) throws ParserConfigurationException, TransformerException {
50         Document xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
51         Element ctl = xmlDoc.createElement("ctl");
52         ctl.setAttribute("td", getName(ProtocolVersion.XML));
53         if (id != null) {
54             ctl.setAttribute("id", id);
55         }
56         applyXmlPayload(xmlDoc, ctl);
57         xmlDoc.appendChild(ctl);
58         Transformer tf = TransformerFactory.newInstance().newTransformer();
59         tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
60         StringWriter writer = new StringWriter();
61         tf.transform(new DOMSource(xmlDoc), new StreamResult(writer));
62         return writer.getBuffer().toString().replaceAll("\n|\r", "");
63     }
64
65     public final JsonElement getJsonPayload(ProtocolVersion version, Gson gson) {
66         JsonObject result = new JsonObject();
67         result.add("header", gson.toJsonTree(new JsonPayloadHeader()));
68         @Nullable
69         JsonElement args = getJsonPayloadArgs(version);
70         if (args != null) {
71             JsonObject body = new JsonObject();
72             body.add("data", args);
73             result.add("body", body);
74         }
75         return result;
76     }
77
78     protected @Nullable JsonElement getJsonPayloadArgs(ProtocolVersion version) {
79         return null;
80     }
81
82     protected void applyXmlPayload(Document doc, Element ctl) {
83     }
84
85     public abstract RESPONSETYPE convertResponse(AbstractPortalIotCommandResponse response, ProtocolVersion version,
86             Gson gson) throws DataParsingException;
87 }