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

PBT-826 update events feature #95

Merged
merged 1 commit into from
Jun 16, 2020
Merged
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
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ Short information about what has changed between releases.
- Usage of newest dependencies
- Cleanup and improvements according to code inspection

* EventApi provides the update of events as well now. ([Pull Request #95](https://github.com/cloud-of-things/cot-java-rest-sdk/pull/95))
* Fixed cast in getSource() method of Alarm and Event
* Added the getter as counterpart of set(Object) in ExtendedObject


### Release 1.1.0

Expand Down
9 changes: 8 additions & 1 deletion src/main/java/com/telekom/m2m/cot/restsdk/alarm/Alarm.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,14 @@ public Date getTime() {
* @return the originating {@link ManagedObject}
*/
public ManagedObject getSource() {
return (ManagedObject) anyObject.get("source");
Object source = anyObject.get("source");
// since source value can be set as ManagedObject via setter in regular way
// and as ExtensibleObject via gson ExtensibleObjectSerializer.
// At first we need to check the type to avoid an unnecessary wrap into ManagedObject
if(source instanceof ManagedObject) {
return (ManagedObject)source;
}
return new ManagedObject((ExtensibleObject) source);
}

/**
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/com/telekom/m2m/cot/restsdk/event/Event.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,14 @@ public void setSource(ManagedObject source) {
* @return the originating {@link ManagedObject}
*/
public ManagedObject getSource() {
return (ManagedObject) anyObject.get("source");
Object source = anyObject.get("source");
// since source value can be set as ManagedObject via setter in regular way
// and as ExtensibleObject via gson ExtensibleObjectSerializer.
// At first we need to check the type to avoid an unnecessary wrap into ManagedObject
if(source instanceof ManagedObject) {
return (ManagedObject)source;
}
return new ManagedObject((ExtensibleObject) source);
}


Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/telekom/m2m/cot/restsdk/event/EventApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
Expand Down Expand Up @@ -106,6 +107,26 @@ public EventCollection getEvents(Filter.FilterBuilder filters) {
filters);
}

/**
* Updates an Event. It is just possible to update the text and user defined fragments.
* Any further attributes like type, time or source.id will be ignored.
*
* @param event the event to update.
* @since 2.0.0
*/
public void update(Event event) {
Map attributes = event.getAttributes();
attributes.remove("time");
attributes.remove("creationTime");
attributes.remove("type");
attributes.remove("source");
Event eventToUpdate = new Event();
eventToUpdate.setAttributes(attributes);

String json = gson.toJson(eventToUpdate);
cloudOfThingsRestClient.doPutRequest(json, RELATIVE_API_URL + event.getId(), CONTENT_TYPE);
}

/**
* Deletes a collection of Events by criteria.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,17 @@ public void set(Object attribute) {
anyObject.put(attribute.getClass().getCanonicalName().replace('.', '_'), attribute);
}

/**
* Get a custom attribute with its name derived from class package and name.
* <p>
* E.g. a class com.telekom.SpecialObject will get the identifier com_telekom_SpecialObject.
*
* @param attribute the value of the custom attribute.
*/
public Object get(Class attribute) {
return anyObject.get(attribute.getCanonicalName().replace('.', '_'));
}

/**
* Adds all attributes from argument to this object. Attributes with the existing attribute identifiers will be
* overridden.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Created by Patrick Steinert on 31.01.16.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,18 +255,15 @@ public void testMultipleEventsByDateAndBySource() {

@Test
public void testMultipleEventsByTypeAndBySource() {
Position sts = new Position();
sts.setAlt(1000.0);
sts.setLat(50.722607);
sts.setLon(7.144011);
Position position = new Position(50.722607, 7.144011, 1000.0);

Event testEvent = new Event();
testEvent.setSource(testManagedObject);
testEvent.setTime(new Date(new Date().getTime() - (1000 * 60)));
testEvent.setType("mysuperspecialtype");
testEvent.setText("Test");

testEvent.set(sts);
testEvent.set(position);
eventApi.createEvent(testEvent);

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

@Test
public void testMultipleEventsByFragmentTypeAndBySource() {
Position sts = new Position();
sts.setAlt(1000.0);
sts.setLat(50.722607);
sts.setLon(7.144011);
Position position = new Position(50.722607, 7.144011, 1000.0);

Event testEvent = new Event();
testEvent.setSource(testManagedObject);
testEvent.setTime(new Date(new Date().getTime() - (1000 * 60)));
testEvent.setType("mysuperspecialtype");
testEvent.setText("Test");
testEvent.set(sts);
testEvent.set(position);
eventApi.createEvent(testEvent);

EventCollection events = eventApi.getEvents(
Expand Down
42 changes: 40 additions & 2 deletions src/test/java/com/telekom/m2m/cot/restsdk/event/EventApiIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.telekom.m2m.cot.restsdk.CloudOfThingsPlatform;
import com.telekom.m2m.cot.restsdk.inventory.ManagedObject;
import com.telekom.m2m.cot.restsdk.util.Position;
import com.telekom.m2m.cot.restsdk.util.TestHelper;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
Expand Down Expand Up @@ -32,7 +33,6 @@ public void tearDown() {

@Test
public void testCreateEvent() {

Event event = new Event();
event.setText("Sample Text");
event.setType("com_telekom_TestType");
Expand Down Expand Up @@ -96,7 +96,7 @@ public void testGetEventReturnNull() {

Event createdEvent = eventApi.createEvent(event);

String id= createdEvent.getId();
String id = createdEvent.getId();

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

@Test
public void testCreateAndUpdate() {
// given
Calendar timeOfEventHappening = Calendar.getInstance();

Event event = new Event();
event.setText("Sample Text");
event.setType("com_telekom_TestType");
event.setTime(timeOfEventHappening.getTime());
event.setSource(testManagedObject);
event.setText("Door sensor was triggered.");
Position position = new Position(50.722607, 7.144011, 1000.0);
event.set(position);

EventApi eventApi = cotPlat.getEventApi();

//when
Event createdEvent = eventApi.createEvent(event);

Assert.assertNotNull(createdEvent.getId(), "Should now have an Id");

Event retrievedEvent = eventApi.getEvent(createdEvent.getId());
Assert.assertEquals(retrievedEvent.getText(), "Door sensor was triggered.");
Assert.assertEquals(retrievedEvent.get(Position.class).toString(), position.toString());

retrievedEvent.setText("Window sensor was triggered.");
position.setLat(77.0);
retrievedEvent.set(position);

eventApi.update(retrievedEvent);
retrievedEvent = eventApi.getEvent(createdEvent.getId());

// then
Assert.assertEquals(retrievedEvent.getText(), "Window sensor was triggered.");
Assert.assertEquals(retrievedEvent.get(Position.class).toString(), position.toString());
Assert.assertEquals(((Position)retrievedEvent.get(Position.class)).getLat(), 77.0);
}

}
99 changes: 63 additions & 36 deletions src/test/java/com/telekom/m2m/cot/restsdk/event/EventApiTest.java
Original file line number Diff line number Diff line change
@@ -1,62 +1,89 @@
package com.telekom.m2m.cot.restsdk.event;

import com.telekom.m2m.cot.restsdk.CloudOfThingsPlatform;
import com.telekom.m2m.cot.restsdk.CloudOfThingsRestClient;
import com.telekom.m2m.cot.restsdk.util.CotSdkException;
import com.telekom.m2m.cot.restsdk.util.Position;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import javax.annotation.Nonnull;
import java.util.Date;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.testng.Assert.assertEquals;

/**
* Created by Patrick Steinert on 03.02.16.
*/
public class EventApiTest {

private static final String EVENT_JSON_EXAMPLE = "{\n" +
" \"id\" : \"10\",\n" +
" \"self\" : \"...\",\n" +
" \"time\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
" \"creationTime\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
" \"type\" : \"com_telekom_DoorSensorEvent\",\n" +
" \"text\" : \"Door sensor was triggered.\",\n" +
" \"source\" : { \"id\":\"12345\", \"name \": \"test\" },\n" +
" \"com_telekom_m2m_cot_restsdk_util_Position\" : { \"alt\": 0.0, \"lon\": 1.0, \"lat\": 2.0}\n" +
"}";

private EventApi eventApi;
private CloudOfThingsRestClient client;

@BeforeMethod
public void setup() {
client = createClient();
eventApi = new EventApi(client);
}

@Test(expectedExceptions = CotSdkException.class)
public void testGetEventWithFailure() {
CloudOfThingsRestClient rc = Mockito.mock(CloudOfThingsRestClient.class);
CloudOfThingsPlatform platform = Mockito.mock(CloudOfThingsPlatform.class);
Mockito.when(platform.getEventApi()).thenReturn(new EventApi(rc));
Mockito.doThrow(CotSdkException.class).when(rc).getResponse(any(String.class), any(String.class), any(String.class));

EventApi eventApi = platform.getEventApi();
eventApi.getEvent("foo");
}

@Test
public void testGetEvent() {
Event event = eventApi.getEvent("10");

assertEquals(event.getId(), "10");
assertEquals(event.getType(), "com_telekom_DoorSensorEvent");
assertEquals(event.getText(), "Door sensor was triggered.");
assertEquals(event.getCreationTime().compareTo(new Date(1315303407000L)), 0);
assertEquals(event.getTime().compareTo(new Date(1315303407000L)), 0);

String eventJsonExample = "{\n" +
" \"id\" : \"10\",\n" +
" \"self\" : \"...\",\n" +
" \"time\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
" \"creationTime\" : \"2011-09-06T12:03:27.000+02:00\",\n" +
" \"type\" : \"com_telekom_DoorSensorEvent\",\n" +
" \"text\" : \"Door sensor was triggered.\",\n" +
" \"source\" : { \"id\":\"12345\", \"name \": \"test\" },\n" +
" \"com_telekom_m2m_cot_restsdk_util_Position\" : { \"alt\": 0.0, \"lon\": 1.0, \"lat\": 2.0}\n" +
"}";

CloudOfThingsRestClient rc = Mockito.mock(CloudOfThingsRestClient.class);
CloudOfThingsPlatform platform = Mockito.mock(CloudOfThingsPlatform.class);
Mockito.when(platform.getEventApi()).thenReturn(new EventApi(rc));
Mockito.when(rc.getResponse(any(String.class), any(String.class), any(String.class))).thenReturn(eventJsonExample);

EventApi eventApi = platform.getEventApi();
Event event = eventApi.getEvent("foo");

Assert.assertEquals(event.getId(), "10");
Assert.assertEquals(event.getType(), "com_telekom_DoorSensorEvent");
Assert.assertEquals(event.getText(), "Door sensor was triggered.");
Assert.assertEquals(event.getCreationTime().compareTo(new Date(1315303407000L)), 0);
Assert.assertEquals(event.getTime().compareTo(new Date(1315303407000L)), 0);

Assert.assertEquals(((Position) event.get("com_telekom_m2m_cot_restsdk_util_Position")).getLat(), 2.0);
//Assert.assertEquals(event.getSource().getId(), "12345");
assertEquals(((Position) event.get(Position.class)).getLat(), 2.0);
assertEquals(event.getSource().getId(), "12345");
}

@Test
public void testUpdateEvent() {
Event event = eventApi.getEvent("10");
event.setText("Window sensor was triggered.");
((Position) event.get(Position.class)).setLat(3.0);
eventApi.update(event);

verify(client, times(1)).doPutRequest(contains("Window sensor was triggered."), anyString(), anyString());
verify(client, times(1)).doPutRequest(contains("3.0"), anyString(), anyString());
verify(client, times(0)).doPutRequest(contains("time"), anyString(), anyString());
verify(client, times(0)).doPutRequest(contains("creationTime"), anyString(), anyString());
verify(client, times(0)).doPutRequest(contains("type"), anyString(), anyString());
verify(client, times(0)).doPutRequest(contains("source"), anyString(), anyString());
}

/**
* @return A mocked Cloud of Things REST client.
*/
@Nonnull
private CloudOfThingsRestClient createClient() {
final CloudOfThingsRestClient client = Mockito.mock(CloudOfThingsRestClient.class);
Mockito.doReturn(EVENT_JSON_EXAMPLE).when(client).getResponse(eq("10"), any(String.class), any(String.class));
Mockito.doThrow(CotSdkException.class).when(client).getResponse(eq("foo"), any(String.class), any(String.class));

return client;
}

}
12 changes: 3 additions & 9 deletions src/test/java/com/telekom/m2m/cot/restsdk/event/EventTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@ public class EventTest {
@Test
public void testEventSerialization() {

Position p = new Position();
p.setAlt(6);
p.setLat(8);
p.setLon(2);
Position p = new Position(8, 2, 6);

Event e = new Event();
e.setId("1234");
Expand All @@ -39,16 +36,13 @@ public void testEventSerialization() {
public void testEventFragmentSerialization() {
Date date = new Date();

Position sts = new Position();
sts.setAlt(1000.0);
sts.setLat(50.722607);
sts.setLon(7.144011);
Position position = new Position(50.722607, 7.144011, 1000.0);

Event event= new Event();
event.setId("300001");
event.setTime(date);
event.setType("com_telekom_locationupdateevent");
event.set(sts);
event.set(position);

Gson gson = GsonUtils.createGson();
String json = gson.toJson(event);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.telekom.m2m.cot.restsdk.library.sensor;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.telekom.m2m.cot.restsdk.CloudOfThingsPlatform;
import com.telekom.m2m.cot.restsdk.inventory.InventoryApi;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.telekom.m2m.cot.restsdk.realtime;

import com.telekom.m2m.cot.restsdk.CloudOfThingsRestClient;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
Expand Down
Loading