diff options
author | Martin Polden <mpolden@mpolden.no> | 2017-11-10 18:50:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-10 18:50:24 +0100 |
commit | c56091ffa4da34a2913b73f860cff2b6fa746c43 (patch) | |
tree | 1d7b53c77e927688fb041157de68797187620163 /standalone-container/src/main/java/com/yahoo | |
parent | ef22b222d1862f6b5a56521f43830abae30eec70 (diff) |
Revert "Bjorncs/jdisc http service cleanup"
Diffstat (limited to 'standalone-container/src/main/java/com/yahoo')
-rw-r--r-- | standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerActivator.java | 69 |
1 files changed, 64 insertions, 5 deletions
diff --git a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerActivator.java b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerActivator.java index baf0b41b270..d03a08a27db 100644 --- a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerActivator.java +++ b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneContainerActivator.java @@ -19,15 +19,24 @@ import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; +import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Hashtable; import java.util.List; +import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toMap; /** * @author Einar M R Rosenvinge @@ -36,19 +45,69 @@ public class StandaloneContainerActivator implements BundleActivator { @Override public void start(BundleContext bundleContext) throws Exception { - for (ConnectorConfig config: getConnectorConfigs(getContainer())) { + Container container = getContainer(); + List<ConnectorConfig> connectorConfigs = getConnectorConfigs(container); + + Stream<Path> keyStorePaths = getKeyStorePaths(connectorConfigs); + Map<Path, FileChannel> fileChannels = openFiles(keyStorePaths); + registerKeyStoreFileChannels(bundleContext, fileChannels); + + for (ConnectorConfig config: connectorConfigs) { ServerSocketChannel socketChannel = bindChannel(config); registerChannels(bundleContext, config.listenPort(), socketChannel); } } - static void registerChannels(BundleContext bundleContext, int listenPort, ServerSocketChannel boundChannel) { + private void registerKeyStoreFileChannels(BundleContext bundleContext, Map<Path, FileChannel> fileChannels) { + Hashtable<String, Object> properties = new Hashtable<>(); + properties.put("role", "com.yahoo.container.standalone.StandaloneContainerActivator.KeyStoreFileChannels"); + //Since Standalone container and jdisc http service don't have a suitable common module for placing a wrapper class for fileChannels, + //we register it with the type map. In the future, we should wrap this. + bundleContext.registerService(Map.class, + Collections.unmodifiableMap(fileChannels), + properties); + } + + private Map<Path, FileChannel> openFiles(Stream<Path> keyStorePaths) { + return keyStorePaths.collect(toMap( + Function.<Path>identity(), + StandaloneContainerActivator::getFileChannel)); + } + + private static FileChannel getFileChannel(Path path) { + try { + FileInputStream inputStream = new FileInputStream(path.toFile()); + //don't close the inputStream, as that will close the underlying channel. + return inputStream.getChannel(); + } catch (IOException e) { + throw new RuntimeException("Failed opening path " + path, e); + } + } + + private Stream<Path> getKeyStorePaths(List<ConnectorConfig> connectorConfigs) { + return connectorConfigs.stream(). + map(ConnectorConfig::ssl). + flatMap(StandaloneContainerActivator::getKeyStorePaths); + } + + private static Stream<Path> getKeyStorePaths(ConnectorConfig.Ssl ssl) { + Stream<String> paths = Stream.of( + ssl.keyStorePath(), + ssl.pemKeyStore().certificatePath(), + ssl.pemKeyStore().keyPath()); + + return paths. + filter(path -> !path.isEmpty()). + map(Paths::get); + } + + void registerChannels(BundleContext bundleContext, int listenPort, ServerSocketChannel boundChannel) { Hashtable<String, Integer> properties = new Hashtable<>(); properties.put("port", listenPort); bundleContext.registerService(ServerSocketChannel.class, boundChannel, properties); } - static ServerSocketChannel bindChannel(ConnectorConfig channelInfo) throws IOException { + ServerSocketChannel bindChannel(ConnectorConfig channelInfo) throws IOException { ServerSocketChannel serverChannel = ServerSocketChannel.open(); InetSocketAddress bindAddress = new InetSocketAddress(channelInfo.listenPort()); serverChannel.socket().bind(bindAddress, channelInfo.acceptQueueSize()); @@ -58,7 +117,7 @@ public class StandaloneContainerActivator implements BundleActivator { @Override public void stop(BundleContext bundleContext) throws Exception { } - static Container getContainer(Module... modules) { + Container getContainer(Module... modules) { Module activatorModule = new ActivatorModule(); List<Module> allModules = new ArrayList<>(); allModules.addAll(Arrays.asList(modules)); @@ -68,7 +127,7 @@ public class StandaloneContainerActivator implements BundleActivator { return app.container(); } - static List<ConnectorConfig> getConnectorConfigs(Container container) { + List<ConnectorConfig> getConnectorConfigs(Container container) { Http http = container.getHttp(); return (http == null) ? |