package io.muoncore; import io.muoncore.codec.Codecs; import io.muoncore.codec.json.JsonOnlyCodecs; import io.muoncore.config.AutoConfiguration; import io.muoncore.discovery.DiscoveryFactory; import io.muoncore.discovery.MultiDiscovery; import io.muoncore.exception.MuonException; import io.muoncore.transport.MuonTransport; import io.muoncore.transport.MuonTransportFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; public class MuonBuilder { private Logger LOG = LoggerFactory.getLogger(MuonBuilder.class.getSimpleName()); private AutoConfiguration config; private Codecs codecs = new JsonOnlyCodecs(); private MuonBuilder(AutoConfiguration config) { this.config = config; } public static MuonBuilder withConfig(AutoConfiguration config) { return new MuonBuilder(config); } public MuonBuilder withCodecs(Codecs codecs) { this.codecs = codecs; return this; } public Muon build() { try { return new MultiTransportMuon(config, generateDiscovery(), generateTransport(), codecs); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { throw new MuonException("Unable to create Muon instance, error during construction", e); } } private List<MuonTransport> generateTransport() throws ClassNotFoundException, IllegalAccessException, InstantiationException { String[] factoryImpl = config.getStringConfig("muon.transport.factories").split(","); List<MuonTransport> transports = new ArrayList<>(); for(String factory: factoryImpl) { try { MuonTransportFactory factoryInstance = (MuonTransportFactory) Class.forName(factory).newInstance(); factoryInstance.setAutoConfiguration(config); transports.add(factoryInstance.build(config.getProperties())); } catch (ClassNotFoundException ex) { LOG.info("Configured transport " + factory + " not present in the classpath, ignoring"); } } return transports; } private Discovery generateDiscovery() throws ClassNotFoundException, IllegalAccessException, InstantiationException { String[] factoryImpl = config.getStringConfig("muon.discovery.factories").split(","); List<Discovery> discoveries = new ArrayList<>(); for(String factory: factoryImpl) { try { DiscoveryFactory factoryInstance = (DiscoveryFactory) Class.forName(factory).newInstance(); factoryInstance.setAutoConfiguration(config); discoveries.add(factoryInstance.build(config.getProperties())); } catch (ClassNotFoundException ex) { LOG.info("Configured discovery " + factory + " not present in the classpath, ignoring"); } } return new MultiDiscovery(discoveries); } }