/* * Copyright 2015 - 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. * 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; 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; import org.traccar.database.DataManager; import org.traccar.database.DeviceManager; import org.traccar.database.GroupsManager; import org.traccar.database.IdentityManager; import org.traccar.database.MailManager; import org.traccar.database.NotificationManager; import org.traccar.database.PermissionsManager; import org.traccar.database.UsersManager; import org.traccar.geocoder.Geocoder; import org.traccar.helper.Log; import org.traccar.helper.SanitizerModule; import org.traccar.model.BaseModel; import org.traccar.model.Device; import org.traccar.model.Group; import org.traccar.model.Notification; import org.traccar.model.User; import org.traccar.notification.EventForwarder; import org.traccar.notification.NotificatorManager; import org.traccar.session.ConnectionManager; 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 { private Context() { } private static Config config; public static Config getConfig() { return config; } private static ObjectMapper objectMapper; public static ObjectMapper getObjectMapper() { return objectMapper; } private static IdentityManager identityManager; public static IdentityManager getIdentityManager() { return identityManager; } private static DataManager dataManager; public static DataManager getDataManager() { return dataManager; } private static MailManager mailManager; public static MailManager getMailManager() { return mailManager; } private static UsersManager usersManager; public static UsersManager getUsersManager() { return usersManager; } private static GroupsManager groupsManager; public static GroupsManager getGroupsManager() { return groupsManager; } private static DeviceManager deviceManager; public static DeviceManager getDeviceManager() { return deviceManager; } private static ConnectionManager connectionManager; public static ConnectionManager getConnectionManager() { return connectionManager; } private static PermissionsManager permissionsManager; public static PermissionsManager getPermissionsManager() { return permissionsManager; } public static Geocoder getGeocoder() { return Main.getInjector() != null ? Main.getInjector().getInstance(Geocoder.class) : null; } private static NotificationManager notificationManager; public static NotificationManager getNotificationManager() { return notificationManager; } private static VelocityEngine velocityEngine; public static VelocityEngine getVelocityEngine() { return velocityEngine; } private static Client client = ClientBuilder.newClient(); public static Client getClient() { return client; } private static EventForwarder eventForwarder; public static EventForwarder getEventForwarder() { return eventForwarder; } private static class ObjectMapperContextResolver implements ContextResolver { @Override public ObjectMapper getContext(Class clazz) { return objectMapper; } } public static void init(String configFile) throws Exception { try { config = new Config(configFile); Log.setupLogger(config); } catch (Exception e) { config = new Config(); Log.setupDefaultLogger(); throw e; } objectMapper = new ObjectMapper(); if (config.getBoolean(Keys.WEB_SANITIZE)) { objectMapper.registerModule(new SanitizerModule()); } objectMapper.registerModule(new JSR353Module()); objectMapper.setConfig( objectMapper.getSerializationConfig().without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)); client = ClientBuilder.newClient().register(new ObjectMapperContextResolver()); if (config.hasKey(Keys.DATABASE_URL)) { dataManager = new DataManager(config); } mailManager = new MailManager(); if (dataManager != null) { usersManager = new UsersManager(dataManager); groupsManager = new GroupsManager(dataManager); deviceManager = new DeviceManager(dataManager); } identityManager = deviceManager; permissionsManager = new PermissionsManager(dataManager, usersManager); connectionManager = new ConnectionManager(); initEventsModule(); if (config.hasKey(Keys.EVENT_FORWARD_URL)) { eventForwarder = new EventForwarder(config); } } private static void initEventsModule() { notificationManager = new NotificationManager( dataManager, Main.getInjector().getInstance(CacheManager.class), Main.getInjector().getInstance(NotificatorManager.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 BaseObjectManager getManager(Class clazz) { if (clazz.equals(Device.class)) { return (BaseObjectManager) deviceManager; } else if (clazz.equals(Group.class)) { return (BaseObjectManager) groupsManager; } else if (clazz.equals(User.class)) { return (BaseObjectManager) usersManager; } else if (clazz.equals(Notification.class)) { return (BaseObjectManager) notificationManager; } return null; } }