Skip to content
This repository was archived by the owner on Jan 26, 2022. It is now read-only.

Commit cea947c

Browse files
authored
Merge pull request #95 from cloud-of-things/PBT-826-update-events-and-measurements
PBT-826 update events feature
2 parents 43eeb51 + ec2f992 commit cea947c

File tree

17 files changed

+182
-76
lines changed

17 files changed

+182
-76
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ Short information about what has changed between releases.
6060
- Usage of newest dependencies
6161
- Cleanup and improvements according to code inspection
6262
63+
* EventApi provides the update of events as well now. ([Pull Request #95](https://github.com/cloud-of-things/cot-java-rest-sdk/pull/95))
64+
* Fixed cast in getSource() method of Alarm and Event
65+
* Added the getter as counterpart of set(Object) in ExtendedObject
66+
6367
6468
### Release 1.1.0
6569

src/main/java/com/telekom/m2m/cot/restsdk/alarm/Alarm.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,14 @@ public Date getTime() {
132132
* @return the originating {@link ManagedObject}
133133
*/
134134
public ManagedObject getSource() {
135-
return (ManagedObject) anyObject.get("source");
135+
Object source = anyObject.get("source");
136+
// since source value can be set as ManagedObject via setter in regular way
137+
// and as ExtensibleObject via gson ExtensibleObjectSerializer.
138+
// At first we need to check the type to avoid an unnecessary wrap into ManagedObject
139+
if(source instanceof ManagedObject) {
140+
return (ManagedObject)source;
141+
}
142+
return new ManagedObject((ExtensibleObject) source);
136143
}
137144

138145
/**

src/main/java/com/telekom/m2m/cot/restsdk/event/Event.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,14 @@ public void setSource(ManagedObject source) {
134134
* @return the originating {@link ManagedObject}
135135
*/
136136
public ManagedObject getSource() {
137-
return (ManagedObject) anyObject.get("source");
137+
Object source = anyObject.get("source");
138+
// since source value can be set as ManagedObject via setter in regular way
139+
// and as ExtensibleObject via gson ExtensibleObjectSerializer.
140+
// At first we need to check the type to avoid an unnecessary wrap into ManagedObject
141+
if(source instanceof ManagedObject) {
142+
return (ManagedObject)source;
143+
}
144+
return new ManagedObject((ExtensibleObject) source);
138145
}
139146

140147

src/main/java/com/telekom/m2m/cot/restsdk/event/EventApi.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import javax.annotation.Nullable;
1111
import java.util.Arrays;
1212
import java.util.List;
13+
import java.util.Map;
1314
import java.util.Optional;
1415

1516
/**
@@ -106,6 +107,26 @@ public EventCollection getEvents(Filter.FilterBuilder filters) {
106107
filters);
107108
}
108109

110+
/**
111+
* Updates an Event. It is just possible to update the text and user defined fragments.
112+
* Any further attributes like type, time or source.id will be ignored.
113+
*
114+
* @param event the event to update.
115+
* @since 2.0.0
116+
*/
117+
public void update(Event event) {
118+
Map attributes = event.getAttributes();
119+
attributes.remove("time");
120+
attributes.remove("creationTime");
121+
attributes.remove("type");
122+
attributes.remove("source");
123+
Event eventToUpdate = new Event();
124+
eventToUpdate.setAttributes(attributes);
125+
126+
String json = gson.toJson(eventToUpdate);
127+
cloudOfThingsRestClient.doPutRequest(json, RELATIVE_API_URL + event.getId(), CONTENT_TYPE);
128+
}
129+
109130
/**
110131
* Deletes a collection of Events by criteria.
111132
*

src/main/java/com/telekom/m2m/cot/restsdk/util/ExtensibleObject.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ public void set(Object attribute) {
7777
anyObject.put(attribute.getClass().getCanonicalName().replace('.', '_'), attribute);
7878
}
7979

80+
/**
81+
* Get a custom attribute with its name derived from class package and name.
82+
* <p>
83+
* E.g. a class com.telekom.SpecialObject will get the identifier com_telekom_SpecialObject.
84+
*
85+
* @param attribute the value of the custom attribute.
86+
*/
87+
public Object get(Class attribute) {
88+
return anyObject.get(attribute.getCanonicalName().replace('.', '_'));
89+
}
90+
8091
/**
8192
* Adds all attributes from argument to this object. Attributes with the existing attribute identifiers will be
8293
* overridden.

src/main/java/com/telekom/m2m/cot/restsdk/util/ExtensibleObjectSerializer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
import java.time.ZonedDateTime;
1010
import java.time.format.DateTimeFormatter;
1111
import java.time.format.DateTimeParseException;
12-
import java.util.*;
12+
import java.util.ArrayList;
13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.Map;
1316

1417
/**
1518
* Created by Patrick Steinert on 31.01.16.

src/main/java/com/telekom/m2m/cot/restsdk/util/ManagedObjectSerializer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.text.ParseException;
99
import java.text.SimpleDateFormat;
1010
import java.util.ArrayList;
11-
import java.util.Iterator;
1211
import java.util.Map;
1312

1413

src/test/java/com/telekom/m2m/cot/restsdk/event/EventApiCollectionIT.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -255,18 +255,15 @@ public void testMultipleEventsByDateAndBySource() {
255255

256256
@Test
257257
public void testMultipleEventsByTypeAndBySource() {
258-
Position sts = new Position();
259-
sts.setAlt(1000.0);
260-
sts.setLat(50.722607);
261-
sts.setLon(7.144011);
258+
Position position = new Position(50.722607, 7.144011, 1000.0);
262259

263260
Event testEvent = new Event();
264261
testEvent.setSource(testManagedObject);
265262
testEvent.setTime(new Date(new Date().getTime() - (1000 * 60)));
266263
testEvent.setType("mysuperspecialtype");
267264
testEvent.setText("Test");
268265

269-
testEvent.set(sts);
266+
testEvent.set(position);
270267
eventApi.createEvent(testEvent);
271268

272269
EventCollection events = eventApi.getEvents(
@@ -290,17 +287,14 @@ public void testMultipleEventsByTypeAndBySource() {
290287

291288
@Test
292289
public void testMultipleEventsByFragmentTypeAndBySource() {
293-
Position sts = new Position();
294-
sts.setAlt(1000.0);
295-
sts.setLat(50.722607);
296-
sts.setLon(7.144011);
290+
Position position = new Position(50.722607, 7.144011, 1000.0);
297291

298292
Event testEvent = new Event();
299293
testEvent.setSource(testManagedObject);
300294
testEvent.setTime(new Date(new Date().getTime() - (1000 * 60)));
301295
testEvent.setType("mysuperspecialtype");
302296
testEvent.setText("Test");
303-
testEvent.set(sts);
297+
testEvent.set(position);
304298
eventApi.createEvent(testEvent);
305299

306300
EventCollection events = eventApi.getEvents(

src/test/java/com/telekom/m2m/cot/restsdk/event/EventApiIT.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.telekom.m2m.cot.restsdk.CloudOfThingsPlatform;
44
import com.telekom.m2m.cot.restsdk.inventory.ManagedObject;
5+
import com.telekom.m2m.cot.restsdk.util.Position;
56
import com.telekom.m2m.cot.restsdk.util.TestHelper;
67
import org.testng.Assert;
78
import org.testng.annotations.AfterClass;
@@ -32,7 +33,6 @@ public void tearDown() {
3233

3334
@Test
3435
public void testCreateEvent() {
35-
3636
Event event = new Event();
3737
event.setText("Sample Text");
3838
event.setType("com_telekom_TestType");
@@ -96,7 +96,7 @@ public void testGetEventReturnNull() {
9696

9797
Event createdEvent = eventApi.createEvent(event);
9898

99-
String id= createdEvent.getId();
99+
String id = createdEvent.getId();
100100

101101
//The event that exist in the cloud should be gettable:
102102
Assert.assertNotNull(eventApi.getEvent(id));
@@ -105,4 +105,42 @@ public void testGetEventReturnNull() {
105105
Assert.assertNull(eventApi.getEvent("theIdThatDoesNotExist"));
106106
}
107107

108+
@Test
109+
public void testCreateAndUpdate() {
110+
// given
111+
Calendar timeOfEventHappening = Calendar.getInstance();
112+
113+
Event event = new Event();
114+
event.setText("Sample Text");
115+
event.setType("com_telekom_TestType");
116+
event.setTime(timeOfEventHappening.getTime());
117+
event.setSource(testManagedObject);
118+
event.setText("Door sensor was triggered.");
119+
Position position = new Position(50.722607, 7.144011, 1000.0);
120+
event.set(position);
121+
122+
EventApi eventApi = cotPlat.getEventApi();
123+
124+
//when
125+
Event createdEvent = eventApi.createEvent(event);
126+
127+
Assert.assertNotNull(createdEvent.getId(), "Should now have an Id");
128+
129+
Event retrievedEvent = eventApi.getEvent(createdEvent.getId());
130+
Assert.assertEquals(retrievedEvent.getText(), "Door sensor was triggered.");
131+
Assert.assertEquals(retrievedEvent.get(Position.class).toString(), position.toString());
132+
133+
retrievedEvent.setText("Window sensor was triggered.");
134+
position.setLat(77.0);
135+
retrievedEvent.set(position);
136+
137+
eventApi.update(retrievedEvent);
138+
retrievedEvent = eventApi.getEvent(createdEvent.getId());
139+
140+
// then
141+
Assert.assertEquals(retrievedEvent.getText(), "Window sensor was triggered.");
142+
Assert.assertEquals(retrievedEvent.get(Position.class).toString(), position.toString());
143+
Assert.assertEquals(((Position)retrievedEvent.get(Position.class)).getLat(), 77.0);
144+
}
145+
108146
}
Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,89 @@
11
package com.telekom.m2m.cot.restsdk.event;
22

3-
import com.telekom.m2m.cot.restsdk.CloudOfThingsPlatform;
43
import com.telekom.m2m.cot.restsdk.CloudOfThingsRestClient;
54
import com.telekom.m2m.cot.restsdk.util.CotSdkException;
65
import com.telekom.m2m.cot.restsdk.util.Position;
76
import org.mockito.Mockito;
8-
import org.testng.Assert;
7+
import org.testng.annotations.BeforeMethod;
98
import org.testng.annotations.Test;
109

10+
import javax.annotation.Nonnull;
1111
import java.util.Date;
1212

13-
import static org.mockito.ArgumentMatchers.any;
13+
import static org.mockito.ArgumentMatchers.*;
14+
import static org.mockito.Mockito.times;
15+
import static org.mockito.Mockito.verify;
16+
import static org.testng.Assert.assertEquals;
1417

1518
/**
1619
* Created by Patrick Steinert on 03.02.16.
1720
*/
1821
public class EventApiTest {
22+
23+
private static final String EVENT_JSON_EXAMPLE = "{\n" +
24+
" \"id\" : \"10\",\n" +
25+
" \"self\" : \"...\",\n" +
26+
" \"time\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
27+
" \"creationTime\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
28+
" \"type\" : \"com_telekom_DoorSensorEvent\",\n" +
29+
" \"text\" : \"Door sensor was triggered.\",\n" +
30+
" \"source\" : { \"id\":\"12345\", \"name \": \"test\" },\n" +
31+
" \"com_telekom_m2m_cot_restsdk_util_Position\" : { \"alt\": 0.0, \"lon\": 1.0, \"lat\": 2.0}\n" +
32+
"}";
33+
34+
private EventApi eventApi;
35+
private CloudOfThingsRestClient client;
36+
37+
@BeforeMethod
38+
public void setup() {
39+
client = createClient();
40+
eventApi = new EventApi(client);
41+
}
42+
1943
@Test(expectedExceptions = CotSdkException.class)
2044
public void testGetEventWithFailure() {
21-
CloudOfThingsRestClient rc = Mockito.mock(CloudOfThingsRestClient.class);
22-
CloudOfThingsPlatform platform = Mockito.mock(CloudOfThingsPlatform.class);
23-
Mockito.when(platform.getEventApi()).thenReturn(new EventApi(rc));
24-
Mockito.doThrow(CotSdkException.class).when(rc).getResponse(any(String.class), any(String.class), any(String.class));
25-
26-
EventApi eventApi = platform.getEventApi();
2745
eventApi.getEvent("foo");
2846
}
2947

3048
@Test
3149
public void testGetEvent() {
50+
Event event = eventApi.getEvent("10");
51+
52+
assertEquals(event.getId(), "10");
53+
assertEquals(event.getType(), "com_telekom_DoorSensorEvent");
54+
assertEquals(event.getText(), "Door sensor was triggered.");
55+
assertEquals(event.getCreationTime().compareTo(new Date(1315303407000L)), 0);
56+
assertEquals(event.getTime().compareTo(new Date(1315303407000L)), 0);
3257

33-
String eventJsonExample = "{\n" +
34-
" \"id\" : \"10\",\n" +
35-
" \"self\" : \"...\",\n" +
36-
" \"time\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
37-
" \"creationTime\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
38-
" \"type\" : \"com_telekom_DoorSensorEvent\",\n" +
39-
" \"text\" : \"Door sensor was triggered.\",\n" +
40-
" \"source\" : { \"id\":\"12345\", \"name \": \"test\" },\n" +
41-
" \"com_telekom_m2m_cot_restsdk_util_Position\" : { \"alt\": 0.0, \"lon\": 1.0, \"lat\": 2.0}\n" +
42-
"}";
43-
44-
CloudOfThingsRestClient rc = Mockito.mock(CloudOfThingsRestClient.class);
45-
CloudOfThingsPlatform platform = Mockito.mock(CloudOfThingsPlatform.class);
46-
Mockito.when(platform.getEventApi()).thenReturn(new EventApi(rc));
47-
Mockito.when(rc.getResponse(any(String.class), any(String.class), any(String.class))).thenReturn(eventJsonExample);
48-
49-
EventApi eventApi = platform.getEventApi();
50-
Event event = eventApi.getEvent("foo");
51-
52-
Assert.assertEquals(event.getId(), "10");
53-
Assert.assertEquals(event.getType(), "com_telekom_DoorSensorEvent");
54-
Assert.assertEquals(event.getText(), "Door sensor was triggered.");
55-
Assert.assertEquals(event.getCreationTime().compareTo(new Date(1315303407000L)), 0);
56-
Assert.assertEquals(event.getTime().compareTo(new Date(1315303407000L)), 0);
57-
58-
Assert.assertEquals(((Position) event.get("com_telekom_m2m_cot_restsdk_util_Position")).getLat(), 2.0);
59-
//Assert.assertEquals(event.getSource().getId(), "12345");
58+
assertEquals(((Position) event.get(Position.class)).getLat(), 2.0);
59+
assertEquals(event.getSource().getId(), "12345");
60+
}
61+
62+
@Test
63+
public void testUpdateEvent() {
64+
Event event = eventApi.getEvent("10");
65+
event.setText("Window sensor was triggered.");
66+
((Position) event.get(Position.class)).setLat(3.0);
67+
eventApi.update(event);
6068

69+
verify(client, times(1)).doPutRequest(contains("Window sensor was triggered."), anyString(), anyString());
70+
verify(client, times(1)).doPutRequest(contains("3.0"), anyString(), anyString());
71+
verify(client, times(0)).doPutRequest(contains("time"), anyString(), anyString());
72+
verify(client, times(0)).doPutRequest(contains("creationTime"), anyString(), anyString());
73+
verify(client, times(0)).doPutRequest(contains("type"), anyString(), anyString());
74+
verify(client, times(0)).doPutRequest(contains("source"), anyString(), anyString());
6175
}
76+
77+
/**
78+
* @return A mocked Cloud of Things REST client.
79+
*/
80+
@Nonnull
81+
private CloudOfThingsRestClient createClient() {
82+
final CloudOfThingsRestClient client = Mockito.mock(CloudOfThingsRestClient.class);
83+
Mockito.doReturn(EVENT_JSON_EXAMPLE).when(client).getResponse(eq("10"), any(String.class), any(String.class));
84+
Mockito.doThrow(CotSdkException.class).when(client).getResponse(eq("foo"), any(String.class), any(String.class));
85+
86+
return client;
87+
}
88+
6289
}

0 commit comments

Comments
 (0)