From b19f1a505f7088ff48f467b32b5f1c207aa3be01 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 12 Jul 2017 14:22:03 +0500 Subject: - Handle rfid attributes and populate driverUniqueId - Add Driver Name to Trip report --- src/org/traccar/reports/ReportUtils.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 71c567c29..92918b861 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -26,6 +26,7 @@ import org.jxls.transform.Transformer; import org.jxls.transform.poi.PoiTransformer; import org.jxls.util.TransformerFactory; import org.traccar.Context; +import org.traccar.model.Driver; import org.traccar.model.Position; import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.StopReport; @@ -101,6 +102,20 @@ public final class ReportUtils { return 0; } + public static String findDriverName(Position firstPosition, Position lastPosition) { + String driverUniqueId = null; + if (firstPosition.getAttributes().containsKey(Position.KEY_DRIVER_UNIQUE_ID)) { + driverUniqueId = firstPosition.getString(Position.KEY_DRIVER_UNIQUE_ID); + } else if (lastPosition.getAttributes().containsKey(Position.KEY_DRIVER_UNIQUE_ID)) { + driverUniqueId = lastPosition.getString(Position.KEY_DRIVER_UNIQUE_ID); + } + if (driverUniqueId != null && Context.getDriversManager() != null) { + Driver driver = Context.getDriversManager().getDriverByUniqueId(driverUniqueId); + return driver != null ? driver.getName() : null; + } + return null; + } + public static org.jxls.common.Context initializeContext(long userId) { org.jxls.common.Context jxlsContext = PoiTransformer.createInitialContext(); jxlsContext.putVar("distanceUnit", getDistanceUnit(userId)); @@ -175,6 +190,7 @@ public final class ReportUtils { trip.setAverageSpeed(speedSum / (endIndex - startIndex)); trip.setMaxSpeed(speedMax); trip.setSpentFuel(calculateFuel(startTrip, endTrip)); + trip.setDriverName(findDriverName(startTrip, endTrip)); return trip; } -- cgit v1.2.3 From e776aa3351535f78c60ab9502dd1154e2b973227 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 13 Jul 2017 10:05:57 +0500 Subject: - Save both driver name and driver unique id in trip report - Map user and driver objects to notification templates - Add driverUnauthorized templates --- src/org/traccar/notification/NotificationFormatter.java | 7 +++++++ src/org/traccar/reports/ReportUtils.java | 17 +++++++++++------ src/org/traccar/reports/model/TripReport.java | 10 ++++++++++ templates/mail/driverUnauthorized.vm | 10 ++++++++++ templates/sms/driverUnauthorized.vm | 6 ++++++ 5 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 templates/mail/driverUnauthorized.vm create mode 100644 templates/sms/driverUnauthorized.vm (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/notification/NotificationFormatter.java b/src/org/traccar/notification/NotificationFormatter.java index 96337ecaa..a30023fdc 100644 --- a/src/org/traccar/notification/NotificationFormatter.java +++ b/src/org/traccar/notification/NotificationFormatter.java @@ -30,6 +30,7 @@ import org.traccar.helper.Log; import org.traccar.model.Device; import org.traccar.model.Event; import org.traccar.model.Position; +import org.traccar.model.User; import org.traccar.reports.ReportUtils; public final class NotificationFormatter { @@ -38,9 +39,11 @@ public final class NotificationFormatter { } public static VelocityContext prepareContext(long userId, Event event, Position position) { + User user = Context.getPermissionsManager().getUser(userId); Device device = Context.getIdentityManager().getDeviceById(event.getDeviceId()); VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("user", user); velocityContext.put("device", device); velocityContext.put("event", event); if (position != null) { @@ -50,6 +53,10 @@ public final class NotificationFormatter { if (event.getGeofenceId() != 0) { velocityContext.put("geofence", Context.getGeofenceManager().getGeofence(event.getGeofenceId())); } + String driverUniqueId = event.getString(Position.KEY_DRIVER_UNIQUE_ID); + if (driverUniqueId != null) { + velocityContext.put("driver", Context.getDriversManager().getDriverByUniqueId(driverUniqueId)); + } velocityContext.put("webUrl", Context.getVelocityEngine().getProperty("web.url")); velocityContext.put("dateTool", new DateTool()); velocityContext.put("numberTool", new NumberTool()); diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 92918b861..3a177300b 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -102,16 +102,19 @@ public final class ReportUtils { return 0; } - public static String findDriverName(Position firstPosition, Position lastPosition) { - String driverUniqueId = null; + public static String findDriver(Position firstPosition, Position lastPosition) { if (firstPosition.getAttributes().containsKey(Position.KEY_DRIVER_UNIQUE_ID)) { - driverUniqueId = firstPosition.getString(Position.KEY_DRIVER_UNIQUE_ID); + return firstPosition.getString(Position.KEY_DRIVER_UNIQUE_ID); } else if (lastPosition.getAttributes().containsKey(Position.KEY_DRIVER_UNIQUE_ID)) { - driverUniqueId = lastPosition.getString(Position.KEY_DRIVER_UNIQUE_ID); + return lastPosition.getString(Position.KEY_DRIVER_UNIQUE_ID); } + return null; + } + + public static String findDriverName(String driverUniqueId) { if (driverUniqueId != null && Context.getDriversManager() != null) { Driver driver = Context.getDriversManager().getDriverByUniqueId(driverUniqueId); - return driver != null ? driver.getName() : null; + return driver != null ? driver.getName() : driverUniqueId; } return null; } @@ -190,7 +193,9 @@ public final class ReportUtils { trip.setAverageSpeed(speedSum / (endIndex - startIndex)); trip.setMaxSpeed(speedMax); trip.setSpentFuel(calculateFuel(startTrip, endTrip)); - trip.setDriverName(findDriverName(startTrip, endTrip)); + + trip.setDriverUniqueId(findDriver(startTrip, endTrip)); + trip.setDriverName(findDriverName(trip.getDriverUniqueId())); return trip; } diff --git a/src/org/traccar/reports/model/TripReport.java b/src/org/traccar/reports/model/TripReport.java index 0f23581b2..42a4240b7 100644 --- a/src/org/traccar/reports/model/TripReport.java +++ b/src/org/traccar/reports/model/TripReport.java @@ -146,6 +146,16 @@ public class TripReport extends BaseReport { this.duration = duration; } + private String driverUniqueId; + + public String getDriverUniqueId() { + return driverUniqueId; + } + + public void setDriverUniqueId(String driverUniqueId) { + this.driverUniqueId = driverUniqueId; + } + private String driverName; public String getDriverName() { diff --git a/templates/mail/driverUnauthorized.vm b/templates/mail/driverUnauthorized.vm new file mode 100644 index 000000000..3d28266cd --- /dev/null +++ b/templates/mail/driverUnauthorized.vm @@ -0,0 +1,10 @@ +#set($subject = "$device.name: driver unauthorized") + + + +Device: $device.name
+Time: $dateTool.format("YYYY-MM-dd HH:mm:ss", $event.serverTime, $locale, $timezone)
+Point: #{if}($position.address)$position.address#{else}$position.latitude°, $position.longitude°#{end}
+Driver: #{if}($driver)$driver.name#{else}$event.getString("driverUniqueId")#{end} + + diff --git a/templates/sms/driverUnauthorized.vm b/templates/sms/driverUnauthorized.vm new file mode 100644 index 000000000..52c819eb8 --- /dev/null +++ b/templates/sms/driverUnauthorized.vm @@ -0,0 +1,6 @@ +#if($driver) +#set($driverName = $driver.name) +#else +#set($driverName = $event.getString("driverUniqueId")) +#end +$driverName is unauthorized for $device.name at $dateTool.format("YYYY-MM-dd HH:mm:ss", $event.serverTime, $locale, $timezone) -- cgit v1.2.3 From 48fee3a5e9c5f99a0195e4c06a058d33eba4e072 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 13 Jul 2017 10:21:01 +0500 Subject: Add Driver column to Trip report template --- src/org/traccar/reports/ReportUtils.java | 4 +++- templates/export/trips.xlsx | Bin 13189 -> 13239 bytes 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 3a177300b..bc58d28df 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -114,7 +114,9 @@ public final class ReportUtils { public static String findDriverName(String driverUniqueId) { if (driverUniqueId != null && Context.getDriversManager() != null) { Driver driver = Context.getDriversManager().getDriverByUniqueId(driverUniqueId); - return driver != null ? driver.getName() : driverUniqueId; + if (driver != null) { + return driver.getName(); + } } return null; } diff --git a/templates/export/trips.xlsx b/templates/export/trips.xlsx index 0e0ab4494..4a6734850 100644 Binary files a/templates/export/trips.xlsx and b/templates/export/trips.xlsx differ -- cgit v1.2.3 From d31f68d80a8e3ae75fa0c2f02b9ca258486a3cad Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 26 Jul 2017 17:52:27 +0500 Subject: - Implement base manager classes as generics - Remame getDeviceById and getDeviceByUniqueId functions --- src/org/traccar/BaseProtocolDecoder.java | 2 +- src/org/traccar/BaseProtocolEncoder.java | 4 +-- src/org/traccar/FilterHandler.java | 2 +- src/org/traccar/MainEventHandler.java | 2 +- src/org/traccar/WebDataHandler.java | 2 +- .../traccar/api/resource/AttributeResource.java | 2 +- src/org/traccar/api/resource/CalendarResource.java | 9 ++++-- src/org/traccar/api/resource/DeviceResource.java | 4 +-- src/org/traccar/api/resource/DriverResource.java | 2 +- src/org/traccar/api/resource/GeofenceResource.java | 2 +- src/org/traccar/api/resource/GroupResource.java | 2 +- src/org/traccar/api/resource/PositionResource.java | 2 +- src/org/traccar/api/resource/UserResource.java | 2 +- src/org/traccar/database/AttributesManager.java | 13 ++------- src/org/traccar/database/BaseObjectManager.java | 28 +++++++++--------- src/org/traccar/database/CalendarManager.java | 7 +---- src/org/traccar/database/ConnectionManager.java | 2 +- src/org/traccar/database/DeviceManager.java | 34 +++++++++------------- src/org/traccar/database/DriversManager.java | 25 ++++++---------- .../traccar/database/ExtendedObjectManager.java | 4 +-- src/org/traccar/database/GeofenceManager.java | 7 +---- src/org/traccar/database/GroupsManager.java | 19 +++++------- src/org/traccar/database/IdentityManager.java | 4 +-- src/org/traccar/database/PermissionsManager.java | 5 ++-- src/org/traccar/database/SimpleObjectManager.java | 5 ++-- src/org/traccar/database/UsersManager.java | 21 +++++-------- src/org/traccar/events/FuelDropEventHandler.java | 2 +- src/org/traccar/events/GeofenceEventHandler.java | 11 ++++--- src/org/traccar/events/IgnitionEventHandler.java | 2 +- .../traccar/events/MaintenanceEventHandler.java | 2 +- src/org/traccar/events/MotionEventHandler.java | 2 +- src/org/traccar/events/OverspeedEventHandler.java | 2 +- src/org/traccar/notification/EventForwarder.java | 2 +- .../notification/NotificationFormatter.java | 2 +- .../processing/ComputedAttributesHandler.java | 4 +-- src/org/traccar/protocol/Gt06ProtocolDecoder.java | 2 +- .../traccar/protocol/MeitrackProtocolDecoder.java | 4 +-- src/org/traccar/reports/Events.java | 2 +- src/org/traccar/reports/ReportUtils.java | 4 +-- src/org/traccar/reports/Route.java | 2 +- src/org/traccar/reports/Stops.java | 2 +- src/org/traccar/reports/Summary.java | 2 +- src/org/traccar/reports/Trips.java | 2 +- test/org/traccar/BaseTest.java | 4 +-- 44 files changed, 112 insertions(+), 152 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/BaseProtocolDecoder.java b/src/org/traccar/BaseProtocolDecoder.java index b7ceabb5c..cc16000f4 100644 --- a/src/org/traccar/BaseProtocolDecoder.java +++ b/src/org/traccar/BaseProtocolDecoder.java @@ -75,7 +75,7 @@ public abstract class BaseProtocolDecoder extends ExtendedObjectDecoder { try { for (String uniqueId : uniqueIds) { if (uniqueId != null) { - Device device = Context.getIdentityManager().getDeviceByUniqueId(uniqueId); + Device device = Context.getIdentityManager().getByUniqueId(uniqueId); if (device != null) { deviceId = device.getId(); break; diff --git a/src/org/traccar/BaseProtocolEncoder.java b/src/org/traccar/BaseProtocolEncoder.java index 3c2d08471..2c8a81868 100644 --- a/src/org/traccar/BaseProtocolEncoder.java +++ b/src/org/traccar/BaseProtocolEncoder.java @@ -25,12 +25,12 @@ import org.traccar.model.Device; public abstract class BaseProtocolEncoder extends OneToOneEncoder { protected String getUniqueId(long deviceId) { - return Context.getIdentityManager().getDeviceById(deviceId).getUniqueId(); + return Context.getIdentityManager().getById(deviceId).getUniqueId(); } protected void initDevicePassword(Command command, String defaultPassword) { if (!command.getAttributes().containsKey(Command.KEY_DEVICE_PASSWORD)) { - Device device = Context.getIdentityManager().getDeviceById(command.getDeviceId()); + Device device = Context.getIdentityManager().getById(command.getDeviceId()); String password = device.getString(Command.KEY_DEVICE_PASSWORD); if (password != null) { command.set(Command.KEY_DEVICE_PASSWORD, password); diff --git a/src/org/traccar/FilterHandler.java b/src/org/traccar/FilterHandler.java index 71c0a1cf5..1f5fffc86 100644 --- a/src/org/traccar/FilterHandler.java +++ b/src/org/traccar/FilterHandler.java @@ -184,7 +184,7 @@ public class FilterHandler extends BaseDataHandler { message.append("Position filtered by "); message.append(filterType.toString()); message.append("filters from device: "); - message.append(Context.getIdentityManager().getDeviceById(position.getDeviceId()).getUniqueId()); + message.append(Context.getIdentityManager().getById(position.getDeviceId()).getUniqueId()); message.append(" with id: "); message.append(position.getDeviceId()); diff --git a/src/org/traccar/MainEventHandler.java b/src/org/traccar/MainEventHandler.java index a005ee44b..8e88e15b9 100644 --- a/src/org/traccar/MainEventHandler.java +++ b/src/org/traccar/MainEventHandler.java @@ -55,7 +55,7 @@ public class MainEventHandler extends IdleStateAwareChannelHandler { Log.warning(error); } - String uniqueId = Context.getIdentityManager().getDeviceById(position.getDeviceId()).getUniqueId(); + String uniqueId = Context.getIdentityManager().getById(position.getDeviceId()).getUniqueId(); // Log position StringBuilder s = new StringBuilder(); diff --git a/src/org/traccar/WebDataHandler.java b/src/org/traccar/WebDataHandler.java index eaf0978ef..c64dcc81b 100644 --- a/src/org/traccar/WebDataHandler.java +++ b/src/org/traccar/WebDataHandler.java @@ -75,7 +75,7 @@ public class WebDataHandler extends BaseDataHandler { public String formatRequest(Position position) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); String request = url .replace("{name}", device.getName()) diff --git a/src/org/traccar/api/resource/AttributeResource.java b/src/org/traccar/api/resource/AttributeResource.java index 7b81d3ffb..c12fcd9e6 100644 --- a/src/org/traccar/api/resource/AttributeResource.java +++ b/src/org/traccar/api/resource/AttributeResource.java @@ -81,7 +81,7 @@ public class AttributeResource extends BaseResource { Context.getPermissionsManager().checkDevice(getUserId(), deviceId); result.retainAll(attributesManager.getDeviceItems(deviceId)); } - return attributesManager.getItems(Attribute.class, result); + return attributesManager.getItems(result); } diff --git a/src/org/traccar/api/resource/CalendarResource.java b/src/org/traccar/api/resource/CalendarResource.java index a0f8656af..f8d78a847 100644 --- a/src/org/traccar/api/resource/CalendarResource.java +++ b/src/org/traccar/api/resource/CalendarResource.java @@ -18,6 +18,7 @@ package org.traccar.api.resource; import java.sql.SQLException; import java.util.Collection; +import java.util.Set; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -47,20 +48,22 @@ public class CalendarResource extends BaseResource { @QueryParam("all") boolean all, @QueryParam("userId") long userId) throws SQLException { CalendarManager calendarManager = Context.getCalendarManager(); + Set result = null; if (all) { if (Context.getPermissionsManager().isAdmin(getUserId())) { - return calendarManager.getItems(Calendar.class, calendarManager.getAllItems()); + result = calendarManager.getAllItems(); } else { Context.getPermissionsManager().checkManager(getUserId()); - return calendarManager.getItems(Calendar.class, calendarManager.getManagedItems(getUserId())); + result = calendarManager.getManagedItems(getUserId()); } } else { if (userId == 0) { userId = getUserId(); } Context.getPermissionsManager().checkUser(getUserId(), userId); - return calendarManager.getItems(Calendar.class, calendarManager.getUserItems(userId)); + result = calendarManager.getUserItems(userId); } + return calendarManager.getItems(result); } @POST diff --git a/src/org/traccar/api/resource/DeviceResource.java b/src/org/traccar/api/resource/DeviceResource.java index c621d4304..a473b7bde 100644 --- a/src/org/traccar/api/resource/DeviceResource.java +++ b/src/org/traccar/api/resource/DeviceResource.java @@ -68,7 +68,7 @@ public class DeviceResource extends BaseResource { } else { result = new HashSet(); for (String uniqueId : uniqueIds) { - Device device = deviceManager.getDeviceByUniqueId(uniqueId); + Device device = deviceManager.getByUniqueId(uniqueId); Context.getPermissionsManager().checkDevice(getUserId(), device.getId()); result.add(device.getId()); } @@ -77,7 +77,7 @@ public class DeviceResource extends BaseResource { result.add(deviceId); } } - return deviceManager.getItems(Device.class, result); + return deviceManager.getItems(result); } @POST diff --git a/src/org/traccar/api/resource/DriverResource.java b/src/org/traccar/api/resource/DriverResource.java index 72eadb711..d44979998 100644 --- a/src/org/traccar/api/resource/DriverResource.java +++ b/src/org/traccar/api/resource/DriverResource.java @@ -79,7 +79,7 @@ public class DriverResource extends BaseResource { Context.getPermissionsManager().checkDevice(getUserId(), deviceId); result.retainAll(driversManager.getDeviceItems(deviceId)); } - return driversManager.getItems(Driver.class, result); + return driversManager.getItems(result); } diff --git a/src/org/traccar/api/resource/GeofenceResource.java b/src/org/traccar/api/resource/GeofenceResource.java index 47f889e9c..9a110fbcf 100644 --- a/src/org/traccar/api/resource/GeofenceResource.java +++ b/src/org/traccar/api/resource/GeofenceResource.java @@ -78,7 +78,7 @@ public class GeofenceResource extends BaseResource { Context.getPermissionsManager().checkDevice(getUserId(), deviceId); result.retainAll(geofenceManager.getDeviceItems(deviceId)); } - return geofenceManager.getItems(Geofence.class, result); + return geofenceManager.getItems(result); } diff --git a/src/org/traccar/api/resource/GroupResource.java b/src/org/traccar/api/resource/GroupResource.java index f832660b2..4482f06c0 100644 --- a/src/org/traccar/api/resource/GroupResource.java +++ b/src/org/traccar/api/resource/GroupResource.java @@ -60,7 +60,7 @@ public class GroupResource extends BaseResource { Context.getPermissionsManager().checkUser(getUserId(), userId); result = groupsManager.getUserItems(userId); } - return groupsManager.getItems(Group.class, result); + return groupsManager.getItems(result); } @POST diff --git a/src/org/traccar/api/resource/PositionResource.java b/src/org/traccar/api/resource/PositionResource.java index 9d3cd9ae6..6dab51744 100644 --- a/src/org/traccar/api/resource/PositionResource.java +++ b/src/org/traccar/api/resource/PositionResource.java @@ -87,7 +87,7 @@ public class PositionResource extends BaseResource { @QueryParam("deviceId") long deviceId, @QueryParam("from") String from, @QueryParam("to") String to) throws SQLException { Context.getPermissionsManager().checkDevice(getUserId(), deviceId); - GpxBuilder gpx = new GpxBuilder(Context.getIdentityManager().getDeviceById(deviceId).getName()); + GpxBuilder gpx = new GpxBuilder(Context.getIdentityManager().getById(deviceId).getName()); gpx.addPositions(Context.getDataManager().getPositions( deviceId, DateUtil.parseDate(from), DateUtil.parseDate(to))); return Response.ok(gpx.build()).header(HttpHeaders.CONTENT_DISPOSITION, CONTENT_DISPOSITION_VALUE_GPX).build(); diff --git a/src/org/traccar/api/resource/UserResource.java b/src/org/traccar/api/resource/UserResource.java index 9998ed346..deb2dd2b4 100644 --- a/src/org/traccar/api/resource/UserResource.java +++ b/src/org/traccar/api/resource/UserResource.java @@ -58,7 +58,7 @@ public class UserResource extends BaseResource { } else { throw new SecurityException("Admin or manager access required"); } - return usersManager.getItems(User.class, result); + return usersManager.getItems(result); } @PermitAll diff --git a/src/org/traccar/database/AttributesManager.java b/src/org/traccar/database/AttributesManager.java index e80d57c4e..28816645a 100644 --- a/src/org/traccar/database/AttributesManager.java +++ b/src/org/traccar/database/AttributesManager.java @@ -17,23 +17,16 @@ package org.traccar.database; import org.traccar.model.Attribute; -import org.traccar.model.BaseModel; -public class AttributesManager extends ExtendedObjectManager { +public class AttributesManager extends ExtendedObjectManager { public AttributesManager(DataManager dataManager) { super(dataManager, Attribute.class); } @Override - public Attribute getById(long calendarId) { - return (Attribute) super.getById(calendarId); - } - - @Override - public void updateCachedItem(BaseModel item) { - Attribute attribute = (Attribute) item; - Attribute cachedAttribute = getById(item.getId()); + public void updateCachedItem(Attribute attribute) { + Attribute cachedAttribute = getById(attribute.getId()); cachedAttribute.setDescription(attribute.getDescription()); cachedAttribute.setAttribute(attribute.getAttribute()); cachedAttribute.setExpression(attribute.getExpression()); diff --git a/src/org/traccar/database/BaseObjectManager.java b/src/org/traccar/database/BaseObjectManager.java index 92cfd9b6b..cc1dbde5f 100644 --- a/src/org/traccar/database/BaseObjectManager.java +++ b/src/org/traccar/database/BaseObjectManager.java @@ -27,14 +27,14 @@ import java.util.concurrent.ConcurrentHashMap; import org.traccar.helper.Log; import org.traccar.model.BaseModel; -public class BaseObjectManager { +public class BaseObjectManager { private final DataManager dataManager; - private Map items; - private Class baseClass; + private Map items; + private Class baseClass; - protected BaseObjectManager(DataManager dataManager, Class baseClass) { + protected BaseObjectManager(DataManager dataManager, Class baseClass) { this.dataManager = dataManager; this.baseClass = baseClass; refreshItems(); @@ -44,23 +44,23 @@ public class BaseObjectManager { return dataManager; } - protected final Class getBaseClass() { + protected final Class getBaseClass() { return baseClass; } - public BaseModel getById(long itemId) { + public T getById(long itemId) { return items.get(itemId); } public void refreshItems() { if (dataManager != null) { try { - Collection databaseItems = dataManager.getObjects(baseClass); + Collection databaseItems = dataManager.getObjects(baseClass); if (items == null) { items = new ConcurrentHashMap<>(databaseItems.size()); } Set databaseItemIds = new HashSet<>(); - for (BaseModel item : databaseItems) { + for (T item : databaseItems) { databaseItemIds.add(item.getId()); if (items.containsKey(item.getId())) { updateCachedItem(item); @@ -79,20 +79,20 @@ public class BaseObjectManager { } } - protected void addNewItem(BaseModel item) { + protected void addNewItem(T item) { items.put(item.getId(), item); } - public void addItem(BaseModel item) throws SQLException { + public void addItem(T item) throws SQLException { dataManager.addObject(item); addNewItem(item); } - protected void updateCachedItem(BaseModel item) { + protected void updateCachedItem(T item) { items.put(item.getId(), item); } - public void updateItem(BaseModel item) throws SQLException { + public void updateItem(T item) throws SQLException { dataManager.updateObject(item); updateCachedItem(item); } @@ -109,10 +109,10 @@ public class BaseObjectManager { } } - public final Collection getItems(Class clazz, Set itemIds) { + public final Collection getItems(Set itemIds) { Collection result = new LinkedList<>(); for (long itemId : itemIds) { - result.add((T) getById(itemId)); + result.add(getById(itemId)); } return result; } diff --git a/src/org/traccar/database/CalendarManager.java b/src/org/traccar/database/CalendarManager.java index b8d0914ee..44ced1082 100644 --- a/src/org/traccar/database/CalendarManager.java +++ b/src/org/traccar/database/CalendarManager.java @@ -18,15 +18,10 @@ package org.traccar.database; import org.traccar.model.Calendar; -public class CalendarManager extends SimpleObjectManager { +public class CalendarManager extends SimpleObjectManager { public CalendarManager(DataManager dataManager) { super(dataManager, Calendar.class); } - @Override - public Calendar getById(long calendarId) { - return (Calendar) super.getById(calendarId); - } - } diff --git a/src/org/traccar/database/ConnectionManager.java b/src/org/traccar/database/ConnectionManager.java index 0baafb578..1445fb785 100644 --- a/src/org/traccar/database/ConnectionManager.java +++ b/src/org/traccar/database/ConnectionManager.java @@ -70,7 +70,7 @@ public class ConnectionManager { } public void updateDevice(final long deviceId, String status, Date time) { - Device device = Context.getIdentityManager().getDeviceById(deviceId); + Device device = Context.getIdentityManager().getById(deviceId); if (device == null) { return; } diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java index 1fe7ddfa5..4aafe6631 100644 --- a/src/org/traccar/database/DeviceManager.java +++ b/src/org/traccar/database/DeviceManager.java @@ -30,7 +30,6 @@ import org.traccar.BaseProtocol; import org.traccar.Config; import org.traccar.Context; import org.traccar.helper.Log; -import org.traccar.model.BaseModel; import org.traccar.model.Command; import org.traccar.model.CommandType; import org.traccar.model.Device; @@ -39,7 +38,7 @@ import org.traccar.model.Group; import org.traccar.model.Position; import org.traccar.model.Server; -public class DeviceManager extends BaseObjectManager implements IdentityManager, ManagableObjects { +public class DeviceManager extends BaseObjectManager implements IdentityManager, ManagableObjects { public static final long DEFAULT_REFRESH_DELAY = 300; @@ -73,12 +72,7 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, } @Override - public Device getDeviceById(long id) { - return (Device) getById(id); - } - - @Override - public Device getDeviceByUniqueId(String uniqueId) throws SQLException { + public Device getByUniqueId(String uniqueId) throws SQLException { boolean forceUpdate = !devicesByUniqueId.containsKey(uniqueId) && !config.getBoolean("database.ignoreUnknown"); updateDeviceCache(forceUpdate); @@ -105,7 +99,7 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, } public Collection getAllDevices() { - return getItems(Device.class, getAllItems()); + return getItems(getAllItems()); } @Override @@ -142,9 +136,8 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, } @Override - protected void addNewItem(BaseModel item) { - super.addNewItem(item); - Device device = (Device) item; + protected void addNewItem(Device device) { + super.addNewItem(device); putUniqueDeviceId(device); if (device.getPhone() != null && !device.getPhone().isEmpty()) { putPhone(device); @@ -158,9 +151,8 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, } @Override - protected void updateCachedItem(BaseModel item) { - Device device = (Device) item; - Device cachedDevice = getDeviceById(device.getId()); + protected void updateCachedItem(Device device) { + Device cachedDevice = getById(device.getId()); cachedDevice.setName(device.getName()); cachedDevice.setGroupId(device.getGroupId()); cachedDevice.setCategory(device.getCategory()); @@ -182,7 +174,7 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, @Override protected void removeCachedItem(long deviceId) { - Device cachedDevice = getDeviceById(deviceId); + Device cachedDevice = getById(deviceId); if (cachedDevice != null) { String deviceUniqueId = cachedDevice.getUniqueId(); String phone = cachedDevice.getPhone(); @@ -197,7 +189,7 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, public void updateDeviceStatus(Device device) throws SQLException { getDataManager().updateDeviceStatus(device); - Device cachedDevice = getDeviceById(device.getId()); + Device cachedDevice = getById(device.getId()); if (cachedDevice != null) { cachedDevice.setStatus(device.getStatus()); } @@ -226,7 +218,7 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, getDataManager().updateLatestPosition(position); - Device device = getDeviceById(position.getDeviceId()); + Device device = getById(position.getDeviceId()); if (device != null) { device.setPositionId(position.getId()); } @@ -305,7 +297,7 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, private String lookupAttribute(long deviceId, String attributeName, boolean lookupConfig) { String result = null; - Device device = getDeviceById(deviceId); + Device device = getById(deviceId); if (device != null) { result = device.getString(attributeName); if (result == null && lookupGroupsAttribute) { @@ -352,9 +344,9 @@ public class DeviceManager extends BaseObjectManager implements IdentityManager, Position lastPosition = getLastPosition(deviceId); if (lastPosition != null) { BaseProtocol protocol = Context.getServerManager().getProtocol(lastPosition.getProtocol()); - protocol.sendTextCommand(getDeviceById(deviceId).getPhone(), command); + protocol.sendTextCommand(getById(deviceId).getPhone(), command); } else if (command.getType().equals(Command.TYPE_CUSTOM)) { - Context.getSmppManager().sendMessageSync(((Device) getById(deviceId)).getPhone(), + Context.getSmppManager().sendMessageSync(getById(deviceId).getPhone(), command.getString(Command.KEY_DATA), true); } else { throw new RuntimeException("Command " + command.getType() + " is not supported"); diff --git a/src/org/traccar/database/DriversManager.java b/src/org/traccar/database/DriversManager.java index 420824dbb..d3866a5f0 100644 --- a/src/org/traccar/database/DriversManager.java +++ b/src/org/traccar/database/DriversManager.java @@ -20,37 +20,30 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.traccar.model.Driver; -import org.traccar.model.BaseModel; -public class DriversManager extends ExtendedObjectManager { +public class DriversManager extends ExtendedObjectManager { - private Map driversByUniqueId; + private Map driversByUniqueId; public DriversManager(DataManager dataManager) { super(dataManager, Driver.class); } - @Override - public Driver getById(long driverId) { - return (Driver) super.getById(driverId); - } - private void putUniqueDriverId(Driver driver) { if (driversByUniqueId == null) { - driversByUniqueId = new ConcurrentHashMap<>(); + driversByUniqueId = new ConcurrentHashMap<>(getAllItems().size()); } - driversByUniqueId.put(driver.getUniqueId(), driver); + driversByUniqueId.put(driver.getUniqueId(), driver.getId()); } @Override - protected void addNewItem(BaseModel item) { - super.addNewItem(item); - putUniqueDriverId((Driver) item); + protected void addNewItem(Driver driver) { + super.addNewItem(driver); + putUniqueDriverId(driver); } @Override - protected void updateCachedItem(BaseModel item) { - Driver driver = (Driver) item; + protected void updateCachedItem(Driver driver) { Driver cachedDriver = getById(driver.getId()); cachedDriver.setName(driver.getName()); if (!driver.getUniqueId().equals(cachedDriver.getUniqueId())) { @@ -72,6 +65,6 @@ public class DriversManager extends ExtendedObjectManager { } public Driver getDriverByUniqueId(String uniqueId) { - return driversByUniqueId.get(uniqueId); + return getById(driversByUniqueId.get(uniqueId)); } } diff --git a/src/org/traccar/database/ExtendedObjectManager.java b/src/org/traccar/database/ExtendedObjectManager.java index 19c9ca5b2..16785cb37 100644 --- a/src/org/traccar/database/ExtendedObjectManager.java +++ b/src/org/traccar/database/ExtendedObjectManager.java @@ -30,13 +30,13 @@ import org.traccar.model.Group; import org.traccar.model.Permission; import org.traccar.model.BaseModel; -public abstract class ExtendedObjectManager extends SimpleObjectManager { +public abstract class ExtendedObjectManager extends SimpleObjectManager { private final Map> deviceItems = new ConcurrentHashMap<>(); private final Map> deviceItemsWithGroups = new ConcurrentHashMap<>(); private final Map> groupItems = new ConcurrentHashMap<>(); - protected ExtendedObjectManager(DataManager dataManager, Class baseClass) { + protected ExtendedObjectManager(DataManager dataManager, Class baseClass) { super(dataManager, baseClass); refreshExtendedPermissions(); } diff --git a/src/org/traccar/database/GeofenceManager.java b/src/org/traccar/database/GeofenceManager.java index 4bc3909cd..a32847cf9 100644 --- a/src/org/traccar/database/GeofenceManager.java +++ b/src/org/traccar/database/GeofenceManager.java @@ -23,17 +23,12 @@ import org.traccar.model.Device; import org.traccar.model.Geofence; import org.traccar.model.Position; -public class GeofenceManager extends ExtendedObjectManager { +public class GeofenceManager extends ExtendedObjectManager { public GeofenceManager(DataManager dataManager) { super(dataManager, Geofence.class); } - @Override - public Geofence getById(long geofenceId) { - return (Geofence) super.getById(geofenceId); - } - @Override public final void refreshExtendedPermissions() { super.refreshExtendedPermissions(); diff --git a/src/org/traccar/database/GroupsManager.java b/src/org/traccar/database/GroupsManager.java index 095e7a22c..20b403d55 100644 --- a/src/org/traccar/database/GroupsManager.java +++ b/src/org/traccar/database/GroupsManager.java @@ -26,7 +26,7 @@ import org.traccar.helper.Log; import org.traccar.model.BaseModel; import org.traccar.model.Group; -public class GroupsManager extends BaseObjectManager implements ManagableObjects { +public class GroupsManager extends BaseObjectManager implements ManagableObjects { private AtomicLong groupsLastUpdate = new AtomicLong(); private final long dataRefreshDelay; @@ -37,11 +37,6 @@ public class GroupsManager extends BaseObjectManager implements ManagableObjects DeviceManager.DEFAULT_REFRESH_DELAY) * 1000; } - @Override - public Group getById(long groupId) { - return (Group) super.getById(groupId); - } - private void checkGroupCycles(BaseModel group) { Set groups = new HashSet<>(); while (group != null) { @@ -76,15 +71,15 @@ public class GroupsManager extends BaseObjectManager implements ManagableObjects } @Override - protected void addNewItem(BaseModel item) { - checkGroupCycles(item); - super.addNewItem(item); + protected void addNewItem(Group group) { + checkGroupCycles(group); + super.addNewItem(group); } @Override - protected void updateCachedItem(BaseModel item) { - checkGroupCycles(item); - super.updateCachedItem(item); + protected void updateCachedItem(Group group) { + checkGroupCycles(group); + super.updateCachedItem(group); } @Override diff --git a/src/org/traccar/database/IdentityManager.java b/src/org/traccar/database/IdentityManager.java index c8c593a54..82d905963 100644 --- a/src/org/traccar/database/IdentityManager.java +++ b/src/org/traccar/database/IdentityManager.java @@ -20,9 +20,9 @@ import org.traccar.model.Position; public interface IdentityManager { - Device getDeviceById(long id); + Device getById(long id); - Device getDeviceByUniqueId(String uniqueId) throws Exception; + Device getByUniqueId(String uniqueId) throws Exception; Position getLastPosition(long deviceId); diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java index 54e5ed979..3b03c1900 100644 --- a/src/org/traccar/database/PermissionsManager.java +++ b/src/org/traccar/database/PermissionsManager.java @@ -18,6 +18,7 @@ package org.traccar.database; import org.traccar.Context; import org.traccar.helper.Log; import org.traccar.model.Attribute; +import org.traccar.model.BaseModel; import org.traccar.model.Calendar; import org.traccar.model.Device; import org.traccar.model.Driver; @@ -99,7 +100,7 @@ public class PermissionsManager { devicePermissions.clear(); try { GroupTree groupTree = new GroupTree(Context.getGroupsManager().getItems( - Group.class, Context.getGroupsManager().getAllItems()), + Context.getGroupsManager().getAllItems()), Context.getDeviceManager().getAllDevices()); for (Permission groupPermission : dataManager.getPermissions(User.class, Group.class)) { Set userGroupPermissions = getGroupPermissions(groupPermission.getOwnerId()); @@ -284,7 +285,7 @@ public class PermissionsManager { public void checkPermission(Class object, long userId, long objectId) throws SecurityException { - SimpleObjectManager manager = null; + SimpleObjectManager manager = null; if (object.equals(Device.class)) { checkDevice(userId, objectId); diff --git a/src/org/traccar/database/SimpleObjectManager.java b/src/org/traccar/database/SimpleObjectManager.java index fa41f30b6..0b4d11378 100644 --- a/src/org/traccar/database/SimpleObjectManager.java +++ b/src/org/traccar/database/SimpleObjectManager.java @@ -28,11 +28,12 @@ import org.traccar.model.BaseModel; import org.traccar.model.Permission; import org.traccar.model.User; -public abstract class SimpleObjectManager extends BaseObjectManager implements ManagableObjects { +public abstract class SimpleObjectManager extends BaseObjectManager + implements ManagableObjects { private Map> userItems; - protected SimpleObjectManager(DataManager dataManager, Class baseClass) { + protected SimpleObjectManager(DataManager dataManager, Class baseClass) { super(dataManager, baseClass); } diff --git a/src/org/traccar/database/UsersManager.java b/src/org/traccar/database/UsersManager.java index e53409b4f..28e6a31b2 100644 --- a/src/org/traccar/database/UsersManager.java +++ b/src/org/traccar/database/UsersManager.java @@ -21,10 +21,9 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.traccar.model.BaseModel; import org.traccar.model.User; -public class UsersManager extends SimpleObjectManager { +public class UsersManager extends SimpleObjectManager { private Map usersTokens; @@ -32,11 +31,6 @@ public class UsersManager extends SimpleObjectManager { super(dataManager, User.class); } - @Override - public User getById(long userId) { - return (User) super.getById(userId); - } - private void putToken(User user) { if (usersTokens == null) { usersTokens = new ConcurrentHashMap<>(); @@ -47,16 +41,15 @@ public class UsersManager extends SimpleObjectManager { } @Override - protected void addNewItem(BaseModel item) { - super.addNewItem(item); - putToken((User) item); + protected void addNewItem(User user) { + super.addNewItem(user); + putToken(user); } @Override - protected void updateCachedItem(BaseModel item) { - User user = (User) item; - User cachedUser = getById(item.getId()); - super.updateCachedItem(item); + protected void updateCachedItem(User user) { + User cachedUser = getById(user.getId()); + super.updateCachedItem(user); if (user.getToken() != null) { usersTokens.put(user.getToken(), user.getId()); } diff --git a/src/org/traccar/events/FuelDropEventHandler.java b/src/org/traccar/events/FuelDropEventHandler.java index e9a261aea..4e09bd4fa 100644 --- a/src/org/traccar/events/FuelDropEventHandler.java +++ b/src/org/traccar/events/FuelDropEventHandler.java @@ -31,7 +31,7 @@ public class FuelDropEventHandler extends BaseEventHandler { @Override protected Collection analyzePosition(Position position) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null) { return null; } diff --git a/src/org/traccar/events/GeofenceEventHandler.java b/src/org/traccar/events/GeofenceEventHandler.java index 516df9d69..79e5d0f8e 100644 --- a/src/org/traccar/events/GeofenceEventHandler.java +++ b/src/org/traccar/events/GeofenceEventHandler.java @@ -25,7 +25,6 @@ import org.traccar.database.GeofenceManager; import org.traccar.model.Calendar; import org.traccar.model.Device; import org.traccar.model.Event; -import org.traccar.model.Geofence; import org.traccar.model.Position; public class GeofenceEventHandler extends BaseEventHandler { @@ -38,7 +37,7 @@ public class GeofenceEventHandler extends BaseEventHandler { @Override protected Collection analyzePosition(Position position) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null) { return null; } @@ -59,8 +58,8 @@ public class GeofenceEventHandler extends BaseEventHandler { Collection events = new ArrayList<>(); for (long geofenceId : newGeofences) { - long calendarId = ((Geofence) geofenceManager.getById(geofenceId)).getCalendarId(); - Calendar calendar = calendarId != 0 ? (Calendar) Context.getCalendarManager().getById(calendarId) : null; + long calendarId = geofenceManager.getById(geofenceId).getCalendarId(); + Calendar calendar = calendarId != 0 ? Context.getCalendarManager().getById(calendarId) : null; if (calendar == null || calendar.checkMoment(position.getFixTime())) { Event event = new Event(Event.TYPE_GEOFENCE_ENTER, position.getDeviceId(), position.getId()); event.setGeofenceId(geofenceId); @@ -68,8 +67,8 @@ public class GeofenceEventHandler extends BaseEventHandler { } } for (long geofenceId : oldGeofences) { - long calendarId = ((Geofence) geofenceManager.getById(geofenceId)).getCalendarId(); - Calendar calendar = calendarId != 0 ? (Calendar) Context.getCalendarManager().getById(calendarId) : null; + long calendarId = geofenceManager.getById(geofenceId).getCalendarId(); + Calendar calendar = calendarId != 0 ? Context.getCalendarManager().getById(calendarId) : null; if (calendar == null || calendar.checkMoment(position.getFixTime())) { Event event = new Event(Event.TYPE_GEOFENCE_EXIT, position.getDeviceId(), position.getId()); event.setGeofenceId(geofenceId); diff --git a/src/org/traccar/events/IgnitionEventHandler.java b/src/org/traccar/events/IgnitionEventHandler.java index c628cc107..5519135bf 100644 --- a/src/org/traccar/events/IgnitionEventHandler.java +++ b/src/org/traccar/events/IgnitionEventHandler.java @@ -29,7 +29,7 @@ public class IgnitionEventHandler extends BaseEventHandler { @Override protected Collection analyzePosition(Position position) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null || !Context.getIdentityManager().isLatestPosition(position)) { return null; } diff --git a/src/org/traccar/events/MaintenanceEventHandler.java b/src/org/traccar/events/MaintenanceEventHandler.java index 86836f6af..ffeefc8c5 100644 --- a/src/org/traccar/events/MaintenanceEventHandler.java +++ b/src/org/traccar/events/MaintenanceEventHandler.java @@ -32,7 +32,7 @@ public class MaintenanceEventHandler extends BaseEventHandler { @Override protected Collection analyzePosition(Position position) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null || !Context.getIdentityManager().isLatestPosition(position)) { return null; } diff --git a/src/org/traccar/events/MotionEventHandler.java b/src/org/traccar/events/MotionEventHandler.java index e6fd10f3e..ed81176a8 100644 --- a/src/org/traccar/events/MotionEventHandler.java +++ b/src/org/traccar/events/MotionEventHandler.java @@ -29,7 +29,7 @@ public class MotionEventHandler extends BaseEventHandler { @Override protected Collection analyzePosition(Position position) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null) { return null; } diff --git a/src/org/traccar/events/OverspeedEventHandler.java b/src/org/traccar/events/OverspeedEventHandler.java index 00c3845d2..795892f40 100644 --- a/src/org/traccar/events/OverspeedEventHandler.java +++ b/src/org/traccar/events/OverspeedEventHandler.java @@ -37,7 +37,7 @@ public class OverspeedEventHandler extends BaseEventHandler { @Override protected Collection analyzePosition(Position position) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null) { return null; } diff --git a/src/org/traccar/notification/EventForwarder.java b/src/org/traccar/notification/EventForwarder.java index 08f55df75..ac37f980c 100644 --- a/src/org/traccar/notification/EventForwarder.java +++ b/src/org/traccar/notification/EventForwarder.java @@ -69,7 +69,7 @@ public final class EventForwarder { data.put(KEY_POSITION, position); } if (event.getDeviceId() != 0) { - Device device = Context.getIdentityManager().getDeviceById(event.getDeviceId()); + Device device = Context.getIdentityManager().getById(event.getDeviceId()); if (device != null) { data.put(KEY_DEVICE, device); } diff --git a/src/org/traccar/notification/NotificationFormatter.java b/src/org/traccar/notification/NotificationFormatter.java index cd9959671..33fd2cdc7 100644 --- a/src/org/traccar/notification/NotificationFormatter.java +++ b/src/org/traccar/notification/NotificationFormatter.java @@ -40,7 +40,7 @@ public final class NotificationFormatter { public static VelocityContext prepareContext(long userId, Event event, Position position) { User user = Context.getPermissionsManager().getUser(userId); - Device device = Context.getIdentityManager().getDeviceById(event.getDeviceId()); + Device device = Context.getIdentityManager().getById(event.getDeviceId()); VelocityContext velocityContext = new VelocityContext(); velocityContext.put("user", user); diff --git a/src/org/traccar/processing/ComputedAttributesHandler.java b/src/org/traccar/processing/ComputedAttributesHandler.java index d6a762535..f1f371475 100644 --- a/src/org/traccar/processing/ComputedAttributesHandler.java +++ b/src/org/traccar/processing/ComputedAttributesHandler.java @@ -51,7 +51,7 @@ public class ComputedAttributesHandler extends BaseDataHandler { private MapContext prepareContext(Position position) { MapContext result = new MapContext(); if (mapDeviceAttributes) { - Device device = Context.getIdentityManager().getDeviceById(position.getDeviceId()); + Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device != null) { for (Object key : device.getAttributes().keySet()) { result.set((String) key, device.getAttributes().get(key)); @@ -86,7 +86,7 @@ public class ComputedAttributesHandler extends BaseDataHandler { @Override protected Position handlePosition(Position position) { - Collection attributes = Context.getAttributesManager().getItems(Attribute.class, + Collection attributes = Context.getAttributesManager().getItems( Context.getAttributesManager().getAllDeviceItems(position.getDeviceId())); for (Attribute attribute : attributes) { if (attribute.getAttribute() != null) { diff --git a/src/org/traccar/protocol/Gt06ProtocolDecoder.java b/src/org/traccar/protocol/Gt06ProtocolDecoder.java index 36358b6e5..186867b9d 100644 --- a/src/org/traccar/protocol/Gt06ProtocolDecoder.java +++ b/src/org/traccar/protocol/Gt06ProtocolDecoder.java @@ -555,7 +555,7 @@ public class Gt06ProtocolDecoder extends BaseProtocolDecoder { if (photo.writableBytes() > 0) { sendPhotoRequest(channel, pictureId); } else { - Device device = Context.getDeviceManager().getDeviceById(deviceSession.getDeviceId()); + Device device = Context.getDeviceManager().getById(deviceSession.getDeviceId()); Context.getMediaManager().writeFile(device.getUniqueId(), photo, "jpg"); photos.remove(pictureId); } diff --git a/src/org/traccar/protocol/MeitrackProtocolDecoder.java b/src/org/traccar/protocol/MeitrackProtocolDecoder.java index 711697fc4..469ef3f76 100644 --- a/src/org/traccar/protocol/MeitrackProtocolDecoder.java +++ b/src/org/traccar/protocol/MeitrackProtocolDecoder.java @@ -160,7 +160,7 @@ public class MeitrackProtocolDecoder extends BaseProtocolDecoder { } } - String deviceModel = Context.getIdentityManager().getDeviceById(deviceSession.getDeviceId()).getModel(); + String deviceModel = Context.getIdentityManager().getById(deviceSession.getDeviceId()).getModel(); if (deviceModel == null) { deviceModel = ""; } @@ -316,7 +316,7 @@ public class MeitrackProtocolDecoder extends BaseProtocolDecoder { case "D03": if (channel != null) { DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - String imei = Context.getIdentityManager().getDeviceById(deviceSession.getDeviceId()).getUniqueId(); + String imei = Context.getIdentityManager().getById(deviceSession.getDeviceId()).getUniqueId(); channel.write("@@O46," + imei + ",D00,camera_picture.jpg,0*00\r\n"); } return null; diff --git a/src/org/traccar/reports/Events.java b/src/org/traccar/reports/Events.java index 348e6077f..63077de32 100644 --- a/src/org/traccar/reports/Events.java +++ b/src/org/traccar/reports/Events.java @@ -88,7 +88,7 @@ public final class Events { } } DeviceReport deviceEvents = new DeviceReport(); - Device device = Context.getIdentityManager().getDeviceById(deviceId); + Device device = Context.getIdentityManager().getById(deviceId); deviceEvents.setDeviceName(device.getName()); sheetNames.add(WorkbookUtil.createSafeSheetName(deviceEvents.getDeviceName())); if (device.getGroupId() != 0) { diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index bc58d28df..cf94030ab 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -176,7 +176,7 @@ public final class ReportUtils { long tripDuration = endTrip.getFixTime().getTime() - startTrip.getFixTime().getTime(); long deviceId = startTrip.getDeviceId(); trip.setDeviceId(deviceId); - trip.setDeviceName(Context.getIdentityManager().getDeviceById(deviceId).getName()); + trip.setDeviceName(Context.getIdentityManager().getById(deviceId).getName()); trip.setStartPositionId(startTrip.getId()); trip.setStartLat(startTrip.getLatitude()); @@ -210,7 +210,7 @@ public final class ReportUtils { long deviceId = startStop.getDeviceId(); stop.setDeviceId(deviceId); - stop.setDeviceName(Context.getIdentityManager().getDeviceById(deviceId).getName()); + stop.setDeviceName(Context.getIdentityManager().getById(deviceId).getName()); stop.setPositionId(startStop.getId()); stop.setLatitude(startStop.getLatitude()); diff --git a/src/org/traccar/reports/Route.java b/src/org/traccar/reports/Route.java index 69be55155..1c53a15cc 100644 --- a/src/org/traccar/reports/Route.java +++ b/src/org/traccar/reports/Route.java @@ -57,7 +57,7 @@ public final class Route { Collection positions = Context.getDataManager() .getPositions(deviceId, from, to); DeviceReport deviceRoutes = new DeviceReport(); - Device device = Context.getIdentityManager().getDeviceById(deviceId); + Device device = Context.getIdentityManager().getById(deviceId); deviceRoutes.setDeviceName(device.getName()); sheetNames.add(WorkbookUtil.createSafeSheetName(deviceRoutes.getDeviceName())); if (device.getGroupId() != 0) { diff --git a/src/org/traccar/reports/Stops.java b/src/org/traccar/reports/Stops.java index 20a6c1ce3..886fd7915 100644 --- a/src/org/traccar/reports/Stops.java +++ b/src/org/traccar/reports/Stops.java @@ -74,7 +74,7 @@ public final class Stops { Context.getPermissionsManager().checkDevice(userId, deviceId); Collection stops = detectStops(deviceId, from, to); DeviceReport deviceStops = new DeviceReport(); - Device device = Context.getIdentityManager().getDeviceById(deviceId); + Device device = Context.getIdentityManager().getById(deviceId); deviceStops.setDeviceName(device.getName()); sheetNames.add(WorkbookUtil.createSafeSheetName(deviceStops.getDeviceName())); if (device.getGroupId() != 0) { diff --git a/src/org/traccar/reports/Summary.java b/src/org/traccar/reports/Summary.java index 5aaf33fae..dd9877cd7 100644 --- a/src/org/traccar/reports/Summary.java +++ b/src/org/traccar/reports/Summary.java @@ -38,7 +38,7 @@ public final class Summary { private static SummaryReport calculateSummaryResult(long deviceId, Date from, Date to) throws SQLException { SummaryReport result = new SummaryReport(); result.setDeviceId(deviceId); - result.setDeviceName(Context.getIdentityManager().getDeviceById(deviceId).getName()); + result.setDeviceName(Context.getIdentityManager().getById(deviceId).getName()); Collection positions = Context.getDataManager().getPositions(deviceId, from, to); if (positions != null && !positions.isEmpty()) { Position firstPosition = null; diff --git a/src/org/traccar/reports/Trips.java b/src/org/traccar/reports/Trips.java index 7b5df0248..68b03a819 100644 --- a/src/org/traccar/reports/Trips.java +++ b/src/org/traccar/reports/Trips.java @@ -73,7 +73,7 @@ public final class Trips { Context.getPermissionsManager().checkDevice(userId, deviceId); Collection trips = detectTrips(deviceId, from, to); DeviceReport deviceTrips = new DeviceReport(); - Device device = Context.getIdentityManager().getDeviceById(deviceId); + Device device = Context.getIdentityManager().getById(deviceId); deviceTrips.setDeviceName(device.getName()); sheetNames.add(WorkbookUtil.createSafeSheetName(deviceTrips.getDeviceName())); if (device.getGroupId() != 0) { diff --git a/test/org/traccar/BaseTest.java b/test/org/traccar/BaseTest.java index 6af8610cd..37956f11d 100644 --- a/test/org/traccar/BaseTest.java +++ b/test/org/traccar/BaseTest.java @@ -18,12 +18,12 @@ public class BaseTest { } @Override - public Device getDeviceById(long id) { + public Device getById(long id) { return createDevice(); } @Override - public Device getDeviceByUniqueId(String uniqueId) { + public Device getByUniqueId(String uniqueId) { return createDevice(); } -- cgit v1.2.3 From bf8a7aac4921d17c086e6d35e44a1bc2e37888b8 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Tue, 1 Aug 2017 16:14:15 +1200 Subject: Option to limit report period --- src/org/traccar/reports/Events.java | 2 ++ src/org/traccar/reports/ReportUtils.java | 8 ++++++++ src/org/traccar/reports/Route.java | 2 ++ src/org/traccar/reports/Stops.java | 9 ++++++--- src/org/traccar/reports/Summary.java | 2 ++ src/org/traccar/reports/Trips.java | 2 ++ 6 files changed, 22 insertions(+), 3 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/Events.java b/src/org/traccar/reports/Events.java index 63077de32..a13aeeeb4 100644 --- a/src/org/traccar/reports/Events.java +++ b/src/org/traccar/reports/Events.java @@ -42,6 +42,7 @@ public final class Events { public static Collection getObjects(long userId, Collection deviceIds, Collection groupIds, Collection types, Date from, Date to) throws SQLException { + ReportUtils.checkPeriodLimit(from, to); ArrayList result = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { Context.getPermissionsManager().checkDevice(userId, deviceId); @@ -62,6 +63,7 @@ public final class Events { public static void getExcel(OutputStream outputStream, long userId, Collection deviceIds, Collection groupIds, Collection types, Date from, Date to) throws SQLException, IOException { + ReportUtils.checkPeriodLimit(from, to); ArrayList devicesEvents = new ArrayList<>(); ArrayList sheetNames = new ArrayList<>(); HashMap geofenceNames = new HashMap<>(); diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index cf94030ab..540feb6c6 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -40,6 +40,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -49,6 +50,13 @@ public final class ReportUtils { private ReportUtils() { } + public static void checkPeriodLimit(Date from, Date to) { + long limit = Context.getConfig().getLong("report.periodLimit") * 1000; + if (limit > 0 && to.getTime() - from.getTime() > limit) { + throw new IllegalArgumentException("Time period exceeds the limit"); + } + } + public static String getDistanceUnit(long userId) { return (String) Context.getPermissionsManager().lookupPreference(userId, "distanceUnit", "km"); } diff --git a/src/org/traccar/reports/Route.java b/src/org/traccar/reports/Route.java index 1c53a15cc..6adb00aae 100644 --- a/src/org/traccar/reports/Route.java +++ b/src/org/traccar/reports/Route.java @@ -39,6 +39,7 @@ public final class Route { public static Collection getObjects(long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException { + ReportUtils.checkPeriodLimit(from, to); ArrayList result = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { Context.getPermissionsManager().checkDevice(userId, deviceId); @@ -50,6 +51,7 @@ public final class Route { public static void getExcel(OutputStream outputStream, long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException, IOException { + ReportUtils.checkPeriodLimit(from, to); ArrayList devicesRoutes = new ArrayList<>(); ArrayList sheetNames = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { diff --git a/src/org/traccar/reports/Stops.java b/src/org/traccar/reports/Stops.java index 886fd7915..ee6746e4e 100644 --- a/src/org/traccar/reports/Stops.java +++ b/src/org/traccar/reports/Stops.java @@ -55,8 +55,10 @@ public final class Stops { return (Collection) result; } - public static Collection getObjects(long userId, Collection deviceIds, Collection groupIds, + public static Collection getObjects( + long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException { + ReportUtils.checkPeriodLimit(from, to); ArrayList result = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { Context.getPermissionsManager().checkDevice(userId, deviceId); @@ -65,9 +67,10 @@ public final class Stops { return result; } - public static void getExcel(OutputStream outputStream, - long userId, Collection deviceIds, Collection groupIds, + public static void getExcel( + OutputStream outputStream, long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException, IOException { + ReportUtils.checkPeriodLimit(from, to); ArrayList devicesStops = new ArrayList<>(); ArrayList sheetNames = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { diff --git a/src/org/traccar/reports/Summary.java b/src/org/traccar/reports/Summary.java index dd9877cd7..366e40421 100644 --- a/src/org/traccar/reports/Summary.java +++ b/src/org/traccar/reports/Summary.java @@ -68,6 +68,7 @@ public final class Summary { public static Collection getObjects(long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException { + ReportUtils.checkPeriodLimit(from, to); ArrayList result = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { Context.getPermissionsManager().checkDevice(userId, deviceId); @@ -79,6 +80,7 @@ public final class Summary { public static void getExcel(OutputStream outputStream, long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException, IOException { + ReportUtils.checkPeriodLimit(from, to); Collection summaries = getObjects(userId, deviceIds, groupIds, from, to); String templatePath = Context.getConfig().getString("report.templatesPath", "templates/export/"); diff --git a/src/org/traccar/reports/Trips.java b/src/org/traccar/reports/Trips.java index 68b03a819..6b97507f4 100644 --- a/src/org/traccar/reports/Trips.java +++ b/src/org/traccar/reports/Trips.java @@ -56,6 +56,7 @@ public final class Trips { public static Collection getObjects(long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException { + ReportUtils.checkPeriodLimit(from, to); ArrayList result = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { Context.getPermissionsManager().checkDevice(userId, deviceId); @@ -67,6 +68,7 @@ public final class Trips { public static void getExcel(OutputStream outputStream, long userId, Collection deviceIds, Collection groupIds, Date from, Date to) throws SQLException, IOException { + ReportUtils.checkPeriodLimit(from, to); ArrayList devicesTrips = new ArrayList<>(); ArrayList sheetNames = new ArrayList<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { -- cgit v1.2.3 From 94a922eaf167a73a0188255398fb1c6799767e18 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 8 Aug 2017 09:53:31 +0500 Subject: Implement motion detection similar to trips detection --- src/org/traccar/database/ConnectionManager.java | 45 ++++++++++++- src/org/traccar/database/DeviceManager.java | 12 ++++ src/org/traccar/events/MotionEventHandler.java | 75 ++++++++++++++++++---- src/org/traccar/model/DeviceState.java | 41 ++++++++++++ src/org/traccar/reports/ReportUtils.java | 2 +- .../org/traccar/events/MotionEventHandlerTest.java | 56 +++++++++++++--- 6 files changed, 207 insertions(+), 24 deletions(-) create mode 100644 src/org/traccar/model/DeviceState.java (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/database/ConnectionManager.java b/src/org/traccar/database/ConnectionManager.java index 1445fb785..b3b00fefa 100644 --- a/src/org/traccar/database/ConnectionManager.java +++ b/src/org/traccar/database/ConnectionManager.java @@ -23,8 +23,11 @@ import org.traccar.GlobalTimer; import org.traccar.Protocol; import org.traccar.helper.Log; import org.traccar.model.Device; +import org.traccar.model.DeviceState; import org.traccar.model.Event; import org.traccar.model.Position; +import org.traccar.reports.ReportUtils; +import org.traccar.reports.model.TripsConfig; import java.net.SocketAddress; import java.sql.SQLException; @@ -41,6 +44,7 @@ public class ConnectionManager { private final long deviceTimeout; private final boolean enableStatusEvents; + private TripsConfig tripsConfig = null; private final Map activeDevices = new ConcurrentHashMap<>(); private final Map> listeners = new ConcurrentHashMap<>(); @@ -49,6 +53,9 @@ public class ConnectionManager { public ConnectionManager() { deviceTimeout = Context.getConfig().getLong("status.timeout", DEFAULT_TIMEOUT) * 1000; enableStatusEvents = Context.getConfig().getBoolean("event.enable"); + if (Context.getConfig().getBoolean("status.updateDeviceState")) { + tripsConfig = ReportUtils.initTripsConfig(); + } } public void addActiveDevice(long deviceId, Protocol protocol, Channel channel, SocketAddress remoteAddress) { @@ -80,21 +87,30 @@ public class ConnectionManager { if (enableStatusEvents && !status.equals(oldStatus)) { String eventType; + Event stateEvent = null; switch (status) { case Device.STATUS_ONLINE: eventType = Event.TYPE_DEVICE_ONLINE; break; case Device.STATUS_UNKNOWN: eventType = Event.TYPE_DEVICE_UNKNOWN; + if (tripsConfig != null) { + stateEvent = updateDeviceState(deviceId); + } break; default: eventType = Event.TYPE_DEVICE_OFFLINE; + if (tripsConfig != null) { + stateEvent = updateDeviceState(deviceId); + } break; } - Event event = new Event(eventType, deviceId); - if (Context.getNotificationManager() != null) { - Context.getNotificationManager().updateEvent(event, null); + Set events = new HashSet<>(); + if (stateEvent != null) { + events.add(stateEvent); } + events.add(new Event(eventType, deviceId)); + Context.getNotificationManager().updateEvents(events, null); } Timeout timeout = timeouts.remove(deviceId); @@ -126,6 +142,29 @@ public class ConnectionManager { updateDevice(device); } + public Event updateDeviceState(long deviceId) { + DeviceState deviceState = Context.getDeviceManager().getDeviceState(deviceId); + if (deviceState == null || deviceState.getMotionState() == null) { + return null; + } + Event result = null; + Boolean oldMotion = deviceState.getMotionState(); + long currentTime = new Date().getTime(); + boolean newMotion = !oldMotion; + Position potentialPosition = deviceState.getMotionPosition(); + if (potentialPosition != null) { + long potentialTime = potentialPosition.getFixTime().getTime() + + (newMotion ? tripsConfig.getMinimalTripDuration() : tripsConfig.getMinimalParkingDuration()); + if (potentialTime <= currentTime) { + String eventType = newMotion ? Event.TYPE_DEVICE_MOVING : Event.TYPE_DEVICE_STOPPED; + result = new Event(eventType, potentialPosition.getDeviceId(), potentialPosition.getId()); + deviceState.setMotionState(newMotion); + deviceState.setMotionPosition(null); + } + } + return result; + } + public synchronized void updateDevice(Device device) { for (long userId : Context.getPermissionsManager().getDeviceUsers(device.getId())) { if (listeners.containsKey(userId)) { diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java index 5d123f9b8..3b7e5c617 100644 --- a/src/org/traccar/database/DeviceManager.java +++ b/src/org/traccar/database/DeviceManager.java @@ -33,6 +33,7 @@ import org.traccar.helper.Log; import org.traccar.model.Command; import org.traccar.model.CommandType; import org.traccar.model.Device; +import org.traccar.model.DeviceState; import org.traccar.model.DeviceTotalDistance; import org.traccar.model.Group; import org.traccar.model.Position; @@ -52,6 +53,8 @@ public class DeviceManager extends BaseObjectManager implements Identity private final Map positions = new ConcurrentHashMap<>(); + private final Map deviceStates = new ConcurrentHashMap<>(); + private boolean fallbackToText; public DeviceManager(DataManager dataManager) { @@ -387,4 +390,13 @@ public class DeviceManager extends BaseObjectManager implements Identity } return result; } + + public DeviceState getDeviceState(long deviceId) { + return deviceStates.get(deviceId); + } + + public void setDeviceState(long deviceId, DeviceState deviceState) { + deviceStates.put(deviceId, deviceState); + } + } diff --git a/src/org/traccar/events/MotionEventHandler.java b/src/org/traccar/events/MotionEventHandler.java index ed81176a8..9168d0fd8 100644 --- a/src/org/traccar/events/MotionEventHandler.java +++ b/src/org/traccar/events/MotionEventHandler.java @@ -21,11 +21,60 @@ import java.util.Collections; import org.traccar.BaseEventHandler; import org.traccar.Context; import org.traccar.model.Device; +import org.traccar.model.DeviceState; import org.traccar.model.Event; import org.traccar.model.Position; +import org.traccar.reports.ReportUtils; +import org.traccar.reports.model.TripsConfig; public class MotionEventHandler extends BaseEventHandler { + private TripsConfig tripsConfig; + + public MotionEventHandler() { + if (Context.getConfig() != null) { + tripsConfig = ReportUtils.initTripsConfig(); + } + } + + public static Event updateMotionState(DeviceState deviceState, Position position, TripsConfig tripsConfig) { + Event result = null; + Boolean oldMotion = deviceState.getMotionState(); + + long currentTime = position.getFixTime().getTime(); + boolean newMotion = position.getBoolean(Position.KEY_MOTION); + if (newMotion != oldMotion) { + if (deviceState.getMotionPosition() == null) { + deviceState.setMotionPosition(position); + } + } else { + deviceState.setMotionPosition(null); + } + + Position potentialPosition = deviceState.getMotionPosition(); + if (potentialPosition != null) { + long potentialTime = potentialPosition.getFixTime().getTime(); + double distance = ReportUtils.calculateDistance(potentialPosition, position, false); + if (newMotion) { + if (potentialTime + tripsConfig.getMinimalTripDuration() <= currentTime + || distance >= tripsConfig.getMinimalTripDistance()) { + result = new Event(Event.TYPE_DEVICE_MOVING, potentialPosition.getDeviceId(), + potentialPosition.getId()); + deviceState.setMotionState(true); + deviceState.setMotionPosition(null); + } + } else { + if (potentialTime + tripsConfig.getMinimalParkingDuration() <= currentTime) { + result = new Event(Event.TYPE_DEVICE_STOPPED, potentialPosition.getDeviceId(), + potentialPosition.getId()); + deviceState.setMotionState(false); + deviceState.setMotionPosition(null); + } + } + } + return result; + } + @Override protected Collection analyzePosition(Position position) { @@ -37,18 +86,22 @@ public class MotionEventHandler extends BaseEventHandler { return null; } - boolean motion = position.getBoolean(Position.KEY_MOTION); - boolean oldMotion = false; - Position lastPosition = Context.getIdentityManager().getLastPosition(position.getDeviceId()); - if (lastPosition != null) { - oldMotion = lastPosition.getBoolean(Position.KEY_MOTION); + Event result = null; + + long deviceId = position.getDeviceId(); + DeviceState deviceState = Context.getDeviceManager().getDeviceState(deviceId); + + if (deviceState == null) { + deviceState = new DeviceState(); + deviceState.setMotionState(position.getBoolean(Position.KEY_MOTION)); + } else if (deviceState.getMotionState() == null) { + deviceState.setMotionState(position.getBoolean(Position.KEY_MOTION)); + } else { + result = updateMotionState(deviceState, position, tripsConfig); } - if (motion && !oldMotion) { - return Collections.singleton( - new Event(Event.TYPE_DEVICE_MOVING, position.getDeviceId(), position.getId())); - } else if (!motion && oldMotion) { - return Collections.singleton( - new Event(Event.TYPE_DEVICE_STOPPED, position.getDeviceId(), position.getId())); + Context.getDeviceManager().setDeviceState(deviceId, deviceState); + if (result != null) { + return Collections.singleton(result); } return null; } diff --git a/src/org/traccar/model/DeviceState.java b/src/org/traccar/model/DeviceState.java new file mode 100644 index 000000000..3626b9953 --- /dev/null +++ b/src/org/traccar/model/DeviceState.java @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.model; + +public class DeviceState { + + private Boolean motionState; + + public void setMotionState(boolean motionState) { + this.motionState = motionState; + } + + public Boolean getMotionState() { + return motionState; + } + + private Position motionPosition; + + public void setMotionPosition(Position motionPosition) { + this.motionPosition = motionPosition; + } + + public Position getMotionPosition() { + return motionPosition; + } + +} diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 540feb6c6..e8db7e3b5 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -157,8 +157,8 @@ public final class ReportUtils { public static TripsConfig initTripsConfig() { return new TripsConfig( - Context.getConfig().getLong("report.trip.minimalTripDuration", 300) * 1000, Context.getConfig().getLong("report.trip.minimalTripDistance", 500), + Context.getConfig().getLong("report.trip.minimalTripDuration", 300) * 1000, Context.getConfig().getLong("report.trip.minimalParkingDuration", 300) * 1000, Context.getConfig().getBoolean("report.trip.greedyParking"), Context.getConfig().getLong("report.trip.minimalNoDataDuration", 3600) * 1000); diff --git a/test/org/traccar/events/MotionEventHandlerTest.java b/test/org/traccar/events/MotionEventHandlerTest.java index f05ef54d5..c44f3f4eb 100644 --- a/test/org/traccar/events/MotionEventHandlerTest.java +++ b/test/org/traccar/events/MotionEventHandlerTest.java @@ -2,28 +2,66 @@ package org.traccar.events; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; -import java.util.Collection; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; import org.junit.Test; import org.traccar.BaseTest; +import org.traccar.model.DeviceState; import org.traccar.model.Event; import org.traccar.model.Position; +import org.traccar.reports.model.TripsConfig; public class MotionEventHandlerTest extends BaseTest { - + + private Date date(String time) throws ParseException { + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + return dateFormat.parse(time); + } + @Test public void testMotionEventHandler() throws Exception { - - MotionEventHandler motionEventHandler = new MotionEventHandler(); - + TripsConfig tripsConfig = new TripsConfig(500, 300 * 1000, 300 * 1000, false, 0); + Position position = new Position(); + position.setTime(date("2017-01-01 00:00:00")); position.set(Position.KEY_MOTION, true); - position.setValid(true); - Collection events = motionEventHandler.analyzePosition(position); - assertNotNull(events); - Event event = (Event) events.toArray()[0]; + position.set(Position.KEY_TOTAL_DISTANCE, 0); + DeviceState deviceState = new DeviceState(); + deviceState.setMotionState(false); + deviceState.setMotionPosition(position); + Position nextPosition = new Position(); + + nextPosition.setTime(date("2017-01-01 00:02:00")); + nextPosition.set(Position.KEY_MOTION, true); + nextPosition.set(Position.KEY_TOTAL_DISTANCE, 200); + + Event event = MotionEventHandler.updateMotionState(deviceState, nextPosition, tripsConfig); + assertNull(event); + + nextPosition.set(Position.KEY_TOTAL_DISTANCE, 600); + event = MotionEventHandler.updateMotionState(deviceState, nextPosition, tripsConfig); + assertNotNull(event); + assertEquals(Event.TYPE_DEVICE_MOVING, event.getType()); + assertTrue(deviceState.getMotionState()); + assertNull(deviceState.getMotionPosition()); + + deviceState.setMotionState(false); + deviceState.setMotionPosition(position); + nextPosition.setTime(date("2017-01-01 00:06:00")); + nextPosition.set(Position.KEY_TOTAL_DISTANCE, 200); + event = MotionEventHandler.updateMotionState(deviceState, nextPosition, tripsConfig); + assertNotNull(event); assertEquals(Event.TYPE_DEVICE_MOVING, event.getType()); + assertTrue(deviceState.getMotionState()); + assertNull(deviceState.getMotionPosition()); } } -- cgit v1.2.3 From 26db3ccc2ed5d43a0e791a29d5cc4afca192e4b7 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 11 Aug 2017 15:26:11 +0500 Subject: Initialize tripsConfig ones in Context --- src/org/traccar/Context.java | 21 +++++++++++++++++++-- src/org/traccar/reports/ReportUtils.java | 9 --------- src/org/traccar/reports/Stops.java | 7 ++----- src/org/traccar/reports/Trips.java | 7 ++----- 4 files changed, 23 insertions(+), 21 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java index 4bcc1468b..a69b1786d 100644 --- a/src/org/traccar/Context.java +++ b/src/org/traccar/Context.java @@ -67,7 +67,7 @@ import org.traccar.geolocation.GeolocationProvider; import org.traccar.geolocation.MozillaGeolocationProvider; import org.traccar.geolocation.OpenCellIdGeolocationProvider; import org.traccar.notification.EventForwarder; -import org.traccar.reports.ReportUtils; +import org.traccar.reports.model.TripsConfig; import org.traccar.smpp.SmppClient; import org.traccar.web.WebServer; @@ -244,6 +244,21 @@ public final class Context { return overspeedEventHandler; } + private static TripsConfig tripsConfig; + + public static TripsConfig getTripsConfig() { + return tripsConfig; + } + + public static TripsConfig initTripsConfig() { + return new TripsConfig( + config.getLong("report.trip.minimalTripDistance", 500), + config.getLong("report.trip.minimalTripDuration", 300) * 1000, + config.getLong("report.trip.minimalParkingDuration", 300) * 1000, + config.getBoolean("report.trip.greedyParking"), + config.getLong("report.trip.minimalNoDataDuration", 3600) * 1000); + } + public static void init(String[] arguments) throws Exception { config = new Config(); @@ -342,6 +357,8 @@ public final class Context { connectionManager = new ConnectionManager(); + tripsConfig = initTripsConfig(); + if (config.getBoolean("event.enable")) { geofenceManager = new GeofenceManager(dataManager); calendarManager = new CalendarManager(dataManager); @@ -366,7 +383,7 @@ public final class Context { velocityEngine = new VelocityEngine(); velocityEngine.init(velocityProperties); - motionEventHandler = new MotionEventHandler(ReportUtils.initTripsConfig()); + motionEventHandler = new MotionEventHandler(tripsConfig); overspeedEventHandler = new OverspeedEventHandler( Context.getConfig().getLong("event.overspeed.minimalDuration") * 1000, Context.getConfig().getBoolean("event.overspeed.notRepeat")); diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index e8db7e3b5..8c39bb9dc 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -155,15 +155,6 @@ public final class ReportUtils { transformer.write(); } - public static TripsConfig initTripsConfig() { - return new TripsConfig( - Context.getConfig().getLong("report.trip.minimalTripDistance", 500), - Context.getConfig().getLong("report.trip.minimalTripDuration", 300) * 1000, - Context.getConfig().getLong("report.trip.minimalParkingDuration", 300) * 1000, - Context.getConfig().getBoolean("report.trip.greedyParking"), - Context.getConfig().getLong("report.trip.minimalNoDataDuration", 3600) * 1000); - } - private static TripReport calculateTrip( ArrayList positions, int startIndex, int endIndex, boolean ignoreOdometer) { Position startTrip = positions.get(startIndex); diff --git a/src/org/traccar/reports/Stops.java b/src/org/traccar/reports/Stops.java index ee6746e4e..3f7f674b5 100644 --- a/src/org/traccar/reports/Stops.java +++ b/src/org/traccar/reports/Stops.java @@ -33,7 +33,6 @@ import org.traccar.model.Group; import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.DeviceReport; import org.traccar.reports.model.StopReport; -import org.traccar.reports.model.TripsConfig; public final class Stops { @@ -43,13 +42,11 @@ public final class Stops { private static Collection detectStops(long deviceId, Date from, Date to) throws SQLException { double speedThreshold = Context.getConfig().getDouble("event.motion.speedThreshold", 0.01); - TripsConfig tripsConfig = ReportUtils.initTripsConfig(); - boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, - ignoreOdometer, speedThreshold, + Collection result = ReportUtils.detectTripsAndStops( + Context.getTripsConfig(), ignoreOdometer, speedThreshold, Context.getDataManager().getPositions(deviceId, from, to), false); return (Collection) result; diff --git a/src/org/traccar/reports/Trips.java b/src/org/traccar/reports/Trips.java index 6b97507f4..a4dcf00f1 100644 --- a/src/org/traccar/reports/Trips.java +++ b/src/org/traccar/reports/Trips.java @@ -32,7 +32,6 @@ import org.traccar.model.Group; import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.DeviceReport; import org.traccar.reports.model.TripReport; -import org.traccar.reports.model.TripsConfig; public final class Trips { @@ -42,13 +41,11 @@ public final class Trips { private static Collection detectTrips(long deviceId, Date from, Date to) throws SQLException { double speedThreshold = Context.getConfig().getDouble("event.motion.speedThreshold", 0.01); - TripsConfig tripsConfig = ReportUtils.initTripsConfig(); - boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, - ignoreOdometer, speedThreshold, + Collection result = ReportUtils.detectTripsAndStops( + Context.getTripsConfig(), ignoreOdometer, speedThreshold, Context.getDataManager().getPositions(deviceId, from, to), true); return (Collection) result; -- cgit v1.2.3 From f1ee1017d62ec0d1b6b1ca56c297537870f1d32b Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Mon, 14 Aug 2017 15:34:48 +0500 Subject: Reimplement trips detector using MotionEventHandler --- src/org/traccar/reports/ReportUtils.java | 147 ++++++++++++-------------- src/org/traccar/reports/Stops.java | 9 +- src/org/traccar/reports/Trips.java | 9 +- test/org/traccar/reports/ReportUtilsTest.java | 75 ++++++------- 4 files changed, 109 insertions(+), 131 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 8c39bb9dc..91dc2e019 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -26,9 +26,11 @@ import org.jxls.transform.Transformer; import org.jxls.transform.poi.PoiTransformer; import org.jxls.util.TransformerFactory; import org.traccar.Context; +import org.traccar.events.MotionEventHandler; +import org.traccar.model.DeviceState; import org.traccar.model.Driver; +import org.traccar.model.Event; import org.traccar.model.Position; -import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.StopReport; import org.traccar.reports.model.TripReport; import org.traccar.reports.model.TripsConfig; @@ -237,8 +239,11 @@ public final class ReportUtils { private static boolean isMoving(ArrayList positions, int index, TripsConfig tripsConfig, double speedThreshold) { - if (tripsConfig.getMinimalNoDataDuration() > 0 && index < positions.size() - 1 + if (tripsConfig.getMinimalNoDataDuration() > 0 && (index < positions.size() - 1 && positions.get(index + 1).getFixTime().getTime() - positions.get(index).getFixTime().getTime() + >= tripsConfig.getMinimalNoDataDuration()) + || index > 0 + && positions.get(index).getFixTime().getTime() - positions.get(index - 1).getFixTime().getTime() >= tripsConfig.getMinimalNoDataDuration()) { return false; } @@ -250,100 +255,80 @@ public final class ReportUtils { } } - public static Collection detectTripsAndStops(TripsConfig tripsConfig, boolean ignoreOdometer, - double speedThreshold, Collection positionCollection, boolean trips) { - - Collection result = new ArrayList<>(); + public static Collection detectTrips(Collection positionCollection, TripsConfig tripsConfig, + boolean ignoreOdometer, double speedThreshold) { + Collection result = new ArrayList<>(); ArrayList positions = new ArrayList<>(positionCollection); if (positions != null && !positions.isEmpty()) { - int previousStartParkingIndex = 0; + MotionEventHandler motionHandler = new MotionEventHandler(tripsConfig); + DeviceState deviceState = new DeviceState(); + deviceState.setMotionState(isMoving(positions, 0, tripsConfig, speedThreshold)); + int startTripIndex = deviceState.getMotionState() ? 0 : -1; int startParkingIndex = -1; - int previousEndParkingIndex = 0; - int endParkingIndex = 0; - - boolean isMoving = false; - boolean isLast = false; - boolean skipped = false; - boolean tripFiltered = false; - for (int i = 0; i < positions.size(); i++) { - isMoving = isMoving(positions, i, tripsConfig, speedThreshold); - isLast = i == positions.size() - 1; - - if ((isMoving || isLast) && startParkingIndex != -1) { - if (!skipped || previousEndParkingIndex == 0) { - previousEndParkingIndex = endParkingIndex; - } - endParkingIndex = i; + positions.get(i).set(Position.KEY_MOTION, isMoving(positions, i, tripsConfig, speedThreshold)); + Event event = motionHandler.updateMotionState(deviceState, positions.get(i)); + if (startTripIndex == -1 && !deviceState.getMotionState() && deviceState.getMotionPosition() != null) { + startTripIndex = i; + startParkingIndex = -1; } - if (!isMoving && startParkingIndex == -1) { - if (tripsConfig.getGreedyParking()) { - long tripDuration = positions.get(i).getFixTime().getTime() - - positions.get(endParkingIndex).getFixTime().getTime(); - double tripDistance = ReportUtils.calculateDistance(positions.get(endParkingIndex), - positions.get(i), false); - tripFiltered = tripDuration < tripsConfig.getMinimalTripDuration() - && tripDistance < tripsConfig.getMinimalTripDistance(); - if (tripFiltered) { - startParkingIndex = previousStartParkingIndex; - endParkingIndex = previousEndParkingIndex; - tripFiltered = false; - } else { - previousStartParkingIndex = i; - startParkingIndex = i; - } - } else { - long tripDuration = positions.get(i).getFixTime().getTime() - - positions.get(previousEndParkingIndex).getFixTime().getTime(); - double tripDistance = ReportUtils.calculateDistance(positions.get(previousEndParkingIndex), - positions.get(i), false); - tripFiltered = tripDuration < tripsConfig.getMinimalTripDuration() - && tripDistance < tripsConfig.getMinimalTripDistance(); + if (deviceState.getMotionState()) { + if (startParkingIndex == -1) { startParkingIndex = i; + } else if (deviceState.getMotionPosition() == null) { + startParkingIndex = -1; } } - if (startParkingIndex != -1 && (endParkingIndex > startParkingIndex || isLast)) { - long parkingDuration = positions.get(endParkingIndex).getFixTime().getTime() - - positions.get(startParkingIndex).getFixTime().getTime(); - if ((parkingDuration >= tripsConfig.getMinimalParkingDuration() || isLast) - && previousEndParkingIndex < startParkingIndex) { - if (!tripFiltered) { - if (trips) { - result.add(calculateTrip( - positions, previousEndParkingIndex, startParkingIndex, ignoreOdometer)); - } else { - if (result.isEmpty() && previousEndParkingIndex > previousStartParkingIndex) { - long previousParkingDuration = positions.get(previousEndParkingIndex) - .getFixTime().getTime() - positions.get(previousStartParkingIndex) - .getFixTime().getTime(); - if (previousParkingDuration >= tripsConfig.getMinimalParkingDuration()) { - result.add(calculateStop(positions, previousStartParkingIndex, - previousEndParkingIndex)); - } - } - result.add(calculateStop(positions, startParkingIndex, isLast ? i : endParkingIndex)); - } - } - previousEndParkingIndex = endParkingIndex; - skipped = false; - } else { - skipped = true; + if (startTripIndex != -1 && startParkingIndex != -1 && event != null && !deviceState.getMotionState()) { + result.add(calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); + startTripIndex = -1; + } + } + if (startTripIndex != -1 && startParkingIndex != -1) { + result.add(calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); + } + } + return result; + } + + public static Collection detectStops(Collection positionCollection, TripsConfig tripsConfig, + boolean ignoreOdometer, double speedThreshold) { + Collection result = new ArrayList<>(); + + ArrayList positions = new ArrayList<>(positionCollection); + if (positions != null && !positions.isEmpty()) { + MotionEventHandler motionHandler = new MotionEventHandler(tripsConfig); + DeviceState deviceState = new DeviceState(); + deviceState.setMotionState(isMoving(positions, 0, tripsConfig, speedThreshold)); + int startTripIndex = -1; + int startParkingIndex = deviceState.getMotionState() ? -1 : 0; + for (int i = 0; i < positions.size(); i++) { + boolean isMoving = isMoving(positions, i, tripsConfig, speedThreshold); + positions.get(i).set(Position.KEY_MOTION, isMoving); + Event event = motionHandler.updateMotionState(deviceState, positions.get(i)); + if (startParkingIndex == -1 && deviceState.getMotionState() + && deviceState.getMotionPosition() != null) { + startParkingIndex = i; + startTripIndex = -1; + } + if (!deviceState.getMotionState()) { + if (startTripIndex == -1) { + startTripIndex = i; + } else if (deviceState.getMotionPosition() == null) { + startTripIndex = -1; } + } + if (startParkingIndex != -1 && startTripIndex != -1 && event != null && deviceState.getMotionState()) { + result.add(calculateStop(positions, startParkingIndex, startTripIndex)); startParkingIndex = -1; } } - if (result.isEmpty() && !trips) { - int end = isMoving && !tripsConfig.getGreedyParking() - ? Math.max(endParkingIndex, previousEndParkingIndex) : positions.size() - 1; - long parkingDuration = positions.get(end).getFixTime().getTime() - - positions.get(previousStartParkingIndex).getFixTime().getTime(); - if (parkingDuration >= tripsConfig.getMinimalParkingDuration()) { - result.add(calculateStop(positions, previousStartParkingIndex, end)); - } + if (startParkingIndex != -1) { + result.add(calculateStop(positions, startParkingIndex, + startTripIndex != -1 ? startTripIndex : positions.size() - 1)); } } - return result; } } diff --git a/src/org/traccar/reports/Stops.java b/src/org/traccar/reports/Stops.java index 3f7f674b5..68fdef334 100644 --- a/src/org/traccar/reports/Stops.java +++ b/src/org/traccar/reports/Stops.java @@ -30,7 +30,6 @@ import org.apache.poi.ss.util.WorkbookUtil; import org.traccar.Context; import org.traccar.model.Device; import org.traccar.model.Group; -import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.DeviceReport; import org.traccar.reports.model.StopReport; @@ -45,11 +44,11 @@ public final class Stops { boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); - Collection result = ReportUtils.detectTripsAndStops( - Context.getTripsConfig(), ignoreOdometer, speedThreshold, - Context.getDataManager().getPositions(deviceId, from, to), false); + Collection result = ReportUtils.detectStops( + Context.getDataManager().getPositions(deviceId, from, to), + Context.getTripsConfig(), ignoreOdometer, speedThreshold); - return (Collection) result; + return result; } public static Collection getObjects( diff --git a/src/org/traccar/reports/Trips.java b/src/org/traccar/reports/Trips.java index a4dcf00f1..bb39cf493 100644 --- a/src/org/traccar/reports/Trips.java +++ b/src/org/traccar/reports/Trips.java @@ -29,7 +29,6 @@ import org.apache.poi.ss.util.WorkbookUtil; import org.traccar.Context; import org.traccar.model.Device; import org.traccar.model.Group; -import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.DeviceReport; import org.traccar.reports.model.TripReport; @@ -44,11 +43,11 @@ public final class Trips { boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); - Collection result = ReportUtils.detectTripsAndStops( - Context.getTripsConfig(), ignoreOdometer, speedThreshold, - Context.getDataManager().getPositions(deviceId, from, to), true); + Collection result = ReportUtils.detectTrips( + Context.getDataManager().getPositions(deviceId, from, to), + Context.getTripsConfig(), ignoreOdometer, speedThreshold); - return (Collection) result; + return result; } public static Collection getObjects(long userId, Collection deviceIds, Collection groupIds, diff --git a/test/org/traccar/reports/ReportUtilsTest.java b/test/org/traccar/reports/ReportUtilsTest.java index adcdf5875..1b552baa3 100644 --- a/test/org/traccar/reports/ReportUtilsTest.java +++ b/test/org/traccar/reports/ReportUtilsTest.java @@ -11,13 +11,13 @@ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collection; import java.util.Date; +import java.util.Iterator; import java.util.TimeZone; import org.junit.Assert; import org.junit.Test; import org.traccar.BaseTest; import org.traccar.model.Position; -import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.StopReport; import org.traccar.reports.model.TripReport; import org.traccar.reports.model.TripsConfig; @@ -81,12 +81,12 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, false, 900000); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, true); + Collection trips = ReportUtils.detectTrips(data, tripsConfig, false, 0.01); - assertNotNull(result); - assertFalse(result.isEmpty()); + assertNotNull(trips); + assertFalse(trips.isEmpty()); - TripReport itemTrip = (TripReport) result.iterator().next(); + TripReport itemTrip = trips.iterator().next(); assertEquals(date("2016-01-01 00:02:00.000"), itemTrip.getStartTime()); assertEquals(date("2016-01-01 00:05:00.000"), itemTrip.getEndTime()); @@ -95,12 +95,20 @@ public class ReportUtilsTest extends BaseTest { assertEquals(10, itemTrip.getMaxSpeed(), 0.01); assertEquals(3000, itemTrip.getDistance(), 0.01); - result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, false); + Collection stops = ReportUtils.detectStops(data, tripsConfig, false, 0.01); - assertNotNull(result); - assertFalse(result.isEmpty()); + assertNotNull(stops); + assertFalse(stops.isEmpty()); - StopReport itemStop = (StopReport) result.iterator().next(); + Iterator iterator = stops.iterator(); + + StopReport itemStop = iterator.next(); + + assertEquals(date("2016-01-01 00:00:00.000"), itemStop.getStartTime()); + assertEquals(date("2016-01-01 00:02:00.000"), itemStop.getEndTime()); + assertEquals(120000, itemStop.getDuration()); + + itemStop = iterator.next(); assertEquals(date("2016-01-01 00:05:00.000"), itemStop.getStartTime()); assertEquals(date("2016-01-01 00:07:00.000"), itemStop.getEndTime()); @@ -121,12 +129,12 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, false, 900000); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, false); + Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); assertNotNull(result); assertFalse(result.isEmpty()); - StopReport itemStop = (StopReport) result.iterator().next(); + StopReport itemStop = result.iterator().next(); assertEquals(date("2016-01-01 00:00:00.000"), itemStop.getStartTime()); assertEquals(date("2016-01-01 00:05:00.000"), itemStop.getEndTime()); @@ -147,32 +155,19 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, false, 900000); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, false); + Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); assertNotNull(result); assertFalse(result.isEmpty()); - StopReport itemStop = (StopReport) result.iterator().next(); + StopReport itemStop = result.iterator().next(); assertEquals(date("2016-01-01 00:00:00.000"), itemStop.getStartTime()); assertEquals(date("2016-01-01 00:04:00.000"), itemStop.getEndTime()); assertEquals(240000, itemStop.getDuration()); - tripsConfig.setGreedyParking(true); - - result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, false); - - assertNotNull(result); - assertFalse(result.isEmpty()); - - itemStop = (StopReport) result.iterator().next(); - - assertEquals(date("2016-01-01 00:00:00.000"), itemStop.getStartTime()); - assertEquals(date("2016-01-01 00:05:00.000"), itemStop.getEndTime()); - assertEquals(300000, itemStop.getDuration()); - } - + @Test public void testDetectStopsStartedFromTrip() throws ParseException { @@ -186,16 +181,16 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, false, 900000); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, false); + Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); assertNotNull(result); assertFalse(result.isEmpty()); - StopReport itemStop = (StopReport) result.iterator().next(); + StopReport itemStop = result.iterator().next(); - assertEquals(date("2016-01-01 00:00:00.000"), itemStop.getStartTime()); + assertEquals(date("2016-01-01 00:02:00.000"), itemStop.getStartTime()); assertEquals(date("2016-01-01 00:05:00.000"), itemStop.getEndTime()); - assertEquals(300000, itemStop.getDuration()); + assertEquals(180000, itemStop.getDuration()); } @@ -212,7 +207,7 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, false, 900000); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, false); + Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); assertNotNull(result); assertTrue(result.isEmpty()); @@ -234,12 +229,12 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 200000, 200000, false, 900000); - Collection result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, true); + Collection trips = ReportUtils.detectTrips(data, tripsConfig, false, 0.01); - assertNotNull(result); - assertFalse(result.isEmpty()); + assertNotNull(trips); + assertFalse(trips.isEmpty()); - TripReport itemTrip = (TripReport) result.iterator().next(); + TripReport itemTrip = trips.iterator().next(); assertEquals(date("2016-01-01 00:00:00.000"), itemTrip.getStartTime()); assertEquals(date("2016-01-01 00:04:00.000"), itemTrip.getEndTime()); @@ -248,12 +243,12 @@ public class ReportUtilsTest extends BaseTest { assertEquals(7, itemTrip.getMaxSpeed(), 0.01); assertEquals(600, itemTrip.getDistance(), 0.01); - result = ReportUtils.detectTripsAndStops(tripsConfig, false, 0.01, data, false); + Collection stops = ReportUtils.detectStops(data, tripsConfig, false, 0.01); - assertNotNull(result); - assertFalse(result.isEmpty()); + assertNotNull(stops); + assertFalse(stops.isEmpty()); - StopReport itemStop = (StopReport) result.iterator().next(); + StopReport itemStop = stops.iterator().next(); assertEquals(date("2016-01-01 00:04:00.000"), itemStop.getStartTime()); assertEquals(date("2016-01-01 00:23:00.000"), itemStop.getEndTime()); -- cgit v1.2.3 From 9b9c715cf0d9604be71a35e5e6e5428a3a891ba9 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 15 Aug 2017 15:26:49 +0500 Subject: Remove intermediate variable --- src/org/traccar/reports/ReportUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 91dc2e019..75f300b1d 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -304,8 +304,7 @@ public final class ReportUtils { int startTripIndex = -1; int startParkingIndex = deviceState.getMotionState() ? -1 : 0; for (int i = 0; i < positions.size(); i++) { - boolean isMoving = isMoving(positions, i, tripsConfig, speedThreshold); - positions.get(i).set(Position.KEY_MOTION, isMoving); + positions.get(i).set(Position.KEY_MOTION, isMoving(positions, i, tripsConfig, speedThreshold)); Event event = motionHandler.updateMotionState(deviceState, positions.get(i)); if (startParkingIndex == -1 && deviceState.getMotionState() && deviceState.getMotionPosition() != null) { -- cgit v1.2.3 From 668d0c65609cc510ad9da3be4fc7aafaa3ca427d Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 16 Aug 2017 11:04:41 +0500 Subject: Combine trips and stops detectors and some optimization --- src/org/traccar/events/MotionEventHandler.java | 5 +- src/org/traccar/reports/ReportUtils.java | 114 +++++++++++-------------- src/org/traccar/reports/Stops.java | 4 +- src/org/traccar/reports/Trips.java | 4 +- test/org/traccar/reports/ReportUtilsTest.java | 16 ++-- 5 files changed, 68 insertions(+), 75 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/events/MotionEventHandler.java b/src/org/traccar/events/MotionEventHandler.java index 8c2d4c56c..b96898fc1 100644 --- a/src/org/traccar/events/MotionEventHandler.java +++ b/src/org/traccar/events/MotionEventHandler.java @@ -61,11 +61,14 @@ public class MotionEventHandler extends BaseEventHandler { } public Event updateMotionState(DeviceState deviceState, Position position) { + return updateMotionState(deviceState, position, position.getBoolean(Position.KEY_MOTION)); + } + + public Event updateMotionState(DeviceState deviceState, Position position, boolean newMotion) { Event result = null; Boolean oldMotion = deviceState.getMotionState(); long currentTime = position.getFixTime().getTime(); - boolean newMotion = position.getBoolean(Position.KEY_MOTION); if (newMotion != oldMotion) { if (deviceState.getMotionPosition() == null) { deviceState.setMotionPosition(position); diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 75f300b1d..cd13b28e6 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -31,6 +31,7 @@ import org.traccar.model.DeviceState; import org.traccar.model.Driver; import org.traccar.model.Event; import org.traccar.model.Position; +import org.traccar.reports.model.BaseReport; import org.traccar.reports.model.StopReport; import org.traccar.reports.model.TripReport; import org.traccar.reports.model.TripsConfig; @@ -239,13 +240,16 @@ public final class ReportUtils { private static boolean isMoving(ArrayList positions, int index, TripsConfig tripsConfig, double speedThreshold) { - if (tripsConfig.getMinimalNoDataDuration() > 0 && (index < positions.size() - 1 - && positions.get(index + 1).getFixTime().getTime() - positions.get(index).getFixTime().getTime() - >= tripsConfig.getMinimalNoDataDuration()) - || index > 0 - && positions.get(index).getFixTime().getTime() - positions.get(index - 1).getFixTime().getTime() - >= tripsConfig.getMinimalNoDataDuration()) { - return false; + if (tripsConfig.getMinimalNoDataDuration() > 0) { + boolean beforeGap = index < positions.size() - 1 + && positions.get(index + 1).getFixTime().getTime() - positions.get(index).getFixTime().getTime() + >= tripsConfig.getMinimalNoDataDuration(); + boolean afterGap = index > 0 + && positions.get(index).getFixTime().getTime() - positions.get(index - 1).getFixTime().getTime() + >= tripsConfig.getMinimalNoDataDuration(); + if (beforeGap || afterGap) { + return false; + } } if (positions.get(index).getAttributes().containsKey(Position.KEY_MOTION) && positions.get(index).getAttributes().get(Position.KEY_MOTION) instanceof Boolean) { @@ -255,76 +259,62 @@ public final class ReportUtils { } } - public static Collection detectTrips(Collection positionCollection, TripsConfig tripsConfig, - boolean ignoreOdometer, double speedThreshold) { - Collection result = new ArrayList<>(); + public static Collection detectTripsAndStops(Collection positionCollection, + TripsConfig tripsConfig, boolean ignoreOdometer, double speedThreshold, Class reportClass) { + Collection result = new ArrayList<>(); ArrayList positions = new ArrayList<>(positionCollection); if (positions != null && !positions.isEmpty()) { + boolean trips = reportClass.equals(TripReport.class); MotionEventHandler motionHandler = new MotionEventHandler(tripsConfig); DeviceState deviceState = new DeviceState(); deviceState.setMotionState(isMoving(positions, 0, tripsConfig, speedThreshold)); - int startTripIndex = deviceState.getMotionState() ? 0 : -1; - int startParkingIndex = -1; + int startTripIndex = trips && deviceState.getMotionState() ? 0 : -1; + int startParkingIndex = !trips && !deviceState.getMotionState() ? 0 : -1; for (int i = 0; i < positions.size(); i++) { - positions.get(i).set(Position.KEY_MOTION, isMoving(positions, i, tripsConfig, speedThreshold)); - Event event = motionHandler.updateMotionState(deviceState, positions.get(i)); - if (startTripIndex == -1 && !deviceState.getMotionState() && deviceState.getMotionPosition() != null) { - startTripIndex = i; - startParkingIndex = -1; - } - if (deviceState.getMotionState()) { - if (startParkingIndex == -1) { - startParkingIndex = i; - } else if (deviceState.getMotionPosition() == null) { + Event event = motionHandler.updateMotionState(deviceState, positions.get(i), + isMoving(positions, i, tripsConfig, speedThreshold)); + if (deviceState.getMotionPosition() != null) { + if (trips && startTripIndex == -1 && !deviceState.getMotionState()) { + startTripIndex = i; startParkingIndex = -1; + } else if (!trips && startParkingIndex == -1 && deviceState.getMotionState()) { + startParkingIndex = i; + startTripIndex = -1; } } - if (startTripIndex != -1 && startParkingIndex != -1 && event != null && !deviceState.getMotionState()) { - result.add(calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); - startTripIndex = -1; - } - } - if (startTripIndex != -1 && startParkingIndex != -1) { - result.add(calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); - } - } - return result; - } - - public static Collection detectStops(Collection positionCollection, TripsConfig tripsConfig, - boolean ignoreOdometer, double speedThreshold) { - Collection result = new ArrayList<>(); - - ArrayList positions = new ArrayList<>(positionCollection); - if (positions != null && !positions.isEmpty()) { - MotionEventHandler motionHandler = new MotionEventHandler(tripsConfig); - DeviceState deviceState = new DeviceState(); - deviceState.setMotionState(isMoving(positions, 0, tripsConfig, speedThreshold)); - int startTripIndex = -1; - int startParkingIndex = deviceState.getMotionState() ? -1 : 0; - for (int i = 0; i < positions.size(); i++) { - positions.get(i).set(Position.KEY_MOTION, isMoving(positions, i, tripsConfig, speedThreshold)); - Event event = motionHandler.updateMotionState(deviceState, positions.get(i)); - if (startParkingIndex == -1 && deviceState.getMotionState() - && deviceState.getMotionPosition() != null) { - startParkingIndex = i; - startTripIndex = -1; + if (trips) { + if (deviceState.getMotionState()) { + if (startParkingIndex == -1) { + startParkingIndex = i; + } else if (deviceState.getMotionPosition() == null) { + startParkingIndex = -1; + } + } + } else { + if (!deviceState.getMotionState()) { + if (startTripIndex == -1) { + startTripIndex = i; + } else if (deviceState.getMotionPosition() == null) { + startTripIndex = -1; + } + } } - if (!deviceState.getMotionState()) { - if (startTripIndex == -1) { - startTripIndex = i; - } else if (deviceState.getMotionPosition() == null) { + if (startTripIndex != -1 && startParkingIndex != -1 && event != null) { + if (trips && !deviceState.getMotionState()) { + result.add((T) calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); startTripIndex = -1; + } else if (!trips && deviceState.getMotionState()) { + result.add((T) calculateStop(positions, startParkingIndex, startTripIndex)); + startParkingIndex = -1; } } - if (startParkingIndex != -1 && startTripIndex != -1 && event != null && deviceState.getMotionState()) { - result.add(calculateStop(positions, startParkingIndex, startTripIndex)); - startParkingIndex = -1; - } } - if (startParkingIndex != -1) { - result.add(calculateStop(positions, startParkingIndex, + if (trips && startTripIndex != -1 && startParkingIndex != -1) { + result.add((T) calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); + } + if (!trips && startParkingIndex != -1) { + result.add((T) calculateStop(positions, startParkingIndex, startTripIndex != -1 ? startTripIndex : positions.size() - 1)); } } diff --git a/src/org/traccar/reports/Stops.java b/src/org/traccar/reports/Stops.java index 68fdef334..1e72cc927 100644 --- a/src/org/traccar/reports/Stops.java +++ b/src/org/traccar/reports/Stops.java @@ -44,9 +44,9 @@ public final class Stops { boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); - Collection result = ReportUtils.detectStops( + Collection result = ReportUtils.detectTripsAndStops( Context.getDataManager().getPositions(deviceId, from, to), - Context.getTripsConfig(), ignoreOdometer, speedThreshold); + Context.getTripsConfig(), ignoreOdometer, speedThreshold, StopReport.class); return result; } diff --git a/src/org/traccar/reports/Trips.java b/src/org/traccar/reports/Trips.java index bb39cf493..1ee62e87c 100644 --- a/src/org/traccar/reports/Trips.java +++ b/src/org/traccar/reports/Trips.java @@ -43,9 +43,9 @@ public final class Trips { boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); - Collection result = ReportUtils.detectTrips( + Collection result = ReportUtils.detectTripsAndStops( Context.getDataManager().getPositions(deviceId, from, to), - Context.getTripsConfig(), ignoreOdometer, speedThreshold); + Context.getTripsConfig(), ignoreOdometer, speedThreshold, TripReport.class); return result; } diff --git a/test/org/traccar/reports/ReportUtilsTest.java b/test/org/traccar/reports/ReportUtilsTest.java index c74109550..c82853161 100644 --- a/test/org/traccar/reports/ReportUtilsTest.java +++ b/test/org/traccar/reports/ReportUtilsTest.java @@ -81,7 +81,7 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false); - Collection trips = ReportUtils.detectTrips(data, tripsConfig, false, 0.01); + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); assertNotNull(trips); assertFalse(trips.isEmpty()); @@ -95,7 +95,7 @@ public class ReportUtilsTest extends BaseTest { assertEquals(10, itemTrip.getMaxSpeed(), 0.01); assertEquals(3000, itemTrip.getDistance(), 0.01); - Collection stops = ReportUtils.detectStops(data, tripsConfig, false, 0.01); + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); assertNotNull(stops); assertFalse(stops.isEmpty()); @@ -129,7 +129,7 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false); - Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); assertNotNull(result); assertFalse(result.isEmpty()); @@ -155,7 +155,7 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false); - Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); assertNotNull(result); assertFalse(result.isEmpty()); @@ -181,7 +181,7 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false); - Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); assertNotNull(result); assertFalse(result.isEmpty()); @@ -207,7 +207,7 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false); - Collection result = ReportUtils.detectStops(data, tripsConfig, false, 0.01); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); assertNotNull(result); assertTrue(result.isEmpty()); @@ -229,7 +229,7 @@ public class ReportUtilsTest extends BaseTest { TripsConfig tripsConfig = new TripsConfig(500, 200000, 200000, 900000, false); - Collection trips = ReportUtils.detectTrips(data, tripsConfig, false, 0.01); + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); assertNotNull(trips); assertFalse(trips.isEmpty()); @@ -243,7 +243,7 @@ public class ReportUtilsTest extends BaseTest { assertEquals(7, itemTrip.getMaxSpeed(), 0.01); assertEquals(600, itemTrip.getDistance(), 0.01); - Collection stops = ReportUtils.detectStops(data, tripsConfig, false, 0.01); + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); assertNotNull(stops); assertFalse(stops.isEmpty()); -- cgit v1.2.3 From 3224a87a5a533737cfe5edf3b67c2f3e84fe8496 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 16 Aug 2017 15:08:51 +0500 Subject: Combine detection logic and unwrap gap check --- src/org/traccar/reports/ReportUtils.java | 89 +++++++++++++++----------------- 1 file changed, 43 insertions(+), 46 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index cd13b28e6..db2d59a5d 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -238,16 +238,30 @@ public final class ReportUtils { } + private static T calculateTripOrStop(ArrayList positions, int startIndex, + int endIndex, boolean ignoreOdometer, Class reportClass) { + if (reportClass.equals(TripReport.class)) { + return (T) calculateTrip(positions, startIndex, endIndex, ignoreOdometer); + } else { + return (T) calculateStop(positions, startIndex, endIndex); + } + } + private static boolean isMoving(ArrayList positions, int index, TripsConfig tripsConfig, double speedThreshold) { if (tripsConfig.getMinimalNoDataDuration() > 0) { - boolean beforeGap = index < positions.size() - 1 - && positions.get(index + 1).getFixTime().getTime() - positions.get(index).getFixTime().getTime() - >= tripsConfig.getMinimalNoDataDuration(); - boolean afterGap = index > 0 - && positions.get(index).getFixTime().getTime() - positions.get(index - 1).getFixTime().getTime() - >= tripsConfig.getMinimalNoDataDuration(); - if (beforeGap || afterGap) { + long positionsDfference = 0; + if (index < positions.size() - 1) { + positionsDfference = positions.get(index + 1).getFixTime().getTime() + - positions.get(index).getFixTime().getTime(); + } + if (positionsDfference >= tripsConfig.getMinimalNoDataDuration()) { + return false; + } else if (index > 0) { + positionsDfference = positions.get(index).getFixTime().getTime() + - positions.get(index - 1).getFixTime().getTime(); + } + if (positionsDfference >= tripsConfig.getMinimalNoDataDuration()) { return false; } } @@ -269,53 +283,36 @@ public final class ReportUtils { MotionEventHandler motionHandler = new MotionEventHandler(tripsConfig); DeviceState deviceState = new DeviceState(); deviceState.setMotionState(isMoving(positions, 0, tripsConfig, speedThreshold)); - int startTripIndex = trips && deviceState.getMotionState() ? 0 : -1; - int startParkingIndex = !trips && !deviceState.getMotionState() ? 0 : -1; + int startEventIndex = trips == deviceState.getMotionState() ? 0 : -1; + int startNoEventIndex = -1; for (int i = 0; i < positions.size(); i++) { Event event = motionHandler.updateMotionState(deviceState, positions.get(i), isMoving(positions, i, tripsConfig, speedThreshold)); - if (deviceState.getMotionPosition() != null) { - if (trips && startTripIndex == -1 && !deviceState.getMotionState()) { - startTripIndex = i; - startParkingIndex = -1; - } else if (!trips && startParkingIndex == -1 && deviceState.getMotionState()) { - startParkingIndex = i; - startTripIndex = -1; - } + if (deviceState.getMotionPosition() != null && startEventIndex == -1 + && trips != deviceState.getMotionState()) { + startEventIndex = i; + startNoEventIndex = -1; } - if (trips) { - if (deviceState.getMotionState()) { - if (startParkingIndex == -1) { - startParkingIndex = i; - } else if (deviceState.getMotionPosition() == null) { - startParkingIndex = -1; - } - } - } else { - if (!deviceState.getMotionState()) { - if (startTripIndex == -1) { - startTripIndex = i; - } else if (deviceState.getMotionPosition() == null) { - startTripIndex = -1; - } + if (trips == deviceState.getMotionState()) { + if (startNoEventIndex == -1) { + startNoEventIndex = i; + } else if (deviceState.getMotionPosition() == null) { + startNoEventIndex = -1; } } - if (startTripIndex != -1 && startParkingIndex != -1 && event != null) { - if (trips && !deviceState.getMotionState()) { - result.add((T) calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); - startTripIndex = -1; - } else if (!trips && deviceState.getMotionState()) { - result.add((T) calculateStop(positions, startParkingIndex, startTripIndex)); - startParkingIndex = -1; - } + if (startEventIndex != -1 && startNoEventIndex != -1 && event != null + && trips != deviceState.getMotionState()) { + result.add(calculateTripOrStop(positions, startEventIndex, startNoEventIndex, + ignoreOdometer, reportClass)); + startEventIndex = -1; } } - if (trips && startTripIndex != -1 && startParkingIndex != -1) { - result.add((T) calculateTrip(positions, startTripIndex, startParkingIndex, ignoreOdometer)); - } - if (!trips && startParkingIndex != -1) { - result.add((T) calculateStop(positions, startParkingIndex, - startTripIndex != -1 ? startTripIndex : positions.size() - 1)); + if (startEventIndex != -1) { + if (startNoEventIndex != -1 || !trips) { + result.add(calculateTripOrStop(positions, startEventIndex, + startNoEventIndex != -1 ? startNoEventIndex : positions.size() - 1, + ignoreOdometer, reportClass)); + } } } return result; -- cgit v1.2.3 From 5d3eb5136b96c8667021ef4d9452b4008ff40e42 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 16 Aug 2017 16:13:26 +0500 Subject: Revert check for gap --- src/org/traccar/reports/ReportUtils.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index db2d59a5d..6a5370d15 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -250,18 +250,13 @@ public final class ReportUtils { private static boolean isMoving(ArrayList positions, int index, TripsConfig tripsConfig, double speedThreshold) { if (tripsConfig.getMinimalNoDataDuration() > 0) { - long positionsDfference = 0; - if (index < positions.size() - 1) { - positionsDfference = positions.get(index + 1).getFixTime().getTime() - - positions.get(index).getFixTime().getTime(); - } - if (positionsDfference >= tripsConfig.getMinimalNoDataDuration()) { - return false; - } else if (index > 0) { - positionsDfference = positions.get(index).getFixTime().getTime() - - positions.get(index - 1).getFixTime().getTime(); - } - if (positionsDfference >= tripsConfig.getMinimalNoDataDuration()) { + boolean beforeGap = index < positions.size() - 1 + && positions.get(index + 1).getFixTime().getTime() - positions.get(index).getFixTime().getTime() + >= tripsConfig.getMinimalNoDataDuration(); + boolean afterGap = index > 0 + && positions.get(index).getFixTime().getTime() - positions.get(index - 1).getFixTime().getTime() + >= tripsConfig.getMinimalNoDataDuration(); + if (beforeGap || afterGap) { return false; } } -- cgit v1.2.3 From 9476e6be8fae228cda5867750bc4d102b1f9497d Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 16 Aug 2017 16:52:45 +0500 Subject: - Map correct position to delayed event notification - Fix nested condition --- src/org/traccar/database/NotificationManager.java | 11 ++++++++--- src/org/traccar/reports/ReportUtils.java | 6 ++---- 2 files changed, 10 insertions(+), 7 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/database/NotificationManager.java b/src/org/traccar/database/NotificationManager.java index 0987f255b..8eea287de 100644 --- a/src/org/traccar/database/NotificationManager.java +++ b/src/org/traccar/database/NotificationManager.java @@ -48,8 +48,13 @@ public class NotificationManager { } public void updateEvent(Event event, Position position) { + Position relatedPosition = position; try { dataManager.addObject(event); + if (event.getPositionId() != 0 && (relatedPosition == null + || event.getPositionId() != relatedPosition.getId())) { + relatedPosition = dataManager.getObject(Position.class, event.getPositionId()); + } } catch (SQLException error) { Log.warning(error); } @@ -64,16 +69,16 @@ public class NotificationManager { Context.getConnectionManager().updateEvent(userId, event); } if (notification.getMail()) { - NotificationMail.sendMailAsync(userId, event, position); + NotificationMail.sendMailAsync(userId, event, relatedPosition); } if (notification.getSms()) { - NotificationSms.sendSmsAsync(userId, event, position); + NotificationSms.sendSmsAsync(userId, event, relatedPosition); } } } } if (Context.getEventForwarder() != null) { - Context.getEventForwarder().forwardEvent(event, position); + Context.getEventForwarder().forwardEvent(event, relatedPosition); } } diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 6a5370d15..8a398e4c2 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -302,12 +302,10 @@ public final class ReportUtils { startEventIndex = -1; } } - if (startEventIndex != -1) { - if (startNoEventIndex != -1 || !trips) { - result.add(calculateTripOrStop(positions, startEventIndex, + if (startEventIndex != -1 && (startNoEventIndex != -1 || !trips)) { + result.add(calculateTripOrStop(positions, startEventIndex, startNoEventIndex != -1 ? startNoEventIndex : positions.size() - 1, ignoreOdometer, reportClass)); - } } } return result; -- cgit v1.2.3 From 1324c00d0ece6e20545fb75f7775a2c6cee2a391 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 17 Aug 2017 10:10:05 +0500 Subject: Pass Map to notifications --- src/org/traccar/BaseEventHandler.java | 8 +++--- src/org/traccar/database/ConnectionManager.java | 21 ++++++++-------- src/org/traccar/database/NotificationManager.java | 18 ++++++-------- src/org/traccar/events/AlertEventHandler.java | 6 ++--- .../traccar/events/CommandResultEventHandler.java | 6 ++--- src/org/traccar/events/DriverEventHandler.java | 6 ++--- src/org/traccar/events/FuelDropEventHandler.java | 6 ++--- src/org/traccar/events/GeofenceEventHandler.java | 11 ++++---- src/org/traccar/events/IgnitionEventHandler.java | 14 +++++------ .../traccar/events/MaintenanceEventHandler.java | 6 ++--- src/org/traccar/events/MotionEventHandler.java | 29 ++++++++++------------ src/org/traccar/events/OverspeedEventHandler.java | 27 +++++++++----------- src/org/traccar/reports/ReportUtils.java | 3 ++- test/org/traccar/events/AlertEventHandlerTest.java | 6 ++--- .../events/CommandResultEventHandlerTest.java | 6 ++--- .../traccar/events/IgnitionEventHandlerTest.java | 4 +-- .../org/traccar/events/MotionEventHandlerTest.java | 23 ++++++++++------- .../traccar/events/OverspeedEventHandlerTest.java | 27 +++++++++++--------- 18 files changed, 114 insertions(+), 113 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/BaseEventHandler.java b/src/org/traccar/BaseEventHandler.java index 588406bf4..b6f7e2085 100644 --- a/src/org/traccar/BaseEventHandler.java +++ b/src/org/traccar/BaseEventHandler.java @@ -15,7 +15,7 @@ */ package org.traccar; -import java.util.Collection; +import java.util.Map; import org.traccar.model.Event; import org.traccar.model.Position; @@ -25,13 +25,13 @@ public abstract class BaseEventHandler extends BaseDataHandler { @Override protected Position handlePosition(Position position) { - Collection events = analyzePosition(position); + Map events = analyzePosition(position); if (events != null && Context.getNotificationManager() != null) { - Context.getNotificationManager().updateEvents(events, position); + Context.getNotificationManager().updateEvents(events); } return position; } - protected abstract Collection analyzePosition(Position position); + protected abstract Map analyzePosition(Position position); } diff --git a/src/org/traccar/database/ConnectionManager.java b/src/org/traccar/database/ConnectionManager.java index 7a0a6d30d..de11db21b 100644 --- a/src/org/traccar/database/ConnectionManager.java +++ b/src/org/traccar/database/ConnectionManager.java @@ -31,6 +31,7 @@ import org.traccar.model.Position; import java.net.SocketAddress; import java.sql.SQLException; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -84,7 +85,7 @@ public class ConnectionManager { if (enableStatusEvents && !status.equals(oldStatus)) { String eventType; - Set events = new HashSet<>(); + Map events = new HashMap<>(); switch (status) { case Device.STATUS_ONLINE: eventType = Event.TYPE_DEVICE_ONLINE; @@ -92,18 +93,18 @@ public class ConnectionManager { case Device.STATUS_UNKNOWN: eventType = Event.TYPE_DEVICE_UNKNOWN; if (updateDeviceState) { - events.addAll(updateDeviceState(deviceId)); + events.putAll(updateDeviceState(deviceId)); } break; default: eventType = Event.TYPE_DEVICE_OFFLINE; if (updateDeviceState) { - events.addAll(updateDeviceState(deviceId)); + events.putAll(updateDeviceState(deviceId)); } break; } - events.add(new Event(eventType, deviceId)); - Context.getNotificationManager().updateEvents(events, null); + events.put(new Event(eventType, deviceId), null); + Context.getNotificationManager().updateEvents(events); } Timeout timeout = timeouts.remove(deviceId); @@ -135,19 +136,19 @@ public class ConnectionManager { updateDevice(device); } - public Set updateDeviceState(long deviceId) { + public Map updateDeviceState(long deviceId) { DeviceState deviceState = Context.getDeviceManager().getDeviceState(deviceId); - Set result = new HashSet<>(); + Map result = new HashMap<>(); - Event event = Context.getMotionEventHandler().updateMotionState(deviceState); + Map event = Context.getMotionEventHandler().updateMotionState(deviceState); if (event != null) { - result.add(event); + result.putAll(event); } event = Context.getOverspeedEventHandler().updateOverspeedState(deviceState, Context.getDeviceManager(). lookupAttributeDouble(deviceId, OverspeedEventHandler.ATTRIBUTE_SPEED_LIMIT, 0, false)); if (event != null) { - result.add(event); + result.putAll(event); } return result; diff --git a/src/org/traccar/database/NotificationManager.java b/src/org/traccar/database/NotificationManager.java index 8eea287de..98cae3499 100644 --- a/src/org/traccar/database/NotificationManager.java +++ b/src/org/traccar/database/NotificationManager.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -48,13 +49,8 @@ public class NotificationManager { } public void updateEvent(Event event, Position position) { - Position relatedPosition = position; try { dataManager.addObject(event); - if (event.getPositionId() != 0 && (relatedPosition == null - || event.getPositionId() != relatedPosition.getId())) { - relatedPosition = dataManager.getObject(Position.class, event.getPositionId()); - } } catch (SQLException error) { Log.warning(error); } @@ -69,22 +65,22 @@ public class NotificationManager { Context.getConnectionManager().updateEvent(userId, event); } if (notification.getMail()) { - NotificationMail.sendMailAsync(userId, event, relatedPosition); + NotificationMail.sendMailAsync(userId, event, position); } if (notification.getSms()) { - NotificationSms.sendSmsAsync(userId, event, relatedPosition); + NotificationSms.sendSmsAsync(userId, event, position); } } } } if (Context.getEventForwarder() != null) { - Context.getEventForwarder().forwardEvent(event, relatedPosition); + Context.getEventForwarder().forwardEvent(event, position); } } - public void updateEvents(Collection events, Position position) { - for (Event event : events) { - updateEvent(event, position); + public void updateEvents(Map events) { + for (Entry event : events.entrySet()) { + updateEvent(event.getKey(), event.getValue()); } } diff --git a/src/org/traccar/events/AlertEventHandler.java b/src/org/traccar/events/AlertEventHandler.java index 7d0bd669b..003ccb662 100644 --- a/src/org/traccar/events/AlertEventHandler.java +++ b/src/org/traccar/events/AlertEventHandler.java @@ -15,8 +15,8 @@ */ package org.traccar.events; -import java.util.Collection; import java.util.Collections; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.model.Event; @@ -25,12 +25,12 @@ import org.traccar.model.Position; public class AlertEventHandler extends BaseEventHandler { @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { Object alarm = position.getAttributes().get(Position.KEY_ALARM); if (alarm != null) { Event event = new Event(Event.TYPE_ALARM, position.getDeviceId(), position.getId()); event.set(Position.KEY_ALARM, (String) alarm); - return Collections.singleton(event); + return Collections.singletonMap(event, position); } return null; } diff --git a/src/org/traccar/events/CommandResultEventHandler.java b/src/org/traccar/events/CommandResultEventHandler.java index 077c389c9..775aa903f 100644 --- a/src/org/traccar/events/CommandResultEventHandler.java +++ b/src/org/traccar/events/CommandResultEventHandler.java @@ -15,8 +15,8 @@ */ package org.traccar.events; -import java.util.Collection; import java.util.Collections; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.model.Event; @@ -25,12 +25,12 @@ import org.traccar.model.Position; public class CommandResultEventHandler extends BaseEventHandler { @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { Object commandResult = position.getAttributes().get(Position.KEY_RESULT); if (commandResult != null) { Event event = new Event(Event.TYPE_COMMAND_RESULT, position.getDeviceId(), position.getId()); event.set(Position.KEY_RESULT, (String) commandResult); - return Collections.singleton(event); + return Collections.singletonMap(event, position); } return null; } diff --git a/src/org/traccar/events/DriverEventHandler.java b/src/org/traccar/events/DriverEventHandler.java index eb5f2a301..39b8eb9c0 100644 --- a/src/org/traccar/events/DriverEventHandler.java +++ b/src/org/traccar/events/DriverEventHandler.java @@ -16,8 +16,8 @@ */ package org.traccar.events; -import java.util.Collection; import java.util.Collections; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -27,7 +27,7 @@ import org.traccar.model.Position; public class DriverEventHandler extends BaseEventHandler { @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { if (!Context.getIdentityManager().isLatestPosition(position)) { return null; } @@ -41,7 +41,7 @@ public class DriverEventHandler extends BaseEventHandler { if (!driverUniqueId.equals(oldDriverUniqueId)) { Event event = new Event(Event.TYPE_DRIVER_CHANGED, position.getDeviceId(), position.getId()); event.set(Position.KEY_DRIVER_UNIQUE_ID, driverUniqueId); - return Collections.singleton(event); + return Collections.singletonMap(event, position); } } return null; diff --git a/src/org/traccar/events/FuelDropEventHandler.java b/src/org/traccar/events/FuelDropEventHandler.java index 4e09bd4fa..4fc512162 100644 --- a/src/org/traccar/events/FuelDropEventHandler.java +++ b/src/org/traccar/events/FuelDropEventHandler.java @@ -21,15 +21,15 @@ import org.traccar.model.Device; import org.traccar.model.Event; import org.traccar.model.Position; -import java.util.Collection; import java.util.Collections; +import java.util.Map; public class FuelDropEventHandler extends BaseEventHandler { public static final String ATTRIBUTE_FUEL_DROP_THRESHOLD = "fuelDropThreshold"; @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null) { @@ -52,7 +52,7 @@ public class FuelDropEventHandler extends BaseEventHandler { if (drop >= fuelDropThreshold) { Event event = new Event(Event.TYPE_DEVICE_FUEL_DROP, position.getDeviceId(), position.getId()); event.set(ATTRIBUTE_FUEL_DROP_THRESHOLD, fuelDropThreshold); - return Collections.singleton(event); + return Collections.singletonMap(event, position); } } } diff --git a/src/org/traccar/events/GeofenceEventHandler.java b/src/org/traccar/events/GeofenceEventHandler.java index 79e5d0f8e..31d82a81e 100644 --- a/src/org/traccar/events/GeofenceEventHandler.java +++ b/src/org/traccar/events/GeofenceEventHandler.java @@ -16,8 +16,9 @@ package org.traccar.events; import java.util.ArrayList; -import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -36,7 +37,7 @@ public class GeofenceEventHandler extends BaseEventHandler { } @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null) { return null; @@ -56,14 +57,14 @@ public class GeofenceEventHandler extends BaseEventHandler { device.setGeofenceIds(currentGeofences); - Collection events = new ArrayList<>(); + Map events = new HashMap<>(); for (long geofenceId : newGeofences) { long calendarId = geofenceManager.getById(geofenceId).getCalendarId(); Calendar calendar = calendarId != 0 ? Context.getCalendarManager().getById(calendarId) : null; if (calendar == null || calendar.checkMoment(position.getFixTime())) { Event event = new Event(Event.TYPE_GEOFENCE_ENTER, position.getDeviceId(), position.getId()); event.setGeofenceId(geofenceId); - events.add(event); + events.put(event, position); } } for (long geofenceId : oldGeofences) { @@ -72,7 +73,7 @@ public class GeofenceEventHandler extends BaseEventHandler { if (calendar == null || calendar.checkMoment(position.getFixTime())) { Event event = new Event(Event.TYPE_GEOFENCE_EXIT, position.getDeviceId(), position.getId()); event.setGeofenceId(geofenceId); - events.add(event); + events.put(event, position); } } return events; diff --git a/src/org/traccar/events/IgnitionEventHandler.java b/src/org/traccar/events/IgnitionEventHandler.java index 5519135bf..cc53b216c 100644 --- a/src/org/traccar/events/IgnitionEventHandler.java +++ b/src/org/traccar/events/IgnitionEventHandler.java @@ -16,8 +16,8 @@ */ package org.traccar.events; -import java.util.Collection; import java.util.Collections; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -28,13 +28,13 @@ import org.traccar.model.Position; public class IgnitionEventHandler extends BaseEventHandler { @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null || !Context.getIdentityManager().isLatestPosition(position)) { return null; } - Collection result = null; + Map result = null; if (position.getAttributes().containsKey(Position.KEY_IGNITION)) { boolean ignition = position.getBoolean(Position.KEY_IGNITION); @@ -44,11 +44,11 @@ public class IgnitionEventHandler extends BaseEventHandler { boolean oldIgnition = lastPosition.getBoolean(Position.KEY_IGNITION); if (ignition && !oldIgnition) { - result = Collections.singleton( - new Event(Event.TYPE_IGNITION_ON, position.getDeviceId(), position.getId())); + result = Collections.singletonMap( + new Event(Event.TYPE_IGNITION_ON, position.getDeviceId(), position.getId()), position); } else if (!ignition && oldIgnition) { - result = Collections.singleton( - new Event(Event.TYPE_IGNITION_OFF, position.getDeviceId(), position.getId())); + result = Collections.singletonMap( + new Event(Event.TYPE_IGNITION_OFF, position.getDeviceId(), position.getId()), position); } } } diff --git a/src/org/traccar/events/MaintenanceEventHandler.java b/src/org/traccar/events/MaintenanceEventHandler.java index ffeefc8c5..86abf7c17 100644 --- a/src/org/traccar/events/MaintenanceEventHandler.java +++ b/src/org/traccar/events/MaintenanceEventHandler.java @@ -16,8 +16,8 @@ */ package org.traccar.events; -import java.util.Collection; import java.util.Collections; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -31,7 +31,7 @@ public class MaintenanceEventHandler extends BaseEventHandler { public static final String ATTRIBUTE_MAINTENANCE_INTERVAL = "maintenance.interval"; @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { Device device = Context.getIdentityManager().getById(position.getDeviceId()); if (device == null || !Context.getIdentityManager().isLatestPosition(position)) { return null; @@ -60,7 +60,7 @@ public class MaintenanceEventHandler extends BaseEventHandler { if ((long) (oldTotalDistance / maintenanceInterval) < (long) (newTotalDistance / maintenanceInterval)) { Event event = new Event(Event.TYPE_MAINTENANCE, position.getDeviceId(), position.getId()); event.set(Position.KEY_TOTAL_DISTANCE, newTotalDistance); - return Collections.singleton(event); + return Collections.singletonMap(event, position); } return null; diff --git a/src/org/traccar/events/MotionEventHandler.java b/src/org/traccar/events/MotionEventHandler.java index b96898fc1..ae64c10ea 100644 --- a/src/org/traccar/events/MotionEventHandler.java +++ b/src/org/traccar/events/MotionEventHandler.java @@ -16,8 +16,8 @@ */ package org.traccar.events; -import java.util.Collection; import java.util.Collections; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -36,17 +36,17 @@ public class MotionEventHandler extends BaseEventHandler { this.tripsConfig = tripsConfig; } - private Event newEvent(DeviceState deviceState, boolean newMotion) { + private Map newEvent(DeviceState deviceState, boolean newMotion) { String eventType = newMotion ? Event.TYPE_DEVICE_MOVING : Event.TYPE_DEVICE_STOPPED; - Event event = new Event(eventType, deviceState.getMotionPosition().getDeviceId(), - deviceState.getMotionPosition().getId()); + Position position = deviceState.getMotionPosition(); + Event event = new Event(eventType, position.getDeviceId(), position.getId()); deviceState.setMotionState(newMotion); deviceState.setMotionPosition(null); - return event; + return Collections.singletonMap(event, position); } - public Event updateMotionState(DeviceState deviceState) { - Event result = null; + public Map updateMotionState(DeviceState deviceState) { + Map result = null; if (deviceState.getMotionState() != null && deviceState.getMotionPosition() != null) { boolean newMotion = !deviceState.getMotionState(); Position motionPosition = deviceState.getMotionPosition(); @@ -60,12 +60,12 @@ public class MotionEventHandler extends BaseEventHandler { return result; } - public Event updateMotionState(DeviceState deviceState, Position position) { + public Map updateMotionState(DeviceState deviceState, Position position) { return updateMotionState(deviceState, position, position.getBoolean(Position.KEY_MOTION)); } - public Event updateMotionState(DeviceState deviceState, Position position, boolean newMotion) { - Event result = null; + public Map updateMotionState(DeviceState deviceState, Position position, boolean newMotion) { + Map result = null; Boolean oldMotion = deviceState.getMotionState(); long currentTime = position.getFixTime().getTime(); @@ -102,7 +102,7 @@ public class MotionEventHandler extends BaseEventHandler { } @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { long deviceId = position.getDeviceId(); Device device = Context.getIdentityManager().getById(deviceId); @@ -113,7 +113,7 @@ public class MotionEventHandler extends BaseEventHandler { return null; } - Event result = null; + Map result = null; DeviceState deviceState = Context.getDeviceManager().getDeviceState(deviceId); if (deviceState.getMotionState() == null) { @@ -122,10 +122,7 @@ public class MotionEventHandler extends BaseEventHandler { result = updateMotionState(deviceState, position); } Context.getDeviceManager().setDeviceState(deviceId, deviceState); - if (result != null) { - return Collections.singleton(result); - } - return null; + return result; } } diff --git a/src/org/traccar/events/OverspeedEventHandler.java b/src/org/traccar/events/OverspeedEventHandler.java index 953af6b33..cb658415c 100644 --- a/src/org/traccar/events/OverspeedEventHandler.java +++ b/src/org/traccar/events/OverspeedEventHandler.java @@ -15,8 +15,8 @@ */ package org.traccar.events; -import java.util.Collection; import java.util.Collections; +import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.Context; @@ -37,18 +37,18 @@ public class OverspeedEventHandler extends BaseEventHandler { this.minimalDuration = minimalDuration; } - private Event newEvent(DeviceState deviceState, double speedLimit) { - Event event = new Event(Event.TYPE_DEVICE_OVERSPEED, deviceState.getOverspeedPosition().getDeviceId(), - deviceState.getOverspeedPosition().getId()); + private Map newEvent(DeviceState deviceState, double speedLimit) { + Position position = deviceState.getOverspeedPosition(); + Event event = new Event(Event.TYPE_DEVICE_OVERSPEED, position.getDeviceId(), position.getId()); event.set("speed", deviceState.getOverspeedPosition().getSpeed()); event.set(ATTRIBUTE_SPEED_LIMIT, speedLimit); deviceState.setOverspeedState(notRepeat); deviceState.setOverspeedPosition(null); - return event; + return Collections.singletonMap(event, position); } - public Event updateOverspeedState(DeviceState deviceState, double speedLimit) { - Event result = null; + public Map updateOverspeedState(DeviceState deviceState, double speedLimit) { + Map result = null; if (deviceState.getOverspeedState() != null && !deviceState.getOverspeedState() && deviceState.getOverspeedPosition() != null && speedLimit != 0) { long currentTime = System.currentTimeMillis(); @@ -61,8 +61,8 @@ public class OverspeedEventHandler extends BaseEventHandler { return result; } - public Event updateOverspeedState(DeviceState deviceState, Position position, double speedLimit) { - Event result = null; + public Map updateOverspeedState(DeviceState deviceState, Position position, double speedLimit) { + Map result = null; Boolean oldOverspeed = deviceState.getOverspeedState(); @@ -89,7 +89,7 @@ public class OverspeedEventHandler extends BaseEventHandler { } @Override - protected Collection analyzePosition(Position position) { + protected Map analyzePosition(Position position) { long deviceId = position.getDeviceId(); Device device = Context.getIdentityManager().getById(deviceId); @@ -105,7 +105,7 @@ public class OverspeedEventHandler extends BaseEventHandler { return null; } - Event result = null; + Map result = null; DeviceState deviceState = Context.getDeviceManager().getDeviceState(deviceId); if (deviceState.getOverspeedState() == null) { @@ -115,10 +115,7 @@ public class OverspeedEventHandler extends BaseEventHandler { } Context.getDeviceManager().setDeviceState(deviceId, deviceState); - if (result != null) { - return Collections.singleton(result); - } - return null; + return result; } } diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 8a398e4c2..46aea0757 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -46,6 +46,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.TimeZone; public final class ReportUtils { @@ -281,7 +282,7 @@ public final class ReportUtils { int startEventIndex = trips == deviceState.getMotionState() ? 0 : -1; int startNoEventIndex = -1; for (int i = 0; i < positions.size(); i++) { - Event event = motionHandler.updateMotionState(deviceState, positions.get(i), + Map event = motionHandler.updateMotionState(deviceState, positions.get(i), isMoving(positions, i, tripsConfig, speedThreshold)); if (deviceState.getMotionPosition() != null && startEventIndex == -1 && trips != deviceState.getMotionState()) { diff --git a/test/org/traccar/events/AlertEventHandlerTest.java b/test/org/traccar/events/AlertEventHandlerTest.java index 77128f066..4e11398e1 100644 --- a/test/org/traccar/events/AlertEventHandlerTest.java +++ b/test/org/traccar/events/AlertEventHandlerTest.java @@ -3,7 +3,7 @@ package org.traccar.events; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import java.util.Collection; +import java.util.Map; import org.junit.Test; import org.traccar.BaseTest; @@ -19,9 +19,9 @@ public class AlertEventHandlerTest extends BaseTest { Position position = new Position(); position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - Collection events = alertEventHandler.analyzePosition(position); + Map events = alertEventHandler.analyzePosition(position); assertNotNull(events); - Event event = (Event) events.toArray()[0]; + Event event = events.keySet().iterator().next(); assertEquals(Event.TYPE_ALARM, event.getType()); } diff --git a/test/org/traccar/events/CommandResultEventHandlerTest.java b/test/org/traccar/events/CommandResultEventHandlerTest.java index f028e86ee..602108d1a 100644 --- a/test/org/traccar/events/CommandResultEventHandlerTest.java +++ b/test/org/traccar/events/CommandResultEventHandlerTest.java @@ -3,7 +3,7 @@ package org.traccar.events; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import java.util.Collection; +import java.util.Map; import org.junit.Test; import org.traccar.BaseTest; @@ -19,9 +19,9 @@ public class CommandResultEventHandlerTest extends BaseTest { Position position = new Position(); position.set(Position.KEY_RESULT, "Test Result"); - Collection events = commandResultEventHandler.analyzePosition(position); + Map events = commandResultEventHandler.analyzePosition(position); assertNotNull(events); - Event event = (Event) events.toArray()[0]; + Event event = events.keySet().iterator().next(); assertEquals(Event.TYPE_COMMAND_RESULT, event.getType()); } diff --git a/test/org/traccar/events/IgnitionEventHandlerTest.java b/test/org/traccar/events/IgnitionEventHandlerTest.java index d6c348c77..7c4ac21b9 100644 --- a/test/org/traccar/events/IgnitionEventHandlerTest.java +++ b/test/org/traccar/events/IgnitionEventHandlerTest.java @@ -2,7 +2,7 @@ package org.traccar.events; import static org.junit.Assert.assertEquals; -import java.util.Collection; +import java.util.Map; import org.junit.Test; import org.traccar.BaseTest; @@ -19,7 +19,7 @@ public class IgnitionEventHandlerTest extends BaseTest { Position position = new Position(); position.set(Position.KEY_IGNITION, true); position.setValid(true); - Collection events = ignitionEventHandler.analyzePosition(position); + Map events = ignitionEventHandler.analyzePosition(position); assertEquals(events, null); } diff --git a/test/org/traccar/events/MotionEventHandlerTest.java b/test/org/traccar/events/MotionEventHandlerTest.java index 902be8b87..b88328e58 100644 --- a/test/org/traccar/events/MotionEventHandlerTest.java +++ b/test/org/traccar/events/MotionEventHandlerTest.java @@ -10,6 +10,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Map; import java.util.TimeZone; import org.junit.Test; @@ -45,12 +46,13 @@ public class MotionEventHandlerTest extends BaseTest { nextPosition.set(Position.KEY_MOTION, true); nextPosition.set(Position.KEY_TOTAL_DISTANCE, 200); - Event event = motionEventHandler.updateMotionState(deviceState, nextPosition); - assertNull(event); + Map events = motionEventHandler.updateMotionState(deviceState, nextPosition); + assertNull(events); nextPosition.set(Position.KEY_TOTAL_DISTANCE, 600); - event = motionEventHandler.updateMotionState(deviceState, nextPosition); - assertNotNull(event); + events = motionEventHandler.updateMotionState(deviceState, nextPosition); + assertNotNull(events); + Event event = events.keySet().iterator().next(); assertEquals(Event.TYPE_DEVICE_MOVING, event.getType()); assertTrue(deviceState.getMotionState()); assertNull(deviceState.getMotionPosition()); @@ -59,8 +61,9 @@ public class MotionEventHandlerTest extends BaseTest { deviceState.setMotionPosition(position); nextPosition.setTime(date("2017-01-01 00:06:00")); nextPosition.set(Position.KEY_TOTAL_DISTANCE, 200); - event = motionEventHandler.updateMotionState(deviceState, nextPosition); + events = motionEventHandler.updateMotionState(deviceState, nextPosition); assertNotNull(event); + event = events.keySet().iterator().next(); assertEquals(Event.TYPE_DEVICE_MOVING, event.getType()); assertTrue(deviceState.getMotionState()); assertNull(deviceState.getMotionPosition()); @@ -78,9 +81,10 @@ public class MotionEventHandlerTest extends BaseTest { deviceState.setMotionState(false); deviceState.setMotionPosition(position); - Event event = motionEventHandler.updateMotionState(deviceState); + Map events = motionEventHandler.updateMotionState(deviceState); - assertNotNull(event); + assertNotNull(events); + Event event = events.keySet().iterator().next(); assertEquals(Event.TYPE_DEVICE_MOVING, event.getType()); assertTrue(deviceState.getMotionState()); assertNull(deviceState.getMotionPosition()); @@ -104,8 +108,9 @@ public class MotionEventHandlerTest extends BaseTest { nextPosition.set(Position.KEY_MOTION, false); nextPosition.set(Position.KEY_IGNITION, false); - Event event = motionEventHandler.updateMotionState(deviceState, nextPosition); - assertNotNull(event); + Map events = motionEventHandler.updateMotionState(deviceState, nextPosition); + assertNotNull(events); + Event event = events.keySet().iterator().next(); assertEquals(Event.TYPE_DEVICE_STOPPED, event.getType()); assertFalse(deviceState.getMotionState()); assertNull(deviceState.getMotionPosition()); diff --git a/test/org/traccar/events/OverspeedEventHandlerTest.java b/test/org/traccar/events/OverspeedEventHandlerTest.java index 48d7445ff..d38367cd9 100644 --- a/test/org/traccar/events/OverspeedEventHandlerTest.java +++ b/test/org/traccar/events/OverspeedEventHandlerTest.java @@ -9,6 +9,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Map; import java.util.TimeZone; import org.junit.Test; @@ -34,8 +35,8 @@ public class OverspeedEventHandlerTest extends BaseTest { DeviceState deviceState = new DeviceState(); deviceState.setOverspeedState(false); - Event event = overspeedEventHandler.updateOverspeedState(deviceState, position, 40); - assertNull(event); + Map events = overspeedEventHandler.updateOverspeedState(deviceState, position, 40); + assertNull(events); assertFalse(deviceState.getOverspeedState()); assertEquals(position, deviceState.getOverspeedPosition()); @@ -43,13 +44,14 @@ public class OverspeedEventHandlerTest extends BaseTest { nextPosition.setTime(date("2017-01-01 00:00:10")); nextPosition.setSpeed(55); - event = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); - assertNull(event); + events = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); + assertNull(events); nextPosition.setTime(date("2017-01-01 00:00:20")); - event = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); - assertNotNull(event); + events = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); + assertNotNull(events); + Event event = events.keySet().iterator().next(); assertEquals(Event.TYPE_DEVICE_OVERSPEED, event.getType()); assertEquals(50, event.getDouble("speed"), 0.1); assertEquals(40, event.getDouble(OverspeedEventHandler.ATTRIBUTE_SPEED_LIMIT), 0.1); @@ -58,8 +60,8 @@ public class OverspeedEventHandlerTest extends BaseTest { assertNull(deviceState.getOverspeedPosition()); nextPosition.setTime(date("2017-01-01 00:00:30")); - event = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); - assertNull(event); + events = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); + assertNull(events); assertEquals(notRepeat, deviceState.getOverspeedState()); if (notRepeat) { @@ -71,8 +73,8 @@ public class OverspeedEventHandlerTest extends BaseTest { nextPosition.setTime(date("2017-01-01 00:00:40")); nextPosition.setSpeed(30); - event = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); - assertNull(event); + events = overspeedEventHandler.updateOverspeedState(deviceState, nextPosition, 40); + assertNull(events); assertFalse(deviceState.getOverspeedState()); assertNull(deviceState.getOverspeedPosition()); } @@ -87,9 +89,10 @@ public class OverspeedEventHandlerTest extends BaseTest { deviceState.setOverspeedState(false); deviceState.setOverspeedPosition(position); - Event event = overspeedEventHandler.updateOverspeedState(deviceState, 40); + Map events = overspeedEventHandler.updateOverspeedState(deviceState, 40); - assertNotNull(event); + assertNotNull(events); + Event event = events.keySet().iterator().next(); assertEquals(Event.TYPE_DEVICE_OVERSPEED, event.getType()); assertEquals(notRepeat, deviceState.getOverspeedState()); } -- cgit v1.2.3 From ad18dad83638ac2b003596eb1b6226bb9c407abc Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 17 Aug 2017 16:37:29 +0500 Subject: Fix trip detector --- src/org/traccar/reports/ReportUtils.java | 20 ++-- test/org/traccar/reports/ReportUtilsTest.java | 127 +++++++++++++++++++++++++- 2 files changed, 136 insertions(+), 11 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 46aea0757..74cdaf9b5 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -284,17 +284,21 @@ public final class ReportUtils { for (int i = 0; i < positions.size(); i++) { Map event = motionHandler.updateMotionState(deviceState, positions.get(i), isMoving(positions, i, tripsConfig, speedThreshold)); - if (deviceState.getMotionPosition() != null && startEventIndex == -1 - && trips != deviceState.getMotionState()) { + if (startEventIndex == -1 + && (trips != deviceState.getMotionState() && deviceState.getMotionPosition() != null + || trips == deviceState.getMotionState() && event != null)) { startEventIndex = i; startNoEventIndex = -1; + } else if (trips != deviceState.getMotionState() && startEventIndex != -1 + && deviceState.getMotionPosition() == null && event == null) { + startEventIndex = -1; } - if (trips == deviceState.getMotionState()) { - if (startNoEventIndex == -1) { - startNoEventIndex = i; - } else if (deviceState.getMotionPosition() == null) { - startNoEventIndex = -1; - } + if (startNoEventIndex == -1 + && (trips == deviceState.getMotionState() && deviceState.getMotionPosition() != null + || trips != deviceState.getMotionState() && event != null)) { + startNoEventIndex = i; + } else if (startNoEventIndex != -1 && deviceState.getMotionPosition() == null && event == null) { + startNoEventIndex = -1; } if (startEventIndex != -1 && startNoEventIndex != -1 && event != null && trips != deviceState.getMotionState()) { diff --git a/test/org/traccar/reports/ReportUtilsTest.java b/test/org/traccar/reports/ReportUtilsTest.java index c82853161..261291255 100644 --- a/test/org/traccar/reports/ReportUtilsTest.java +++ b/test/org/traccar/reports/ReportUtilsTest.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Iterator; +import java.util.List; import java.util.TimeZone; import org.junit.Assert; @@ -69,7 +70,7 @@ public class ReportUtilsTest extends BaseTest { @Test public void testDetectTripsSimple() throws ParseException { - Collection data = Arrays.asList( + List data = Arrays.asList( position("2016-01-01 00:00:00.000", 0, 0), position("2016-01-01 00:01:00.000", 0, 0), position("2016-01-01 00:02:00.000", 10, 0), @@ -116,6 +117,126 @@ public class ReportUtilsTest extends BaseTest { } + @Test + public void testDetectTripsSimpleWithIgnition() throws ParseException { + + List data = Arrays.asList( + position("2016-01-01 00:00:00.000", 0, 0), + position("2016-01-01 00:01:00.000", 0, 0), + position("2016-01-01 00:02:00.000", 10, 0), + position("2016-01-01 00:03:00.000", 10, 1000), + position("2016-01-01 00:04:00.000", 10, 2000), + position("2016-01-01 00:05:00.000", 0, 3000), + position("2016-01-01 00:06:00.000", 0, 3000), + position("2016-01-01 00:07:00.000", 0, 3000)); + + data.get(5).set(Position.KEY_IGNITION, false); + + TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, true); + + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + + assertNotNull(trips); + assertFalse(trips.isEmpty()); + + TripReport itemTrip = trips.iterator().next(); + + assertEquals(date("2016-01-01 00:02:00.000"), itemTrip.getStartTime()); + assertEquals(date("2016-01-01 00:05:00.000"), itemTrip.getEndTime()); + assertEquals(180000, itemTrip.getDuration()); + assertEquals(10, itemTrip.getAverageSpeed(), 0.01); + assertEquals(10, itemTrip.getMaxSpeed(), 0.01); + assertEquals(3000, itemTrip.getDistance(), 0.01); + + trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + + assertNotNull(trips); + assertFalse(trips.isEmpty()); + + itemTrip = trips.iterator().next(); + + assertEquals(date("2016-01-01 00:02:00.000"), itemTrip.getStartTime()); + assertEquals(date("2016-01-01 00:05:00.000"), itemTrip.getEndTime()); + assertEquals(180000, itemTrip.getDuration()); + assertEquals(10, itemTrip.getAverageSpeed(), 0.01); + assertEquals(10, itemTrip.getMaxSpeed(), 0.01); + assertEquals(3000, itemTrip.getDistance(), 0.01); + + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + + assertNotNull(stops); + assertFalse(stops.isEmpty()); + + Iterator iterator = stops.iterator(); + + StopReport itemStop = iterator.next(); + + assertEquals(date("2016-01-01 00:00:00.000"), itemStop.getStartTime()); + assertEquals(date("2016-01-01 00:02:00.000"), itemStop.getEndTime()); + assertEquals(120000, itemStop.getDuration()); + + itemStop = iterator.next(); + + assertEquals(date("2016-01-01 00:05:00.000"), itemStop.getStartTime()); + assertEquals(date("2016-01-01 00:07:00.000"), itemStop.getEndTime()); + assertEquals(120000, itemStop.getDuration()); + + } + + @Test + public void testDetectTripsWithFluctuation() throws ParseException { + + List data = Arrays.asList( + position("2016-01-01 00:00:00.000", 0, 0), + position("2016-01-01 00:01:00.000", 0, 0), + position("2016-01-01 00:02:00.000", 10, 0), + position("2016-01-01 00:03:00.000", 10, 1000), + position("2016-01-01 00:04:00.000", 10, 2000), + position("2016-01-01 00:05:00.000", 10, 3000), + position("2016-01-01 00:06:00.000", 10, 4000), + position("2016-01-01 00:07:00.000", 0, 5000), + position("2016-01-01 00:08:00.000", 10, 6000), + position("2016-01-01 00:09:00.000", 0, 7000), + position("2016-01-01 00:10:00.000", 0, 7000), + position("2016-01-01 00:11:00.000", 0, 7000)); + + TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false); + + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + + assertNotNull(trips); + assertFalse(trips.isEmpty()); + + TripReport itemTrip = trips.iterator().next(); + + assertEquals(date("2016-01-01 00:02:00.000"), itemTrip.getStartTime()); + assertEquals(date("2016-01-01 00:09:00.000"), itemTrip.getEndTime()); + assertEquals(420000, itemTrip.getDuration()); + assertEquals(8.57, itemTrip.getAverageSpeed(), 0.01); + assertEquals(10, itemTrip.getMaxSpeed(), 0.01); + assertEquals(7000, itemTrip.getDistance(), 0.01); + + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + + assertNotNull(stops); + assertFalse(stops.isEmpty()); + + Iterator iterator = stops.iterator(); + + StopReport itemStop = iterator.next(); + + assertEquals(date("2016-01-01 00:00:00.000"), itemStop.getStartTime()); + assertEquals(date("2016-01-01 00:02:00.000"), itemStop.getEndTime()); + assertEquals(120000, itemStop.getDuration()); + + itemStop = iterator.next(); + + assertEquals(date("2016-01-01 00:09:00.000"), itemStop.getStartTime()); + assertEquals(date("2016-01-01 00:11:00.000"), itemStop.getEndTime()); + assertEquals(120000, itemStop.getDuration()); + + } + @Test public void testDetectStopsOnly() throws ParseException { @@ -251,8 +372,8 @@ public class ReportUtilsTest extends BaseTest { StopReport itemStop = stops.iterator().next(); assertEquals(date("2016-01-01 00:04:00.000"), itemStop.getStartTime()); - assertEquals(date("2016-01-01 00:23:00.000"), itemStop.getEndTime()); - assertEquals(1140000, itemStop.getDuration()); + assertEquals(date("2016-01-01 00:24:00.000"), itemStop.getEndTime()); + assertEquals(1200000, itemStop.getDuration()); } } -- cgit v1.2.3 From fe5e6f7e1aaa01dfe8d61af46c3b818f8c566a25 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 6 Sep 2017 13:43:51 +0500 Subject: Move units to attributes and add volume units --- schema/changelog-3.15.xml | 8 ++++++ src/org/traccar/database/PermissionsManager.java | 22 ++------------ src/org/traccar/model/Server.java | 32 --------------------- src/org/traccar/model/User.java | 30 ------------------- .../notification/NotificationFormatter.java | 4 ++- src/org/traccar/reports/ReportUtils.java | 11 +++++-- templates/export/stops.xlsx | Bin 12855 -> 12870 bytes templates/export/summary.xlsx | Bin 8735 -> 12564 bytes templates/export/trips.xlsx | Bin 13239 -> 13154 bytes templates/mail/deviceOverspeed.vm | 4 +-- templates/sms/deviceOverspeed.vm | 4 +-- 11 files changed, 26 insertions(+), 89 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/schema/changelog-3.15.xml b/schema/changelog-3.15.xml index a2d944abb..37fd2e278 100644 --- a/schema/changelog-3.15.xml +++ b/schema/changelog-3.15.xml @@ -13,5 +13,13 @@ + + + + + + + + diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java index 3b03c1900..0708cc5c9 100644 --- a/src/org/traccar/database/PermissionsManager.java +++ b/src/org/traccar/database/PermissionsManager.java @@ -29,7 +29,6 @@ import org.traccar.model.Permission; import org.traccar.model.Server; import org.traccar.model.User; -import java.lang.reflect.Method; import java.sql.SQLException; import java.util.HashMap; import java.util.HashSet; @@ -382,25 +381,10 @@ public class PermissionsManager { return null; } - public Object lookupPreference(long userId, String key, Object defaultValue) { - String methodName = "get" + key.substring(0, 1).toUpperCase() + key.substring(1); + public Object lookupAttribute(long userId, String key, Object defaultValue) { Object preference; - Object serverPreference = null; - Object userPreference = null; - try { - Method method = null; - method = User.class.getMethod(methodName, (Class[]) null); - if (method != null) { - userPreference = method.invoke(getUser(userId), (Object[]) null); - } - method = null; - method = Server.class.getMethod(methodName, (Class[]) null); - if (method != null) { - serverPreference = method.invoke(server, (Object[]) null); - } - } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException exception) { - return defaultValue; - } + Object serverPreference = server.getAttributes().get(key); + Object userPreference = getUser(userId).getAttributes().get(key); if (server.getForceSettings()) { preference = serverPreference != null ? serverPreference : userPreference; } else { diff --git a/src/org/traccar/model/Server.java b/src/org/traccar/model/Server.java index 246be0b4f..bfe881479 100644 --- a/src/org/traccar/model/Server.java +++ b/src/org/traccar/model/Server.java @@ -15,8 +15,6 @@ */ package org.traccar.model; -import java.util.TimeZone; - import org.traccar.database.QueryIgnore; import org.traccar.helper.Log; @@ -90,26 +88,6 @@ public class Server extends ExtendedModel { this.mapUrl = mapUrl; } - private String distanceUnit; - - public String getDistanceUnit() { - return distanceUnit; - } - - public void setDistanceUnit(String distanceUnit) { - this.distanceUnit = distanceUnit; - } - - private String speedUnit; - - public String getSpeedUnit() { - return speedUnit; - } - - public void setSpeedUnit(String speedUnit) { - this.speedUnit = speedUnit; - } - private double latitude; public double getLatitude() { @@ -169,14 +147,4 @@ public class Server extends ExtendedModel { public void setCoordinateFormat(String coordinateFormat) { this.coordinateFormat = coordinateFormat; } - - private String timezone; - - public void setTimezone(String timezone) { - this.timezone = timezone != null ? TimeZone.getTimeZone(timezone).getID() : null; - } - - public String getTimezone() { - return timezone; - } } diff --git a/src/org/traccar/model/User.java b/src/org/traccar/model/User.java index 3557521ab..043c23036 100644 --- a/src/org/traccar/model/User.java +++ b/src/org/traccar/model/User.java @@ -22,7 +22,6 @@ import org.traccar.database.QueryIgnore; import org.traccar.helper.Hashing; import java.util.Date; -import java.util.TimeZone; public class User extends ExtendedModel { @@ -86,26 +85,6 @@ public class User extends ExtendedModel { this.map = map; } - private String distanceUnit; - - public String getDistanceUnit() { - return distanceUnit; - } - - public void setDistanceUnit(String distanceUnit) { - this.distanceUnit = distanceUnit; - } - - private String speedUnit; - - public String getSpeedUnit() { - return speedUnit; - } - - public void setSpeedUnit(String speedUnit) { - this.speedUnit = speedUnit; - } - private double latitude; public double getLatitude() { @@ -272,13 +251,4 @@ public class User extends ExtendedModel { return Hashing.validatePassword(password, hashedPassword, salt); } - private String timezone; - - public void setTimezone(String timezone) { - this.timezone = timezone != null ? TimeZone.getTimeZone(timezone).getID() : null; - } - - public String getTimezone() { - return timezone; - } } diff --git a/src/org/traccar/notification/NotificationFormatter.java b/src/org/traccar/notification/NotificationFormatter.java index 33fd2cdc7..8da819430 100644 --- a/src/org/traccar/notification/NotificationFormatter.java +++ b/src/org/traccar/notification/NotificationFormatter.java @@ -48,7 +48,9 @@ public final class NotificationFormatter { velocityContext.put("event", event); if (position != null) { velocityContext.put("position", position); - velocityContext.put("speedUnits", ReportUtils.getSpeedUnit(userId)); + velocityContext.put("speedUnit", ReportUtils.getSpeedUnit(userId)); + velocityContext.put("distanceUnit", ReportUtils.getDistanceUnit(userId)); + velocityContext.put("volumeUnit", ReportUtils.getVolumeUnit(userId)); } if (event.getGeofenceId() != 0) { velocityContext.put("geofence", Context.getGeofenceManager().getById(event.getGeofenceId())); diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 74cdaf9b5..5f718feac 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -62,15 +62,19 @@ public final class ReportUtils { } public static String getDistanceUnit(long userId) { - return (String) Context.getPermissionsManager().lookupPreference(userId, "distanceUnit", "km"); + return (String) Context.getPermissionsManager().lookupAttribute(userId, "distanceUnit", "km"); } public static String getSpeedUnit(long userId) { - return (String) Context.getPermissionsManager().lookupPreference(userId, "speedUnit", "kn"); + return (String) Context.getPermissionsManager().lookupAttribute(userId, "speedUnit", "kn"); + } + + public static String getVolumeUnit(long userId) { + return (String) Context.getPermissionsManager().lookupAttribute(userId, "volumeUnit", "ltr"); } public static TimeZone getTimezone(long userId) { - String timezone = (String) Context.getPermissionsManager().lookupPreference(userId, "timezone", null); + String timezone = (String) Context.getPermissionsManager().lookupAttribute(userId, "timezone", null); return timezone != null ? TimeZone.getTimeZone(timezone) : TimeZone.getDefault(); } @@ -137,6 +141,7 @@ public final class ReportUtils { org.jxls.common.Context jxlsContext = PoiTransformer.createInitialContext(); jxlsContext.putVar("distanceUnit", getDistanceUnit(userId)); jxlsContext.putVar("speedUnit", getSpeedUnit(userId)); + jxlsContext.putVar("volumeUnit", getVolumeUnit(userId)); jxlsContext.putVar("webUrl", Context.getVelocityEngine().getProperty("web.url")); jxlsContext.putVar("dateTool", new DateTool()); jxlsContext.putVar("numberTool", new NumberTool()); diff --git a/templates/export/stops.xlsx b/templates/export/stops.xlsx index d6bb4c3b9..0c00b7bff 100644 Binary files a/templates/export/stops.xlsx and b/templates/export/stops.xlsx differ diff --git a/templates/export/summary.xlsx b/templates/export/summary.xlsx index 73e702a70..a71f013a9 100644 Binary files a/templates/export/summary.xlsx and b/templates/export/summary.xlsx differ diff --git a/templates/export/trips.xlsx b/templates/export/trips.xlsx index 4a6734850..c5fa73342 100644 Binary files a/templates/export/trips.xlsx and b/templates/export/trips.xlsx differ diff --git a/templates/mail/deviceOverspeed.vm b/templates/mail/deviceOverspeed.vm index 0715a3d60..b1f0a6734 100644 --- a/templates/mail/deviceOverspeed.vm +++ b/templates/mail/deviceOverspeed.vm @@ -1,8 +1,8 @@ #set($subject = "$device.name: exceeds the speed") -#if($speedUnits == 'kmh') +#if($speedUnit == 'kmh') #set($speedValue = $position.speed * 1.852) #set($speedString = $numberTool.format("0.0 km/h", $speedValue)) -#elseif($speedUnits == 'mph') +#elseif($speedUnit == 'mph') #set($speedValue = $position.speed * 1.15078) #set($speedString = $numberTool.format("0.0 mph", $speedValue)) #else diff --git a/templates/sms/deviceOverspeed.vm b/templates/sms/deviceOverspeed.vm index ef0d9d955..f0b03c9e7 100644 --- a/templates/sms/deviceOverspeed.vm +++ b/templates/sms/deviceOverspeed.vm @@ -1,7 +1,7 @@ -#if($speedUnits == 'kmh') +#if($speedUnit == 'kmh') #set($speedValue = $position.speed * 1.852) #set($speedString = $numberTool.format("0.0 km/h", $speedValue)) -#elseif($speedUnits == 'mph') +#elseif($speedUnit == 'mph') #set($speedValue = $position.speed * 1.15078) #set($speedString = $numberTool.format("0.0 mph", $speedValue)) #else -- cgit v1.2.3 From 36ad4ac525b8eb25ac1c2eed8c05d690754399c5 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 21 Sep 2017 18:01:10 +0500 Subject: Move speedThreshold to TripsConfig --- src/org/traccar/BasePipelineFactory.java | 2 +- src/org/traccar/Context.java | 3 +- src/org/traccar/reports/ReportUtils.java | 11 +++--- src/org/traccar/reports/Stops.java | 4 +-- src/org/traccar/reports/Trips.java | 4 +-- src/org/traccar/reports/model/TripsConfig.java | 13 ++++++- .../org/traccar/events/MotionEventHandlerTest.java | 6 ++-- test/org/traccar/reports/ReportUtilsTest.java | 42 +++++++++++----------- 8 files changed, 46 insertions(+), 39 deletions(-) (limited to 'src/org/traccar/reports/ReportUtils.java') diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java index ac1d450c5..771ab8acb 100644 --- a/src/org/traccar/BasePipelineFactory.java +++ b/src/org/traccar/BasePipelineFactory.java @@ -153,7 +153,7 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory { Context.getConfig().getBoolean("geolocation.processInvalidPositions")); } - motionHandler = new MotionHandler(Context.getConfig().getDouble("event.motion.speedThreshold", 0.01)); + motionHandler = new MotionHandler(Context.getTripsConfig().getSpeedThreshold()); if (Context.getConfig().hasKey("location.latitudeHemisphere") || Context.getConfig().hasKey("location.longitudeHemisphere")) { diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java index cf857178f..3b24c6460 100644 --- a/src/org/traccar/Context.java +++ b/src/org/traccar/Context.java @@ -259,7 +259,8 @@ public final class Context { config.getLong("report.trip.minimalParkingDuration", 300) * 1000, config.getLong("report.trip.minimalNoDataDuration", 3600) * 1000, config.getBoolean("report.trip.useIgnition"), - config.getBoolean("event.motion.processInvalidPositions")); + config.getBoolean("event.motion.processInvalidPositions"), + config.getDouble("event.motion.speedThreshold", 0.01)); } public static void init(String[] arguments) throws Exception { diff --git a/src/org/traccar/reports/ReportUtils.java b/src/org/traccar/reports/ReportUtils.java index 5f718feac..f6f386e99 100644 --- a/src/org/traccar/reports/ReportUtils.java +++ b/src/org/traccar/reports/ReportUtils.java @@ -253,8 +253,7 @@ public final class ReportUtils { } } - private static boolean isMoving(ArrayList positions, int index, - TripsConfig tripsConfig, double speedThreshold) { + private static boolean isMoving(ArrayList positions, int index, TripsConfig tripsConfig) { if (tripsConfig.getMinimalNoDataDuration() > 0) { boolean beforeGap = index < positions.size() - 1 && positions.get(index + 1).getFixTime().getTime() - positions.get(index).getFixTime().getTime() @@ -270,12 +269,12 @@ public final class ReportUtils { && positions.get(index).getAttributes().get(Position.KEY_MOTION) instanceof Boolean) { return positions.get(index).getBoolean(Position.KEY_MOTION); } else { - return positions.get(index).getSpeed() > speedThreshold; + return positions.get(index).getSpeed() > tripsConfig.getSpeedThreshold(); } } public static Collection detectTripsAndStops(Collection positionCollection, - TripsConfig tripsConfig, boolean ignoreOdometer, double speedThreshold, Class reportClass) { + TripsConfig tripsConfig, boolean ignoreOdometer, Class reportClass) { Collection result = new ArrayList<>(); ArrayList positions = new ArrayList<>(positionCollection); @@ -283,12 +282,12 @@ public final class ReportUtils { boolean trips = reportClass.equals(TripReport.class); MotionEventHandler motionHandler = new MotionEventHandler(tripsConfig); DeviceState deviceState = new DeviceState(); - deviceState.setMotionState(isMoving(positions, 0, tripsConfig, speedThreshold)); + deviceState.setMotionState(isMoving(positions, 0, tripsConfig)); int startEventIndex = trips == deviceState.getMotionState() ? 0 : -1; int startNoEventIndex = -1; for (int i = 0; i < positions.size(); i++) { Map event = motionHandler.updateMotionState(deviceState, positions.get(i), - isMoving(positions, i, tripsConfig, speedThreshold)); + isMoving(positions, i, tripsConfig)); if (startEventIndex == -1 && (trips != deviceState.getMotionState() && deviceState.getMotionPosition() != null || trips == deviceState.getMotionState() && event != null)) { diff --git a/src/org/traccar/reports/Stops.java b/src/org/traccar/reports/Stops.java index 1e72cc927..14b3a2437 100644 --- a/src/org/traccar/reports/Stops.java +++ b/src/org/traccar/reports/Stops.java @@ -39,14 +39,12 @@ public final class Stops { } private static Collection detectStops(long deviceId, Date from, Date to) throws SQLException { - double speedThreshold = Context.getConfig().getDouble("event.motion.speedThreshold", 0.01); - boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); Collection result = ReportUtils.detectTripsAndStops( Context.getDataManager().getPositions(deviceId, from, to), - Context.getTripsConfig(), ignoreOdometer, speedThreshold, StopReport.class); + Context.getTripsConfig(), ignoreOdometer, StopReport.class); return result; } diff --git a/src/org/traccar/reports/Trips.java b/src/org/traccar/reports/Trips.java index 1ee62e87c..696defa94 100644 --- a/src/org/traccar/reports/Trips.java +++ b/src/org/traccar/reports/Trips.java @@ -38,14 +38,12 @@ public final class Trips { } private static Collection detectTrips(long deviceId, Date from, Date to) throws SQLException { - double speedThreshold = Context.getConfig().getDouble("event.motion.speedThreshold", 0.01); - boolean ignoreOdometer = Context.getDeviceManager() .lookupAttributeBoolean(deviceId, "report.ignoreOdometer", false, true); Collection result = ReportUtils.detectTripsAndStops( Context.getDataManager().getPositions(deviceId, from, to), - Context.getTripsConfig(), ignoreOdometer, speedThreshold, TripReport.class); + Context.getTripsConfig(), ignoreOdometer, TripReport.class); return result; } diff --git a/src/org/traccar/reports/model/TripsConfig.java b/src/org/traccar/reports/model/TripsConfig.java index ca361a466..0f0c615d3 100644 --- a/src/org/traccar/reports/model/TripsConfig.java +++ b/src/org/traccar/reports/model/TripsConfig.java @@ -22,13 +22,14 @@ public class TripsConfig { } public TripsConfig(double minimalTripDistance, long minimalTripDuration, long minimalParkingDuration, - long minimalNoDataDuration, boolean useIgnition, boolean processInvalidPositions) { + long minimalNoDataDuration, boolean useIgnition, boolean processInvalidPositions, double speedThreshold) { this.minimalTripDistance = minimalTripDistance; this.minimalTripDuration = minimalTripDuration; this.minimalParkingDuration = minimalParkingDuration; this.minimalNoDataDuration = minimalNoDataDuration; this.useIgnition = useIgnition; this.processInvalidPositions = processInvalidPositions; + this.speedThreshold = speedThreshold; } private double minimalTripDistance; @@ -91,4 +92,14 @@ public class TripsConfig { this.processInvalidPositions = processInvalidPositions; } + private double speedThreshold; + + public double getSpeedThreshold() { + return speedThreshold; + } + + public void setSpeedThreshold(double speedThreshold) { + this.speedThreshold = speedThreshold; + } + } diff --git a/test/org/traccar/events/MotionEventHandlerTest.java b/test/org/traccar/events/MotionEventHandlerTest.java index a2e5cf651..3fc63adf0 100644 --- a/test/org/traccar/events/MotionEventHandlerTest.java +++ b/test/org/traccar/events/MotionEventHandlerTest.java @@ -31,7 +31,7 @@ public class MotionEventHandlerTest extends BaseTest { @Test public void testMotionWithPosition() throws Exception { MotionEventHandler motionEventHandler = new MotionEventHandler( - new TripsConfig(500, 300 * 1000, 300 * 1000, 0, false, false)); + new TripsConfig(500, 300 * 1000, 300 * 1000, 0, false, false, 0.01)); Position position = new Position(); position.setTime(date("2017-01-01 00:00:00")); @@ -72,7 +72,7 @@ public class MotionEventHandlerTest extends BaseTest { @Test public void testMotionWithStatus() throws Exception { MotionEventHandler motionEventHandler = new MotionEventHandler( - new TripsConfig(500, 300 * 1000, 300 * 1000, 0, false, false)); + new TripsConfig(500, 300 * 1000, 300 * 1000, 0, false, false, 0.01)); Position position = new Position(); position.setTime(new Date(System.currentTimeMillis() - 360000)); @@ -93,7 +93,7 @@ public class MotionEventHandlerTest extends BaseTest { @Test public void testStopWithPositionIgnition() throws Exception { MotionEventHandler motionEventHandler = new MotionEventHandler( - new TripsConfig(500, 300 * 1000, 300 * 1000, 0, true, false)); + new TripsConfig(500, 300 * 1000, 300 * 1000, 0, true, false, 0.01)); Position position = new Position(); position.setTime(date("2017-01-01 00:00:00")); diff --git a/test/org/traccar/reports/ReportUtilsTest.java b/test/org/traccar/reports/ReportUtilsTest.java index 23fdbd0b1..4f7a4eb68 100644 --- a/test/org/traccar/reports/ReportUtilsTest.java +++ b/test/org/traccar/reports/ReportUtilsTest.java @@ -80,9 +80,9 @@ public class ReportUtilsTest extends BaseTest { position("2016-01-01 00:06:00.000", 0, 3000), position("2016-01-01 00:07:00.000", 0, 3000)); - TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false, false); + TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false, false, 0.01); - Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, TripReport.class); assertNotNull(trips); assertFalse(trips.isEmpty()); @@ -96,7 +96,7 @@ public class ReportUtilsTest extends BaseTest { assertEquals(10, itemTrip.getMaxSpeed(), 0.01); assertEquals(3000, itemTrip.getDistance(), 0.01); - Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(stops); assertFalse(stops.isEmpty()); @@ -132,9 +132,9 @@ public class ReportUtilsTest extends BaseTest { data.get(5).set(Position.KEY_IGNITION, false); - TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, true, false); + TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, true, false, 0.01); - Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, TripReport.class); assertNotNull(trips); assertFalse(trips.isEmpty()); @@ -148,7 +148,7 @@ public class ReportUtilsTest extends BaseTest { assertEquals(10, itemTrip.getMaxSpeed(), 0.01); assertEquals(3000, itemTrip.getDistance(), 0.01); - trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, TripReport.class); assertNotNull(trips); assertFalse(trips.isEmpty()); @@ -162,7 +162,7 @@ public class ReportUtilsTest extends BaseTest { assertEquals(10, itemTrip.getMaxSpeed(), 0.01); assertEquals(3000, itemTrip.getDistance(), 0.01); - Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(stops); assertFalse(stops.isEmpty()); @@ -200,9 +200,9 @@ public class ReportUtilsTest extends BaseTest { position("2016-01-01 00:10:00.000", 0, 7000), position("2016-01-01 00:11:00.000", 0, 7000)); - TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false, false); + TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false, false, 0.01); - Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, TripReport.class); assertNotNull(trips); assertFalse(trips.isEmpty()); @@ -216,7 +216,7 @@ public class ReportUtilsTest extends BaseTest { assertEquals(10, itemTrip.getMaxSpeed(), 0.01); assertEquals(7000, itemTrip.getDistance(), 0.01); - Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(stops); assertFalse(stops.isEmpty()); @@ -248,9 +248,9 @@ public class ReportUtilsTest extends BaseTest { position("2016-01-01 00:04:00.000", 1, 0), position("2016-01-01 00:05:00.000", 0, 0)); - TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false); + TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01); - Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(result); assertFalse(result.isEmpty()); @@ -274,9 +274,9 @@ public class ReportUtilsTest extends BaseTest { position("2016-01-01 00:04:00.000", 1, 0), position("2016-01-01 00:05:00.000", 2, 0)); - TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false); + TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01); - Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(result); assertFalse(result.isEmpty()); @@ -300,9 +300,9 @@ public class ReportUtilsTest extends BaseTest { position("2016-01-01 00:04:00.000", 0, 0), position("2016-01-01 00:05:00.000", 0, 0)); - TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false); + TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01); - Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(result); assertFalse(result.isEmpty()); @@ -326,9 +326,9 @@ public class ReportUtilsTest extends BaseTest { position("2016-01-01 00:04:00.000", 5, 0), position("2016-01-01 00:05:00.000", 5, 0)); - TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false); + TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01); - Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection result = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(result); assertTrue(result.isEmpty()); @@ -348,9 +348,9 @@ public class ReportUtilsTest extends BaseTest { position("2016-01-01 00:24:00.000", 5, 800), position("2016-01-01 00:25:00.000", 5, 900)); - TripsConfig tripsConfig = new TripsConfig(500, 200000, 200000, 900000, false, false); + TripsConfig tripsConfig = new TripsConfig(500, 200000, 200000, 900000, false, false, 0.01); - Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, TripReport.class); + Collection trips = ReportUtils.detectTripsAndStops(data, tripsConfig, false, TripReport.class); assertNotNull(trips); assertFalse(trips.isEmpty()); @@ -364,7 +364,7 @@ public class ReportUtilsTest extends BaseTest { assertEquals(7, itemTrip.getMaxSpeed(), 0.01); assertEquals(600, itemTrip.getDistance(), 0.01); - Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, 0.01, StopReport.class); + Collection stops = ReportUtils.detectTripsAndStops(data, tripsConfig, false, StopReport.class); assertNotNull(stops); assertFalse(stops.isEmpty()); -- cgit v1.2.3