diff options
Diffstat (limited to 'src/main/java/org/traccar/ServerManager.java')
-rw-r--r-- | src/main/java/org/traccar/ServerManager.java | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/main/java/org/traccar/ServerManager.java b/src/main/java/org/traccar/ServerManager.java new file mode 100644 index 000000000..6a3273402 --- /dev/null +++ b/src/main/java/org/traccar/ServerManager.java @@ -0,0 +1,103 @@ +/* + * 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. + * 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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.net.BindException; +import java.net.URI; +import java.net.URL; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.Enumeration; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ServerManager { + + private static final Logger LOGGER = LoggerFactory.getLogger(ServerManager.class); + + private final List<TrackerServer> serverList = new LinkedList<>(); + private final Map<String, BaseProtocol> protocolList = new ConcurrentHashMap<>(); + + public ServerManager() throws Exception { + + List<String> names = new LinkedList<>(); + String packageName = "org.traccar.protocol"; + String packagePath = packageName.replace('.', '/'); + URL packageUrl = getClass().getClassLoader().getResource(packagePath); + + if (packageUrl.getProtocol().equals("jar")) { + String jarFileName = URLDecoder.decode(packageUrl.getFile(), StandardCharsets.UTF_8.name()); + try (JarFile jf = new JarFile(jarFileName.substring(5, jarFileName.indexOf("!")))) { + Enumeration<JarEntry> jarEntries = jf.entries(); + while (jarEntries.hasMoreElements()) { + String entryName = jarEntries.nextElement().getName(); + if (entryName.startsWith(packagePath) && entryName.length() > packagePath.length() + 5) { + names.add(entryName.substring(packagePath.length() + 1, entryName.lastIndexOf('.'))); + } + } + } + } else { + File folder = new File(new URI(packageUrl.toString())); + File[] files = folder.listFiles(); + if (files != null) { + for (File actual: files) { + String entryName = actual.getName(); + names.add(entryName.substring(0, entryName.lastIndexOf('.'))); + } + } + } + + for (String name : names) { + Class protocolClass = Class.forName(packageName + '.' + name); + if (BaseProtocol.class.isAssignableFrom(protocolClass) + && Context.getConfig().hasKey(BaseProtocol.nameFromClass(protocolClass) + ".port")) { + BaseProtocol protocol = (BaseProtocol) protocolClass.newInstance(); + serverList.addAll(protocol.getServerList()); + protocolList.put(protocol.getName(), protocol); + } + } + } + + public BaseProtocol getProtocol(String name) { + return protocolList.get(name); + } + + public void start() throws Exception { + for (TrackerServer server: serverList) { + try { + server.start(); + } catch (BindException e) { + LOGGER.warn("Port {} is disabled due to conflict", server.getPort()); + } + } + } + + public void stop() { + for (TrackerServer server: serverList) { + server.stop(); + } + GlobalTimer.release(); + } + +} |