2016-07-20 20:57:04 +02:00
|
|
|
/**
|
|
|
|
*
|
2021-01-28 22:05:47 +01:00
|
|
|
* Copyright © 2016-2021 Florian Schmaus
|
2016-07-20 20:57:04 +02:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
package org.jivesoftware.smackx.iot.data.provider;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.text.ParseException;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
2019-02-15 23:21:30 +01:00
|
|
|
import org.jivesoftware.smack.packet.XmlEnvironment;
|
2016-07-20 20:57:04 +02:00
|
|
|
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
|
|
|
import org.jivesoftware.smack.util.ParserUtils;
|
2019-05-06 22:06:13 +02:00
|
|
|
import org.jivesoftware.smack.xml.XmlPullParser;
|
|
|
|
import org.jivesoftware.smack.xml.XmlPullParserException;
|
2017-06-14 17:12:43 +02:00
|
|
|
|
2016-07-20 20:57:04 +02:00
|
|
|
import org.jivesoftware.smackx.iot.data.element.IoTDataField;
|
|
|
|
import org.jivesoftware.smackx.iot.data.element.IoTFieldsExtension;
|
|
|
|
import org.jivesoftware.smackx.iot.data.element.NodeElement;
|
|
|
|
import org.jivesoftware.smackx.iot.data.element.TimestampElement;
|
|
|
|
import org.jivesoftware.smackx.iot.element.NodeInfo;
|
|
|
|
import org.jivesoftware.smackx.iot.parser.NodeInfoParser;
|
2017-06-14 17:12:43 +02:00
|
|
|
|
2016-07-20 20:57:04 +02:00
|
|
|
import org.jxmpp.util.XmppDateTime;
|
|
|
|
|
|
|
|
public class IoTFieldsExtensionProvider extends ExtensionElementProvider<IoTFieldsExtension> {
|
|
|
|
|
|
|
|
private static final Logger LOGGER = Logger.getLogger(IoTFieldsExtensionProvider.class.getName());
|
|
|
|
|
|
|
|
@Override
|
2021-01-28 22:05:47 +01:00
|
|
|
public IoTFieldsExtension parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment)
|
|
|
|
throws IOException, XmlPullParserException, ParseException {
|
2016-07-20 20:57:04 +02:00
|
|
|
int seqNr = ParserUtils.getIntegerAttributeOrThrow(parser, "seqnr", "IoT data request <accepted/> without sequence number");
|
|
|
|
boolean done = ParserUtils.getBooleanAttribute(parser, "done", false);
|
|
|
|
List<NodeElement> nodes = new ArrayList<>();
|
|
|
|
outerloop: while (true) {
|
2019-05-06 22:06:13 +02:00
|
|
|
final XmlPullParser.Event eventType = parser.next();
|
2016-07-20 20:57:04 +02:00
|
|
|
final String name = parser.getName();
|
|
|
|
switch (eventType) {
|
2019-05-06 22:06:13 +02:00
|
|
|
case START_ELEMENT:
|
2016-07-20 20:57:04 +02:00
|
|
|
switch (name) {
|
|
|
|
case NodeElement.ELEMENT:
|
|
|
|
NodeElement node = parseNode(parser);
|
|
|
|
nodes.add(node);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
2019-05-06 22:06:13 +02:00
|
|
|
case END_ELEMENT:
|
2016-07-20 20:57:04 +02:00
|
|
|
if (parser.getDepth() == initialDepth) {
|
|
|
|
break outerloop;
|
|
|
|
}
|
|
|
|
break;
|
2019-05-06 22:06:13 +02:00
|
|
|
default:
|
|
|
|
// Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
|
|
|
|
break;
|
2016-07-20 20:57:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return new IoTFieldsExtension(seqNr, done, nodes);
|
|
|
|
}
|
|
|
|
|
2021-01-28 22:05:47 +01:00
|
|
|
public NodeElement parseNode(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
|
2016-07-20 20:57:04 +02:00
|
|
|
final int initialDepth = parser.getDepth();
|
|
|
|
final NodeInfo nodeInfo = NodeInfoParser.parse(parser);
|
|
|
|
List<TimestampElement> timestampElements = new ArrayList<>();
|
|
|
|
outerloop: while (true) {
|
2019-05-06 22:06:13 +02:00
|
|
|
final XmlPullParser.Event eventType = parser.next();
|
2016-07-20 20:57:04 +02:00
|
|
|
final String name = parser.getName();
|
|
|
|
switch (eventType) {
|
2019-05-06 22:06:13 +02:00
|
|
|
case START_ELEMENT:
|
2016-07-20 20:57:04 +02:00
|
|
|
switch (name){
|
|
|
|
case TimestampElement.ELEMENT:
|
|
|
|
TimestampElement timestampElement = parseTimestampElement(parser);
|
|
|
|
timestampElements.add(timestampElement);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
2019-05-06 22:06:13 +02:00
|
|
|
case END_ELEMENT:
|
2016-07-20 20:57:04 +02:00
|
|
|
if (parser.getDepth() == initialDepth) {
|
|
|
|
break outerloop;
|
|
|
|
}
|
|
|
|
break;
|
2019-05-06 22:06:13 +02:00
|
|
|
default:
|
|
|
|
// Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
|
|
|
|
break;
|
2016-07-20 20:57:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return new NodeElement(nodeInfo, timestampElements);
|
|
|
|
}
|
|
|
|
|
2021-01-28 22:05:47 +01:00
|
|
|
public TimestampElement parseTimestampElement(XmlPullParser parser)
|
|
|
|
throws XmlPullParserException, IOException, ParseException {
|
2016-07-20 20:57:04 +02:00
|
|
|
final int initialDepth = parser.getDepth();
|
|
|
|
final String dateString = parser.getAttributeValue(null, "value");
|
2021-01-28 22:05:47 +01:00
|
|
|
Date date = XmppDateTime.parseDate(dateString);
|
2016-07-20 20:57:04 +02:00
|
|
|
List<IoTDataField> fields = new ArrayList<>();
|
|
|
|
outerloop: while (true) {
|
2019-05-06 22:06:13 +02:00
|
|
|
final XmlPullParser.Event eventType = parser.next();
|
2016-07-20 20:57:04 +02:00
|
|
|
final String name = parser.getName();
|
|
|
|
switch (eventType) {
|
2019-05-06 22:06:13 +02:00
|
|
|
case START_ELEMENT:
|
2016-07-20 20:57:04 +02:00
|
|
|
IoTDataField field = null;
|
|
|
|
final String fieldName = parser.getAttributeValue(null, "name");
|
|
|
|
final String fieldValue = parser.getAttributeValue(null, "value");
|
|
|
|
switch (name) {
|
|
|
|
case "int": {
|
|
|
|
int value = Integer.parseInt(fieldValue);
|
|
|
|
field = new IoTDataField.IntField(fieldName, value);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "boolean": {
|
|
|
|
boolean value = Boolean.parseBoolean(fieldValue);
|
|
|
|
field = new IoTDataField.BooleanField(fieldName, value);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
LOGGER.warning("IoT Data field type '" + name + "' not implement yet. Ignoring.");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (field != null) {
|
|
|
|
fields.add(field);
|
|
|
|
}
|
|
|
|
break;
|
2019-05-06 22:06:13 +02:00
|
|
|
case END_ELEMENT:
|
2016-07-20 20:57:04 +02:00
|
|
|
if (parser.getDepth() == initialDepth) {
|
|
|
|
break outerloop;
|
|
|
|
}
|
|
|
|
break;
|
2019-05-06 22:06:13 +02:00
|
|
|
default:
|
|
|
|
// Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
|
|
|
|
break;
|
2016-07-20 20:57:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return new TimestampElement(date, fields);
|
|
|
|
}
|
|
|
|
}
|