public static Type getResourceType(LwM2mPath rscPath, LwM2mModel model) throws CodecException { ResourceModel rscDesc = model.getResourceModel(rscPath.getObjectId(), rscPath.getResourceId()); if (rscDesc == null || rscDesc.type == null) { LOG.trace("unknown type for resource : {}", rscPath); // no resource description... opaque return Type.OPAQUE; } else { return rscDesc.type; } } }
public static LwM2mNode decode(byte[] content, LwM2mPath path, LwM2mModel model) throws CodecException { if (!path.isResource()) throw new CodecException("Invalid path %s : TextDecoder decodes resource only", path); ResourceModel rDesc = model.getResourceModel(path.getObjectId(), path.getResourceId()); String strValue = content != null ? new String(content, StandardCharsets.UTF_8) : ""; if (rDesc != null && rDesc.type != null) { return LwM2mSingleResource.newResource(path.getResourceId(), parseTextValue(strValue, rDesc.type, path), rDesc.type); } else { // unknown resource, returning a default string value return LwM2mSingleResource.newStringResource(path.getResourceId(), strValue); } }
/** * The string representation of the path: /{Object ID}/{ObjectInstance ID}/{Resource ID}/{ResourceInstance ID} */ @Override public String toString() { StringBuilder b = new StringBuilder(); b.append("/"); if (getObjectId() != null) { b.append(getObjectId()); if (getObjectInstanceId() != null) { b.append("/").append(getObjectInstanceId()); if (getResourceId() != null) { b.append("/").append(getResourceId()); if (getResourceInstanceId() != null) { b.append("/").append(getResourceInstanceId()); } } } } return b.toString(); }
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; } }
public static LwM2mNode decode(byte[] content, LwM2mPath path, LwM2mModel model) throws CodecException { if (!path.isResource()) throw new CodecException("Invalid path %s : OpaqueDecoder decodes resource only", path); ResourceModel desc = model.getResourceModel(path.getObjectId(), path.getResourceId()); if (desc != null && desc.type != Type.OPAQUE) { throw new CodecException( "Invalid content format [%s] for path [%s], OPAQUE can only be used for single OPAQUE resource", desc.type, path); } return LwM2mSingleResource.newBinaryResource(path.getResourceId(), content); }
@Override protected ExecuteResponse doExecute(ExecuteRequest request) { LwM2mPath path = request.getPath(); LwM2mInstanceEnabler instance = instances.get(path.getObjectInstanceId()); if (instance == null) { return ExecuteResponse.notFound(); } return instance.execute(path.getResourceId(), request.getParameters()); }
@Override protected ReadResponse doRead(ServerIdentity identity, ReadRequest request) { LwM2mPath path = request.getPath(); // Manage Object case if (path.isObject()) { List<LwM2mObjectInstance> lwM2mObjectInstances = new ArrayList<>(); for (Entry<Integer, LwM2mInstanceEnabler> entry : instances.entrySet()) { lwM2mObjectInstances.add(getLwM2mObjectInstance(entry.getKey(), entry.getValue(), identity, false)); } return ReadResponse.success(new LwM2mObject(getId(), lwM2mObjectInstances)); } // Manage Instance case LwM2mInstanceEnabler instance = instances.get(path.getObjectInstanceId()); if (instance == null) return ReadResponse.notFound(); if (path.getResourceId() == null) { return ReadResponse.success(getLwM2mObjectInstance(path.getObjectInstanceId(), instance, identity, false)); } // Manage Resource case return instance.read(path.getResourceId()); }
@Override protected ObserveResponse doObserve(final ServerIdentity identity, final ObserveRequest request) { final LwM2mPath path = request.getPath(); // Manage Object case if (path.isObject()) { List<LwM2mObjectInstance> lwM2mObjectInstances = new ArrayList<>(); for (Entry<Integer, LwM2mInstanceEnabler> entry : instances.entrySet()) { lwM2mObjectInstances.add(getLwM2mObjectInstance(entry.getKey(), entry.getValue(), identity, true)); } return ObserveResponse.success(new LwM2mObject(getId(), lwM2mObjectInstances)); } // Manage Instance case final LwM2mInstanceEnabler instance = instances.get(path.getObjectInstanceId()); if (instance == null) return ObserveResponse.notFound(); if (path.getResourceId() == null) { return ObserveResponse .success(getLwM2mObjectInstance(path.getObjectInstanceId(), instance, identity, true)); } // Manage Resource case return instance.observe(path.getResourceId()); }
private static LwM2mPath extractAndValidateBaseName(JsonRootObject jsonObject, LwM2mPath requestPath) throws CodecException { // Check baseName is valid if (jsonObject.getBaseName() != null && !jsonObject.getBaseName().isEmpty()) { LwM2mPath bnPath = new LwM2mPath(jsonObject.getBaseName()); // check returned base name path is under requested path if (requestPath.getObjectId() != null && bnPath.getObjectId() != null) { if (!bnPath.getObjectId().equals(requestPath.getObjectId())) { throw new CodecException("Basename path [%s] does not match requested path [%s].", bnPath, requestPath); } if (requestPath.getObjectInstanceId() != null && bnPath.getObjectInstanceId() != null) { if (!bnPath.getObjectInstanceId().equals(requestPath.getObjectInstanceId())) { throw new CodecException("Basename path [%s] does not match requested path [%s].", bnPath, requestPath); } if (requestPath.getResourceId() != null && bnPath.getResourceId() != null) { if (!bnPath.getResourceId().equals(requestPath.getResourceId())) { throw new CodecException("Basename path [%s] does not match requested path [%s].", bnPath, requestPath); } } } } return bnPath; } return null; }
nodePath.getResourceId()); Map<Integer, JsonArrayEntry> multiResource = multiResourceMap.get(resourcePath); if (multiResource == null) { LwM2mResource res = LwM2mSingleResource.newResource(nodePath.getResourceId(), parseJsonValue(resourceElt.getResourceValue(), expectedType, nodePath), expectedType); LwM2mResource previousRes = lwM2mResourceMap.put(nodePath.getResourceId(), res); if (previousRes != null) { throw new CodecException("2 RESOURCE nodes (%s,%s) with the same identifier %d for path %s", parseJsonValue(e.getValue().getResourceValue(), expectedType, resourcePath)); LwM2mResource resource = LwM2mMultipleResource.newResource(resourcePath.getResourceId(), values, expectedType); LwM2mResource previousRes = lwM2mResourceMap.put(resourcePath.getResourceId(), resource); if (previousRes != null) { throw new CodecException("2 RESOURCE nodes (%s,%s) with the same identifier %d for path %s", ResourceModel resourceModel = model.getResourceModel(baseName.getObjectId(), baseName.getResourceId()); lwM2mResourceMap.put(baseName.getResourceId(), LwM2mMultipleResource .newResource(baseName.getResourceId(), new HashMap<Integer, Object>(), resourceType));
private final void setTarget(Request coapRequest, LwM2mPath path) { EndpointContext context = EndpointContextUtil.extractContext(destination); coapRequest.setDestinationContext(context); // root path if (rootPath != null) { for (String rootPathPart : rootPath.split("/")) { if (!StringUtils.isEmpty(rootPathPart)) { coapRequest.getOptions().addUriPath(rootPathPart); } } } // objectId if (path.getObjectId() != null) { coapRequest.getOptions().addUriPath(Integer.toString(path.getObjectId())); } // objectInstanceId if (path.getObjectInstanceId() == null) { if (path.getResourceId() != null) { coapRequest.getOptions().addUriPath("0"); // default instanceId } } else { coapRequest.getOptions().addUriPath(Integer.toString(path.getObjectInstanceId())); } // resourceId if (path.getResourceId() != null) { coapRequest.getOptions().addUriPath(Integer.toString(path.getResourceId())); } }
private final void setTarget(Request coapRequest, Client client, LwM2mPath path) { coapRequest.setDestination(client.getAddress()); coapRequest.setDestinationPort(client.getPort()); // root path if (client.getRootPath() != null) { for (String rootPath : client.getRootPath().split("/")) { if (!StringUtils.isEmpty(rootPath)) { coapRequest.getOptions().addUriPath(rootPath); } } } // objectId coapRequest.getOptions().addUriPath(Integer.toString(path.getObjectId())); // objectInstanceId if (path.getObjectInstanceId() == null) { if (path.getResourceId() != null) { coapRequest.getOptions().addUriPath("0"); // default instanceId } } else { coapRequest.getOptions().addUriPath(Integer.toString(path.getObjectInstanceId())); } // resourceId if (path.getResourceId() != null) { coapRequest.getOptions().addUriPath(Integer.toString(path.getResourceId())); } }
protected DiscoverResponse doDiscover(DiscoverRequest request) { LwM2mPath path = request.getPath(); if (path.isObject()) { // Manage discover on object Link[] ObjectLinks = LinkFormatHelper.getObjectDescription(this, null); return DiscoverResponse.success(ObjectLinks); } else if (path.isObjectInstance()) { // Manage discover on instance if (!getAvailableInstanceIds().contains(path.getObjectInstanceId())) return DiscoverResponse.notFound(); Link[] instanceLink = LinkFormatHelper.getInstanceDescription(this, path.getObjectInstanceId(), null); return DiscoverResponse.success(instanceLink); } else if (path.isResource()) { // Manage discover on resource if (!getAvailableInstanceIds().contains(path.getObjectInstanceId())) return DiscoverResponse.notFound(); ResourceModel resourceModel = getObjectModel().resources.get(path.getResourceId()); if (resourceModel == null) return DiscoverResponse.notFound(); if (!getAvailableResourceIds(path.getObjectInstanceId()).contains(path.getResourceId())) return DiscoverResponse.notFound(); Link resourceLink = LinkFormatHelper.getResourceDescription(this, path.getObjectInstanceId(), path.getResourceId(), null); return DiscoverResponse.success(new Link[] { resourceLink }); } return DiscoverResponse.badRequest(null); }
@Override public synchronized ObserveResponse observe(ServerIdentity identity, ObserveRequest request) { LwM2mPath path = request.getPath(); // observe is not supported for bootstrap if (identity.isLwm2mBootstrapServer()) return ObserveResponse.methodNotAllowed(); if (!identity.isSystem()) { // observe or read of the security object is forbidden if (id == LwM2mId.SECURITY) return ObserveResponse.notFound(); // check if the resource is readable. if (path.isResource()) { ResourceModel resourceModel = objectModel.resources.get(path.getResourceId()); if (resourceModel != null && !resourceModel.operations.isReadable()) return ObserveResponse.methodNotAllowed(); } } return doObserve(identity, request); }
return instance.write(path.getResourceId(), (LwM2mResource) request.getNode());
@Override public synchronized ExecuteResponse execute(ServerIdentity identity, ExecuteRequest request) { LwM2mPath path = request.getPath(); // execute is not supported for bootstrap if (identity.isLwm2mBootstrapServer()) { return ExecuteResponse.methodNotAllowed(); } // execute on security object is forbidden if (id == LwM2mId.SECURITY) { return ExecuteResponse.notFound(); } // only resource could be executed if (!path.isResource()) { return ExecuteResponse.badRequest(null); } // check if the resource is writable ResourceModel resourceModel = objectModel.resources.get(path.getResourceId()); if (resourceModel != null && !resourceModel.operations.isExecutable()) { return ExecuteResponse.methodNotAllowed(); } return doExecute(request); }
ResourceModel resourceModel = objectModel.resources.get(path.getResourceId()); if (resourceModel != null && !resourceModel.operations.isWritable()) { return WriteResponse.methodNotAllowed();
@Override public synchronized ReadResponse read(ServerIdentity identity, ReadRequest request) { LwM2mPath path = request.getPath(); // read is not supported for bootstrap if (identity.isLwm2mBootstrapServer()) { return ReadResponse.methodNotAllowed(); } if (!identity.isSystem()) { // read the security object is forbidden if (id == LwM2mId.SECURITY) { return ReadResponse.notFound(); } // check if the resource is readable. if (path.isResource()) { ResourceModel resourceModel = objectModel.resources.get(path.getResourceId()); if (resourceModel != null && !resourceModel.operations.isReadable()) { return ReadResponse.methodNotAllowed(); } } } return doRead(identity, request); // TODO we could do a validation of response.getContent by comparing with the spec. }
new LwM2mObjectInstance(path.getObjectInstanceId(), resource))); } else { instanceEnabler.write(path.getResourceId(), resource);
ResourceModel resourceModel = model.getResourceModel(path.getObjectId(), path.getResourceId()); if (tlvs.length == 0 && resourceModel != null && !resourceModel.multiple) { tlv.getType().name(), path); if (path.isResource() && path.getResourceId() != tlv.getIdentifier()) { throw new CodecException("Id conflict between path [%s] and resource TLV [resource id=%s]", path, tlv.getIdentifier()); } else { Type expectedRscType = getResourceType(path, model); return (T) LwM2mMultipleResource.newResource(path.getResourceId(), parseTlvValues(tlvs, expectedRscType, path), expectedRscType);