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.ecovacs.internal.api.commands;
15 import java.io.StringWriter;
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;
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;
35 import com.google.gson.Gson;
36 import com.google.gson.JsonElement;
37 import com.google.gson.JsonObject;
40 * @author Danny Baumann - Initial contribution
43 public abstract class IotDeviceCommand<RESPONSETYPE> {
44 protected IotDeviceCommand() {
47 public abstract String getName(ProtocolVersion version);
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));
54 ctl.setAttribute("id", id);
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", "");
65 public final JsonElement getJsonPayload(ProtocolVersion version, Gson gson) {
66 JsonObject result = new JsonObject();
67 result.add("header", gson.toJsonTree(new JsonPayloadHeader()));
69 JsonElement args = getJsonPayloadArgs(version);
71 JsonObject body = new JsonObject();
72 body.add("data", args);
73 result.add("body", body);
78 protected @Nullable JsonElement getJsonPayloadArgs(ProtocolVersion version) {
82 protected void applyXmlPayload(Document doc, Element ctl) {
85 public abstract RESPONSETYPE convertResponse(AbstractPortalIotCommandResponse response, ProtocolVersion version,
86 Gson gson) throws DataParsingException;