From 8dad0208975bf29e868a5ca9b6a844863f50d86c Mon Sep 17 00:00:00 2001 From: parveenkumaryadav Date: Wed, 10 Jan 2018 15:03:07 +0530 Subject: Odometer permission to both Admin or Manager --- src/org/traccar/api/resource/DeviceResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/resource/DeviceResource.java b/src/org/traccar/api/resource/DeviceResource.java index 0ea532567..c432a04f4 100644 --- a/src/org/traccar/api/resource/DeviceResource.java +++ b/src/org/traccar/api/resource/DeviceResource.java @@ -88,7 +88,7 @@ public class DeviceResource extends BaseObjectResource { @Path("{id}/distance") @PUT public Response updateTotalDistance(DeviceTotalDistance entity) throws SQLException { - Context.getPermissionsManager().checkAdmin(getUserId()); + Context.getPermissionsManager().checkDevice(getUserId(), entity.getDeviceId()); Context.getDeviceManager().resetTotalDistance(entity); LogAction.resetTotalDistance(getUserId(), entity.getDeviceId()); return Response.noContent().build(); -- cgit v1.2.3 From 6428e67fe7732d15adcf27ffd261e3eda96840cd Mon Sep 17 00:00:00 2001 From: parveenkumaryadav Date: Wed, 10 Jan 2018 16:17:25 +0530 Subject: Remove Odometer permission to User bug fix --- src/org/traccar/api/resource/DeviceResource.java | 2 +- src/org/traccar/database/PermissionsManager.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/resource/DeviceResource.java b/src/org/traccar/api/resource/DeviceResource.java index c432a04f4..c04b3b474 100644 --- a/src/org/traccar/api/resource/DeviceResource.java +++ b/src/org/traccar/api/resource/DeviceResource.java @@ -88,7 +88,7 @@ public class DeviceResource extends BaseObjectResource { @Path("{id}/distance") @PUT public Response updateTotalDistance(DeviceTotalDistance entity) throws SQLException { - Context.getPermissionsManager().checkDevice(getUserId(), entity.getDeviceId()); + Context.getPermissionsManager().checkDeviceManagerOrAdmin(getUserId(), entity.getDeviceId()); Context.getDeviceManager().resetTotalDistance(entity); LogAction.resetTotalDistance(getUserId(), entity.getDeviceId()); return Response.noContent().build(); diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java index 60bda99ce..05806175c 100644 --- a/src/org/traccar/database/PermissionsManager.java +++ b/src/org/traccar/database/PermissionsManager.java @@ -300,7 +300,13 @@ public class PermissionsManager { } public void checkDevice(long userId, long deviceId) throws SecurityException { - if (!Context.getDeviceManager().getUserItems(userId).contains(deviceId) && !getUserAdmin(userId)) { + if (!Context.getDeviceManager().getUserItems(userId).contains(deviceId)) { + checkDeviceManagerOrAdmin(userId, deviceId); + } + } + + public void checkDeviceManagerOrAdmin(long userId, long deviceId) throws SecurityException { + if (!getUserAdmin(userId)) { checkManager(userId); for (long managedUserId : usersManager.getUserItems(userId)) { if (Context.getDeviceManager().getUserItems(managedUserId).contains(deviceId)) { -- cgit v1.2.3 From 11601949460beb5ef621e9f2c776900f48b3e96c Mon Sep 17 00:00:00 2001 From: parveenkumaryadav Date: Wed, 10 Jan 2018 17:27:41 +0530 Subject: Simplify Odometer permission API --- src/org/traccar/api/resource/DeviceResource.java | 5 ++++- src/org/traccar/database/PermissionsManager.java | 8 +------- 2 files changed, 5 insertions(+), 8 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/resource/DeviceResource.java b/src/org/traccar/api/resource/DeviceResource.java index c04b3b474..ddf8832ed 100644 --- a/src/org/traccar/api/resource/DeviceResource.java +++ b/src/org/traccar/api/resource/DeviceResource.java @@ -88,7 +88,10 @@ public class DeviceResource extends BaseObjectResource { @Path("{id}/distance") @PUT public Response updateTotalDistance(DeviceTotalDistance entity) throws SQLException { - Context.getPermissionsManager().checkDeviceManagerOrAdmin(getUserId(), entity.getDeviceId()); + if (!Context.getPermissionsManager().getUserAdmin(getUserId())) { + Context.getPermissionsManager().checkManager(getUserId()); + Context.getPermissionsManager().checkPermission(Device.class, getUserId(), entity.getDeviceId()); + } Context.getDeviceManager().resetTotalDistance(entity); LogAction.resetTotalDistance(getUserId(), entity.getDeviceId()); return Response.noContent().build(); diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java index 05806175c..60bda99ce 100644 --- a/src/org/traccar/database/PermissionsManager.java +++ b/src/org/traccar/database/PermissionsManager.java @@ -300,13 +300,7 @@ public class PermissionsManager { } public void checkDevice(long userId, long deviceId) throws SecurityException { - if (!Context.getDeviceManager().getUserItems(userId).contains(deviceId)) { - checkDeviceManagerOrAdmin(userId, deviceId); - } - } - - public void checkDeviceManagerOrAdmin(long userId, long deviceId) throws SecurityException { - if (!getUserAdmin(userId)) { + if (!Context.getDeviceManager().getUserItems(userId).contains(deviceId) && !getUserAdmin(userId)) { checkManager(userId); for (long managedUserId : usersManager.getUserItems(userId)) { if (Context.getDeviceManager().getUserItems(managedUserId).contains(deviceId)) { -- cgit v1.2.3 From df65b06ad4a7d072f1affb837733cebc7058c2c0 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 11 Jan 2018 14:28:02 +0500 Subject: Update group and device cache on group delete. --- src/org/traccar/api/BaseObjectResource.java | 4 ++++ src/org/traccar/database/DeviceManager.java | 2 +- src/org/traccar/database/GroupsManager.java | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/BaseObjectResource.java b/src/org/traccar/api/BaseObjectResource.java index 806c78624..3914f8cce 100644 --- a/src/org/traccar/api/BaseObjectResource.java +++ b/src/org/traccar/api/BaseObjectResource.java @@ -141,6 +141,10 @@ public abstract class BaseObjectResource extends BaseResour } } if (baseClass.equals(Group.class) || baseClass.equals(Device.class) || baseClass.equals(User.class)) { + if (baseClass.equals(Group.class)) { + Context.getGroupsManager().updateGroupCache(true); + Context.getDeviceManager().updateDeviceCache(true); + } Context.getPermissionsManager().refreshDeviceAndGroupPermissions(); if (baseClass.equals(User.class)) { Context.getPermissionsManager().refreshAllUsersPermissions(); diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java index cb410b7c0..4c329786f 100644 --- a/src/org/traccar/database/DeviceManager.java +++ b/src/org/traccar/database/DeviceManager.java @@ -65,7 +65,7 @@ public class DeviceManager extends BaseObjectManager implements Identity refreshLastPositions(); } - private void updateDeviceCache(boolean force) throws SQLException { + public void updateDeviceCache(boolean force) throws SQLException { long lastUpdate = devicesLastUpdate.get(); if ((force || System.currentTimeMillis() - lastUpdate > dataRefreshDelay) && devicesLastUpdate.compareAndSet(lastUpdate, System.currentTimeMillis())) { diff --git a/src/org/traccar/database/GroupsManager.java b/src/org/traccar/database/GroupsManager.java index c0456085b..c1a07a498 100644 --- a/src/org/traccar/database/GroupsManager.java +++ b/src/org/traccar/database/GroupsManager.java @@ -47,7 +47,7 @@ public class GroupsManager extends BaseObjectManager implements Managable } } - private void updateGroupCache(boolean force) throws SQLException { + public void updateGroupCache(boolean force) throws SQLException { long lastUpdate = groupsLastUpdate.get(); if ((force || System.currentTimeMillis() - lastUpdate > dataRefreshDelay) && groupsLastUpdate.compareAndSet(lastUpdate, System.currentTimeMillis())) { -- cgit v1.2.3 From 9b74f4a691354db61a3096794f3daeec575b8517 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Tue, 23 Jan 2018 12:16:46 +0500 Subject: Implement scheduled notifications --- schema/changelog-3.16.xml | 6 +++++ src/org/traccar/api/BaseObjectResource.java | 15 ++++++++++-- src/org/traccar/database/NotificationManager.java | 16 ++++++++---- src/org/traccar/model/Geofence.java | 12 +-------- src/org/traccar/model/Notification.java | 4 +-- src/org/traccar/model/ScheduledModel.java | 30 +++++++++++++++++++++++ 6 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 src/org/traccar/model/ScheduledModel.java (limited to 'src/org/traccar/api') diff --git a/schema/changelog-3.16.xml b/schema/changelog-3.16.xml index 4e8e1cda9..615222676 100644 --- a/schema/changelog-3.16.xml +++ b/schema/changelog-3.16.xml @@ -20,5 +20,11 @@ + + + + + + diff --git a/src/org/traccar/api/BaseObjectResource.java b/src/org/traccar/api/BaseObjectResource.java index 3914f8cce..e4e00938f 100644 --- a/src/org/traccar/api/BaseObjectResource.java +++ b/src/org/traccar/api/BaseObjectResource.java @@ -1,6 +1,6 @@ /* - * Copyright 2017 Anton Tananaev (anton@traccar.org) - * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2017 - 2018 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. @@ -33,9 +33,11 @@ import org.traccar.database.ManagableObjects; import org.traccar.database.SimpleObjectManager; import org.traccar.helper.LogAction; import org.traccar.model.BaseModel; +import org.traccar.model.Calendar; import org.traccar.model.Command; import org.traccar.model.Device; import org.traccar.model.Group; +import org.traccar.model.ScheduledModel; import org.traccar.model.User; public abstract class BaseObjectResource extends BaseResource { @@ -77,6 +79,9 @@ public abstract class BaseObjectResource extends BaseResour Context.getPermissionsManager().checkDeviceLimit(getUserId()); } else if (baseClass.equals(Command.class)) { Context.getPermissionsManager().checkLimitCommands(getUserId()); + } else if (entity instanceof ScheduledModel) { + Context.getPermissionsManager().checkPermission(Calendar.class, getUserId(), + ((ScheduledModel) entity).getCalendarId()); } BaseObjectManager manager = Context.getManager(baseClass); @@ -106,6 +111,9 @@ public abstract class BaseObjectResource extends BaseResour Context.getPermissionsManager().checkUserUpdate(getUserId(), before, (User) entity); } else if (baseClass.equals(Command.class)) { Context.getPermissionsManager().checkLimitCommands(getUserId()); + } else if (entity instanceof ScheduledModel) { + Context.getPermissionsManager().checkPermission(Calendar.class, getUserId(), + ((ScheduledModel) entity).getCalendarId()); } Context.getPermissionsManager().checkPermission(baseClass, getUserId(), entity.getId()); @@ -151,6 +159,9 @@ public abstract class BaseObjectResource extends BaseResour } else { Context.getPermissionsManager().refreshAllExtendedPermissions(); } + } else if (baseClass.equals(Calendar.class)) { + Context.getGeofenceManager().refreshItems(); + Context.getNotificationManager().refreshItems(); } return Response.noContent().build(); } diff --git a/src/org/traccar/database/NotificationManager.java b/src/org/traccar/database/NotificationManager.java index 4e6114001..c666f27ce 100644 --- a/src/org/traccar/database/NotificationManager.java +++ b/src/org/traccar/database/NotificationManager.java @@ -1,6 +1,6 @@ /* - * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org) - * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@traccar.org) + * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2016 - 2018 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. @@ -19,6 +19,7 @@ package org.traccar.database; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.sql.SQLException; +import java.util.Date; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; @@ -26,6 +27,7 @@ import java.util.Set; import org.traccar.Context; import org.traccar.helper.Log; +import org.traccar.model.Calendar; import org.traccar.model.Event; import org.traccar.model.Notification; import org.traccar.model.Position; @@ -42,12 +44,16 @@ public class NotificationManager extends ExtendedObjectManager { geocodeOnRequest = Context.getConfig().getBoolean("geocoder.onRequest"); } - private Set getEffectiveNotifications(long userId, long deviceId) { + private Set getEffectiveNotifications(long userId, long deviceId, Date date) { Set result = new HashSet<>(); Set deviceNotifications = getAllDeviceItems(deviceId); for (long itemId : getUserItems(userId)) { if (getById(itemId).getAlways() || deviceNotifications.contains(itemId)) { - result.add(itemId); + long calendarId = getById(itemId).getCalendarId(); + Calendar calendar = calendarId != 0 ? Context.getCalendarManager().getById(calendarId) : null; + if (calendar == null || calendar.checkMoment(date)) { + result.add(itemId); + } } } return result; @@ -73,7 +79,7 @@ public class NotificationManager extends ExtendedObjectManager { boolean sentWeb = false; boolean sentMail = false; boolean sentSms = Context.getSmppManager() == null; - for (long notificationId : getEffectiveNotifications(userId, deviceId)) { + for (long notificationId : getEffectiveNotifications(userId, deviceId, event.getServerTime())) { Notification notification = getById(notificationId); if (getById(notificationId).getType().equals(event.getType())) { if (!sentWeb && notification.getWeb()) { diff --git a/src/org/traccar/model/Geofence.java b/src/org/traccar/model/Geofence.java index 21c196da9..7042325dc 100644 --- a/src/org/traccar/model/Geofence.java +++ b/src/org/traccar/model/Geofence.java @@ -26,7 +26,7 @@ import org.traccar.geofence.GeofencePolyline; import com.fasterxml.jackson.annotation.JsonIgnore; -public class Geofence extends ExtendedModel { +public class Geofence extends ScheduledModel { public static final String TYPE_GEOFENCE_CILCLE = "geofenceCircle"; public static final String TYPE_GEOFENCE_POLYGON = "geofencePolygon"; @@ -87,14 +87,4 @@ public class Geofence extends ExtendedModel { area = geometry.toWkt(); this.geometry = geometry; } - - private long calendarId; - - public long getCalendarId() { - return calendarId; - } - - public void setCalendarId(long calendarId) { - this.calendarId = calendarId; - } } diff --git a/src/org/traccar/model/Notification.java b/src/org/traccar/model/Notification.java index 9d6034fff..cc80f2ae2 100644 --- a/src/org/traccar/model/Notification.java +++ b/src/org/traccar/model/Notification.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package org.traccar.model; -public class Notification extends ExtendedModel { +public class Notification extends ScheduledModel { private boolean always; diff --git a/src/org/traccar/model/ScheduledModel.java b/src/org/traccar/model/ScheduledModel.java new file mode 100644 index 000000000..9e6a4b9a6 --- /dev/null +++ b/src/org/traccar/model/ScheduledModel.java @@ -0,0 +1,30 @@ +/* + * Copyright 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2018 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 ScheduledModel extends ExtendedModel { + + private long calendarId; + + public long getCalendarId() { + return calendarId; + } + + public void setCalendarId(long calendarId) { + this.calendarId = calendarId; + } +} -- cgit v1.2.3 From 8535983fea8c09046c53f2ebf388bbf3fae594ce Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 25 Jan 2018 20:02:22 +1300 Subject: Clean up unnecessary code --- src/org/traccar/api/resource/AttributeResource.java | 4 ++-- src/org/traccar/database/ExtendedObjectManager.java | 2 +- src/org/traccar/database/LdapProvider.java | 2 +- src/org/traccar/database/PermissionsManager.java | 2 +- src/org/traccar/notification/EventForwarder.java | 2 +- src/org/traccar/processing/ComputedAttributesHandler.java | 4 ++-- src/org/traccar/protocol/TmgFrameDecoder.java | 7 ++----- src/org/traccar/reports/Events.java | 2 +- src/org/traccar/web/CsvBuilder.java | 8 ++++---- test/org/traccar/protocol/H02ProtocolEncoderTest.java | 2 +- 10 files changed, 16 insertions(+), 19 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/resource/AttributeResource.java b/src/org/traccar/api/resource/AttributeResource.java index 26a1f6931..b37cbbeb2 100644 --- a/src/org/traccar/api/resource/AttributeResource.java +++ b/src/org/traccar/api/resource/AttributeResource.java @@ -52,9 +52,9 @@ public class AttributeResource extends ExtendedObjectResource { if (result != null) { switch (entity.getType()) { case "number": - return Response.ok((Number) result).build(); + return Response.ok(result).build(); case "boolean": - return Response.ok((Boolean) result).build(); + return Response.ok(result).build(); default: return Response.ok(result.toString()).build(); } diff --git a/src/org/traccar/database/ExtendedObjectManager.java b/src/org/traccar/database/ExtendedObjectManager.java index 16785cb37..c9e349136 100644 --- a/src/org/traccar/database/ExtendedObjectManager.java +++ b/src/org/traccar/database/ExtendedObjectManager.java @@ -95,7 +95,7 @@ public abstract class ExtendedObjectManager extends SimpleO long groupId = device.getGroupId(); while (groupId != 0) { getAllDeviceItems(device.getId()).addAll(getGroupItems(groupId)); - Group group = (Group) Context.getGroupsManager().getById(groupId); + Group group = Context.getGroupsManager().getById(groupId); if (group != null) { groupId = group.getGroupId(); } else { diff --git a/src/org/traccar/database/LdapProvider.java b/src/org/traccar/database/LdapProvider.java index 2c4b7ceb1..44dd386ed 100644 --- a/src/org/traccar/database/LdapProvider.java +++ b/src/org/traccar/database/LdapProvider.java @@ -115,7 +115,7 @@ public class LdapProvider { SearchResult searchResult = null; if (results.hasMoreElements()) { - searchResult = (SearchResult) results.nextElement(); + searchResult = results.nextElement(); if (results.hasMoreElements()) { Log.warning("Matched multiple users for the accountName: " + accountName); return null; diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java index 60bda99ce..3ae5961ce 100644 --- a/src/org/traccar/database/PermissionsManager.java +++ b/src/org/traccar/database/PermissionsManager.java @@ -57,7 +57,7 @@ public class PermissionsManager { } public User getUser(long userId) { - return (User) usersManager.getById(userId); + return usersManager.getById(userId); } public Set getGroupPermissions(long userId) { diff --git a/src/org/traccar/notification/EventForwarder.java b/src/org/traccar/notification/EventForwarder.java index 68c3ea221..ad8134f18 100644 --- a/src/org/traccar/notification/EventForwarder.java +++ b/src/org/traccar/notification/EventForwarder.java @@ -92,7 +92,7 @@ public abstract class EventForwarder { } } if (event.getGeofenceId() != 0) { - Geofence geofence = (Geofence) Context.getGeofenceManager().getById(event.getGeofenceId()); + Geofence geofence = Context.getGeofenceManager().getById(event.getGeofenceId()); if (geofence != null) { data.put(KEY_GEOFENCE, geofence); } diff --git a/src/org/traccar/processing/ComputedAttributesHandler.java b/src/org/traccar/processing/ComputedAttributesHandler.java index 1e702d17f..f0c54d355 100644 --- a/src/org/traccar/processing/ComputedAttributesHandler.java +++ b/src/org/traccar/processing/ComputedAttributesHandler.java @@ -102,10 +102,10 @@ public class ComputedAttributesHandler extends BaseDataHandler { try { switch (attribute.getType()) { case "number": - position.getAttributes().put(attribute.getAttribute(), (Number) result); + position.getAttributes().put(attribute.getAttribute(), result); break; case "boolean": - position.getAttributes().put(attribute.getAttribute(), (Boolean) result); + position.getAttributes().put(attribute.getAttribute(), result); break; default: position.getAttributes().put(attribute.getAttribute(), result.toString()); diff --git a/src/org/traccar/protocol/TmgFrameDecoder.java b/src/org/traccar/protocol/TmgFrameDecoder.java index 549c42466..c39cf03ac 100644 --- a/src/org/traccar/protocol/TmgFrameDecoder.java +++ b/src/org/traccar/protocol/TmgFrameDecoder.java @@ -37,13 +37,10 @@ public class TmgFrameDecoder extends FrameDecoder { if (buffer.getByte(guessedIndex) != (byte) '$' || buffer.writerIndex() - guessedIndex < 5) { return false; } - if (buffer.getByte(guessedIndex + 4) == ',' + return buffer.getByte(guessedIndex + 4) == ',' && isLetter(buffer.getByte(guessedIndex + 1)) && isLetter(buffer.getByte(guessedIndex + 2)) - && isLetter(buffer.getByte(guessedIndex + 3))) { - return true; - } - return false; + && isLetter(buffer.getByte(guessedIndex + 3)); } }); diff --git a/src/org/traccar/reports/Events.java b/src/org/traccar/reports/Events.java index a13aeeeb4..7cb6ef6eb 100644 --- a/src/org/traccar/reports/Events.java +++ b/src/org/traccar/reports/Events.java @@ -77,7 +77,7 @@ public final class Events { long geofenceId = event.getGeofenceId(); if (geofenceId != 0) { if (Context.getGeofenceManager().checkItemPermission(userId, geofenceId)) { - Geofence geofence = (Geofence) Context.getGeofenceManager().getById(geofenceId); + Geofence geofence = Context.getGeofenceManager().getById(geofenceId); if (geofence != null) { geofenceNames.put(geofenceId, geofence.getName()); } diff --git a/src/org/traccar/web/CsvBuilder.java b/src/org/traccar/web/CsvBuilder.java index 31b389873..2bbe89788 100644 --- a/src/org/traccar/web/CsvBuilder.java +++ b/src/org/traccar/web/CsvBuilder.java @@ -75,16 +75,16 @@ public class CsvBuilder { if (method.getName().startsWith("get") && method.getParameterTypes().length == 0) { try { if (method.getReturnType().equals(boolean.class)) { - builder.append((Boolean) method.invoke(object)); + builder.append(method.invoke(object)); addSeparator(); } else if (method.getReturnType().equals(int.class)) { - builder.append((Integer) method.invoke(object)); + builder.append(method.invoke(object)); addSeparator(); } else if (method.getReturnType().equals(long.class)) { - builder.append((Long) method.invoke(object)); + builder.append(method.invoke(object)); addSeparator(); } else if (method.getReturnType().equals(double.class)) { - builder.append((Double) method.invoke(object)); + builder.append(method.invoke(object)); addSeparator(); } else if (method.getReturnType().equals(String.class)) { builder.append((String) method.invoke(object)); diff --git a/test/org/traccar/protocol/H02ProtocolEncoderTest.java b/test/org/traccar/protocol/H02ProtocolEncoderTest.java index 5a9f58827..f0369eeeb 100644 --- a/test/org/traccar/protocol/H02ProtocolEncoderTest.java +++ b/test/org/traccar/protocol/H02ProtocolEncoderTest.java @@ -9,7 +9,7 @@ import org.traccar.model.Command; public class H02ProtocolEncoderTest extends ProtocolTest { private H02ProtocolEncoder encoder = new H02ProtocolEncoder(); - private DateTime time = new DateTime().withHourOfDay(1).withMinuteOfHour(2).withSecondOfMinute(3);; + private DateTime time = new DateTime().withHourOfDay(1).withMinuteOfHour(2).withSecondOfMinute(3); @Test public void testAlarmArmEncode() throws Exception { -- cgit v1.2.3 From 0f87445428a831e0f0d3b69f6f07f2a60272f2fb Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 25 Jan 2018 20:24:40 +1300 Subject: Clean up unused imports --- src/org/traccar/api/resource/DeviceResource.java | 2 +- src/org/traccar/api/resource/SessionResource.java | 11 +++++------ src/org/traccar/notification/EventForwarder.java | 4 ++-- src/org/traccar/web/CsvBuilder.java | 2 +- test/org/traccar/FilterHandlerTest.java | 2 -- test/org/traccar/ProtocolTest.java | 1 - test/org/traccar/WebDataHandlerTest.java | 1 - test/org/traccar/calendar/CalendarTest.java | 1 - test/org/traccar/database/DataManagerTest.java | 1 - test/org/traccar/database/GroupTreeTest.java | 1 - test/org/traccar/geocoder/AddressFormatTest.java | 1 - test/org/traccar/geocoder/GeocoderTest.java | 1 - test/org/traccar/geofence/GeofenceCircleTest.java | 1 - test/org/traccar/geofence/GeofencePolygonTest.java | 1 - test/org/traccar/geofence/GeofencePolylineTest.java | 1 - test/org/traccar/geolocation/GeolocationProviderTest.java | 1 - test/org/traccar/helper/BcdUtilTest.java | 1 - test/org/traccar/helper/BitUtilTest.java | 1 - test/org/traccar/helper/ChecksumTest.java | 1 - test/org/traccar/helper/DateBuilderTest.java | 1 - test/org/traccar/helper/DateUtilTest.java | 1 - test/org/traccar/helper/DistanceCalculatorTest.java | 1 - test/org/traccar/helper/LocationTreeTest.java | 1 - test/org/traccar/helper/ObdDecoderTest.java | 1 - test/org/traccar/helper/PatternBuilderTest.java | 1 - test/org/traccar/helper/StringFinderTest.java | 5 ----- test/org/traccar/notification/NotificiationMailTest.java | 4 +++- test/org/traccar/processing/ComputedAttributesTest.java | 1 - test/org/traccar/protocol/AdmProtocolEncoderTest.java | 1 - test/org/traccar/protocol/AplicomFrameDecoderTest.java | 1 - test/org/traccar/protocol/At2000FrameDecoderTest.java | 1 - test/org/traccar/protocol/AtrackFrameDecoderTest.java | 1 - test/org/traccar/protocol/EskyFrameDecoderTest.java | 1 - test/org/traccar/protocol/GalileoFrameDecoderTest.java | 1 - test/org/traccar/protocol/GatorProtocolDecoderTest.java | 1 - test/org/traccar/protocol/Gl200FrameDecoderTest.java | 1 - test/org/traccar/protocol/Gps056FrameDecoderTest.java | 1 - test/org/traccar/protocol/Gps103ProtocolEncoderTest.java | 1 - test/org/traccar/protocol/GranitFrameDecoderTest.java | 1 - test/org/traccar/protocol/Gt06FrameDecoderTest.java | 1 - test/org/traccar/protocol/H02FrameDecoderTest.java | 1 - test/org/traccar/protocol/H02ProtocolEncoderTest.java | 1 - test/org/traccar/protocol/HuaShengFrameDecoderTest.java | 1 - test/org/traccar/protocol/HuabaoFrameDecoderTest.java | 1 - test/org/traccar/protocol/Jt600FrameDecoderTest.java | 1 - test/org/traccar/protocol/L100FrameDecoderTest.java | 1 - test/org/traccar/protocol/MegastekFrameDecoderTest.java | 1 - test/org/traccar/protocol/MeiligaoFrameDecoderTest.java | 1 - test/org/traccar/protocol/MeitrackFrameDecoderTest.java | 1 - test/org/traccar/protocol/MeitrackProtocolEncoderTest.java | 1 - test/org/traccar/protocol/MiniFinderProtocolEncoderTest.java | 1 - test/org/traccar/protocol/NvsFrameDecoderTest.java | 1 - test/org/traccar/protocol/Pt502FrameDecoderTest.java | 1 - test/org/traccar/protocol/Pt502ProtocolEncoderTest.java | 1 - test/org/traccar/protocol/TelicFrameDecoderTest.java | 2 -- test/org/traccar/protocol/Tk103ProtocolEncoderTest.java | 3 --- test/org/traccar/protocol/TmgFrameDecoderTest.java | 1 - test/org/traccar/protocol/TotemFrameDecoderTest.java | 1 - test/org/traccar/protocol/TotemProtocolEncoderTest.java | 1 - test/org/traccar/protocol/TzoneProtocolDecoderTest.java | 1 - test/org/traccar/protocol/UlbotechFrameDecoderTest.java | 1 - test/org/traccar/protocol/Vt200FrameDecoderTest.java | 1 - test/org/traccar/protocol/VtfmsFrameDecoderTest.java | 1 - test/org/traccar/protocol/WatchProtocolEncoderTest.java | 1 - test/org/traccar/protocol/WondexFrameDecoderTest.java | 1 - test/org/traccar/protocol/WondexProtocolEncoderTest.java | 1 - test/org/traccar/protocol/XexunFrameDecoderTest.java | 1 - test/org/traccar/reports/ReportUtilsTest.java | 1 - 68 files changed, 12 insertions(+), 82 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/resource/DeviceResource.java b/src/org/traccar/api/resource/DeviceResource.java index ddf8832ed..87927e45b 100644 --- a/src/org/traccar/api/resource/DeviceResource.java +++ b/src/org/traccar/api/resource/DeviceResource.java @@ -71,7 +71,7 @@ public class DeviceResource extends BaseObjectResource { result = deviceManager.getUserItems(userId); } } else { - result = new HashSet(); + result = new HashSet<>(); for (String uniqueId : uniqueIds) { Device device = deviceManager.getByUniqueId(uniqueId); Context.getPermissionsManager().checkDevice(getUserId(), device.getId()); diff --git a/src/org/traccar/api/resource/SessionResource.java b/src/org/traccar/api/resource/SessionResource.java index 3f7842626..2a0bd4364 100644 --- a/src/org/traccar/api/resource/SessionResource.java +++ b/src/org/traccar/api/resource/SessionResource.java @@ -61,15 +61,14 @@ public class SessionResource extends BaseResource { Cookie[] cookies = request.getCookies(); String email = null, password = null; if (cookies != null) { - for (int i = 0; i < cookies.length; i++) { - if (cookies[i].getName().equals(USER_COOKIE_KEY)) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals(USER_COOKIE_KEY)) { byte[] emailBytes = DatatypeConverter.parseBase64Binary( - URLDecoder.decode(cookies[i].getValue(), StandardCharsets.US_ASCII.name())); + URLDecoder.decode(cookie.getValue(), StandardCharsets.US_ASCII.name())); email = new String(emailBytes, StandardCharsets.UTF_8); - } - if (cookies[i].getName().equals(PASS_COOKIE_KEY)) { + } else if (cookie.getName().equals(PASS_COOKIE_KEY)) { byte[] passwordBytes = DatatypeConverter.parseBase64Binary( - URLDecoder.decode(cookies[i].getValue(), StandardCharsets.US_ASCII.name())); + URLDecoder.decode(cookie.getValue(), StandardCharsets.US_ASCII.name())); password = new String(passwordBytes, StandardCharsets.UTF_8); } } diff --git a/src/org/traccar/notification/EventForwarder.java b/src/org/traccar/notification/EventForwarder.java index ad8134f18..d1bdd4aba 100644 --- a/src/org/traccar/notification/EventForwarder.java +++ b/src/org/traccar/notification/EventForwarder.java @@ -17,7 +17,7 @@ package org.traccar.notification; import com.fasterxml.jackson.core.JsonProcessingException; import com.ning.http.client.AsyncHttpClient.BoundRequestBuilder; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.traccar.Context; @@ -73,7 +73,7 @@ public abstract class EventForwarder { for (String paramLine: paramsLines) { splitedLine = paramLine.split(separator, 2); if (splitedLine.length == 2) { - paramsMap.put(splitedLine[0].trim(), Arrays.asList(splitedLine[1].trim())); + paramsMap.put(splitedLine[0].trim(), Collections.singletonList(splitedLine[1].trim())); } } return paramsMap; diff --git a/src/org/traccar/web/CsvBuilder.java b/src/org/traccar/web/CsvBuilder.java index 2bbe89788..fa99f1b18 100644 --- a/src/org/traccar/web/CsvBuilder.java +++ b/src/org/traccar/web/CsvBuilder.java @@ -51,7 +51,7 @@ public class CsvBuilder { private SortedSet getSortedMethods(Object object) { Method[] methodArray = object.getClass().getMethods(); - SortedSet methods = new TreeSet(new Comparator() { + SortedSet methods = new TreeSet<>(new Comparator() { @Override public int compare(Method m1, Method m2) { if (m1.getName().equals("getAttributes") && !m1.getName().equals(m2.getName())) { diff --git a/test/org/traccar/FilterHandlerTest.java b/test/org/traccar/FilterHandlerTest.java index 0d488a7fb..8b1ba3b1f 100644 --- a/test/org/traccar/FilterHandlerTest.java +++ b/test/org/traccar/FilterHandlerTest.java @@ -3,8 +3,6 @@ package org.traccar; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.traccar.database.IdentityManager; -import org.traccar.model.Device; import org.traccar.model.Position; import java.util.Date; diff --git a/test/org/traccar/ProtocolTest.java b/test/org/traccar/ProtocolTest.java index 246e3d0e7..e67b53aa8 100644 --- a/test/org/traccar/ProtocolTest.java +++ b/test/org/traccar/ProtocolTest.java @@ -5,7 +5,6 @@ import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.handler.codec.http.DefaultHttpRequest; import org.jboss.netty.handler.codec.http.HttpMethod; import org.jboss.netty.handler.codec.http.HttpVersion; -import org.junit.Assert; import org.traccar.model.CellTower; import org.traccar.model.Command; import org.traccar.model.Position; diff --git a/test/org/traccar/WebDataHandlerTest.java b/test/org/traccar/WebDataHandlerTest.java index be05e0855..70b098b0f 100644 --- a/test/org/traccar/WebDataHandlerTest.java +++ b/test/org/traccar/WebDataHandlerTest.java @@ -1,6 +1,5 @@ package org.traccar; -import org.junit.Assert; import org.junit.Test; import org.traccar.model.Position; diff --git a/test/org/traccar/calendar/CalendarTest.java b/test/org/traccar/calendar/CalendarTest.java index ae68af9c0..0de89f97f 100644 --- a/test/org/traccar/calendar/CalendarTest.java +++ b/test/org/traccar/calendar/CalendarTest.java @@ -7,7 +7,6 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import org.junit.Assert; import org.junit.Test; import org.traccar.model.Calendar; diff --git a/test/org/traccar/database/DataManagerTest.java b/test/org/traccar/database/DataManagerTest.java index 3e3dcab6c..f9945c994 100644 --- a/test/org/traccar/database/DataManagerTest.java +++ b/test/org/traccar/database/DataManagerTest.java @@ -1,6 +1,5 @@ package org.traccar.database; -import org.junit.Assert; import org.junit.Test; import org.traccar.model.Attribute; import org.traccar.model.Device; diff --git a/test/org/traccar/database/GroupTreeTest.java b/test/org/traccar/database/GroupTreeTest.java index 3e75f9073..b547aab60 100644 --- a/test/org/traccar/database/GroupTreeTest.java +++ b/test/org/traccar/database/GroupTreeTest.java @@ -1,6 +1,5 @@ package org.traccar.database; -import org.junit.Assert; import org.junit.Test; import org.traccar.model.Device; import org.traccar.model.Group; diff --git a/test/org/traccar/geocoder/AddressFormatTest.java b/test/org/traccar/geocoder/AddressFormatTest.java index 12f38fca4..0cc5168ef 100644 --- a/test/org/traccar/geocoder/AddressFormatTest.java +++ b/test/org/traccar/geocoder/AddressFormatTest.java @@ -1,6 +1,5 @@ package org.traccar.geocoder; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/geocoder/GeocoderTest.java b/test/org/traccar/geocoder/GeocoderTest.java index 3b53495c4..1ddc43ad2 100644 --- a/test/org/traccar/geocoder/GeocoderTest.java +++ b/test/org/traccar/geocoder/GeocoderTest.java @@ -2,7 +2,6 @@ package org.traccar.geocoder; import java.util.Locale; -import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; diff --git a/test/org/traccar/geofence/GeofenceCircleTest.java b/test/org/traccar/geofence/GeofenceCircleTest.java index 020b10a0b..259a8fb77 100644 --- a/test/org/traccar/geofence/GeofenceCircleTest.java +++ b/test/org/traccar/geofence/GeofenceCircleTest.java @@ -2,7 +2,6 @@ package org.traccar.geofence; import java.text.ParseException; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/geofence/GeofencePolygonTest.java b/test/org/traccar/geofence/GeofencePolygonTest.java index 31f35120f..94b73af3a 100644 --- a/test/org/traccar/geofence/GeofencePolygonTest.java +++ b/test/org/traccar/geofence/GeofencePolygonTest.java @@ -2,7 +2,6 @@ package org.traccar.geofence; import java.text.ParseException; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/geofence/GeofencePolylineTest.java b/test/org/traccar/geofence/GeofencePolylineTest.java index 1b51c17f6..1e9dcb7c3 100644 --- a/test/org/traccar/geofence/GeofencePolylineTest.java +++ b/test/org/traccar/geofence/GeofencePolylineTest.java @@ -2,7 +2,6 @@ package org.traccar.geofence; import java.text.ParseException; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/geolocation/GeolocationProviderTest.java b/test/org/traccar/geolocation/GeolocationProviderTest.java index 97b5b32da..2729052d6 100644 --- a/test/org/traccar/geolocation/GeolocationProviderTest.java +++ b/test/org/traccar/geolocation/GeolocationProviderTest.java @@ -1,6 +1,5 @@ package org.traccar.geolocation; -import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.traccar.BaseTest; diff --git a/test/org/traccar/helper/BcdUtilTest.java b/test/org/traccar/helper/BcdUtilTest.java index 9ffceacd9..e97aad09f 100644 --- a/test/org/traccar/helper/BcdUtilTest.java +++ b/test/org/traccar/helper/BcdUtilTest.java @@ -1,7 +1,6 @@ package org.traccar.helper; import org.jboss.netty.buffer.ChannelBuffers; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/helper/BitUtilTest.java b/test/org/traccar/helper/BitUtilTest.java index 683c4e6b8..90431bf55 100644 --- a/test/org/traccar/helper/BitUtilTest.java +++ b/test/org/traccar/helper/BitUtilTest.java @@ -1,6 +1,5 @@ package org.traccar.helper; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/helper/ChecksumTest.java b/test/org/traccar/helper/ChecksumTest.java index 1c20ba899..a7c66a2a2 100644 --- a/test/org/traccar/helper/ChecksumTest.java +++ b/test/org/traccar/helper/ChecksumTest.java @@ -2,7 +2,6 @@ package org.traccar.helper; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; -import org.junit.Assert; import org.junit.Test; import java.nio.charset.StandardCharsets; diff --git a/test/org/traccar/helper/DateBuilderTest.java b/test/org/traccar/helper/DateBuilderTest.java index 8b2898fed..b6323cc1d 100644 --- a/test/org/traccar/helper/DateBuilderTest.java +++ b/test/org/traccar/helper/DateBuilderTest.java @@ -1,6 +1,5 @@ package org.traccar.helper; -import org.junit.Assert; import org.junit.Test; import java.text.DateFormat; diff --git a/test/org/traccar/helper/DateUtilTest.java b/test/org/traccar/helper/DateUtilTest.java index b0bae4d11..ec42e71ae 100644 --- a/test/org/traccar/helper/DateUtilTest.java +++ b/test/org/traccar/helper/DateUtilTest.java @@ -1,6 +1,5 @@ package org.traccar.helper; -import org.junit.Assert; import org.junit.Test; import java.text.DateFormat; diff --git a/test/org/traccar/helper/DistanceCalculatorTest.java b/test/org/traccar/helper/DistanceCalculatorTest.java index f12a1ec83..a7457b6c4 100644 --- a/test/org/traccar/helper/DistanceCalculatorTest.java +++ b/test/org/traccar/helper/DistanceCalculatorTest.java @@ -1,6 +1,5 @@ package org.traccar.helper; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/helper/LocationTreeTest.java b/test/org/traccar/helper/LocationTreeTest.java index 3984b1142..21604144a 100644 --- a/test/org/traccar/helper/LocationTreeTest.java +++ b/test/org/traccar/helper/LocationTreeTest.java @@ -1,6 +1,5 @@ package org.traccar.helper; -import org.junit.Assert; import org.junit.Test; import java.util.ArrayList; diff --git a/test/org/traccar/helper/ObdDecoderTest.java b/test/org/traccar/helper/ObdDecoderTest.java index d9cc2ed6b..1ffe68c8b 100644 --- a/test/org/traccar/helper/ObdDecoderTest.java +++ b/test/org/traccar/helper/ObdDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.helper; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/helper/PatternBuilderTest.java b/test/org/traccar/helper/PatternBuilderTest.java index a8fb1aa93..4c76bc463 100644 --- a/test/org/traccar/helper/PatternBuilderTest.java +++ b/test/org/traccar/helper/PatternBuilderTest.java @@ -1,6 +1,5 @@ package org.traccar.helper; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/helper/StringFinderTest.java b/test/org/traccar/helper/StringFinderTest.java index 6bc78ea82..f35f9a759 100644 --- a/test/org/traccar/helper/StringFinderTest.java +++ b/test/org/traccar/helper/StringFinderTest.java @@ -1,16 +1,11 @@ package org.traccar.helper; import org.jboss.netty.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBufferFactory; import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.buffer.HeapChannelBufferFactory; -import org.junit.Assert; import org.junit.Test; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; public class StringFinderTest { diff --git a/test/org/traccar/notification/NotificiationMailTest.java b/test/org/traccar/notification/NotificiationMailTest.java index 975505a3a..b82bec02e 100644 --- a/test/org/traccar/notification/NotificiationMailTest.java +++ b/test/org/traccar/notification/NotificiationMailTest.java @@ -1,5 +1,6 @@ package org.traccar.notification; +import org.junit.Ignore; import org.junit.Test; import javax.mail.Message; @@ -24,7 +25,8 @@ public class NotificiationMailTest { private static final int PORT = 25; - //@Test + @Ignore + @Test public void test() throws Exception { Properties props = System.getProperties(); diff --git a/test/org/traccar/processing/ComputedAttributesTest.java b/test/org/traccar/processing/ComputedAttributesTest.java index 88ebfd9a9..160067915 100644 --- a/test/org/traccar/processing/ComputedAttributesTest.java +++ b/test/org/traccar/processing/ComputedAttributesTest.java @@ -2,7 +2,6 @@ package org.traccar.processing; import java.util.Date; -import org.junit.Assert; import org.junit.Test; import org.traccar.model.Attribute; import org.traccar.model.Position; diff --git a/test/org/traccar/protocol/AdmProtocolEncoderTest.java b/test/org/traccar/protocol/AdmProtocolEncoderTest.java index fd4ea4af0..cb0a31ceb 100644 --- a/test/org/traccar/protocol/AdmProtocolEncoderTest.java +++ b/test/org/traccar/protocol/AdmProtocolEncoderTest.java @@ -16,7 +16,6 @@ */ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/AplicomFrameDecoderTest.java b/test/org/traccar/protocol/AplicomFrameDecoderTest.java index 6ba8f9334..581f7696f 100644 --- a/test/org/traccar/protocol/AplicomFrameDecoderTest.java +++ b/test/org/traccar/protocol/AplicomFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/At2000FrameDecoderTest.java b/test/org/traccar/protocol/At2000FrameDecoderTest.java index 52490c107..5613f832e 100644 --- a/test/org/traccar/protocol/At2000FrameDecoderTest.java +++ b/test/org/traccar/protocol/At2000FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/AtrackFrameDecoderTest.java b/test/org/traccar/protocol/AtrackFrameDecoderTest.java index 12ce783ad..9db4fd052 100644 --- a/test/org/traccar/protocol/AtrackFrameDecoderTest.java +++ b/test/org/traccar/protocol/AtrackFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/EskyFrameDecoderTest.java b/test/org/traccar/protocol/EskyFrameDecoderTest.java index e8902e8be..3b16a9051 100644 --- a/test/org/traccar/protocol/EskyFrameDecoderTest.java +++ b/test/org/traccar/protocol/EskyFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/GalileoFrameDecoderTest.java b/test/org/traccar/protocol/GalileoFrameDecoderTest.java index 049c16efa..7a7c97ba6 100644 --- a/test/org/traccar/protocol/GalileoFrameDecoderTest.java +++ b/test/org/traccar/protocol/GalileoFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/GatorProtocolDecoderTest.java b/test/org/traccar/protocol/GatorProtocolDecoderTest.java index ae6240b3e..360a3abed 100644 --- a/test/org/traccar/protocol/GatorProtocolDecoderTest.java +++ b/test/org/traccar/protocol/GatorProtocolDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Gl200FrameDecoderTest.java b/test/org/traccar/protocol/Gl200FrameDecoderTest.java index 2112ce466..e90c6495a 100644 --- a/test/org/traccar/protocol/Gl200FrameDecoderTest.java +++ b/test/org/traccar/protocol/Gl200FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Gps056FrameDecoderTest.java b/test/org/traccar/protocol/Gps056FrameDecoderTest.java index 58c64f59e..ce21f733f 100644 --- a/test/org/traccar/protocol/Gps056FrameDecoderTest.java +++ b/test/org/traccar/protocol/Gps056FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Gps103ProtocolEncoderTest.java b/test/org/traccar/protocol/Gps103ProtocolEncoderTest.java index cfb1d5b90..f888ee252 100644 --- a/test/org/traccar/protocol/Gps103ProtocolEncoderTest.java +++ b/test/org/traccar/protocol/Gps103ProtocolEncoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/GranitFrameDecoderTest.java b/test/org/traccar/protocol/GranitFrameDecoderTest.java index aa5a5b580..130b9dbd7 100644 --- a/test/org/traccar/protocol/GranitFrameDecoderTest.java +++ b/test/org/traccar/protocol/GranitFrameDecoderTest.java @@ -2,7 +2,6 @@ package org.traccar.protocol; import java.nio.ByteOrder; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Gt06FrameDecoderTest.java b/test/org/traccar/protocol/Gt06FrameDecoderTest.java index 97230695a..cf6d1cfd7 100644 --- a/test/org/traccar/protocol/Gt06FrameDecoderTest.java +++ b/test/org/traccar/protocol/Gt06FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/H02FrameDecoderTest.java b/test/org/traccar/protocol/H02FrameDecoderTest.java index 214f1c9fa..bdb2ff37b 100644 --- a/test/org/traccar/protocol/H02FrameDecoderTest.java +++ b/test/org/traccar/protocol/H02FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/H02ProtocolEncoderTest.java b/test/org/traccar/protocol/H02ProtocolEncoderTest.java index bf3978385..e7b409a88 100644 --- a/test/org/traccar/protocol/H02ProtocolEncoderTest.java +++ b/test/org/traccar/protocol/H02ProtocolEncoderTest.java @@ -1,7 +1,6 @@ package org.traccar.protocol; import org.joda.time.DateTime; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/HuaShengFrameDecoderTest.java b/test/org/traccar/protocol/HuaShengFrameDecoderTest.java index dc2536319..0f24d4b5c 100644 --- a/test/org/traccar/protocol/HuaShengFrameDecoderTest.java +++ b/test/org/traccar/protocol/HuaShengFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/HuabaoFrameDecoderTest.java b/test/org/traccar/protocol/HuabaoFrameDecoderTest.java index 98caf1dca..2d3937903 100644 --- a/test/org/traccar/protocol/HuabaoFrameDecoderTest.java +++ b/test/org/traccar/protocol/HuabaoFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Jt600FrameDecoderTest.java b/test/org/traccar/protocol/Jt600FrameDecoderTest.java index 15e6ec18c..ae0948987 100644 --- a/test/org/traccar/protocol/Jt600FrameDecoderTest.java +++ b/test/org/traccar/protocol/Jt600FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/L100FrameDecoderTest.java b/test/org/traccar/protocol/L100FrameDecoderTest.java index ab70678d5..fc6a892dc 100644 --- a/test/org/traccar/protocol/L100FrameDecoderTest.java +++ b/test/org/traccar/protocol/L100FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/MegastekFrameDecoderTest.java b/test/org/traccar/protocol/MegastekFrameDecoderTest.java index 9a327bb1f..68606a98a 100644 --- a/test/org/traccar/protocol/MegastekFrameDecoderTest.java +++ b/test/org/traccar/protocol/MegastekFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/MeiligaoFrameDecoderTest.java b/test/org/traccar/protocol/MeiligaoFrameDecoderTest.java index 214936514..2d09c626b 100644 --- a/test/org/traccar/protocol/MeiligaoFrameDecoderTest.java +++ b/test/org/traccar/protocol/MeiligaoFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/MeitrackFrameDecoderTest.java b/test/org/traccar/protocol/MeitrackFrameDecoderTest.java index f0afee02e..53749816e 100644 --- a/test/org/traccar/protocol/MeitrackFrameDecoderTest.java +++ b/test/org/traccar/protocol/MeitrackFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/MeitrackProtocolEncoderTest.java b/test/org/traccar/protocol/MeitrackProtocolEncoderTest.java index a2b0ae6fd..d5ecbb488 100644 --- a/test/org/traccar/protocol/MeitrackProtocolEncoderTest.java +++ b/test/org/traccar/protocol/MeitrackProtocolEncoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/MiniFinderProtocolEncoderTest.java b/test/org/traccar/protocol/MiniFinderProtocolEncoderTest.java index d446c228c..e9422da9f 100644 --- a/test/org/traccar/protocol/MiniFinderProtocolEncoderTest.java +++ b/test/org/traccar/protocol/MiniFinderProtocolEncoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/NvsFrameDecoderTest.java b/test/org/traccar/protocol/NvsFrameDecoderTest.java index b03e3826c..8a00207eb 100644 --- a/test/org/traccar/protocol/NvsFrameDecoderTest.java +++ b/test/org/traccar/protocol/NvsFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Pt502FrameDecoderTest.java b/test/org/traccar/protocol/Pt502FrameDecoderTest.java index d654c0c61..04180abb0 100644 --- a/test/org/traccar/protocol/Pt502FrameDecoderTest.java +++ b/test/org/traccar/protocol/Pt502FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java b/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java index 5438eb366..9d591bceb 100644 --- a/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java +++ b/test/org/traccar/protocol/Pt502ProtocolEncoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/TelicFrameDecoderTest.java b/test/org/traccar/protocol/TelicFrameDecoderTest.java index 711014c46..dd0efacb6 100644 --- a/test/org/traccar/protocol/TelicFrameDecoderTest.java +++ b/test/org/traccar/protocol/TelicFrameDecoderTest.java @@ -1,7 +1,5 @@ package org.traccar.protocol; -import org.jboss.netty.buffer.ChannelBuffer; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Tk103ProtocolEncoderTest.java b/test/org/traccar/protocol/Tk103ProtocolEncoderTest.java index 6b38035ed..565f6bb88 100644 --- a/test/org/traccar/protocol/Tk103ProtocolEncoderTest.java +++ b/test/org/traccar/protocol/Tk103ProtocolEncoderTest.java @@ -1,11 +1,8 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; -import org.traccar.TestIdentityManager; import org.traccar.model.Command; -import org.traccar.model.Device; import static org.junit.Assert.assertEquals; diff --git a/test/org/traccar/protocol/TmgFrameDecoderTest.java b/test/org/traccar/protocol/TmgFrameDecoderTest.java index 7a6c47fb9..4f7be1b28 100644 --- a/test/org/traccar/protocol/TmgFrameDecoderTest.java +++ b/test/org/traccar/protocol/TmgFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/TotemFrameDecoderTest.java b/test/org/traccar/protocol/TotemFrameDecoderTest.java index 0d3e69465..8fb5f8d54 100644 --- a/test/org/traccar/protocol/TotemFrameDecoderTest.java +++ b/test/org/traccar/protocol/TotemFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/TotemProtocolEncoderTest.java b/test/org/traccar/protocol/TotemProtocolEncoderTest.java index d17f70405..5a47f74cc 100644 --- a/test/org/traccar/protocol/TotemProtocolEncoderTest.java +++ b/test/org/traccar/protocol/TotemProtocolEncoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/TzoneProtocolDecoderTest.java b/test/org/traccar/protocol/TzoneProtocolDecoderTest.java index 68c8bbdbc..c309abce1 100644 --- a/test/org/traccar/protocol/TzoneProtocolDecoderTest.java +++ b/test/org/traccar/protocol/TzoneProtocolDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import static org.junit.Assert.assertNotNull; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/UlbotechFrameDecoderTest.java b/test/org/traccar/protocol/UlbotechFrameDecoderTest.java index b0af435b8..d3d0429d6 100644 --- a/test/org/traccar/protocol/UlbotechFrameDecoderTest.java +++ b/test/org/traccar/protocol/UlbotechFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/Vt200FrameDecoderTest.java b/test/org/traccar/protocol/Vt200FrameDecoderTest.java index a9fff6c33..9422f6d74 100644 --- a/test/org/traccar/protocol/Vt200FrameDecoderTest.java +++ b/test/org/traccar/protocol/Vt200FrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/VtfmsFrameDecoderTest.java b/test/org/traccar/protocol/VtfmsFrameDecoderTest.java index c9ee8ae20..a5eb0b49b 100644 --- a/test/org/traccar/protocol/VtfmsFrameDecoderTest.java +++ b/test/org/traccar/protocol/VtfmsFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/WatchProtocolEncoderTest.java b/test/org/traccar/protocol/WatchProtocolEncoderTest.java index a87afbfc5..a201b7860 100644 --- a/test/org/traccar/protocol/WatchProtocolEncoderTest.java +++ b/test/org/traccar/protocol/WatchProtocolEncoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/WondexFrameDecoderTest.java b/test/org/traccar/protocol/WondexFrameDecoderTest.java index 8eb80da9a..642473f2d 100644 --- a/test/org/traccar/protocol/WondexFrameDecoderTest.java +++ b/test/org/traccar/protocol/WondexFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/protocol/WondexProtocolEncoderTest.java b/test/org/traccar/protocol/WondexProtocolEncoderTest.java index 7c5fa572c..3d76cb677 100644 --- a/test/org/traccar/protocol/WondexProtocolEncoderTest.java +++ b/test/org/traccar/protocol/WondexProtocolEncoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; import org.traccar.model.Command; diff --git a/test/org/traccar/protocol/XexunFrameDecoderTest.java b/test/org/traccar/protocol/XexunFrameDecoderTest.java index cdf30965c..8fc628bdb 100644 --- a/test/org/traccar/protocol/XexunFrameDecoderTest.java +++ b/test/org/traccar/protocol/XexunFrameDecoderTest.java @@ -1,6 +1,5 @@ package org.traccar.protocol; -import org.junit.Assert; import org.junit.Test; import org.traccar.ProtocolTest; diff --git a/test/org/traccar/reports/ReportUtilsTest.java b/test/org/traccar/reports/ReportUtilsTest.java index bdf45e9d5..a8ff653c9 100644 --- a/test/org/traccar/reports/ReportUtilsTest.java +++ b/test/org/traccar/reports/ReportUtilsTest.java @@ -15,7 +15,6 @@ import java.util.Iterator; import java.util.List; import java.util.TimeZone; -import org.junit.Assert; import org.junit.Test; import org.traccar.BaseTest; import org.traccar.model.Position; -- cgit v1.2.3 From a24a7d075ec26e36d26e6ffaec028d7893d07800 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 26 Jan 2018 19:03:15 +1300 Subject: Implement some explicit casts --- src/org/traccar/api/resource/AttributeResource.java | 6 ++++-- src/org/traccar/processing/ComputedAttributesHandler.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/resource/AttributeResource.java b/src/org/traccar/api/resource/AttributeResource.java index b37cbbeb2..8f0bac473 100644 --- a/src/org/traccar/api/resource/AttributeResource.java +++ b/src/org/traccar/api/resource/AttributeResource.java @@ -52,9 +52,11 @@ public class AttributeResource extends ExtendedObjectResource { if (result != null) { switch (entity.getType()) { case "number": - return Response.ok(result).build(); + Number numberValue = (Number) result; + return Response.ok(numberValue).build(); case "boolean": - return Response.ok(result).build(); + Boolean booleanValue = (Boolean) result; + return Response.ok(booleanValue).build(); default: return Response.ok(result.toString()).build(); } diff --git a/src/org/traccar/processing/ComputedAttributesHandler.java b/src/org/traccar/processing/ComputedAttributesHandler.java index f0c54d355..b37db05bf 100644 --- a/src/org/traccar/processing/ComputedAttributesHandler.java +++ b/src/org/traccar/processing/ComputedAttributesHandler.java @@ -102,10 +102,12 @@ public class ComputedAttributesHandler extends BaseDataHandler { try { switch (attribute.getType()) { case "number": - position.getAttributes().put(attribute.getAttribute(), result); + Number numberValue = (Number) result; + position.getAttributes().put(attribute.getAttribute(), numberValue); break; case "boolean": - position.getAttributes().put(attribute.getAttribute(), result); + Boolean booleanValue = (Boolean) result; + position.getAttributes().put(attribute.getAttribute(), booleanValue); break; default: position.getAttributes().put(attribute.getAttribute(), result.toString()); -- cgit v1.2.3 From bda31d967673477331caba9597c1ab57553c4b8d Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Mon, 29 Jan 2018 09:40:53 +0500 Subject: Fix ScheduledModel objects permission check --- src/org/traccar/api/BaseObjectResource.java | 11 ++++++++-- src/org/traccar/model/Device.java | 14 ++----------- src/org/traccar/model/Group.java | 14 ++----------- src/org/traccar/model/GroupedModel.java | 31 +++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 src/org/traccar/model/GroupedModel.java (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/BaseObjectResource.java b/src/org/traccar/api/BaseObjectResource.java index e4e00938f..596195cae 100644 --- a/src/org/traccar/api/BaseObjectResource.java +++ b/src/org/traccar/api/BaseObjectResource.java @@ -37,6 +37,7 @@ import org.traccar.model.Calendar; import org.traccar.model.Command; import org.traccar.model.Device; import org.traccar.model.Group; +import org.traccar.model.GroupedModel; import org.traccar.model.ScheduledModel; import org.traccar.model.User; @@ -79,7 +80,10 @@ public abstract class BaseObjectResource extends BaseResour Context.getPermissionsManager().checkDeviceLimit(getUserId()); } else if (baseClass.equals(Command.class)) { Context.getPermissionsManager().checkLimitCommands(getUserId()); - } else if (entity instanceof ScheduledModel) { + } else if (entity instanceof GroupedModel && ((GroupedModel) entity).getGroupId() != 0) { + Context.getPermissionsManager().checkPermission(Group.class, getUserId(), + ((GroupedModel) entity).getGroupId()); + } else if (entity instanceof ScheduledModel && ((ScheduledModel) entity).getCalendarId() != 0) { Context.getPermissionsManager().checkPermission(Calendar.class, getUserId(), ((ScheduledModel) entity).getCalendarId()); } @@ -111,7 +115,10 @@ public abstract class BaseObjectResource extends BaseResour Context.getPermissionsManager().checkUserUpdate(getUserId(), before, (User) entity); } else if (baseClass.equals(Command.class)) { Context.getPermissionsManager().checkLimitCommands(getUserId()); - } else if (entity instanceof ScheduledModel) { + } else if (entity instanceof GroupedModel && ((GroupedModel) entity).getGroupId() != 0) { + Context.getPermissionsManager().checkPermission(Group.class, getUserId(), + ((GroupedModel) entity).getGroupId()); + } else if (entity instanceof ScheduledModel && ((ScheduledModel) entity).getCalendarId() != 0) { Context.getPermissionsManager().checkPermission(Calendar.class, getUserId(), ((ScheduledModel) entity).getCalendarId()); } diff --git a/src/org/traccar/model/Device.java b/src/org/traccar/model/Device.java index 51b479b09..0c9be932d 100644 --- a/src/org/traccar/model/Device.java +++ b/src/org/traccar/model/Device.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 - 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2012 - 2018 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import java.util.List; import org.traccar.database.QueryExtended; import org.traccar.database.QueryIgnore; -public class Device extends ExtendedModel { +public class Device extends GroupedModel { private String name; @@ -88,16 +88,6 @@ public class Device extends ExtendedModel { this.positionId = positionId; } - private long groupId; - - public long getGroupId() { - return groupId; - } - - public void setGroupId(long groupId) { - this.groupId = groupId; - } - private List geofenceIds; @QueryIgnore diff --git a/src/org/traccar/model/Group.java b/src/org/traccar/model/Group.java index aad206aad..91ea2319d 100644 --- a/src/org/traccar/model/Group.java +++ b/src/org/traccar/model/Group.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package org.traccar.model; -public class Group extends ExtendedModel { +public class Group extends GroupedModel { private String name; @@ -27,14 +27,4 @@ public class Group extends ExtendedModel { this.name = name; } - private long groupId; - - public long getGroupId() { - return groupId; - } - - public void setGroupId(long groupId) { - this.groupId = groupId; - } - } diff --git a/src/org/traccar/model/GroupedModel.java b/src/org/traccar/model/GroupedModel.java new file mode 100644 index 000000000..6b1aa75b1 --- /dev/null +++ b/src/org/traccar/model/GroupedModel.java @@ -0,0 +1,31 @@ +/* + * Copyright 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2018 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 GroupedModel extends ExtendedModel { + + private long groupId; + + public long getGroupId() { + return groupId; + } + + public void setGroupId(long groupId) { + this.groupId = groupId; + } + +} -- cgit v1.2.3 From 400a82e0c1817f02fcc2b0cf3ffe6f8ee5abf05f Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Mon, 29 Jan 2018 11:01:45 +0500 Subject: Fix formatting --- src/org/traccar/api/BaseObjectResource.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/BaseObjectResource.java b/src/org/traccar/api/BaseObjectResource.java index 596195cae..7de6a3877 100644 --- a/src/org/traccar/api/BaseObjectResource.java +++ b/src/org/traccar/api/BaseObjectResource.java @@ -81,11 +81,11 @@ public abstract class BaseObjectResource extends BaseResour } else if (baseClass.equals(Command.class)) { Context.getPermissionsManager().checkLimitCommands(getUserId()); } else if (entity instanceof GroupedModel && ((GroupedModel) entity).getGroupId() != 0) { - Context.getPermissionsManager().checkPermission(Group.class, getUserId(), - ((GroupedModel) entity).getGroupId()); + Context.getPermissionsManager().checkPermission( + Group.class, getUserId(), ((GroupedModel) entity).getGroupId()); } else if (entity instanceof ScheduledModel && ((ScheduledModel) entity).getCalendarId() != 0) { - Context.getPermissionsManager().checkPermission(Calendar.class, getUserId(), - ((ScheduledModel) entity).getCalendarId()); + Context.getPermissionsManager().checkPermission( + Calendar.class, getUserId(), ((ScheduledModel) entity).getCalendarId()); } BaseObjectManager manager = Context.getManager(baseClass); @@ -116,11 +116,11 @@ public abstract class BaseObjectResource extends BaseResour } else if (baseClass.equals(Command.class)) { Context.getPermissionsManager().checkLimitCommands(getUserId()); } else if (entity instanceof GroupedModel && ((GroupedModel) entity).getGroupId() != 0) { - Context.getPermissionsManager().checkPermission(Group.class, getUserId(), - ((GroupedModel) entity).getGroupId()); + Context.getPermissionsManager().checkPermission( + Group.class, getUserId(), ((GroupedModel) entity).getGroupId()); } else if (entity instanceof ScheduledModel && ((ScheduledModel) entity).getCalendarId() != 0) { - Context.getPermissionsManager().checkPermission(Calendar.class, getUserId(), - ((ScheduledModel) entity).getCalendarId()); + Context.getPermissionsManager().checkPermission( + Calendar.class, getUserId(), ((ScheduledModel) entity).getCalendarId()); } Context.getPermissionsManager().checkPermission(baseClass, getUserId(), entity.getId()); -- cgit v1.2.3 From 22f792139406e381fdda5a02a61b61a577b33656 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Thu, 1 Feb 2018 14:12:06 +0500 Subject: Provide access to media files received from devices --- src/org/traccar/api/MediaFilter.java | 104 ++++++++++++++++++++++ src/org/traccar/protocol/Gt06ProtocolDecoder.java | 3 +- src/org/traccar/web/WebServer.java | 18 ++++ 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 src/org/traccar/api/MediaFilter.java (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/MediaFilter.java b/src/org/traccar/api/MediaFilter.java new file mode 100644 index 000000000..c07175d40 --- /dev/null +++ b/src/org/traccar/api/MediaFilter.java @@ -0,0 +1,104 @@ +/* + * Copyright 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2018 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.api; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.ws.rs.NotAuthorizedException; + +import org.traccar.Context; +import org.traccar.api.resource.SessionResource; +import org.traccar.helper.Log; +import org.traccar.model.Device; + +public class MediaFilter implements Filter { + + private boolean dirAllowed; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + dirAllowed = Context.getConfig().getBoolean("media.dirAllowed"); + } + + private static void formatError(HttpServletResponse response, Exception e) throws IOException { + if (e instanceof SecurityException) { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); + } else if (e instanceof IllegalArgumentException) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + } else if (e instanceof NotAuthorizedException) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } else { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + } + response.getWriter().println(Log.exceptionStack(e)); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + try { + HttpSession session = ((HttpServletRequest) request).getSession(false); + Long userId = null; + if (session != null) { + userId = (Long) session.getAttribute(SessionResource.USER_ID_KEY); + if (userId != null) { + Context.getPermissionsManager().checkUserEnabled(userId); + Context.getStatisticsManager().registerRequest(userId); + } + } + if (userId == null) { + throw new NotAuthorizedException("Not authorized"); + } + + String[] parts = ((HttpServletRequest) request).getPathInfo().split("/"); + if (parts.length < 2) { + if (dirAllowed) { + Context.getPermissionsManager().checkAdmin(userId); + } else { + throw new SecurityException("Wrong path"); + } + } else if (parts.length == 2 && !dirAllowed) { + throw new SecurityException("Wrong path"); + } else { + Device device = Context.getIdentityManager().getByUniqueId(parts[1]); + if (device != null) { + Context.getPermissionsManager().checkDevice(userId, device.getId()); + } else { + throw new IllegalArgumentException("Device not found"); + } + } + + chain.doFilter(request, response); + } catch (Exception e) { + formatError((HttpServletResponse) response, e); + } + } + + @Override + public void destroy() { + } + +} diff --git a/src/org/traccar/protocol/Gt06ProtocolDecoder.java b/src/org/traccar/protocol/Gt06ProtocolDecoder.java index e11a6580b..4173b4d5b 100644 --- a/src/org/traccar/protocol/Gt06ProtocolDecoder.java +++ b/src/org/traccar/protocol/Gt06ProtocolDecoder.java @@ -704,7 +704,8 @@ public class Gt06ProtocolDecoder extends BaseProtocolDecoder { sendPhotoRequest(channel, pictureId); } else { Device device = Context.getDeviceManager().getById(deviceSession.getDeviceId()); - Context.getMediaManager().writeFile(device.getUniqueId(), photo, "jpg"); + position.set( + Position.KEY_IMAGE, Context.getMediaManager().writeFile(device.getUniqueId(), photo, "jpg")); photos.remove(pictureId); } diff --git a/src/org/traccar/web/WebServer.java b/src/org/traccar/web/WebServer.java index e145ff554..8b0696081 100644 --- a/src/org/traccar/web/WebServer.java +++ b/src/org/traccar/web/WebServer.java @@ -25,6 +25,7 @@ import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.session.HashSessionManager; +import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.webapp.WebAppContext; @@ -35,6 +36,7 @@ import org.traccar.Config; import org.traccar.Context; import org.traccar.api.AsyncSocketServlet; import org.traccar.api.CorsResponseFilter; +import org.traccar.api.MediaFilter; import org.traccar.api.ObjectMapperProvider; import org.traccar.api.ResourceErrorHandler; import org.traccar.api.SecurityRequestFilter; @@ -42,6 +44,7 @@ import org.traccar.api.resource.ServerResource; import org.traccar.helper.Log; import javax.naming.InitialContext; +import javax.servlet.DispatcherType; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -49,6 +52,7 @@ import javax.sql.DataSource; import java.io.IOException; import java.io.Writer; import java.net.InetSocketAddress; +import java.util.EnumSet; public class WebServer { @@ -80,6 +84,7 @@ public class WebServer { } initServer(); + initMedia(); initApi(); if (config.getBoolean("web.console")) { initConsole(); @@ -156,6 +161,19 @@ public class WebServer { handlers.addHandler(app); } + private void initMedia() { + ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); + servletHandler.setContextPath("/api/media"); + servletHandler.getSessionHandler().setSessionManager(sessionManager); + + ServletHolder servletHolder = new ServletHolder("media", DefaultServlet.class); + servletHolder.setInitParameter("resourceBase", config.getString("media.path")); + servletHolder.setInitParameter("dirAllowed", config.getString("media.dirAllowed", "false")); + servletHandler.addServlet(servletHolder, "/*"); + servletHandler.addFilter(MediaFilter.class, "/*", EnumSet.of(DispatcherType.INCLUDE, DispatcherType.REQUEST)); + handlers.addHandler(servletHandler); + } + private void initApi() { ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); servletHandler.setContextPath("/api"); -- cgit v1.2.3 From 195ec5aed9e3a6a499cf5a21773235563806a0c1 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 2 Feb 2018 11:15:12 +0500 Subject: - Move media servlet to api context - Cleanup and optimization --- src/org/traccar/api/MediaFilter.java | 41 +++++++++++++----------------------- src/org/traccar/web/WebServer.java | 24 +++++++-------------- 2 files changed, 23 insertions(+), 42 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/MediaFilter.java b/src/org/traccar/api/MediaFilter.java index c07175d40..b3dcbbd66 100644 --- a/src/org/traccar/api/MediaFilter.java +++ b/src/org/traccar/api/MediaFilter.java @@ -36,24 +36,8 @@ import org.traccar.model.Device; public class MediaFilter implements Filter { - private boolean dirAllowed; - @Override public void init(FilterConfig filterConfig) throws ServletException { - dirAllowed = Context.getConfig().getBoolean("media.dirAllowed"); - } - - private static void formatError(HttpServletResponse response, Exception e) throws IOException { - if (e instanceof SecurityException) { - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - } else if (e instanceof IllegalArgumentException) { - response.setStatus(HttpServletResponse.SC_NOT_FOUND); - } else if (e instanceof NotAuthorizedException) { - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - } else { - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - } - response.getWriter().println(Log.exceptionStack(e)); } @Override @@ -73,15 +57,10 @@ public class MediaFilter implements Filter { throw new NotAuthorizedException("Not authorized"); } - String[] parts = ((HttpServletRequest) request).getPathInfo().split("/"); - if (parts.length < 2) { - if (dirAllowed) { - Context.getPermissionsManager().checkAdmin(userId); - } else { - throw new SecurityException("Wrong path"); - } - } else if (parts.length == 2 && !dirAllowed) { - throw new SecurityException("Wrong path"); + String path = ((HttpServletRequest) request).getPathInfo(); + String[] parts = path.split("/"); + if (parts.length < 2 || parts.length == 2 && !path.endsWith("/")) { + Context.getPermissionsManager().checkAdmin(userId); } else { Device device = Context.getIdentityManager().getByUniqueId(parts[1]); if (device != null) { @@ -93,7 +72,17 @@ public class MediaFilter implements Filter { chain.doFilter(request, response); } catch (Exception e) { - formatError((HttpServletResponse) response, e); + HttpServletResponse httpResponse = (HttpServletResponse) response; + if (e instanceof SecurityException) { + httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); + } else if (e instanceof IllegalArgumentException) { + httpResponse.setStatus(HttpServletResponse.SC_NOT_FOUND); + } else if (e instanceof NotAuthorizedException) { + httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } else { + httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST); + } + response.getWriter().println(Log.exceptionStack(e)); } } diff --git a/src/org/traccar/web/WebServer.java b/src/org/traccar/web/WebServer.java index 8b0696081..88b38c1ab 100644 --- a/src/org/traccar/web/WebServer.java +++ b/src/org/traccar/web/WebServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 - 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2012 - 2018 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -84,7 +84,6 @@ public class WebServer { } initServer(); - initMedia(); initApi(); if (config.getBoolean("web.console")) { initConsole(); @@ -161,19 +160,6 @@ public class WebServer { handlers.addHandler(app); } - private void initMedia() { - ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); - servletHandler.setContextPath("/api/media"); - servletHandler.getSessionHandler().setSessionManager(sessionManager); - - ServletHolder servletHolder = new ServletHolder("media", DefaultServlet.class); - servletHolder.setInitParameter("resourceBase", config.getString("media.path")); - servletHolder.setInitParameter("dirAllowed", config.getString("media.dirAllowed", "false")); - servletHandler.addServlet(servletHolder, "/*"); - servletHandler.addFilter(MediaFilter.class, "/*", EnumSet.of(DispatcherType.INCLUDE, DispatcherType.REQUEST)); - handlers.addHandler(servletHandler); - } - private void initApi() { ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); servletHandler.setContextPath("/api"); @@ -181,11 +167,17 @@ public class WebServer { servletHandler.addServlet(new ServletHolder(new AsyncSocketServlet()), "/socket"); + ServletHolder servletHolder = new ServletHolder("media", DefaultServlet.class); + servletHolder.setInitParameter("resourceBase", config.getString("media.path")); + servletHolder.setInitParameter("dirAllowed", config.getString("media.directoryAllow", "false")); + servletHolder.setInitParameter("pathInfoOnly", "true"); + servletHandler.addServlet(servletHolder, "/media/*"); + servletHandler.addFilter(MediaFilter.class, "/media/*", EnumSet.allOf(DispatcherType.class)); + ResourceConfig resourceConfig = new ResourceConfig(); resourceConfig.registerClasses(JacksonFeature.class, ObjectMapperProvider.class, ResourceErrorHandler.class); resourceConfig.registerClasses(SecurityRequestFilter.class, CorsResponseFilter.class); resourceConfig.packages(ServerResource.class.getPackage().getName()); - servletHandler.addServlet(new ServletHolder(new ServletContainer(resourceConfig)), "/*"); handlers.addHandler(servletHandler); -- cgit v1.2.3 From 16f912fa4ebfbb89a5d99116c12740229fa09b67 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 2 Feb 2018 11:41:54 +0500 Subject: Optimize exception handling --- src/org/traccar/api/MediaFilter.java | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/MediaFilter.java b/src/org/traccar/api/MediaFilter.java index b3dcbbd66..de15209e7 100644 --- a/src/org/traccar/api/MediaFilter.java +++ b/src/org/traccar/api/MediaFilter.java @@ -17,6 +17,7 @@ package org.traccar.api; import java.io.IOException; +import java.sql.SQLException; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -27,7 +28,6 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; -import javax.ws.rs.NotAuthorizedException; import org.traccar.Context; import org.traccar.api.resource.SessionResource; @@ -54,7 +54,9 @@ public class MediaFilter implements Filter { } } if (userId == null) { - throw new NotAuthorizedException("Not authorized"); + ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().println("Not authorized"); + return; } String path = ((HttpServletRequest) request).getPathInfo(); @@ -62,26 +64,22 @@ public class MediaFilter implements Filter { if (parts.length < 2 || parts.length == 2 && !path.endsWith("/")) { Context.getPermissionsManager().checkAdmin(userId); } else { - Device device = Context.getIdentityManager().getByUniqueId(parts[1]); + Device device = Context.getDeviceManager().getByUniqueId(parts[1]); if (device != null) { Context.getPermissionsManager().checkDevice(userId, device.getId()); } else { - throw new IllegalArgumentException("Device not found"); + ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND); + response.getWriter().println("Device not found"); + return; } } chain.doFilter(request, response); - } catch (Exception e) { - HttpServletResponse httpResponse = (HttpServletResponse) response; - if (e instanceof SecurityException) { - httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); - } else if (e instanceof IllegalArgumentException) { - httpResponse.setStatus(HttpServletResponse.SC_NOT_FOUND); - } else if (e instanceof NotAuthorizedException) { - httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - } else { - httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST); - } + } catch (SecurityException e) { + ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_FORBIDDEN); + response.getWriter().println(Log.exceptionStack(e)); + } catch (SQLException e) { + ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().println(Log.exceptionStack(e)); } } -- cgit v1.2.3 From 1d56c58847d811086d65115d7dca7a705bfda92a Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Fri, 2 Feb 2018 11:53:02 +0500 Subject: Remove custom text and repeated casting --- src/org/traccar/api/MediaFilter.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/MediaFilter.java b/src/org/traccar/api/MediaFilter.java index de15209e7..4685ce05b 100644 --- a/src/org/traccar/api/MediaFilter.java +++ b/src/org/traccar/api/MediaFilter.java @@ -43,6 +43,7 @@ public class MediaFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletResponse httpResponse = ((HttpServletResponse) response); try { HttpSession session = ((HttpServletRequest) request).getSession(false); Long userId = null; @@ -54,8 +55,7 @@ public class MediaFilter implements Filter { } } if (userId == null) { - ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.getWriter().println("Not authorized"); + httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); return; } @@ -68,19 +68,18 @@ public class MediaFilter implements Filter { if (device != null) { Context.getPermissionsManager().checkDevice(userId, device.getId()); } else { - ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND); - response.getWriter().println("Device not found"); + httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND); return; } } chain.doFilter(request, response); } catch (SecurityException e) { - ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_FORBIDDEN); - response.getWriter().println(Log.exceptionStack(e)); + httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); + httpResponse.getWriter().println(Log.exceptionStack(e)); } catch (SQLException e) { - ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_BAD_REQUEST); - response.getWriter().println(Log.exceptionStack(e)); + httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST); + httpResponse.getWriter().println(Log.exceptionStack(e)); } } -- cgit v1.2.3 From eedfb54d208ba48783cb9d03a775723660e9ff73 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 10 Mar 2018 15:02:21 +1300 Subject: Fix PMD code issues --- src/org/traccar/api/MediaFilter.java | 2 +- src/org/traccar/protocol/FlespiProtocolDecoder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/org/traccar/api') diff --git a/src/org/traccar/api/MediaFilter.java b/src/org/traccar/api/MediaFilter.java index 4685ce05b..25e242b01 100644 --- a/src/org/traccar/api/MediaFilter.java +++ b/src/org/traccar/api/MediaFilter.java @@ -43,7 +43,7 @@ public class MediaFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletResponse httpResponse = ((HttpServletResponse) response); + HttpServletResponse httpResponse = (HttpServletResponse) response; try { HttpSession session = ((HttpServletRequest) request).getSession(false); Long userId = null; diff --git a/src/org/traccar/protocol/FlespiProtocolDecoder.java b/src/org/traccar/protocol/FlespiProtocolDecoder.java index be0e4a07f..526e10fa2 100644 --- a/src/org/traccar/protocol/FlespiProtocolDecoder.java +++ b/src/org/traccar/protocol/FlespiProtocolDecoder.java @@ -123,7 +123,7 @@ public class FlespiProtocolDecoder extends BaseHttpProtocolDecoder { return true; case "din": case "dout": - position.set((name.equals("din") ? Position.KEY_INPUT : Position.KEY_OUTPUT), + position.set(name.equals("din") ? Position.KEY_INPUT : Position.KEY_OUTPUT, ((JsonNumber) value).intValue()); return true; case "gps.vehicle.mileage": -- cgit v1.2.3 From a58b40a49e96f8fc876b88b6b10489f8532893d9 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 10 Mar 2018 16:23:06 +1300 Subject: Replace deprecated classes --- pom.xml | 5 +++ src/org/traccar/BaseProtocol.java | 4 +- src/org/traccar/ExtendedObjectDecoder.java | 4 +- src/org/traccar/api/SecurityRequestFilter.java | 4 +- src/org/traccar/api/resource/SessionResource.java | 6 +-- src/org/traccar/helper/DataConverter.java | 47 ++++++++++++++++++++++ src/org/traccar/helper/Hashing.java | 9 ++--- .../traccar/protocol/At2000ProtocolDecoder.java | 4 +- .../traccar/protocol/EelinkProtocolEncoder.java | 4 +- .../traccar/protocol/HuabaoProtocolEncoder.java | 6 +-- .../traccar/protocol/MeiligaoProtocolEncoder.java | 4 +- .../traccar/protocol/RuptelaProtocolDecoder.java | 6 +-- .../traccar/protocol/SigfoxProtocolDecoder.java | 4 +- src/org/traccar/protocol/T800xProtocolEncoder.java | 4 +- src/org/traccar/protocol/WatchProtocolEncoder.java | 4 +- .../traccar/protocol/Xt2400ProtocolDecoder.java | 4 +- test/org/traccar/ProtocolTest.java | 4 +- 17 files changed, 87 insertions(+), 36 deletions(-) create mode 100644 src/org/traccar/helper/DataConverter.java (limited to 'src/org/traccar/api') diff --git a/pom.xml b/pom.xml index 81e9d49c2..14de784f3 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,11 @@ joda-time 2.9.9 + + commons-codec + commons-codec + 1.11 + com.h2database h2 diff --git a/src/org/traccar/BaseProtocol.java b/src/org/traccar/BaseProtocol.java index 90b9f21f2..07adbea5e 100644 --- a/src/org/traccar/BaseProtocol.java +++ b/src/org/traccar/BaseProtocol.java @@ -18,9 +18,9 @@ package org.traccar; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.handler.codec.string.StringEncoder; import org.traccar.database.ActiveDevice; +import org.traccar.helper.DataConverter; import org.traccar.model.Command; -import javax.xml.bind.DatatypeConverter; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; @@ -79,7 +79,7 @@ public abstract class BaseProtocol implements Protocol { if (activeDevice.getChannel().getPipeline().get(StringEncoder.class) != null) { activeDevice.write(data); } else { - activeDevice.write(ChannelBuffers.wrappedBuffer(DatatypeConverter.parseHexBinary(data))); + activeDevice.write(ChannelBuffers.wrappedBuffer(DataConverter.parseHex(data))); } } else { throw new RuntimeException("Command " + command.getType() + " is not supported in protocol " + getName()); diff --git a/src/org/traccar/ExtendedObjectDecoder.java b/src/org/traccar/ExtendedObjectDecoder.java index 268e6f688..75a24212f 100644 --- a/src/org/traccar/ExtendedObjectDecoder.java +++ b/src/org/traccar/ExtendedObjectDecoder.java @@ -23,9 +23,9 @@ import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelUpstreamHandler; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.MessageEvent; +import org.traccar.helper.DataConverter; import org.traccar.model.Position; -import javax.xml.bind.DatatypeConverter; import java.net.SocketAddress; import java.nio.charset.StandardCharsets; import java.util.Collection; @@ -39,7 +39,7 @@ public abstract class ExtendedObjectDecoder implements ChannelUpstreamHandler { ChannelBuffer buf = (ChannelBuffer) originalMessage; position.set(Position.KEY_ORIGINAL, ChannelBuffers.hexDump(buf, 0, buf.writerIndex())); } else if (originalMessage instanceof String) { - position.set(Position.KEY_ORIGINAL, DatatypeConverter.printHexBinary( + position.set(Position.KEY_ORIGINAL, DataConverter.printHex( ((String) originalMessage).getBytes(StandardCharsets.US_ASCII))); } } diff --git a/src/org/traccar/api/SecurityRequestFilter.java b/src/org/traccar/api/SecurityRequestFilter.java index 7024bdbc9..aace9f705 100644 --- a/src/org/traccar/api/SecurityRequestFilter.java +++ b/src/org/traccar/api/SecurityRequestFilter.java @@ -17,6 +17,7 @@ package org.traccar.api; import org.traccar.Context; import org.traccar.api.resource.SessionResource; +import org.traccar.helper.DataConverter; import org.traccar.helper.Log; import org.traccar.model.User; @@ -28,7 +29,6 @@ import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; -import javax.xml.bind.DatatypeConverter; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.sql.SQLException; @@ -43,7 +43,7 @@ public class SecurityRequestFilter implements ContainerRequestFilter { public static String[] decodeBasicAuth(String auth) { auth = auth.replaceFirst("[B|b]asic ", ""); - byte[] decodedBytes = DatatypeConverter.parseBase64Binary(auth); + byte[] decodedBytes = DataConverter.parseBase64(auth); if (decodedBytes != null && decodedBytes.length > 0) { return new String(decodedBytes, StandardCharsets.US_ASCII).split(":", 2); } diff --git a/src/org/traccar/api/resource/SessionResource.java b/src/org/traccar/api/resource/SessionResource.java index 2a0bd4364..fd331c766 100644 --- a/src/org/traccar/api/resource/SessionResource.java +++ b/src/org/traccar/api/resource/SessionResource.java @@ -17,6 +17,7 @@ package org.traccar.api.resource; import org.traccar.Context; import org.traccar.api.BaseResource; +import org.traccar.helper.DataConverter; import org.traccar.helper.LogAction; import org.traccar.model.User; @@ -34,7 +35,6 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import javax.xml.bind.DatatypeConverter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -63,11 +63,11 @@ public class SessionResource extends BaseResource { if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(USER_COOKIE_KEY)) { - byte[] emailBytes = DatatypeConverter.parseBase64Binary( + byte[] emailBytes = DataConverter.parseBase64( URLDecoder.decode(cookie.getValue(), StandardCharsets.US_ASCII.name())); email = new String(emailBytes, StandardCharsets.UTF_8); } else if (cookie.getName().equals(PASS_COOKIE_KEY)) { - byte[] passwordBytes = DatatypeConverter.parseBase64Binary( + byte[] passwordBytes = DataConverter.parseBase64( URLDecoder.decode(cookie.getValue(), StandardCharsets.US_ASCII.name())); password = new String(passwordBytes, StandardCharsets.UTF_8); } diff --git a/src/org/traccar/helper/DataConverter.java b/src/org/traccar/helper/DataConverter.java new file mode 100644 index 000000000..7abd4ae93 --- /dev/null +++ b/src/org/traccar/helper/DataConverter.java @@ -0,0 +1,47 @@ +/* + * Copyright 2018 Anton Tananaev (anton@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.helper; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.binary.Hex; + +public final class DataConverter { + + private DataConverter() { + } + + public static byte[] parseHex(String string) { + try { + return Hex.decodeHex(string); + } catch (DecoderException e) { + throw new RuntimeException(e); + } + } + + public static String printHex(byte[] data) { + return Hex.encodeHexString(data); + } + + public static byte[] parseBase64(String string) { + return Base64.decodeBase64(string); + } + + public static String printBase64(byte[] data) { + return Base64.encodeBase64String(data); + } + +} diff --git a/src/org/traccar/helper/Hashing.java b/src/org/traccar/helper/Hashing.java index 3fcc124fa..e91310eda 100644 --- a/src/org/traccar/helper/Hashing.java +++ b/src/org/traccar/helper/Hashing.java @@ -17,7 +17,6 @@ package org.traccar.helper; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; -import javax.xml.bind.DatatypeConverter; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; @@ -75,13 +74,13 @@ public final class Hashing { RANDOM.nextBytes(salt); byte[] hash = function(password.toCharArray(), salt); return new HashingResult( - DatatypeConverter.printHexBinary(hash), - DatatypeConverter.printHexBinary(salt)); + DataConverter.printHex(hash), + DataConverter.printHex(salt)); } public static boolean validatePassword(String password, String hashHex, String saltHex) { - byte[] hash = DatatypeConverter.parseHexBinary(hashHex); - byte[] salt = DatatypeConverter.parseHexBinary(saltHex); + byte[] hash = DataConverter.parseHex(hashHex); + byte[] salt = DataConverter.parseHex(saltHex); return slowEquals(hash, function(password.toCharArray(), salt)); } diff --git a/src/org/traccar/protocol/At2000ProtocolDecoder.java b/src/org/traccar/protocol/At2000ProtocolDecoder.java index 06d80c497..e0f2b4278 100644 --- a/src/org/traccar/protocol/At2000ProtocolDecoder.java +++ b/src/org/traccar/protocol/At2000ProtocolDecoder.java @@ -20,13 +20,13 @@ import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.traccar.BaseProtocolDecoder; import org.traccar.DeviceSession; +import org.traccar.helper.DataConverter; import org.traccar.helper.UnitsConverter; import org.traccar.model.Position; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; -import javax.xml.bind.DatatypeConverter; import java.net.SocketAddress; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; @@ -84,7 +84,7 @@ public class At2000ProtocolDecoder extends BaseProtocolDecoder { IvParameterSpec ivSpec = new IvParameterSpec(iv); SecretKeySpec keySpec = new SecretKeySpec( - DatatypeConverter.parseHexBinary("000102030405060708090a0b0c0d0e0f"), "AES"); + DataConverter.parseHex("000102030405060708090a0b0c0d0e0f"), "AES"); cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); diff --git a/src/org/traccar/protocol/EelinkProtocolEncoder.java b/src/org/traccar/protocol/EelinkProtocolEncoder.java index 76865a039..4d2d86e68 100644 --- a/src/org/traccar/protocol/EelinkProtocolEncoder.java +++ b/src/org/traccar/protocol/EelinkProtocolEncoder.java @@ -18,10 +18,10 @@ package org.traccar.protocol; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.traccar.BaseProtocolEncoder; +import org.traccar.helper.DataConverter; import org.traccar.helper.Log; import org.traccar.model.Command; -import javax.xml.bind.DatatypeConverter; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -47,7 +47,7 @@ public class EelinkProtocolEncoder extends BaseProtocolEncoder { ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); if (connectionless) { - buf.writeBytes(ChannelBuffers.wrappedBuffer(DatatypeConverter.parseHexBinary('0' + uniqueId))); + buf.writeBytes(ChannelBuffers.wrappedBuffer(DataConverter.parseHex('0' + uniqueId))); } buf.writeByte(0x67); diff --git a/src/org/traccar/protocol/HuabaoProtocolEncoder.java b/src/org/traccar/protocol/HuabaoProtocolEncoder.java index 7d6f0510d..d1889bf5e 100644 --- a/src/org/traccar/protocol/HuabaoProtocolEncoder.java +++ b/src/org/traccar/protocol/HuabaoProtocolEncoder.java @@ -18,10 +18,10 @@ package org.traccar.protocol; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.traccar.BaseProtocolEncoder; +import org.traccar.helper.DataConverter; import org.traccar.helper.Log; import org.traccar.model.Command; -import javax.xml.bind.DatatypeConverter; import java.text.SimpleDateFormat; import java.util.Date; @@ -31,10 +31,10 @@ public class HuabaoProtocolEncoder extends BaseProtocolEncoder { protected Object encodeCommand(Command command) { ChannelBuffer id = ChannelBuffers.wrappedBuffer( - DatatypeConverter.parseHexBinary(getUniqueId(command.getDeviceId()))); + DataConverter.parseHex(getUniqueId(command.getDeviceId()))); ChannelBuffer data = ChannelBuffers.dynamicBuffer(); - byte[] time = DatatypeConverter.parseHexBinary(new SimpleDateFormat("yyMMddHHmmss").format(new Date())); + byte[] time = DataConverter.parseHex(new SimpleDateFormat("yyMMddHHmmss").format(new Date())); switch (command.getType()) { case Command.TYPE_ENGINE_STOP: diff --git a/src/org/traccar/protocol/MeiligaoProtocolEncoder.java b/src/org/traccar/protocol/MeiligaoProtocolEncoder.java index 2e0a1e84c..340d947e3 100644 --- a/src/org/traccar/protocol/MeiligaoProtocolEncoder.java +++ b/src/org/traccar/protocol/MeiligaoProtocolEncoder.java @@ -19,10 +19,10 @@ import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.traccar.BaseProtocolEncoder; import org.traccar.helper.Checksum; +import org.traccar.helper.DataConverter; import org.traccar.helper.Log; import org.traccar.model.Command; -import javax.xml.bind.DatatypeConverter; import java.nio.charset.StandardCharsets; import java.util.TimeZone; @@ -44,7 +44,7 @@ public class MeiligaoProtocolEncoder extends BaseProtocolEncoder { buf.writeShort(2 + 2 + 7 + 2 + content.readableBytes() + 2 + 2); // message length - buf.writeBytes(DatatypeConverter.parseHexBinary((getUniqueId(deviceId) + "FFFFFFFFFFFFFF").substring(0, 14))); + buf.writeBytes(DataConverter.parseHex((getUniqueId(deviceId) + "FFFFFFFFFFFFFF").substring(0, 14))); buf.writeShort(type); diff --git a/src/org/traccar/protocol/RuptelaProtocolDecoder.java b/src/org/traccar/protocol/RuptelaProtocolDecoder.java index 87ee8246a..7b11cc5c3 100644 --- a/src/org/traccar/protocol/RuptelaProtocolDecoder.java +++ b/src/org/traccar/protocol/RuptelaProtocolDecoder.java @@ -20,10 +20,10 @@ import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.traccar.BaseProtocolDecoder; import org.traccar.DeviceSession; +import org.traccar.helper.DataConverter; import org.traccar.helper.UnitsConverter; import org.traccar.model.Position; -import javax.xml.bind.DatatypeConverter; import java.net.SocketAddress; import java.nio.charset.StandardCharsets; import java.util.Date; @@ -196,7 +196,7 @@ public class RuptelaProtocolDecoder extends BaseProtocolDecoder { } if (channel != null) { - channel.write(ChannelBuffers.wrappedBuffer(DatatypeConverter.parseHexBinary("0002640113bc"))); + channel.write(ChannelBuffers.wrappedBuffer(DataConverter.parseHex("0002640113bc"))); } return positions; @@ -229,7 +229,7 @@ public class RuptelaProtocolDecoder extends BaseProtocolDecoder { } if (channel != null) { - channel.write(ChannelBuffers.wrappedBuffer(DatatypeConverter.parseHexBinary("00026d01c4a4"))); + channel.write(ChannelBuffers.wrappedBuffer(DataConverter.parseHex("00026d01c4a4"))); } return positions; diff --git a/src/org/traccar/protocol/SigfoxProtocolDecoder.java b/src/org/traccar/protocol/SigfoxProtocolDecoder.java index 65ab2cc55..b454e00fa 100644 --- a/src/org/traccar/protocol/SigfoxProtocolDecoder.java +++ b/src/org/traccar/protocol/SigfoxProtocolDecoder.java @@ -22,12 +22,12 @@ import org.jboss.netty.handler.codec.http.HttpRequest; import org.jboss.netty.handler.codec.http.HttpResponseStatus; import org.traccar.BaseHttpProtocolDecoder; import org.traccar.DeviceSession; +import org.traccar.helper.DataConverter; import org.traccar.helper.UnitsConverter; import org.traccar.model.Position; import javax.json.Json; import javax.json.JsonObject; -import javax.xml.bind.DatatypeConverter; import java.io.StringReader; import java.net.SocketAddress; import java.net.URLDecoder; @@ -61,7 +61,7 @@ public class SigfoxProtocolDecoder extends BaseHttpProtocolDecoder { position.setTime(new Date(json.getInt("time") * 1000L)); ChannelBuffer buf = ChannelBuffers.wrappedBuffer( - ByteOrder.LITTLE_ENDIAN, DatatypeConverter.parseHexBinary(json.getString("data"))); + ByteOrder.LITTLE_ENDIAN, DataConverter.parseHex(json.getString("data"))); int type = buf.readUnsignedByte() >> 4; if (type == 0) { diff --git a/src/org/traccar/protocol/T800xProtocolEncoder.java b/src/org/traccar/protocol/T800xProtocolEncoder.java index 6ed5dbccd..038a5e51a 100644 --- a/src/org/traccar/protocol/T800xProtocolEncoder.java +++ b/src/org/traccar/protocol/T800xProtocolEncoder.java @@ -18,10 +18,10 @@ package org.traccar.protocol; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.traccar.BaseProtocolEncoder; +import org.traccar.helper.DataConverter; import org.traccar.helper.Log; import org.traccar.model.Command; -import javax.xml.bind.DatatypeConverter; import java.nio.charset.StandardCharsets; public class T800xProtocolEncoder extends BaseProtocolEncoder { @@ -39,7 +39,7 @@ public class T800xProtocolEncoder extends BaseProtocolEncoder { buf.writeByte(T800xProtocolDecoder.MSG_COMMAND); buf.writeShort(7 + 8 + 1 + content.length()); buf.writeShort(1); // serial number - buf.writeBytes(DatatypeConverter.parseHexBinary("0" + getUniqueId(command.getDeviceId()))); + buf.writeBytes(DataConverter.parseHex("0" + getUniqueId(command.getDeviceId()))); buf.writeByte(MODE_SETTING); buf.writeBytes(content.getBytes(StandardCharsets.US_ASCII)); diff --git a/src/org/traccar/protocol/WatchProtocolEncoder.java b/src/org/traccar/protocol/WatchProtocolEncoder.java index d2d3b52d1..5206fbf10 100644 --- a/src/org/traccar/protocol/WatchProtocolEncoder.java +++ b/src/org/traccar/protocol/WatchProtocolEncoder.java @@ -16,10 +16,10 @@ package org.traccar.protocol; import org.traccar.StringProtocolEncoder; +import org.traccar.helper.DataConverter; import org.traccar.helper.Log; import org.traccar.model.Command; -import javax.xml.bind.DatatypeConverter; import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; @@ -68,7 +68,7 @@ public class WatchProtocolEncoder extends StringProtocolEncoder implements Strin } private String getBinaryData(Command command) { - byte[] data = DatatypeConverter.parseHexBinary(command.getString(Command.KEY_DATA)); + byte[] data = DataConverter.parseHex(command.getString(Command.KEY_DATA)); int encodedLength = data.length; for (byte b : data) { diff --git a/src/org/traccar/protocol/Xt2400ProtocolDecoder.java b/src/org/traccar/protocol/Xt2400ProtocolDecoder.java index 72be473c1..1be943e98 100644 --- a/src/org/traccar/protocol/Xt2400ProtocolDecoder.java +++ b/src/org/traccar/protocol/Xt2400ProtocolDecoder.java @@ -20,10 +20,10 @@ import org.jboss.netty.channel.Channel; import org.traccar.BaseProtocolDecoder; import org.traccar.Context; import org.traccar.DeviceSession; +import org.traccar.helper.DataConverter; import org.traccar.helper.UnitsConverter; import org.traccar.model.Position; -import javax.xml.bind.DatatypeConverter; import java.net.SocketAddress; import java.nio.charset.StandardCharsets; import java.util.Date; @@ -95,7 +95,7 @@ public class Xt2400ProtocolDecoder extends BaseProtocolDecoder { Pattern pattern = Pattern.compile(":wycfg pcr\\[\\d+\\] ([0-9a-fA-F]{2})[0-9a-fA-F]{2}([0-9a-fA-F]+)"); Matcher matcher = pattern.matcher(configString); while (matcher.find()) { - formats.put(Short.parseShort(matcher.group(1), 16), DatatypeConverter.parseHexBinary(matcher.group(2))); + formats.put(Short.parseShort(matcher.group(1), 16), DataConverter.parseHex(matcher.group(2))); } } diff --git a/test/org/traccar/ProtocolTest.java b/test/org/traccar/ProtocolTest.java index e67b53aa8..75a98000b 100644 --- a/test/org/traccar/ProtocolTest.java +++ b/test/org/traccar/ProtocolTest.java @@ -5,11 +5,11 @@ import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.handler.codec.http.DefaultHttpRequest; import org.jboss.netty.handler.codec.http.HttpMethod; import org.jboss.netty.handler.codec.http.HttpVersion; +import org.traccar.helper.DataConverter; import org.traccar.model.CellTower; import org.traccar.model.Command; import org.traccar.model.Position; -import javax.xml.bind.DatatypeConverter; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; import java.text.DateFormat; @@ -56,7 +56,7 @@ public class ProtocolTest extends BaseTest { protected ChannelBuffer binary(ByteOrder endianness, String... data) { return ChannelBuffers.wrappedBuffer( - endianness, DatatypeConverter.parseHexBinary(concatenateStrings(data))); + endianness, DataConverter.parseHex(concatenateStrings(data))); } protected String text(String... data) { -- cgit v1.2.3 From f7a4d1977e71797b231ebb9a55308fee7c2b64d7 Mon Sep 17 00:00:00 2001 From: Abyss777 Date: Wed, 11 Apr 2018 14:55:11 +0500 Subject: Add support of multiple Maintenances --- schema/changelog-3.17.xml | 70 +++++++++++++++++++++ schema/changelog-master.xml | 1 + src/org/traccar/Context.java | 14 ++++- src/org/traccar/api/resource/EventResource.java | 4 ++ .../traccar/api/resource/MaintenanceResource.java | 36 +++++++++++ src/org/traccar/database/DataManager.java | 3 + src/org/traccar/database/MaintenancesManager.java | 27 ++++++++ src/org/traccar/database/NotificationManager.java | 6 +- src/org/traccar/database/PermissionsManager.java | 11 +++- .../traccar/events/MaintenanceEventHandler.java | 43 ++++++------- src/org/traccar/model/Event.java | 10 +++ src/org/traccar/model/Maintenance.java | 51 +++++++++++++++ src/org/traccar/notification/EventForwarder.java | 8 +++ .../notification/NotificationFormatter.java | 7 ++- src/org/traccar/reports/Events.java | 22 ++++++- templates/export/events.xlsx | Bin 12336 -> 8738 bytes templates/mail/maintenance.vm | 2 +- templates/sms/maintenance.vm | 2 +- 18 files changed, 281 insertions(+), 36 deletions(-) create mode 100644 schema/changelog-3.17.xml create mode 100644 src/org/traccar/api/resource/MaintenanceResource.java create mode 100644 src/org/traccar/database/MaintenancesManager.java create mode 100644 src/org/traccar/model/Maintenance.java (limited to 'src/org/traccar/api') diff --git a/schema/changelog-3.17.xml b/schema/changelog-3.17.xml new file mode 100644 index 000000000..e0b7de10a --- /dev/null +++ b/schema/changelog-3.17.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schema/changelog-master.xml b/schema/changelog-master.xml index 0c6941eed..3e7944238 100644 --- a/schema/changelog-master.xml +++ b/schema/changelog-master.xml @@ -17,4 +17,5 @@ + diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java index 09e3c619b..a1a5f5a8e 100644 --- a/src/org/traccar/Context.java +++ b/src/org/traccar/Context.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2018 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ import org.traccar.database.DeviceManager; import org.traccar.database.DriversManager; import org.traccar.database.IdentityManager; import org.traccar.database.LdapProvider; +import org.traccar.database.MaintenancesManager; import org.traccar.database.MediaManager; import org.traccar.database.NotificationManager; import org.traccar.database.PermissionsManager; @@ -64,6 +65,7 @@ import org.traccar.model.Device; import org.traccar.model.Driver; import org.traccar.model.Geofence; import org.traccar.model.Group; +import org.traccar.model.Maintenance; import org.traccar.model.Notification; import org.traccar.model.User; import org.traccar.geolocation.GoogleGeolocationProvider; @@ -232,6 +234,12 @@ public final class Context { return commandsManager; } + private static MaintenancesManager maintenancesManager; + + public static MaintenancesManager getMaintenancesManager() { + return maintenancesManager; + } + private static StatisticsManager statisticsManager; public static StatisticsManager getStatisticsManager() { @@ -385,6 +393,8 @@ public final class Context { commandsManager = new CommandsManager(dataManager); + maintenancesManager = new MaintenancesManager(dataManager); + statisticsManager = new StatisticsManager(); if (config.getBoolean("sms.smpp.enable")) { @@ -469,6 +479,8 @@ public final class Context { return (BaseObjectManager) driversManager; } else if (clazz.equals(Command.class)) { return (BaseObjectManager) commandsManager; + } else if (clazz.equals(Maintenance.class)) { + return (BaseObjectManager) maintenancesManager; } else if (clazz.equals(Notification.class)) { return (BaseObjectManager) notificationManager; } diff --git a/src/org/traccar/api/resource/EventResource.java b/src/org/traccar/api/resource/EventResource.java index a7cf9edbd..e0ccf7020 100644 --- a/src/org/traccar/api/resource/EventResource.java +++ b/src/org/traccar/api/resource/EventResource.java @@ -13,6 +13,7 @@ import org.traccar.Context; import org.traccar.api.BaseResource; import org.traccar.model.Event; import org.traccar.model.Geofence; +import org.traccar.model.Maintenance; @Path("events") @Produces(MediaType.APPLICATION_JSON) @@ -28,6 +29,9 @@ public class EventResource extends BaseResource { if (event.getGeofenceId() != 0) { Context.getPermissionsManager().checkPermission(Geofence.class, getUserId(), event.getGeofenceId()); } + if (event.getMaintenanceId() != 0) { + Context.getPermissionsManager().checkPermission(Maintenance.class, getUserId(), event.getMaintenanceId()); + } return event; } diff --git a/src/org/traccar/api/resource/MaintenanceResource.java b/src/org/traccar/api/resource/MaintenanceResource.java new file mode 100644 index 000000000..b3726b429 --- /dev/null +++ b/src/org/traccar/api/resource/MaintenanceResource.java @@ -0,0 +1,36 @@ +/* + * Copyright 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2018 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.api.resource; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.traccar.api.ExtendedObjectResource; +import org.traccar.model.Maintenance; + +@Path("maintenances") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class MaintenanceResource extends ExtendedObjectResource { + + public MaintenanceResource() { + super(Maintenance.class); + } + +} diff --git a/src/org/traccar/database/DataManager.java b/src/org/traccar/database/DataManager.java index a997a89f6..84f8f0394 100644 --- a/src/org/traccar/database/DataManager.java +++ b/src/org/traccar/database/DataManager.java @@ -48,6 +48,7 @@ import org.traccar.model.Driver; import org.traccar.model.Event; import org.traccar.model.Geofence; import org.traccar.model.Group; +import org.traccar.model.Maintenance; import org.traccar.model.ManagedUser; import org.traccar.model.Notification; import org.traccar.model.Permission; @@ -405,6 +406,8 @@ public class DataManager { return Calendar.class; case "command": return Command.class; + case "maintenance": + return Maintenance.class; case "notification": return Notification.class; default: diff --git a/src/org/traccar/database/MaintenancesManager.java b/src/org/traccar/database/MaintenancesManager.java new file mode 100644 index 000000000..4e266cb78 --- /dev/null +++ b/src/org/traccar/database/MaintenancesManager.java @@ -0,0 +1,27 @@ +/* + * Copyright 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2018 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.database; + +import org.traccar.model.Maintenance; + +public class MaintenancesManager extends ExtendedObjectManager { + + public MaintenancesManager(DataManager dataManager) { + super(dataManager, Maintenance.class); + } + +} diff --git a/src/org/traccar/database/NotificationManager.java b/src/org/traccar/database/NotificationManager.java index 1c59a8666..9f2606f7f 100644 --- a/src/org/traccar/database/NotificationManager.java +++ b/src/org/traccar/database/NotificationManager.java @@ -78,8 +78,10 @@ public class NotificationManager extends ExtendedObjectManager { usersToForward = new HashSet<>(); } for (long userId : users) { - if (event.getGeofenceId() == 0 || Context.getGeofenceManager() != null - && Context.getGeofenceManager().checkItemPermission(userId, event.getGeofenceId())) { + if ((event.getGeofenceId() == 0 || Context.getGeofenceManager() != null + && Context.getGeofenceManager().checkItemPermission(userId, event.getGeofenceId())) + && (event.getMaintenanceId() == 0 + || Context.getMaintenancesManager().checkItemPermission(userId, event.getMaintenanceId()))) { if (usersToForward != null) { usersToForward.add(userId); } diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java index 3ae5961ce..b5f062d2b 100644 --- a/src/org/traccar/database/PermissionsManager.java +++ b/src/org/traccar/database/PermissionsManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2018 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import org.traccar.model.Device; import org.traccar.model.Driver; import org.traccar.model.Geofence; import org.traccar.model.Group; +import org.traccar.model.Maintenance; import org.traccar.model.ManagedUser; import org.traccar.model.Notification; import org.traccar.model.Permission; @@ -337,6 +338,8 @@ public class PermissionsManager { manager = Context.getCalendarManager(); } else if (object.equals(Command.class)) { manager = Context.getCommandsManager(); + } else if (object.equals(Maintenance.class)) { + manager = Context.getMaintenancesManager(); } else if (object.equals(Notification.class)) { manager = Context.getNotificationManager(); } else { @@ -362,6 +365,7 @@ public class PermissionsManager { Context.getDriversManager().refreshUserItems(); Context.getAttributesManager().refreshUserItems(); Context.getCommandsManager().refreshUserItems(); + Context.getMaintenancesManager().refreshUserItems(); if (Context.getNotificationManager() != null) { Context.getNotificationManager().refreshUserItems(); } @@ -374,6 +378,7 @@ public class PermissionsManager { Context.getDriversManager().refreshExtendedPermissions(); Context.getAttributesManager().refreshExtendedPermissions(); Context.getCommandsManager().refreshExtendedPermissions(); + Context.getMaintenancesManager().refreshExtendedPermissions(); } public void refreshPermissions(Permission permission) { @@ -394,6 +399,8 @@ public class PermissionsManager { Context.getCalendarManager().refreshUserItems(); } else if (permission.getPropertyClass().equals(Command.class)) { Context.getCommandsManager().refreshUserItems(); + } else if (permission.getPropertyClass().equals(Maintenance.class)) { + Context.getMaintenancesManager().refreshUserItems(); } else if (permission.getPropertyClass().equals(Notification.class) && Context.getNotificationManager() != null) { Context.getNotificationManager().refreshUserItems(); @@ -407,6 +414,8 @@ public class PermissionsManager { Context.getAttributesManager().refreshExtendedPermissions(); } else if (permission.getPropertyClass().equals(Command.class)) { Context.getCommandsManager().refreshExtendedPermissions(); + } else if (permission.getPropertyClass().equals(Maintenance.class)) { + Context.getMaintenancesManager().refreshExtendedPermissions(); } else if (permission.getPropertyClass().equals(Notification.class) && Context.getNotificationManager() != null) { Context.getNotificationManager().refreshExtendedPermissions(); diff --git a/src/org/traccar/events/MaintenanceEventHandler.java b/src/org/traccar/events/MaintenanceEventHandler.java index 86abf7c17..001b414c0 100644 --- a/src/org/traccar/events/MaintenanceEventHandler.java +++ b/src/org/traccar/events/MaintenanceEventHandler.java @@ -1,6 +1,6 @@ /* - * Copyright 2016 Anton Tananaev (anton@traccar.org) - * Copyright 2016 Andrey Kunitsyn (andrey@traccar.org) + * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2016 - 2018 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. @@ -16,35 +16,24 @@ */ package org.traccar.events; -import java.util.Collections; +import java.util.HashMap; import java.util.Map; import org.traccar.BaseEventHandler; import org.traccar.Context; -import org.traccar.model.Device; import org.traccar.model.Event; +import org.traccar.model.Maintenance; import org.traccar.model.Position; public class MaintenanceEventHandler extends BaseEventHandler { - public static final String ATTRIBUTE_MAINTENANCE_START = "maintenance.start"; - public static final String ATTRIBUTE_MAINTENANCE_INTERVAL = "maintenance.interval"; - @Override protected Map analyzePosition(Position position) { - Device device = Context.getIdentityManager().getById(position.getDeviceId()); - if (device == null || !Context.getIdentityManager().isLatestPosition(position)) { + if (Context.getIdentityManager().getById(position.getDeviceId()) == null + || !Context.getIdentityManager().isLatestPosition(position)) { return null; } - double maintenanceInterval = Context.getDeviceManager() - .lookupAttributeDouble(device.getId(), ATTRIBUTE_MAINTENANCE_INTERVAL, 0, false); - if (maintenanceInterval == 0) { - return null; - } - double maintenanceStart = Context.getDeviceManager() - .lookupAttributeDouble(device.getId(), ATTRIBUTE_MAINTENANCE_START, 0, false); - double oldTotalDistance = 0.0; double newTotalDistance = 0.0; @@ -54,16 +43,20 @@ public class MaintenanceEventHandler extends BaseEventHandler { } newTotalDistance = position.getDouble(Position.KEY_TOTAL_DISTANCE); - oldTotalDistance -= maintenanceStart; - newTotalDistance -= maintenanceStart; - - 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.singletonMap(event, position); + Map events = new HashMap<>(); + for (long maintenanceId : Context.getMaintenancesManager().getAllDeviceItems(position.getDeviceId())) { + Maintenance maintenance = Context.getMaintenancesManager().getById(maintenanceId); + if (maintenance.getLapse() != 0 + && (long) ((oldTotalDistance - maintenance.getStart()) / maintenance.getLapse()) + < (long) ((newTotalDistance - maintenance.getStart()) / maintenance.getLapse())) { + Event event = new Event(Event.TYPE_MAINTENANCE, position.getDeviceId(), position.getId()); + event.setMaintenanceId(maintenanceId); + event.set(Position.KEY_TOTAL_DISTANCE, newTotalDistance); + events.put(event, position); + } } - return null; + return events; } } diff --git a/src/org/traccar/model/Event.java b/src/org/traccar/model/Event.java index 465afeb35..ee7fcc679 100644 --- a/src/org/traccar/model/Event.java +++ b/src/org/traccar/model/Event.java @@ -91,4 +91,14 @@ public class Event extends Message { this.geofenceId = geofenceId; } + private long maintenanceId = 0; + + public long getMaintenanceId() { + return maintenanceId; + } + + public void setMaintenanceId(long maintenanceId) { + this.maintenanceId = maintenanceId; + } + } diff --git a/src/org/traccar/model/Maintenance.java b/src/org/traccar/model/Maintenance.java new file mode 100644 index 000000000..827fd3b85 --- /dev/null +++ b/src/org/traccar/model/Maintenance.java @@ -0,0 +1,51 @@ +/* + * Copyright 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2018 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 Maintenance extends ExtendedModel { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private double start; + + public double getStart() { + return start; + } + + public void setStart(double start) { + this.start = start; + } + + private double lapse; + + public double getLapse() { + return lapse; + } + + public void setLapse(double lapse) { + this.lapse = lapse; + } + +} diff --git a/src/org/traccar/notification/EventForwarder.java b/src/org/traccar/notification/EventForwarder.java index b13f8fe43..9d2181e21 100644 --- a/src/org/traccar/notification/EventForwarder.java +++ b/src/org/traccar/notification/EventForwarder.java @@ -25,6 +25,7 @@ import org.traccar.helper.Log; import org.traccar.model.Device; import org.traccar.model.Event; import org.traccar.model.Geofence; +import org.traccar.model.Maintenance; import org.traccar.model.Position; import java.nio.charset.StandardCharsets; @@ -48,6 +49,7 @@ public abstract class EventForwarder { private static final String KEY_EVENT = "event"; private static final String KEY_GEOFENCE = "geofence"; private static final String KEY_DEVICE = "device"; + private static final String KEY_MAINTENANCE = "maintenance"; private static final String KEY_USERS = "users"; public final void forwardEvent(Event event, Position position, Set users) { @@ -98,6 +100,12 @@ public abstract class EventForwarder { data.put(KEY_GEOFENCE, geofence); } } + if (event.getMaintenanceId() != 0) { + Maintenance maintenance = Context.getMaintenancesManager().getById(event.getMaintenanceId()); + if (maintenance != null) { + data.put(KEY_MAINTENANCE, maintenance); + } + } data.put(KEY_USERS, Context.getUsersManager().getItems(users)); try { return Context.getObjectMapper().writeValueAsString(data); diff --git a/src/org/traccar/notification/NotificationFormatter.java b/src/org/traccar/notification/NotificationFormatter.java index 114825a83..524153721 100644 --- a/src/org/traccar/notification/NotificationFormatter.java +++ b/src/org/traccar/notification/NotificationFormatter.java @@ -1,6 +1,6 @@ /* - * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org) - * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) + * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2017 - 2018 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. @@ -57,6 +57,9 @@ public final class NotificationFormatter { if (event.getGeofenceId() != 0) { velocityContext.put("geofence", Context.getGeofenceManager().getById(event.getGeofenceId())); } + if (event.getMaintenanceId() != 0) { + velocityContext.put("maintenance", Context.getMaintenancesManager().getById(event.getMaintenanceId())); + } String driverUniqueId = event.getString(Position.KEY_DRIVER_UNIQUE_ID); if (driverUniqueId != null) { velocityContext.put("driver", Context.getDriversManager().getDriverByUniqueId(driverUniqueId)); diff --git a/src/org/traccar/reports/Events.java b/src/org/traccar/reports/Events.java index 7cb6ef6eb..66d9e708d 100644 --- a/src/org/traccar/reports/Events.java +++ b/src/org/traccar/reports/Events.java @@ -1,6 +1,6 @@ /* - * Copyright 2016 Anton Tananaev (anton@traccar.org) - * Copyright 2016 Andrey Kunitsyn (andrey@traccar.org) + * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2016 - 2018 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. @@ -33,6 +33,7 @@ import org.traccar.model.Device; import org.traccar.model.Event; import org.traccar.model.Geofence; import org.traccar.model.Group; +import org.traccar.model.Maintenance; import org.traccar.reports.model.DeviceReport; public final class Events { @@ -51,7 +52,10 @@ public final class Events { for (Event event : events) { if (all || types.contains(event.getType())) { long geofenceId = event.getGeofenceId(); - if (geofenceId == 0 || Context.getGeofenceManager().checkItemPermission(userId, geofenceId)) { + long maintenanceId = event.getMaintenanceId(); + if ((geofenceId == 0 || Context.getGeofenceManager().checkItemPermission(userId, geofenceId)) + && (maintenanceId == 0 + || Context.getMaintenancesManager().checkItemPermission(userId, maintenanceId))) { result.add(event); } } @@ -67,6 +71,7 @@ public final class Events { ArrayList devicesEvents = new ArrayList<>(); ArrayList sheetNames = new ArrayList<>(); HashMap geofenceNames = new HashMap<>(); + HashMap maintenanceNames = new HashMap<>(); for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) { Context.getPermissionsManager().checkDevice(userId, deviceId); Collection events = Context.getDataManager().getEvents(deviceId, from, to); @@ -75,6 +80,7 @@ public final class Events { Event event = iterator.next(); if (all || types.contains(event.getType())) { long geofenceId = event.getGeofenceId(); + long maintenanceId = event.getMaintenanceId(); if (geofenceId != 0) { if (Context.getGeofenceManager().checkItemPermission(userId, geofenceId)) { Geofence geofence = Context.getGeofenceManager().getById(geofenceId); @@ -84,6 +90,15 @@ public final class Events { } else { iterator.remove(); } + } else if (maintenanceId != 0) { + if (Context.getMaintenancesManager().checkItemPermission(userId, maintenanceId)) { + Maintenance maintenance = Context.getMaintenancesManager().getById(maintenanceId); + if (maintenance != null) { + maintenanceNames.put(maintenanceId, maintenance.getName()); + } + } else { + iterator.remove(); + } } } else { iterator.remove(); @@ -109,6 +124,7 @@ public final class Events { jxlsContext.putVar("devices", devicesEvents); jxlsContext.putVar("sheetNames", sheetNames); jxlsContext.putVar("geofenceNames", geofenceNames); + jxlsContext.putVar("maintenanceNames", maintenanceNames); jxlsContext.putVar("from", from); jxlsContext.putVar("to", to); ReportUtils.processTemplateWithSheets(inputStream, outputStream, jxlsContext); diff --git a/templates/export/events.xlsx b/templates/export/events.xlsx index f3151d11c..5c5633f3a 100644 Binary files a/templates/export/events.xlsx and b/templates/export/events.xlsx differ diff --git a/templates/mail/maintenance.vm b/templates/mail/maintenance.vm index 7f69b6c0d..c6973f97a 100644 --- a/templates/mail/maintenance.vm +++ b/templates/mail/maintenance.vm @@ -3,7 +3,7 @@ Device: $device.name
-Maintenance is required
+Maintenance is required: $maintenance.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}
diff --git a/templates/sms/maintenance.vm b/templates/sms/maintenance.vm index 554b74400..621beae46 100644 --- a/templates/sms/maintenance.vm +++ b/templates/sms/maintenance.vm @@ -1 +1 @@ -$device.name maintenance is required at $dateTool.format("YYYY-MM-dd HH:mm:ss", $event.serverTime, $locale, $timezone) +$device.name maintenance $maintenance.name is required at $dateTool.format("YYYY-MM-dd HH:mm:ss", $event.serverTime, $locale, $timezone) -- cgit v1.2.3