ServiceFactory.java

/**
 * DESC
 *
 * @author mm
 */
package com.icegreen.greenmail.webapp;

import com.icegreen.greenmail.Managers;
import com.icegreen.greenmail.imap.ImapServer;
import com.icegreen.greenmail.pop3.Pop3Server;
import com.icegreen.greenmail.smtp.SmtpServer;
import com.icegreen.greenmail.util.ServerSetup;
import com.icegreen.greenmail.util.Service;

import java.util.ArrayList;
import java.util.List;

public class ServiceFactory {
    private ServiceFactory() {
    }

    public static List<Service> create(final Configuration pConf,
                                       final Managers pManagers) {
        List<Configuration.ServiceConfiguration> seviceConfigs = pConf.getServiceConfigurations();
        List<Service> services = new ArrayList<>(seviceConfigs.size());
        for (Configuration.ServiceConfiguration serviceConf : seviceConfigs) {
            services.add(create(pConf, serviceConf, pManagers));
        }
        return services;
    }

    public static Service create(final Configuration pConf,
                                 final Configuration.ServiceConfiguration pServiceConfiguration,
                                 final Managers pManagers) {
        Service service;
        if (Protocol.SMTP.equals(pServiceConfiguration.protocol)) {
            service = new SmtpServer(new ServerSetup(getPort(pConf, pServiceConfiguration),
                getHost(pConf, pServiceConfiguration),
                ServerSetup.PROTOCOL_SMTP),
                pManagers
            );
        } else if (Protocol.SMTPS.equals(pServiceConfiguration.protocol)) {
            service = new SmtpServer(new ServerSetup(getPort(pConf, pServiceConfiguration),
                getHost(pConf, pServiceConfiguration),
                ServerSetup.PROTOCOL_SMTPS),
                pManagers
            );
        } else if (Protocol.POP3.equals(pServiceConfiguration.protocol)) {
            service = new Pop3Server(new ServerSetup(getPort(pConf, pServiceConfiguration),
                getHost(pConf, pServiceConfiguration),
                ServerSetup.PROTOCOL_POP3),
                pManagers
            );
        } else if (Protocol.POP3S.equals(pServiceConfiguration.protocol)) {
            service = new Pop3Server(new ServerSetup(getPort(pConf, pServiceConfiguration),
                getHost(pConf, pServiceConfiguration),
                ServerSetup.PROTOCOL_POP3S),
                pManagers
            );
        } else if (Protocol.IMAP.equals(pServiceConfiguration.protocol)) {
            service = new ImapServer(new ServerSetup(getPort(pConf, pServiceConfiguration),
                getHost(pConf, pServiceConfiguration),
                ServerSetup.PROTOCOL_IMAP),
                pManagers
            );
        } else if (Protocol.IMAPS.equals(pServiceConfiguration.protocol)) {
            service = new ImapServer(new ServerSetup(getPort(pConf, pServiceConfiguration),
                getHost(pConf, pServiceConfiguration),
                ServerSetup.PROTOCOL_IMAPS),
                pManagers
            );
        } else {
            throw new IllegalArgumentException(
                "Can not handle protocol " + pServiceConfiguration.protocol.toString());
        }
        return service;
    }

    private static String getHost(final Configuration pConf,
                                  final Configuration.ServiceConfiguration pServiceConfiguration) {
        String host = pServiceConfiguration.hostname;
        if (null == host || host.isEmpty()) {
            host = pConf.getDefaultHostname();
        }
        return host;
    }

    private static int getPort(final Configuration pConf,
                               final Configuration.ServiceConfiguration pServiceConfiguration) {
        int port = pServiceConfiguration.port;
        if (port == 0) {
            port = pServiceConfiguration.protocol.port + pConf.getPortOffset();
        }
        return port;
    }
}