Skip to content

Commit 5b351c7

Browse files
committed
Work item 2: Add cloud functionality
1 parent 5359401 commit 5b351c7

35 files changed

+1538
-197
lines changed

otgc/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ android {
3030
minSdkVersion 21
3131
targetSdkVersion 28
3232
versionCode 13
33-
versionName "2.13.0"
33+
versionName "3.0.0"
3434
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
3535

3636
compileOptions {

otgc/src/main/java/org/openconnectivity/otgc/data/repository/CloudRepository.java

+557-2
Large diffs are not rendered by default.

otgc/src/main/java/org/openconnectivity/otgc/data/repository/IotivityRepository.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.iotivity.OCBufferSettings;
2828
import org.iotivity.OCClientResponse;
2929
import org.iotivity.OCCloud;
30+
import org.iotivity.OCCloudContext;
3031
import org.iotivity.OCCoreRes;
3132
import org.iotivity.OCDiscoveryAllHandler;
3233
import org.iotivity.OCDiscoveryFlags;
@@ -354,19 +355,19 @@ public Observable<Device> scanOwnedByOtherDevices() {
354355

355356
public Single<String> getNonSecureEndpoint(Device device) {
356357
return Single.create(emitter -> {
357-
String endpoint = device.getIpv6Host();
358+
String endpoint = device.getIpv6Host() != null ? device.getIpv6Host() : device.getIpv6TcpHost();
358359
if (endpoint == null) {
359-
endpoint = device.getIpv4Host();
360+
endpoint = device.getIpv4Host() != null ? device.getIpv4Host() : device.getIpv4TcpHost();
360361
}
361362
emitter.onSuccess(endpoint);
362363
});
363364
}
364365

365366
public Single<String> getSecureEndpoint(Device device) {
366367
return Single.create(emitter -> {
367-
String endpoint = device.getIpv6SecureHost();
368+
String endpoint = device.getIpv6SecureHost() != null ? device.getIpv6SecureHost() : device.getIpv6TcpSecureHost();
368369
if (endpoint == null) {
369-
endpoint = device.getIpv4SecureHost();
370+
endpoint = device.getIpv4SecureHost() != null ? device.getIpv4SecureHost() : device.getIpv4TcpSecureHost();
370371
}
371372
emitter.onSuccess(endpoint);
372373
});
@@ -777,6 +778,12 @@ private void parseOCRepresentionToCbor(CborEncoder parent, Map<String, Object> v
777778

778779
public void close() {
779780
Timber.d("Calling OCMain.mainShutdown()");
781+
782+
OCCloudContext ctx = OCCloud.getContext(0);
783+
if (ctx != null) {
784+
OCCloud.managerStop(ctx);
785+
}
786+
780787
OCMain.mainShutdown();
781788
OCObt.shutdown();
782789
}

otgc/src/main/java/org/openconnectivity/otgc/domain/model/devicelist/Device.java

+96-16
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,13 @@ public class Device implements Comparable<Device>, Serializable {
4444
private String deviceId;
4545
private transient OcDeviceInfo deviceInfo;
4646
private String ipv6SecureHost;
47+
private String ipv6TcpSecureHost;
4748
private String ipv6Host;
49+
private String ipv6TcpHost;
4850
private String ipv4SecureHost;
51+
private String ipv4TcpSecureHost;
4952
private String ipv4Host;
53+
private String ipv4TcpHost;
5054
private int permits;
5155

5256
public Device() {}
@@ -61,14 +65,26 @@ public Device(DeviceType type, String deviceId, OcDeviceInfo deviceInfo, OCEndpo
6165
while(endpoints != null) {
6266
String endpointStr = OCEndpointUtil.toString(endpoints);
6367

64-
if (endpointStr.startsWith("coaps://") && endpointStr.contains(".")) {
65-
ipv4SecureHost = endpointStr;
66-
} else if (endpointStr.startsWith("coaps://")) {
67-
ipv6SecureHost = endpointStr;
68-
} else if (endpointStr.startsWith("coap://") && endpointStr.contains(".")) {
69-
ipv4Host = endpointStr;
70-
} else if (endpointStr.startsWith("coap://")){
71-
ipv6Host = endpointStr;
68+
if (endpointStr.contains(".")) {
69+
if (endpointStr.startsWith("coaps://")) {
70+
ipv4SecureHost = endpointStr;
71+
} else if (endpointStr.startsWith("coaps+tcp://")) {
72+
ipv4TcpSecureHost = endpointStr;
73+
} else if (endpointStr.startsWith("coap://")) {
74+
ipv4Host = endpointStr;
75+
} else if (endpointStr.startsWith("coap+tcp://")) {
76+
ipv4TcpHost = endpointStr;
77+
}
78+
} else {
79+
if (endpointStr.startsWith("coaps://")) {
80+
ipv6SecureHost = endpointStr;
81+
} else if (endpointStr.startsWith("coaps+tcp://")) {
82+
ipv6TcpSecureHost = endpointStr;
83+
} else if (endpointStr.startsWith("coap://")) {
84+
ipv6Host = endpointStr;
85+
} else if (endpointStr.startsWith("coap+tcp://")) {
86+
ipv6TcpHost = endpointStr;
87+
}
7288
}
7389

7490
endpoints = endpoints.getNext();
@@ -83,14 +99,26 @@ public Device(DeviceType type, String deviceId, OcDeviceInfo deviceInfo, List<St
8399
this.permits = permits;
84100

85101
for (String endpoint : endpoints) {
86-
if (endpoint.startsWith("coaps://") && endpoint.contains(".")) {
87-
ipv4SecureHost = endpoint;
88-
} else if (endpoint.startsWith("coaps://")) {
89-
ipv6SecureHost = endpoint;
90-
} else if (endpoint.startsWith("coap://") && endpoint.contains(".")) {
91-
ipv4Host = endpoint;
92-
} else if (endpoint.startsWith("coap://")) {
93-
ipv6Host = endpoint;
102+
if (endpoint.contains(".")) {
103+
if (endpoint.startsWith("coaps://")) {
104+
ipv4SecureHost = endpoint;
105+
} else if (endpoint.startsWith("coaps+tcp://")) {
106+
ipv4TcpSecureHost = endpoint;
107+
} else if (endpoint.startsWith("coap://")) {
108+
ipv4Host = endpoint;
109+
} else if (endpoint.startsWith("coap+tcp://")) {
110+
ipv4TcpHost = endpoint;
111+
}
112+
} else {
113+
if (endpoint.startsWith("coaps://")) {
114+
ipv6SecureHost = endpoint;
115+
} else if (endpoint.startsWith("coaps+tcp://")) {
116+
ipv6TcpSecureHost = endpoint;
117+
} else if (endpoint.startsWith("coap://")) {
118+
ipv6Host = endpoint;
119+
} else if (endpoint.startsWith("coap+tcp://")) {
120+
ipv6TcpHost = endpoint;
121+
}
94122
}
95123
}
96124
}
@@ -135,6 +163,14 @@ public void setIpv6Host(String host) {
135163
this.ipv6Host = host;
136164
}
137165

166+
public String getIpv6TcpHost() {
167+
return this.ipv6TcpHost;
168+
}
169+
170+
public void setIpv6TcpHost(String host) {
171+
this.ipv6TcpHost = host;
172+
}
173+
138174
public String getIpv6SecureHost() {
139175
return this.ipv6SecureHost;
140176
}
@@ -143,6 +179,14 @@ public void setIpv6SecureHost(String host) {
143179
this.ipv6SecureHost = host;
144180
}
145181

182+
public String getIpv6TcpSecureHost() {
183+
return this.ipv6TcpSecureHost;
184+
}
185+
186+
public void setIpv6TcpSecureHost(String host) {
187+
this.ipv6TcpSecureHost = host;
188+
}
189+
146190
public String getIpv4Host() {
147191
return this.ipv4Host;
148192
}
@@ -151,6 +195,14 @@ public void setIpv4Host(String host) {
151195
this.ipv4Host = host;
152196
}
153197

198+
public String getIpv4TcpHost() {
199+
return this.ipv4TcpHost;
200+
}
201+
202+
public void setIpv4TcpHost(String host) {
203+
this.ipv4TcpHost = host;
204+
}
205+
154206
public String getIpv4SecureHost() {
155207
return this.ipv4SecureHost;
156208
}
@@ -159,27 +211,55 @@ public void setIpv4SecureHost(String host) {
159211
this.ipv4SecureHost = host;
160212
}
161213

214+
public String getIpv4TcpSecureHost() {
215+
return this.ipv4SecureHost;
216+
}
217+
218+
public void setIpv4TcpSecureHost(String host) {
219+
this.ipv4SecureHost = host;
220+
}
221+
162222
public boolean equalsHosts(Device device) {
163223
if (this.getIpv6Host() != null && device.getIpv6Host() != null
164224
&& !this.getIpv6Host().equals(device.getIpv6Host())) {
165225
return false;
166226
}
167227

228+
if (this.getIpv6TcpHost() != null && device.getIpv6TcpHost() != null
229+
&& !this.getIpv6TcpHost().equals(device.getIpv6TcpHost())) {
230+
return false;
231+
}
232+
168233
if (this.getIpv6SecureHost() != null && device.getIpv6SecureHost() != null
169234
&& !this.getIpv6SecureHost().equals(device.getIpv6SecureHost())) {
170235
return false;
171236
}
172237

238+
if (this.getIpv6TcpSecureHost() != null && device.getIpv6TcpSecureHost() != null
239+
&& !this.getIpv6TcpSecureHost().equals(device.getIpv6TcpSecureHost())) {
240+
return false;
241+
}
242+
173243
if (this.getIpv4Host() != null && device.getIpv4Host() != null
174244
&& !this.getIpv4Host().equals(device.getIpv4Host())) {
175245
return false;
176246
}
177247

248+
if (this.getIpv4TcpHost() != null && device.getIpv4TcpHost() != null
249+
&& !this.getIpv4TcpHost().equals(device.getIpv4TcpHost())) {
250+
return false;
251+
}
252+
178253
if (this.getIpv4SecureHost() != null && device.getIpv4SecureHost() != null
179254
&& !this.getIpv4SecureHost().equals(device.getIpv4SecureHost())) {
180255
return false;
181256
}
182257

258+
if (this.getIpv4TcpSecureHost() != null && device.getIpv4TcpSecureHost() != null
259+
&& !this.getIpv4TcpSecureHost().equals(device.getIpv4TcpSecureHost())) {
260+
return false;
261+
}
262+
183263
return true;
184264
}
185265

otgc/src/main/java/org/openconnectivity/otgc/domain/model/devicelist/DeviceType.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ public enum DeviceType {
2525
UNOWNED,
2626
OWNED_BY_SELF,
2727
OWNED_BY_OTHER,
28-
OWNED_BY_OTHER_WITH_PERMITS
28+
OWNED_BY_OTHER_WITH_PERMITS,
29+
CLOUD
2930
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.openconnectivity.otgc.domain.usecase.cloud;
2+
3+
import org.openconnectivity.otgc.data.repository.CloudRepository;
4+
5+
import javax.inject.Inject;
6+
7+
import io.reactivex.Single;
8+
9+
public class CloudDeregisterUseCase {
10+
private final CloudRepository cloudRepository;
11+
12+
@Inject
13+
public CloudDeregisterUseCase(CloudRepository cloudRepository) {
14+
this.cloudRepository = cloudRepository;
15+
}
16+
17+
public Single<Integer> execute() {
18+
return cloudRepository.deregister()
19+
.andThen(cloudRepository.retrieveState());
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.openconnectivity.otgc.domain.usecase.cloud;
2+
3+
import org.openconnectivity.otgc.data.repository.CloudRepository;
4+
import org.openconnectivity.otgc.domain.model.devicelist.Device;
5+
6+
import javax.inject.Inject;
7+
8+
import io.reactivex.Observable;
9+
10+
public class CloudDiscoverDevicesUseCase {
11+
private final CloudRepository cloudRepository;
12+
13+
@Inject
14+
public CloudDiscoverDevicesUseCase(CloudRepository cloudRepository) {
15+
this.cloudRepository = cloudRepository;
16+
}
17+
18+
public Observable<Device> execute() {
19+
return cloudRepository.discoverDevices();
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.openconnectivity.otgc.domain.usecase.cloud;
2+
3+
import org.openconnectivity.otgc.data.repository.CloudRepository;
4+
import org.openconnectivity.otgc.domain.model.client.SerializableResource;
5+
import org.openconnectivity.otgc.domain.model.devicelist.Device;
6+
import org.openconnectivity.otgc.domain.model.resource.virtual.res.OcResource;
7+
8+
import java.util.ArrayList;
9+
import java.util.Collections;
10+
import java.util.List;
11+
import java.util.concurrent.TimeUnit;
12+
13+
import javax.inject.Inject;
14+
15+
import io.reactivex.Completable;
16+
import io.reactivex.Single;
17+
18+
public class CloudDiscoverResourcesUseCase {
19+
private final CloudRepository cloudRepository;
20+
21+
@Inject
22+
public CloudDiscoverResourcesUseCase(CloudRepository cloudRepository) {
23+
this.cloudRepository = cloudRepository;
24+
}
25+
26+
public Single<List<SerializableResource>> execute(Device device) {
27+
return
28+
Completable.complete()
29+
.delay(1, TimeUnit.SECONDS)
30+
.andThen(cloudRepository.discoverVerticalResources(device.getDeviceId())
31+
.map(ocResources -> {
32+
List<SerializableResource> serializableResources = new ArrayList<>();
33+
for (OcResource resource : ocResources) {
34+
SerializableResource serializableResource = new SerializableResource();
35+
serializableResource.setUri(resource.getHref());
36+
serializableResource.setResourceTypes(resource.getResourceTypes());
37+
serializableResource.setResourceInterfaces(resource.getInterfaces());
38+
serializableResource.setObservable(false);
39+
40+
serializableResources.add(serializableResource);
41+
}
42+
43+
Collections.sort(serializableResources,
44+
(r1, r2) -> r1.getUri().compareTo(r2.getUri()));
45+
46+
return serializableResources;
47+
}));
48+
}
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.openconnectivity.otgc.domain.usecase.cloud;
2+
3+
import io.reactivex.Single;
4+
import org.openconnectivity.otgc.data.repository.CloudRepository;
5+
import org.openconnectivity.otgc.domain.model.client.SerializableResource;
6+
import org.openconnectivity.otgc.domain.model.devicelist.Device;
7+
8+
import javax.inject.Inject;
9+
10+
public class CloudGetResourceUseCase {
11+
private final CloudRepository cloudRepository;
12+
13+
@Inject
14+
public CloudGetResourceUseCase(CloudRepository cloudRepository) {
15+
this.cloudRepository = cloudRepository;
16+
}
17+
18+
public Single<SerializableResource> execute(Device device, SerializableResource resource) {
19+
return cloudRepository.retrieveEndpoint()
20+
.flatMap(endpoint -> cloudRepository.get(endpoint, resource.getUri(), device.getDeviceId()))
21+
.map(ocRepresentation -> {
22+
resource.setProperties(ocRepresentation);
23+
return resource;
24+
});
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.openconnectivity.otgc.domain.usecase.cloud;
2+
3+
import org.openconnectivity.otgc.data.repository.CloudRepository;
4+
5+
import javax.inject.Inject;
6+
7+
import io.reactivex.Single;
8+
9+
public class CloudLoginUseCase {
10+
private final CloudRepository cloudRepository;
11+
12+
@Inject
13+
public CloudLoginUseCase(CloudRepository cloudRepository) {
14+
this.cloudRepository = cloudRepository;
15+
}
16+
17+
public Single<Integer> execute() {
18+
return cloudRepository.login()
19+
.andThen(cloudRepository.retrieveState());
20+
}
21+
}

0 commit comments

Comments
 (0)