Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DiscoverResponse represents links based on its existing resources #531

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,8 @@
import java.util.HashSet;
import java.util.Set;

import org.eclipse.leshan.Link;
import org.eclipse.leshan.LwM2mId;
import org.eclipse.leshan.client.request.ServerIdentity;
import org.eclipse.leshan.client.util.LinkFormatHelper;
import org.eclipse.leshan.core.model.ObjectModel;
import org.eclipse.leshan.core.model.ResourceModel;
import org.eclipse.leshan.core.node.LwM2mObjectInstance;
Expand Down Expand Up @@ -290,38 +288,12 @@ public synchronized DiscoverResponse discover(ServerIdentity identity, DiscoverR
if (id == LwM2mId.SECURITY) {
return DiscoverResponse.notFound();
}

LwM2mPath path = request.getPath();
if (path.isObject()) {

// Manage discover on object
Link[] ObjectLinks = LinkFormatHelper.getObjectDescription(getObjectModel(), 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(getObjectModel(),
path.getObjectInstanceId(), null);
return DiscoverResponse.success(new Link[] { 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();

Link resourceLink = LinkFormatHelper.getResourceDescription(getObjectModel().id,
path.getObjectInstanceId(), resourceModel, null);
return DiscoverResponse.success(new Link[] { resourceLink });
}
return DiscoverResponse.badRequest(null);

return doDiscover(request);
}

protected DiscoverResponse doDiscover(DiscoverRequest request) {
return DiscoverResponse.internalServerError("not implemented");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.leshan.Link;
import org.eclipse.leshan.ResponseCode;
import org.eclipse.leshan.client.request.ServerIdentity;
import org.eclipse.leshan.client.util.LinkFormatHelper;
import org.eclipse.leshan.core.model.ObjectModel;
import org.eclipse.leshan.core.model.ResourceModel;
import org.eclipse.leshan.core.node.LwM2mObject;
Expand All @@ -35,6 +37,7 @@
import org.eclipse.leshan.core.request.BootstrapWriteRequest;
import org.eclipse.leshan.core.request.CreateRequest;
import org.eclipse.leshan.core.request.DeleteRequest;
import org.eclipse.leshan.core.request.DiscoverRequest;
import org.eclipse.leshan.core.request.ExecuteRequest;
import org.eclipse.leshan.core.request.ObserveRequest;
import org.eclipse.leshan.core.request.ReadRequest;
Expand All @@ -43,6 +46,7 @@
import org.eclipse.leshan.core.response.BootstrapWriteResponse;
import org.eclipse.leshan.core.response.CreateResponse;
import org.eclipse.leshan.core.response.DeleteResponse;
import org.eclipse.leshan.core.response.DiscoverResponse;
import org.eclipse.leshan.core.response.ExecuteResponse;
import org.eclipse.leshan.core.response.ObserveResponse;
import org.eclipse.leshan.core.response.ReadResponse;
Expand Down Expand Up @@ -268,6 +272,50 @@ protected ExecuteResponse doExecute(ExecuteRequest request) {
}
return instance.execute(path.getResourceId(), request.getParameters());
}

@Override
protected DiscoverResponse doDiscover(DiscoverRequest request) {
LwM2mPath path = request.getPath();
if (path.isObject()) {

List<LwM2mObjectInstance> objectInstances = new ArrayList<>(instances.size());

for (Entry<Integer, LwM2mInstanceEnabler> instanceEntry : instances.entrySet()) {
objectInstances.add(getLwM2mObjectInstance(instanceEntry.getKey(), instanceEntry.getValue(),
ServerIdentity.SYSTEM, false));
}

// Manage discover on object
Link[] objectLinks = LinkFormatHelper.getObjectDescription(getObjectModel(), objectInstances, null);

return DiscoverResponse.success(objectLinks);
} else if (path.isObjectInstance()) {

// Manage discover on instance
if (!getAvailableInstanceIds().contains(path.getObjectInstanceId()))
return DiscoverResponse.notFound();

Link[] instanceLinks = LinkFormatHelper.getInstanceDescription(getObjectModel(), path.getObjectInstanceId(),
getLwM2mObjectInstance(path.getObjectInstanceId(), instances.get(path.getObjectInstanceId()),
ServerIdentity.SYSTEM, false),
null);
return DiscoverResponse.success(instanceLinks);

} 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();

Link resourceLink = LinkFormatHelper.getResourceDescription(getObjectModel().id,
path.getObjectInstanceId(), resourceModel, null);
return DiscoverResponse.success(new Link[] { resourceLink });
}
return DiscoverResponse.badRequest(null);
}

@Override
protected DeleteResponse doDelete(DeleteRequest request) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package org.eclipse.leshan.client.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
Expand All @@ -29,6 +30,8 @@
import org.eclipse.leshan.core.model.LwM2mModel;
import org.eclipse.leshan.core.model.ObjectModel;
import org.eclipse.leshan.core.model.ResourceModel;
import org.eclipse.leshan.core.node.LwM2mObjectInstance;
import org.eclipse.leshan.core.node.LwM2mResource;
import org.eclipse.leshan.util.StringUtils;

/**
Expand Down Expand Up @@ -82,7 +85,7 @@ public int compare(LwM2mObjectEnabler o1, LwM2mObjectEnabler o2) {
return links.toArray(new Link[] {});
}

public static Link[] getObjectDescription(ObjectModel objectModel, String root) {
public static Link[] getObjectDescription(ObjectModel objectModel, List<LwM2mObjectInstance> objectInstances, String root) {
List<Link> links = new ArrayList<>();

// clean root path
Expand All @@ -93,32 +96,32 @@ public static Link[] getObjectDescription(ObjectModel objectModel, String root)
String objectURL = getPath("/", rootPath, Integer.toString(objectModel.id));
links.add(new Link(objectURL, objectAttributes));

// sort resources
List<ResourceModel> resources = new ArrayList<>(objectModel.resources.values());
Collections.sort(resources, new Comparator<ResourceModel>() {
@Override
public int compare(ResourceModel o1, ResourceModel o2) {
return o1.id - o2.id;
}
});

// create links for resource
for (ResourceModel resourceModel : resources) {
String resourceURL = getPath("/", rootPath, Integer.toString(objectModel.id), "0",
Integer.toString(resourceModel.id));
links.add(new Link(resourceURL));
for (LwM2mObjectInstance instance : objectInstances) {
links.addAll(Arrays.asList(getInstanceDescription(objectModel, instance.getId(), instance, rootPath)));
}

return links.toArray(new Link[] {});
}

public static Link getInstanceDescription(ObjectModel objectModel, int instanceId, String root) {
public static Link[] getInstanceDescription(ObjectModel objectModel, int instanceId,
LwM2mObjectInstance lwM2mObjectInstance, String root) {
List<Link> links = new ArrayList<>();

// clean root path
String rootPath = root == null ? "" : root;

// create link for "instance"
String objectURL = getPath("/", rootPath, Integer.toString(objectModel.id), Integer.toString(instanceId));
return new Link(objectURL);
links.add(new Link(objectURL));

for (ResourceModel resourceModel : objectModel.resources.values()) {
LwM2mResource lwM2mResource = lwM2mObjectInstance.getResource(resourceModel.id);
if (lwM2mResource != null) {
links.add(getResourceDescription(objectModel.id, instanceId, resourceModel, rootPath));
}
}

return links.toArray(new Link[] {});
}

public static Link getResourceDescription(int objectId, int instanceId, ResourceModel resourceModel, String root) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.eclipse.leshan.client.resource.ObjectEnabler;
import org.eclipse.leshan.core.model.ObjectLoader;
import org.eclipse.leshan.core.model.ObjectModel;
import org.eclipse.leshan.core.node.LwM2mObjectInstance;
import org.junit.Test;

public class LinkFormatHelperTest {
Expand All @@ -37,65 +38,66 @@ public class LinkFormatHelperTest {
public void encode_objectModel_to_linkObject_without_root_path() {
ObjectModel locationModel = getObjectModel(6);

Link[] links = LinkFormatHelper.getObjectDescription(locationModel, null);
Link[] links = LinkFormatHelper.getObjectDescription(locationModel,
new ArrayList<LwM2mObjectInstance>(), null);
String strLinks = Link.serialize(links);

assertEquals("</6>, </6/0/0>, </6/0/1>, </6/0/2>, </6/0/3>, </6/0/4>, </6/0/5>, </6/0/6>", strLinks);
assertEquals("</6>", strLinks);
}

@Test
public void encode_objectModel_to_linkObject_with_simple_root_path() {
ObjectModel locationModel = getObjectModel(6);

Link[] links = LinkFormatHelper.getObjectDescription(locationModel, "rp");
Link[] links = LinkFormatHelper.getObjectDescription(locationModel,
new ArrayList<LwM2mObjectInstance>(), "rp");
String strLinks = Link.serialize(links);

assertEquals(
"</rp/6>, </rp/6/0/0>, </rp/6/0/1>, </rp/6/0/2>, </rp/6/0/3>, </rp/6/0/4>, </rp/6/0/5>, </rp/6/0/6>",
strLinks);
assertEquals("</rp/6>", strLinks);
}

@Test
public void encode_objectModel_to_linkObject_with_empty_root_path() {
ObjectModel locationModel = getObjectModel(6);

Link[] links = LinkFormatHelper.getObjectDescription(locationModel, "");
Link[] links = LinkFormatHelper.getObjectDescription(locationModel,
new ArrayList<LwM2mObjectInstance>(), "");
String strLinks = Link.serialize(links);

assertEquals("</6>, </6/0/0>, </6/0/1>, </6/0/2>, </6/0/3>, </6/0/4>, </6/0/5>, </6/0/6>", strLinks);
assertEquals("</6>", strLinks);
}

@Test
public void encode_objectModel_to_linkObject_with_explicit_empty_root_path() {
ObjectModel locationModel = getObjectModel(6);

Link[] links = LinkFormatHelper.getObjectDescription(locationModel, "/");
Link[] links = LinkFormatHelper.getObjectDescription(locationModel,
new ArrayList<LwM2mObjectInstance>(), "/");
String strLinks = Link.serialize(links);

assertEquals("</6>, </6/0/0>, </6/0/1>, </6/0/2>, </6/0/3>, </6/0/4>, </6/0/5>, </6/0/6>", strLinks);
assertEquals("</6>", strLinks);
}

@Test
public void encode_objectModel_to_linkObject_with_version2_0() {
ObjectModel locationModel = getVersionedObjectModel(6, "2.0");

Link[] links = LinkFormatHelper.getObjectDescription(locationModel, "/");
Link[] links = LinkFormatHelper.getObjectDescription(locationModel,
new ArrayList<LwM2mObjectInstance>(), "/");
String strLinks = Link.serialize(links);

assertEquals("</6>;ver=\"2.0\", </6/0/0>, </6/0/1>, </6/0/2>, </6/0/3>, </6/0/4>, </6/0/5>, </6/0/6>",
strLinks);
assertEquals("</6>;ver=\"2.0\"", strLinks);
}

@Test
public void encode_objectModel_to_linkObject_with_explicit_complex_root_path() {
ObjectModel locationModel = getObjectModel(6);

Link[] links = LinkFormatHelper.getObjectDescription(locationModel, "/r/t/");
Link[] links = LinkFormatHelper.getObjectDescription(locationModel,
new ArrayList<LwM2mObjectInstance>(), "/r/t/");
String strLinks = Link.serialize(links);

assertEquals(
"</r/t/6>, </r/t/6/0/0>, </r/t/6/0/1>, </r/t/6/0/2>, </r/t/6/0/3>, </r/t/6/0/4>, </r/t/6/0/5>, </r/t/6/0/6>",
strLinks);
assertEquals("</r/t/6>", strLinks);
}

@Test
Expand Down