package com.aol.micro.server.application.registry; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Optional; import java.util.Properties; import java.util.stream.Collectors; import java.util.stream.Stream; import com.aol.cyclops2.util.ExceptionSoftener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.aol.micro.server.servers.ApplicationRegister; import com.aol.micro.server.servers.model.ServerData; import lombok.Getter; @Component public class ApplicationRegisterImpl implements ApplicationRegister { private final Logger logger = LoggerFactory.getLogger(getClass()); @Getter private volatile Application application; private final String customHostname; private final String targetEndpoint; private final Properties props; @Autowired public ApplicationRegisterImpl(@Value("${host.address:#{null}}") String customHostname, @Value("${target.endpoint:#{null}}") String targetEndpoint, @Qualifier("propertyFactory") Properties props) { this.customHostname = customHostname; this.targetEndpoint = targetEndpoint; this.props = props; } public ApplicationRegisterImpl() { this( null, null, new Properties()); } @Override public void register(ServerData[] data) { try { final String hostname = Optional.ofNullable(customHostname) .orElse(InetAddress.getLocalHost() .getHostName()); application = new Application( Stream.of(data) .map(next -> new RegisterEntry( next.getPort(), hostname, next.getModule() .getContext(), next.getModule() .getContext(), null, targetEndpoint, externalPort(next))) .collect(Collectors.toList())); logger.info("Registered application {} ", application); } catch (UnknownHostException e) { throw ExceptionSoftener.throwSoftenedException(e); } } private int externalPort(ServerData next) { String ep = props.getProperty("external.port." + next.getModule() .getContext()); if (ep == null) return next.getPort(); try { return Integer.valueOf(ep); } catch (NumberFormatException e) { return next.getPort(); } } }