All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.grey.naf.nafman.NafManConfig Maven / Gradle / Ivy

/*
 * Copyright 2013-2021 Yusef Badri - All rights reserved.
 * NAF is distributed under the terms of the GNU Affero General Public License, Version 3 (AGPLv3).
 */
package com.grey.naf.nafman;

import java.time.Duration;
import java.util.function.Supplier;

import com.grey.base.config.XmlConfig;
import com.grey.naf.BufferGenerator;
import com.grey.naf.NAFConfig;
import com.grey.naf.reactor.config.ConcurrentListenerConfig;

public class NafManConfig
{
	private final boolean surviveDownstream; //if false, Primary agent halts its Dispatcher if any secondary agents halt
	private final long idleConnectionTimeout; //idle timeout the NAFMAN server applies to incoming connections
	private final ConcurrentListenerConfig listenerConfig; //the NAFMAN server
	private BufferGenerator.BufferConfig bufferConfig;

	// these are TTLs for cached responses in NAFMAN server
	private final long dynamicResourceTTL;
	private final long declaredStaticTTL; //this is for permanently cached static content, but we have to declare a finite time to clients

	private NafManConfig(Builder bldr) {
		surviveDownstream = bldr.surviveDownstream;
		dynamicResourceTTL = bldr.dynamicResourceTTL;
		declaredStaticTTL = bldr.declaredStaticTTL;
		idleConnectionTimeout = bldr.idleConnectionTimeout;
		listenerConfig = bldr.getListenerConfig().build();
		bufferConfig = bldr.bufferConfig;
	}

	public boolean isSurviveDownstream() {
		return surviveDownstream;
	}

	public long getIdleConnectionTimeout() {
		return idleConnectionTimeout;
	}

	public long getDynamicResourceTTL() {
		return dynamicResourceTTL;
	}

	public long getDeclaredStaticTTL() {
		return declaredStaticTTL;
	}

	public ConcurrentListenerConfig getListenerConfig() {
		return listenerConfig;
	}

	public BufferGenerator.BufferConfig getBufferConfig() {
		return bufferConfig;
	}

	@Override
	public String toString() {
		return super.toString()+" on port="+getListenerConfig().getPort()+" with survive-downstream="+isSurviveDownstream();
	}


	public static class Builder {
		private final NAFConfig nafConfig;
		private final ConcurrentListenerConfig.Builder listenerConfig;
		private boolean surviveDownstream = true;
		private long dynamicResourceTTL = Duration.ofSeconds(5).toMillis();
		private long declaredStaticTTL = Duration.ofDays(1).toMillis();
		private long idleConnectionTimeout = Duration.ofSeconds(30).toMillis();
		private BufferGenerator.BufferConfig bufferConfig = new BufferGenerator.BufferConfig(1024, true, BufferGenerator.directniobufs, null);

		public Builder(NAFConfig nafConfig) {
			this.nafConfig = nafConfig;
			listenerConfig = defaultListener();
		}

		public ConcurrentListenerConfig.Builder getListenerConfig() {
			return listenerConfig;
		}

		public Builder withXmlConfig(XmlConfig cfg) {
			surviveDownstream = cfg.getBool("@survive_downstream", surviveDownstream);
			dynamicResourceTTL = cfg.getTime("@dyncache", dynamicResourceTTL);
			declaredStaticTTL = cfg.getTime("@permcache", declaredStaticTTL);
			idleConnectionTimeout = cfg.getTime("@timeout", idleConnectionTimeout);
			bufferConfig = BufferGenerator.BufferConfig.create(cfg, "niobuffers", bufferConfig);

			XmlConfig lxmlcfg = cfg.getSection("listener");
			getListenerConfig().withXmlConfig(lxmlcfg, nafConfig);
			return this;
		}

		public Builder withSurviveDownstream(boolean v) {
			surviveDownstream = v;
			return this;
		}

		public Builder withDynamicResourceTTL(long v) {
			dynamicResourceTTL = v;
			return this;
		}

		public Builder withDeclaredStaticTTL(long v) {
			declaredStaticTTL = v;
			return this;
		}

		public Builder withIdleConnectionTimeout(long v) {
			idleConnectionTimeout = v;
			return this;
		}

		public Builder withBufferConfig(BufferGenerator.BufferConfig v) {
			bufferConfig = v;
			return this;
		}

		public NafManConfig build() {
			return new NafManConfig(this);
		}

		private ConcurrentListenerConfig.Builder defaultListener() {
			Supplier srvcfg = () -> this.build();
			ConcurrentListenerConfig.Builder bldr = new ConcurrentListenerConfig.Builder<>()
					.withName("NAFMAN-Primary")
					.withServerFactory(NafManServer.Factory.class, srvcfg);
			if (nafConfig != null) {
				int port = nafConfig.assignPort(NAFConfig.RSVPORT_NAFMAN);
				bldr.withPort(port);
			}
			return bldr;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy