Search in sources :

Example 11 with ResourceModel

use of org.eclipse.leshan.core.model.ResourceModel in project leshan by eclipse.

the class LwM2mNodeJsonDecoder method getResourceType.

public static Type getResourceType(LwM2mPath rscPath, LwM2mModel model, JsonArrayEntry resourceElt) {
    // Use model type in priority
    ResourceModel rscDesc = model.getResourceModel(rscPath.getObjectId(), rscPath.getResourceId());
    if (rscDesc != null && rscDesc.type != null)
        return rscDesc.type;
    // Then json type
    if (resourceElt != null) {
        Type type = resourceElt.getType();
        if (type != null)
            return type;
    }
    // Else use String as default
    LOG.trace("unknown type for resource use string as default: {}", rscPath);
    return Type.STRING;
}
Also used : Type(org.eclipse.leshan.core.model.ResourceModel.Type) ResourceModel(org.eclipse.leshan.core.model.ResourceModel)

Example 12 with ResourceModel

use of org.eclipse.leshan.core.model.ResourceModel in project leshan by eclipse.

the class LwM2mNodeTlvDecoder method parseTlv.

@SuppressWarnings("unchecked")
private static <T extends LwM2mNode> T parseTlv(Tlv[] tlvs, LwM2mPath path, LwM2mModel model, Class<T> nodeClass) throws CodecException {
    LOG.trace("Parsing TLV content for path {}: {}", path, tlvs);
    // Object
    if (nodeClass == LwM2mObject.class) {
        List<LwM2mObjectInstance> instances = new ArrayList<>();
        // is it an array of TLV resources?
        if (// 
        tlvs.length > 0 && (tlvs[0].getType() == TlvType.MULTIPLE_RESOURCE || tlvs[0].getType() == TlvType.RESOURCE_VALUE)) {
            ObjectModel oModel = model.getObjectModel(path.getObjectId());
            if (oModel == null) {
                LOG.warn("No model for object {}. The tlv is decoded assuming this is a single instance object", path.getObjectId());
                instances.add(parseObjectInstanceTlv(tlvs, path.getObjectId(), 0, model));
            } else if (!oModel.multiple) {
                instances.add(parseObjectInstanceTlv(tlvs, path.getObjectId(), 0, model));
            } else {
                throw new CodecException("Object instance TLV is mandatory for multiple instances object [path:%s]", path);
            }
        } else {
            for (Tlv tlv : tlvs) {
                if (tlv.getType() != TlvType.OBJECT_INSTANCE)
                    throw new CodecException("Expected TLV of type OBJECT_INSTANCE but was %s  [path:%s]", tlv.getType().name(), path);
                instances.add(parseObjectInstanceTlv(tlv.getChildren(), path.getObjectId(), tlv.getIdentifier(), model));
            }
        }
        return (T) new LwM2mObject(path.getObjectId(), instances);
    } else // Object instance
    if (nodeClass == LwM2mObjectInstance.class) {
        if (tlvs.length == 1 && tlvs[0].getType() == TlvType.OBJECT_INSTANCE) {
            if (path.isObjectInstance() && tlvs[0].getIdentifier() != path.getObjectInstanceId()) {
                throw new CodecException("Id conflict between path [%s] and instance TLV [%d]", path, tlvs[0].getIdentifier());
            }
            // object instance TLV
            return (T) parseObjectInstanceTlv(tlvs[0].getChildren(), path.getObjectId(), tlvs[0].getIdentifier(), model);
        } else {
            // array of TLV resources
            // try to retrieve the instanceId from the path or the model
            Integer instanceId = path.getObjectInstanceId();
            if (instanceId == null) {
                // single instance object?
                ObjectModel oModel = model.getObjectModel(path.getObjectId());
                if (oModel != null && !oModel.multiple) {
                    instanceId = 0;
                } else {
                    instanceId = LwM2mObjectInstance.UNDEFINED;
                }
            }
            return (T) parseObjectInstanceTlv(tlvs, path.getObjectId(), instanceId, model);
        }
    } else // Resource
    if (nodeClass == LwM2mResource.class) {
        ResourceModel resourceModel = model.getResourceModel(path.getObjectId(), path.getResourceId());
        if (tlvs.length == 0 && resourceModel != null && !resourceModel.multiple) {
            // else we consider this is a multi-instance resource
            throw new CodecException("TLV payload is mandatory for single resource %s", path);
        } else if (tlvs.length == 1 && tlvs[0].getType() != TlvType.RESOURCE_INSTANCE) {
            if (path.isResource() && path.getResourceId() != tlvs[0].getIdentifier()) {
                throw new CodecException("Id conflict between path [%s] and resource TLV [%s]", path, tlvs[0].getIdentifier());
            }
            return (T) parseResourceTlv(tlvs[0], path.getObjectId(), path.getObjectInstanceId(), model);
        } else {
            Type expectedRscType = getResourceType(path, model);
            return (T) LwM2mMultipleResource.newResource(path.getResourceId(), parseTlvValues(tlvs, expectedRscType, path), expectedRscType);
        }
    } else {
        throw new IllegalArgumentException("invalid node class: " + nodeClass);
    }
}
Also used : LwM2mObjectInstance(org.eclipse.leshan.core.node.LwM2mObjectInstance) TlvType(org.eclipse.leshan.tlv.Tlv.TlvType) Type(org.eclipse.leshan.core.model.ResourceModel.Type) ObjectModel(org.eclipse.leshan.core.model.ObjectModel) ArrayList(java.util.ArrayList) LwM2mObject(org.eclipse.leshan.core.node.LwM2mObject) ResourceModel(org.eclipse.leshan.core.model.ResourceModel) CodecException(org.eclipse.leshan.core.node.codec.CodecException) Tlv(org.eclipse.leshan.tlv.Tlv)

Aggregations

ResourceModel (org.eclipse.leshan.core.model.ResourceModel)12 ArrayList (java.util.ArrayList)4 Type (org.eclipse.leshan.core.model.ResourceModel.Type)4 LwM2mPath (org.eclipse.leshan.core.node.LwM2mPath)4 ObjectModel (org.eclipse.leshan.core.model.ObjectModel)3 CodecException (org.eclipse.leshan.core.node.codec.CodecException)3 Link (org.eclipse.leshan.Link)2 LwM2mObject (org.eclipse.leshan.core.node.LwM2mObject)2 LwM2mObjectInstance (org.eclipse.leshan.core.node.LwM2mObjectInstance)2 LwM2mResource (org.eclipse.leshan.core.node.LwM2mResource)2 JsonArray (com.eclipsesource.json.JsonArray)1 JsonObject (com.eclipsesource.json.JsonObject)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 SortedMap (java.util.SortedMap)1 TreeMap (java.util.TreeMap)1 LwM2mModel (org.eclipse.leshan.core.model.LwM2mModel)1 Operations (org.eclipse.leshan.core.model.ResourceModel.Operations)1 JsonArrayEntry (org.eclipse.leshan.json.JsonArrayEntry)1 JsonRootObject (org.eclipse.leshan.json.JsonRootObject)1