package dmg.cells.services.login; import com.google.common.collect.Ordering; import java.util.ServiceLoader; import dmg.cells.nucleus.CellEndpoint; import org.dcache.util.Args; public class LoginCellFactoryBuilder { private static final ServiceLoader<LoginCellProvider> PROVIDERS = ServiceLoader.load(LoginCellProvider.class); private String name; private Args args; private String loginManagerName; private CellEndpoint endpoint; public LoginCellFactoryBuilder setName(String name) { this.name = name; return this; } public LoginCellFactoryBuilder setArgs(Args args) { this.args = args; return this; } public LoginCellFactoryBuilder setLoginManagerName(String loginManagerName) { this.loginManagerName = loginManagerName; return this; } public LoginCellFactoryBuilder setCellEndpoint(CellEndpoint endpoint) { this.endpoint = endpoint; return this; } public LoginCellFactory build() { LoginCellProvider bestProvider = Ordering.natural().onResultOf((LoginCellProvider p) -> p.getPriority(name)).max(PROVIDERS); if (bestProvider.getPriority(name) == Integer.MIN_VALUE) { throw new IllegalArgumentException("No login cell provider found for " + name); } return bestProvider.createFactory(name, args, endpoint, loginManagerName); } }