aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/traccar/Context.java30
-rw-r--r--src/main/java/org/traccar/MainModule.java29
-rw-r--r--src/main/java/org/traccar/api/resource/PasswordResource.java13
-rw-r--r--src/main/java/org/traccar/config/Keys.java17
-rw-r--r--src/main/java/org/traccar/notification/NotificationFormatter.java20
-rw-r--r--src/main/java/org/traccar/notification/TextTemplateFormatter.java23
-rw-r--r--src/main/java/org/traccar/notificators/NotificatorFirebase.java14
-rw-r--r--src/main/java/org/traccar/notificators/NotificatorMail.java11
-rw-r--r--src/main/java/org/traccar/notificators/NotificatorPushover.java9
-rw-r--r--src/main/java/org/traccar/notificators/NotificatorSms.java12
-rw-r--r--src/main/java/org/traccar/notificators/NotificatorTelegram.java9
-rw-r--r--src/main/java/org/traccar/notificators/NotificatorTraccar.java6
-rw-r--r--src/main/java/org/traccar/notificators/NotificatorWeb.java9
-rw-r--r--src/main/java/org/traccar/reports/common/ReportUtils.java8
-rw-r--r--src/test/java/org/traccar/reports/ReportUtilsTest.java37
15 files changed, 136 insertions, 111 deletions
diff --git a/src/main/java/org/traccar/Context.java b/src/main/java/org/traccar/Context.java
index 95ff2eddb..627acd4e2 100644
--- a/src/main/java/org/traccar/Context.java
+++ b/src/main/java/org/traccar/Context.java
@@ -18,8 +18,6 @@ package org.traccar;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr353.JSR353Module;
-import org.apache.velocity.app.VelocityEngine;
-import org.eclipse.jetty.util.URIUtil;
import org.traccar.config.Config;
import org.traccar.config.Keys;
import org.traccar.database.BaseObjectManager;
@@ -46,9 +44,6 @@ import org.traccar.session.cache.CacheManager;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.ext.ContextResolver;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Properties;
public final class Context {
@@ -115,12 +110,6 @@ public final class Context {
return notificationManager;
}
- private static VelocityEngine velocityEngine;
-
- public static VelocityEngine getVelocityEngine() {
- return velocityEngine;
- }
-
private static Client client = ClientBuilder.newClient();
public static Client getClient() {
@@ -185,25 +174,6 @@ public final class Context {
Main.getInjector().getInstance(EventForwarder.class),
Main.getInjector().getInstance(NotificatorManager.class),
Main.getInjector().getInstance(Geocoder.class));
- Properties velocityProperties = new Properties();
- velocityProperties.setProperty("file.resource.loader.path",
- Context.getConfig().getString("templates.rootPath", "templates") + "/");
- velocityProperties.setProperty("runtime.log.logsystem.class",
- "org.apache.velocity.runtime.log.NullLogChute");
-
- String address;
- try {
- address = config.getString(Keys.WEB_ADDRESS, InetAddress.getLocalHost().getHostAddress());
- } catch (UnknownHostException e) {
- address = "localhost";
- }
-
- String webUrl = URIUtil.newURI("http", address, config.getInteger(Keys.WEB_PORT), "", "");
- webUrl = Context.getConfig().getString("web.url", webUrl);
- velocityProperties.setProperty("web.url", webUrl);
-
- velocityEngine = new VelocityEngine();
- velocityEngine.init(velocityProperties);
}
public static <T extends BaseModel> BaseObjectManager<T> getManager(Class<T> clazz) {
diff --git a/src/main/java/org/traccar/MainModule.java b/src/main/java/org/traccar/MainModule.java
index e3f693444..a6f983a6b 100644
--- a/src/main/java/org/traccar/MainModule.java
+++ b/src/main/java/org/traccar/MainModule.java
@@ -21,6 +21,9 @@ import com.google.inject.Provides;
import com.google.inject.Scopes;
import io.netty.util.HashedWheelTimer;
import io.netty.util.Timer;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.runtime.log.NullLogChute;
+import org.eclipse.jetty.util.URIUtil;
import org.traccar.broadcast.BroadcastService;
import org.traccar.config.Config;
import org.traccar.config.Keys;
@@ -70,6 +73,9 @@ import javax.annotation.Nullable;
import javax.inject.Singleton;
import javax.ws.rs.client.Client;
import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Properties;
public class MainModule extends AbstractModule {
@@ -278,4 +284,27 @@ public class MainModule extends AbstractModule {
return null;
}
+ @Singleton
+ @Provides
+ public static VelocityEngine provideVelocityEngine(Config config) {
+ Properties properties = new Properties();
+ properties.setProperty("file.resource.loader.path", config.getString(Keys.TEMPLATES_ROOT) + "/");
+ properties.setProperty("runtime.log.logsystem.class", NullLogChute.class.getName());
+
+ String address;
+ try {
+ address = config.getString(Keys.WEB_ADDRESS, InetAddress.getLocalHost().getHostAddress());
+ } catch (UnknownHostException e) {
+ address = "localhost";
+ }
+
+ String url = config.getString(
+ Keys.WEB_URL, URIUtil.newURI("http", address, config.getInteger(Keys.WEB_PORT), "", ""));
+ properties.setProperty("web.url", url);
+
+ VelocityEngine velocityEngine = new VelocityEngine();
+ velocityEngine.init(properties);
+ return velocityEngine;
+ }
+
}
diff --git a/src/main/java/org/traccar/api/resource/PasswordResource.java b/src/main/java/org/traccar/api/resource/PasswordResource.java
index 7df25c264..c7244f41c 100644
--- a/src/main/java/org/traccar/api/resource/PasswordResource.java
+++ b/src/main/java/org/traccar/api/resource/PasswordResource.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2021 Anton Tananaev (anton@traccar.org)
+ * Copyright 2021 - 2022 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,12 +15,10 @@
*/
package org.traccar.api.resource;
-import org.apache.velocity.VelocityContext;
import org.traccar.Context;
import org.traccar.api.BaseResource;
import org.traccar.database.MailManager;
import org.traccar.model.User;
-import org.traccar.notification.NotificationMessage;
import org.traccar.notification.TextTemplateFormatter;
import org.traccar.storage.StorageException;
@@ -46,6 +44,9 @@ public class PasswordResource extends BaseResource {
@Inject
private MailManager mailManager;
+ @Inject
+ private TextTemplateFormatter textTemplateFormatter;
+
@Path("reset")
@PermitAll
@POST
@@ -56,11 +57,9 @@ public class PasswordResource extends BaseResource {
String token = UUID.randomUUID().toString().replaceAll("-", "");
user.set(PASSWORD_RESET_TOKEN, token);
Context.getUsersManager().updateItem(user);
- VelocityContext velocityContext = TextTemplateFormatter.prepareContext(
- permissionsService.getServer(), user);
+ var velocityContext = textTemplateFormatter.prepareContext(permissionsService.getServer(), user);
velocityContext.put("token", token);
- NotificationMessage fullMessage =
- TextTemplateFormatter.formatMessage(velocityContext, "passwordReset", "full");
+ var fullMessage = textTemplateFormatter.formatMessage(velocityContext, "passwordReset", "full");
mailManager.sendMessage(user, fullMessage.getSubject(), fullMessage.getBody());
break;
}
diff --git a/src/main/java/org/traccar/config/Keys.java b/src/main/java/org/traccar/config/Keys.java
index d53245c65..82afe048b 100644
--- a/src/main/java/org/traccar/config/Keys.java
+++ b/src/main/java/org/traccar/config/Keys.java
@@ -688,6 +688,14 @@ public final class Keys {
Collections.singletonList(KeyType.GLOBAL));
/**
+ * Root folder for all template files.
+ */
+ public static final ConfigKey<String> TEMPLATES_ROOT = new ConfigKey<>(
+ "templates.root",
+ Collections.singletonList(KeyType.GLOBAL),
+ "templates");
+
+ /**
* SMS API service full URL. Enables SMS commands and notifications.
*/
public static final ConfigKey<String> SMS_HTTP_URL = new ConfigKey<>(
@@ -1246,6 +1254,15 @@ public final class Keys {
Collections.singletonList(KeyType.GLOBAL));
/**
+ * Public URL for the web app. Used for notification and report link.
+ *
+ * If not provided, Traccar will attempt to get a URL from the server IP address, but it might be a local address.
+ */
+ public static final ConfigKey<String> WEB_URL = new ConfigKey<>(
+ "web.url",
+ Collections.singletonList(KeyType.GLOBAL));
+
+ /**
* Output logging to the standard terminal output instead of a log file.
*/
public static final ConfigKey<Boolean> LOGGER_CONSOLE = new ConfigKey<>(
diff --git a/src/main/java/org/traccar/notification/NotificationFormatter.java b/src/main/java/org/traccar/notification/NotificationFormatter.java
index 2d3b90412..fa244d9b4 100644
--- a/src/main/java/org/traccar/notification/NotificationFormatter.java
+++ b/src/main/java/org/traccar/notification/NotificationFormatter.java
@@ -27,18 +27,26 @@ import org.traccar.model.Server;
import org.traccar.model.User;
import org.traccar.session.cache.CacheManager;
-public final class NotificationFormatter {
+import javax.inject.Inject;
- private NotificationFormatter() {
+public class NotificationFormatter {
+
+ private final CacheManager cacheManager;
+ private final TextTemplateFormatter textTemplateFormatter;
+
+ @Inject
+ public NotificationFormatter(
+ CacheManager cacheManager, TextTemplateFormatter textTemplateFormatter) {
+ this.cacheManager = cacheManager;
+ this.textTemplateFormatter = textTemplateFormatter;
}
- public static NotificationMessage formatMessage(
- CacheManager cacheManager, User user, Event event, Position position, String templatePath) {
+ public NotificationMessage formatMessage(User user, Event event, Position position, String templatePath) {
Server server = cacheManager.getServer();
Device device = cacheManager.getObject(Device.class, event.getDeviceId());
- VelocityContext velocityContext = TextTemplateFormatter.prepareContext(server, user);
+ VelocityContext velocityContext = textTemplateFormatter.prepareContext(server, user);
velocityContext.put("device", device);
velocityContext.put("event", event);
@@ -59,7 +67,7 @@ public final class NotificationFormatter {
velocityContext.put("driver", cacheManager.findDriverByUniqueId(device.getId(), driverUniqueId));
}
- return TextTemplateFormatter.formatMessage(velocityContext, event.getType(), templatePath);
+ return textTemplateFormatter.formatMessage(velocityContext, event.getType(), templatePath);
}
}
diff --git a/src/main/java/org/traccar/notification/TextTemplateFormatter.java b/src/main/java/org/traccar/notification/TextTemplateFormatter.java
index 9072ec89e..bca18f53c 100644
--- a/src/main/java/org/traccar/notification/TextTemplateFormatter.java
+++ b/src/main/java/org/traccar/notification/TextTemplateFormatter.java
@@ -17,29 +17,34 @@ package org.traccar.notification;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.tools.generic.DateTool;
import org.apache.velocity.tools.generic.NumberTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.traccar.Context;
import org.traccar.helper.model.UserUtil;
import org.traccar.model.Server;
import org.traccar.model.User;
+import javax.inject.Inject;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.util.Locale;
-public final class TextTemplateFormatter {
+public class TextTemplateFormatter {
private static final Logger LOGGER = LoggerFactory.getLogger(TextTemplateFormatter.class);
- private TextTemplateFormatter() {
+ private final VelocityEngine velocityEngine;
+
+ @Inject
+ public TextTemplateFormatter(VelocityEngine velocityEngine) {
+ this.velocityEngine = velocityEngine;
}
- public static VelocityContext prepareContext(Server server, User user) {
+ public VelocityContext prepareContext(Server server, User user) {
VelocityContext velocityContext = new VelocityContext();
@@ -48,7 +53,7 @@ public final class TextTemplateFormatter {
velocityContext.put("timezone", UserUtil.getTimezone(server, user));
}
- velocityContext.put("webUrl", Context.getVelocityEngine().getProperty("web.url"));
+ velocityContext.put("webUrl", velocityEngine.getProperty("web.url"));
velocityContext.put("dateTool", new DateTool());
velocityContext.put("numberTool", new NumberTool());
velocityContext.put("locale", Locale.getDefault());
@@ -56,23 +61,23 @@ public final class TextTemplateFormatter {
return velocityContext;
}
- public static Template getTemplate(String name, String path) {
+ public Template getTemplate(String name, String path) {
String templateFilePath;
Template template;
try {
templateFilePath = Paths.get(path, name + ".vm").toString();
- template = Context.getVelocityEngine().getTemplate(templateFilePath, StandardCharsets.UTF_8.name());
+ template = velocityEngine.getTemplate(templateFilePath, StandardCharsets.UTF_8.name());
} catch (ResourceNotFoundException error) {
LOGGER.warn("Notification template error", error);
templateFilePath = Paths.get(path, "unknown.vm").toString();
- template = Context.getVelocityEngine().getTemplate(templateFilePath, StandardCharsets.UTF_8.name());
+ template = velocityEngine.getTemplate(templateFilePath, StandardCharsets.UTF_8.name());
}
return template;
}
- public static NotificationMessage formatMessage(VelocityContext velocityContext, String name, String templatePath) {
+ public NotificationMessage formatMessage(VelocityContext velocityContext, String name, String templatePath) {
StringWriter writer = new StringWriter();
getTemplate(name, templatePath).merge(velocityContext, writer);
return new NotificationMessage((String) velocityContext.get("subject"), writer.toString());
diff --git a/src/main/java/org/traccar/notificators/NotificatorFirebase.java b/src/main/java/org/traccar/notificators/NotificatorFirebase.java
index 3f1667568..5787b7ef2 100644
--- a/src/main/java/org/traccar/notificators/NotificatorFirebase.java
+++ b/src/main/java/org/traccar/notificators/NotificatorFirebase.java
@@ -23,7 +23,6 @@ import org.traccar.model.Event;
import org.traccar.model.Position;
import org.traccar.model.User;
import org.traccar.notification.NotificationFormatter;
-import org.traccar.session.cache.CacheManager;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
@@ -31,7 +30,7 @@ import javax.ws.rs.client.Entity;
public class NotificatorFirebase implements Notificator {
- private final CacheManager cacheManager;
+ private final NotificationFormatter notificationFormatter;
private final Client client;
private final String url;
@@ -54,14 +53,15 @@ public class NotificatorFirebase implements Notificator {
}
@Inject
- public NotificatorFirebase(Config config, CacheManager cacheManager, Client client) {
+ public NotificatorFirebase(Config config, NotificationFormatter notificationFormatter, Client client) {
this(
- cacheManager, client, "https://fcm.googleapis.com/fcm/send",
+ notificationFormatter, client, "https://fcm.googleapis.com/fcm/send",
config.getString(Keys.NOTIFICATOR_FIREBASE_KEY));
}
- protected NotificatorFirebase(CacheManager cacheManager, Client client, String url, String key) {
- this.cacheManager = cacheManager;
+ protected NotificatorFirebase(
+ NotificationFormatter notificationFormatter, Client client, String url, String key) {
+ this.notificationFormatter = notificationFormatter;
this.client = client;
this.url = url;
this.key = key;
@@ -71,7 +71,7 @@ public class NotificatorFirebase implements Notificator {
public void send(User user, Event event, Position position) {
if (user.getAttributes().containsKey("notificationTokens")) {
- var shortMessage = NotificationFormatter.formatMessage(cacheManager, user, event, position, "short");
+ var shortMessage = notificationFormatter.formatMessage(user, event, position, "short");
Notification notification = new Notification();
notification.title = shortMessage.getSubject();
diff --git a/src/main/java/org/traccar/notificators/NotificatorMail.java b/src/main/java/org/traccar/notificators/NotificatorMail.java
index fe8d69af2..647832166 100644
--- a/src/main/java/org/traccar/notificators/NotificatorMail.java
+++ b/src/main/java/org/traccar/notificators/NotificatorMail.java
@@ -20,10 +20,8 @@ import org.traccar.database.MailManager;
import org.traccar.model.Event;
import org.traccar.model.Position;
import org.traccar.model.User;
-import org.traccar.notification.NotificationMessage;
import org.traccar.notification.MessageException;
import org.traccar.notification.NotificationFormatter;
-import org.traccar.session.cache.CacheManager;
import javax.inject.Inject;
import javax.mail.MessagingException;
@@ -31,19 +29,18 @@ import javax.mail.MessagingException;
public class NotificatorMail implements Notificator {
private final MailManager mailManager;
- private final CacheManager cacheManager;
+ private final NotificationFormatter notificationFormatter;
@Inject
- public NotificatorMail(MailManager mailManager, CacheManager cacheManager) {
+ public NotificatorMail(MailManager mailManager, NotificationFormatter notificationFormatter) {
this.mailManager = mailManager;
- this.cacheManager = cacheManager;
+ this.notificationFormatter = notificationFormatter;
}
@Override
public void send(User user, Event event, Position position) throws MessageException {
try {
- NotificationMessage fullMessage = NotificationFormatter.formatMessage(
- cacheManager, user, event, position, "full");
+ var fullMessage = notificationFormatter.formatMessage(user, event, position, "full");
mailManager.sendMessage(user, fullMessage.getSubject(), fullMessage.getBody());
} catch (MessagingException e) {
throw new MessageException(e);
diff --git a/src/main/java/org/traccar/notificators/NotificatorPushover.java b/src/main/java/org/traccar/notificators/NotificatorPushover.java
index 2ac489dd6..32ceae780 100644
--- a/src/main/java/org/traccar/notificators/NotificatorPushover.java
+++ b/src/main/java/org/traccar/notificators/NotificatorPushover.java
@@ -22,7 +22,6 @@ import org.traccar.model.Event;
import org.traccar.model.Position;
import org.traccar.model.User;
import org.traccar.notification.NotificationFormatter;
-import org.traccar.session.cache.CacheManager;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
@@ -30,7 +29,7 @@ import javax.ws.rs.client.Entity;
public class NotificatorPushover implements Notificator {
- private final CacheManager cacheManager;
+ private final NotificationFormatter notificationFormatter;
private final Client client;
private final String url;
@@ -51,8 +50,8 @@ public class NotificatorPushover implements Notificator {
}
@Inject
- public NotificatorPushover(Config config, CacheManager cacheManager, Client client) {
- this.cacheManager = cacheManager;
+ public NotificatorPushover(Config config, NotificationFormatter notificationFormatter, Client client) {
+ this.notificationFormatter = notificationFormatter;
this.client = client;
url = "https://api.pushover.net/1/messages.json";
token = config.getString(Keys.NOTIFICATOR_PUSHOVER_TOKEN);
@@ -70,7 +69,7 @@ public class NotificatorPushover implements Notificator {
device = user.getString("notificator.pushover.device").replaceAll(" *, *", ",");
}
- var shortMessage = NotificationFormatter.formatMessage(cacheManager, user, event, position, "short");
+ var shortMessage = notificationFormatter.formatMessage(user, event, position, "short");
Message message = new Message();
message.token = token;
diff --git a/src/main/java/org/traccar/notificators/NotificatorSms.java b/src/main/java/org/traccar/notificators/NotificatorSms.java
index f4d1de0cb..544b67a5e 100644
--- a/src/main/java/org/traccar/notificators/NotificatorSms.java
+++ b/src/main/java/org/traccar/notificators/NotificatorSms.java
@@ -22,8 +22,6 @@ import org.traccar.model.Position;
import org.traccar.model.User;
import org.traccar.notification.MessageException;
import org.traccar.notification.NotificationFormatter;
-import org.traccar.notification.NotificationMessage;
-import org.traccar.session.cache.CacheManager;
import org.traccar.sms.SmsManager;
import javax.inject.Inject;
@@ -31,21 +29,21 @@ import javax.inject.Inject;
public class NotificatorSms implements Notificator {
private final SmsManager smsManager;
- private final CacheManager cacheManager;
+ private final NotificationFormatter notificationFormatter;
private final StatisticsManager statisticsManager;
@Inject
- public NotificatorSms(SmsManager smsManager, CacheManager cacheManager, StatisticsManager statisticsManager) {
+ public NotificatorSms(
+ SmsManager smsManager, NotificationFormatter notificationFormatter, StatisticsManager statisticsManager) {
this.smsManager = smsManager;
- this.cacheManager = cacheManager;
+ this.notificationFormatter = notificationFormatter;
this.statisticsManager = statisticsManager;
}
@Override
public void send(User user, Event event, Position position) throws MessageException, InterruptedException {
if (user.getPhone() != null) {
- NotificationMessage shortMessage = NotificationFormatter.formatMessage(
- cacheManager, user, event, position, "short");
+ var shortMessage = notificationFormatter.formatMessage(user, event, position, "short");
statisticsManager.registerSms();
smsManager.sendMessage(user.getPhone(), shortMessage.getBody(), false);
}
diff --git a/src/main/java/org/traccar/notificators/NotificatorTelegram.java b/src/main/java/org/traccar/notificators/NotificatorTelegram.java
index 1dccf2c04..a00cd36f1 100644
--- a/src/main/java/org/traccar/notificators/NotificatorTelegram.java
+++ b/src/main/java/org/traccar/notificators/NotificatorTelegram.java
@@ -23,7 +23,6 @@ import org.traccar.model.Event;
import org.traccar.model.Position;
import org.traccar.model.User;
import org.traccar.notification.NotificationFormatter;
-import org.traccar.session.cache.CacheManager;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
@@ -31,7 +30,7 @@ import javax.ws.rs.client.Entity;
public class NotificatorTelegram implements Notificator {
- private final CacheManager cacheManager;
+ private final NotificationFormatter notificationFormatter;
private final Client client;
private final String urlSendText;
@@ -62,8 +61,8 @@ public class NotificatorTelegram implements Notificator {
}
@Inject
- public NotificatorTelegram(Config config, CacheManager cacheManager, Client client) {
- this.cacheManager = cacheManager;
+ public NotificatorTelegram(Config config, NotificationFormatter notificationFormatter, Client client) {
+ this.notificationFormatter = notificationFormatter;
this.client = client;
urlSendText = String.format(
"https://api.telegram.org/bot%s/sendMessage", config.getString(Keys.NOTIFICATOR_TELEGRAM_KEY));
@@ -85,7 +84,7 @@ public class NotificatorTelegram implements Notificator {
@Override
public void send(User user, Event event, Position position) {
- var shortMessage = NotificationFormatter.formatMessage(cacheManager, user, event, position, "short");
+ var shortMessage = notificationFormatter.formatMessage(user, event, position, "short");
TextMessage message = new TextMessage();
message.chatId = user.getString("telegramChatId");
diff --git a/src/main/java/org/traccar/notificators/NotificatorTraccar.java b/src/main/java/org/traccar/notificators/NotificatorTraccar.java
index 0827567ae..8f1260e96 100644
--- a/src/main/java/org/traccar/notificators/NotificatorTraccar.java
+++ b/src/main/java/org/traccar/notificators/NotificatorTraccar.java
@@ -17,7 +17,7 @@ package org.traccar.notificators;
import org.traccar.config.Config;
import org.traccar.config.Keys;
-import org.traccar.session.cache.CacheManager;
+import org.traccar.notification.NotificationFormatter;
import javax.inject.Inject;
import javax.ws.rs.client.Client;
@@ -25,9 +25,9 @@ import javax.ws.rs.client.Client;
public class NotificatorTraccar extends NotificatorFirebase {
@Inject
- public NotificatorTraccar(Config config, CacheManager cacheManager, Client client) {
+ public NotificatorTraccar(Config config, NotificationFormatter notificationFormatter, Client client) {
super(
- cacheManager, client, "https://www.traccar.org/push/",
+ notificationFormatter, client, "https://www.traccar.org/push/",
config.getString(Keys.NOTIFICATOR_TRACCAR_KEY));
}
diff --git a/src/main/java/org/traccar/notificators/NotificatorWeb.java b/src/main/java/org/traccar/notificators/NotificatorWeb.java
index 402f7a9f0..3d899584d 100644
--- a/src/main/java/org/traccar/notificators/NotificatorWeb.java
+++ b/src/main/java/org/traccar/notificators/NotificatorWeb.java
@@ -21,19 +21,18 @@ import org.traccar.model.Position;
import org.traccar.model.User;
import org.traccar.notification.NotificationFormatter;
import org.traccar.session.ConnectionManager;
-import org.traccar.session.cache.CacheManager;
import javax.inject.Inject;
public final class NotificatorWeb implements Notificator {
private final ConnectionManager connectionManager;
- private final CacheManager cacheManager;
+ private final NotificationFormatter notificationFormatter;
@Inject
- public NotificatorWeb(ConnectionManager connectionManager, CacheManager cacheManager) {
+ public NotificatorWeb(ConnectionManager connectionManager, NotificationFormatter notificationFormatter) {
this.connectionManager = connectionManager;
- this.cacheManager = cacheManager;
+ this.notificationFormatter = notificationFormatter;
}
@Override
@@ -49,7 +48,7 @@ public final class NotificatorWeb implements Notificator {
copy.setMaintenanceId(event.getMaintenanceId());
copy.getAttributes().putAll(event.getAttributes());
- var message = NotificationFormatter.formatMessage(cacheManager, user, event, position, "short");
+ var message = notificationFormatter.formatMessage(user, event, position, "short");
copy.set("message", message.getBody());
connectionManager.updateEvent(user.getId(), copy);
diff --git a/src/main/java/org/traccar/reports/common/ReportUtils.java b/src/main/java/org/traccar/reports/common/ReportUtils.java
index 706475241..95c43f8a0 100644
--- a/src/main/java/org/traccar/reports/common/ReportUtils.java
+++ b/src/main/java/org/traccar/reports/common/ReportUtils.java
@@ -16,6 +16,7 @@
*/
package org.traccar.reports.common;
+import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.tools.generic.DateTool;
import org.apache.velocity.tools.generic.NumberTool;
import org.jxls.area.Area;
@@ -74,18 +75,21 @@ public class ReportUtils {
private final IdentityManager identityManager;
private final DeviceManager deviceManager;
private final TripsConfig tripsConfig;
+ private final VelocityEngine velocityEngine;
private final Geocoder geocoder;
@Inject
public ReportUtils(
Config config, Storage storage, PermissionsService permissionsService, IdentityManager identityManager,
- DeviceManager deviceManager, TripsConfig tripsConfig, @Nullable Geocoder geocoder) {
+ DeviceManager deviceManager, TripsConfig tripsConfig, VelocityEngine velocityEngine,
+ @Nullable Geocoder geocoder) {
this.config = config;
this.storage = storage;
this.permissionsService = permissionsService;
this.identityManager = identityManager;
this.deviceManager = deviceManager;
this.tripsConfig = tripsConfig;
+ this.velocityEngine = velocityEngine;
this.geocoder = geocoder;
}
@@ -153,7 +157,7 @@ public class ReportUtils {
context.putVar("distanceUnit", UserUtil.getDistanceUnit(server, user));
context.putVar("speedUnit", UserUtil.getSpeedUnit(server, user));
context.putVar("volumeUnit", UserUtil.getVolumeUnit(server, user));
- context.putVar("webUrl", Context.getVelocityEngine().getProperty("web.url"));
+ context.putVar("webUrl", velocityEngine.getProperty("web.url"));
context.putVar("dateTool", new DateTool());
context.putVar("numberTool", new NumberTool());
context.putVar("timezone", UserUtil.getTimezone(server, user));
diff --git a/src/test/java/org/traccar/reports/ReportUtilsTest.java b/src/test/java/org/traccar/reports/ReportUtilsTest.java
index 92bfdae1c..1440c4c30 100644
--- a/src/test/java/org/traccar/reports/ReportUtilsTest.java
+++ b/src/test/java/org/traccar/reports/ReportUtilsTest.java
@@ -1,5 +1,6 @@
package org.traccar.reports;
+import org.apache.velocity.app.VelocityEngine;
import org.junit.Test;
import org.traccar.BaseTest;
import org.traccar.api.security.PermissionsService;
@@ -76,8 +77,8 @@ public class ReportUtilsTest extends BaseTest {
@Test
public void testCalculateSpentFuel() {
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), mock(TripsConfig.class), null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), mock(TripsConfig.class), mock(VelocityEngine.class), null);
Position startPosition = new Position();
Position endPosition = new Position();
assertEquals(reportUtils.calculateFuel(startPosition, endPosition), 0.0, 0.01);
@@ -101,8 +102,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<TripReportItem> trips = reportUtils.detectTripsAndStops(data, false, TripReportItem.class);
@@ -156,8 +157,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, true, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<TripReportItem> trips = reportUtils.detectTripsAndStops(data, false, TripReportItem.class);
@@ -227,8 +228,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 300000, 180000, 900000, false, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<TripReportItem> trips = reportUtils.detectTripsAndStops(data, false, TripReportItem.class);
@@ -278,8 +279,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<StopReportItem> result = reportUtils.detectTripsAndStops(data, false, StopReportItem.class);
@@ -307,8 +308,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<StopReportItem> result = reportUtils.detectTripsAndStops(data, false, StopReportItem.class);
@@ -336,8 +337,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<StopReportItem> result = reportUtils.detectTripsAndStops(data, false, StopReportItem.class);
@@ -365,8 +366,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 300000, 200000, 900000, false, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<StopReportItem> result = reportUtils.detectTripsAndStops(data, false, StopReportItem.class);
@@ -390,8 +391,8 @@ public class ReportUtilsTest extends BaseTest {
TripsConfig tripsConfig = new TripsConfig(500, 200000, 200000, 900000, false, false, 0.01);
ReportUtils reportUtils = new ReportUtils(
- mock(Config.class), mock(Storage.class), mock(PermissionsService.class),
- mockIdentityManager(), mock(DeviceManager.class), tripsConfig, null);
+ mock(Config.class), mock(Storage.class), mock(PermissionsService.class), mockIdentityManager(),
+ mock(DeviceManager.class), tripsConfig, mock(VelocityEngine.class), null);
Collection<TripReportItem> trips = reportUtils.detectTripsAndStops(data, false, TripReportItem.class);