AbstractPolicyConfiguration.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.core.controllo_traffico.beans;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.config.Proprieta;
import org.openspcoop2.core.controllo_traffico.constants.Costanti;
import org.openspcoop2.core.controllo_traffico.driver.PolicyGroupByActiveThreadsType;
/**
* PolicyConfiguration
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public abstract class AbstractPolicyConfiguration implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
// runtime config
protected boolean gestionePolicyRidefinita = false;
protected PolicyGroupByActiveThreadsType type;
private Boolean LOCAL_DIVIDED_BY_NODES_remaining_zeroValue = null;
private Boolean LOCAL_DIVIDED_BY_NODES_limit_roundingDown = null;
private Boolean LOCAL_DIVIDED_BY_NODES_limit_normalizedQuota = null;
protected Boolean getEngineLOCAL_DIVIDED_BY_NODES_remaining_zeroValue() {
return this.LOCAL_DIVIDED_BY_NODES_remaining_zeroValue;
}
public void setLOCAL_DIVIDED_BY_NODES_remaining_zeroValue(Boolean lOCAL_DIVIDED_BY_NODES_remaining_zeroValue) {
this.LOCAL_DIVIDED_BY_NODES_remaining_zeroValue = lOCAL_DIVIDED_BY_NODES_remaining_zeroValue;
}
protected Boolean getEngineLOCAL_DIVIDED_BY_NODES_limit_roundingDown() {
return this.LOCAL_DIVIDED_BY_NODES_limit_roundingDown;
}
public void setLOCAL_DIVIDED_BY_NODES_limit_roundingDown(Boolean lOCAL_DIVIDED_BY_NODES_limit_roundingDown) {
this.LOCAL_DIVIDED_BY_NODES_limit_roundingDown = lOCAL_DIVIDED_BY_NODES_limit_roundingDown;
}
protected Boolean getEngineLOCAL_DIVIDED_BY_NODES_limit_normalizedQuota() {
return this.LOCAL_DIVIDED_BY_NODES_limit_normalizedQuota;
}
public void setLOCAL_DIVIDED_BY_NODES_limit_normalizedQuota(Boolean lOCAL_DIVIDED_BY_NODES_limit_normalizedQuota) {
this.LOCAL_DIVIDED_BY_NODES_limit_normalizedQuota = lOCAL_DIVIDED_BY_NODES_limit_normalizedQuota;
}
protected boolean gestioneHttpHeadersRidefinita = false;
protected boolean disabledHttpHeaders = false;
protected boolean disabledHttpHeaders_limit = false;
protected boolean forceHttpHeaders_limit_no_windows = false;
protected boolean forceHttpHeaders_limit_windows = false;
protected boolean disabledHttpHeaders_remaining = false;
protected boolean disabledHttpHeaders_reset = false;
protected boolean disabledHttpHeaders_retryAfter = false;
protected boolean forceDisabledHttpHeaders_retryAfter_backoff = false;
protected int forceHttpHeaders_retryAfter_backoff = -1;
// console config
protected String syncMode = Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_DEFAULT;
protected String impl = null;
protected String count = null;
protected String engineType = null;
protected Long gestorePolicyConfigDate = null;
protected String httpMode = Costanti.VALUE_HTTP_HEADER_DEFAULT;
protected String httpMode_limit = null;
protected String httpMode_remaining = null;
protected String httpMode_reset = null;
protected String httpMode_retry_after = null;
protected String httpMode_retry_after_backoff = null;
public AbstractPolicyConfiguration(){
// usato da console
}
public AbstractPolicyConfiguration(boolean runtime) throws Exception{
this.initRuntimeInfo(runtime);
}
public AbstractPolicyConfiguration(List<Proprieta> p) throws Exception{
this(p, null, true);
}
public AbstractPolicyConfiguration(List<Proprieta> p, List<PolicyGroupByActiveThreadsType> tipiSupportati, boolean runtime) throws Exception{
if(p!=null && !p.isEmpty()) {
if(tipiSupportati==null) {
if(runtime) {
tipiSupportati = new ArrayList<PolicyGroupByActiveThreadsType>();
for (PolicyGroupByActiveThreadsType type : PolicyGroupByActiveThreadsType.values()) {
tipiSupportati.add(type);
}
}
else {
throw new Exception("Tipi supportati non indicati");
}
}
String gestorePolicyConfigDate = getValue(p, Costanti.GESTORE_CONFIG_DATE, null);
if(gestorePolicyConfigDate!=null) {
this.gestorePolicyConfigDate = Long.valueOf(gestorePolicyConfigDate);
}
this.syncMode = getValue(p, Costanti.MODALITA_SINCRONIZZAZIONE, Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_DEFAULT);
if(!Costanti.getVALUES_MODALITA_SINCRONIZZAZIONE(tipiSupportati).contains(this.syncMode)) {
throw new Exception("Value '"+this.syncMode+"' unsupported for property '"+Costanti.MODALITA_SINCRONIZZAZIONE+"'");
}
if(Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_DISTRIBUITA.equals(this.syncMode)) {
this.impl = getValue(p, Costanti.MODALITA_IMPLEMENTAZIONE, null);
if(this.impl==null) {
if(runtime) {
throw new Exception("Value undefined for property '"+Costanti.MODALITA_IMPLEMENTAZIONE+"'");
}
else {
// default
this.impl = Costanti.getVALUES_MODALITA_IMPLEMENTAZIONE(tipiSupportati).get(0);
}
}
if(!Costanti.getVALUES_MODALITA_IMPLEMENTAZIONE(tipiSupportati).contains(this.impl)) {
throw new Exception("Value '"+this.impl+"' unsupported for property '"+Costanti.MODALITA_IMPLEMENTAZIONE+"'");
}
if(Costanti.VALUE_MODALITA_IMPLEMENTAZIONE_HAZELCAST.equals(this.impl) ||
Costanti.VALUE_MODALITA_IMPLEMENTAZIONE_REDIS.equals(this.impl)) {
this.count = getValue(p, Costanti.MODALITA_CONTATORI, null);
if(this.count==null) {
if(runtime) {
throw new Exception("Value undefined for property '"+Costanti.MODALITA_CONTATORI+"'");
}
else {
// default
this.count = Costanti.getVALUES_MODALITA_CONTATORI(tipiSupportati, this.impl).get(0);
}
}
if(!Costanti.getVALUES_MODALITA_CONTATORI(tipiSupportati, this.impl).contains(this.count)) {
if(runtime) {
throw new Exception("Value '"+this.count+"' unsupported for property '"+Costanti.MODALITA_CONTATORI+"'");
}
else {
// default (e' cambiato impl)
this.count = Costanti.getVALUES_MODALITA_CONTATORI(tipiSupportati, this.impl).get(0);
}
}
this.engineType = getValue(p, Costanti.MODALITA_TIPOLOGIA, null);
if(this.engineType==null) {
if(runtime) {
throw new Exception("Value undefined for property '"+Costanti.MODALITA_TIPOLOGIA+"'");
}
else {
// default
this.engineType = Costanti.getVALUES_MODALITA_TIPOLOGIA(tipiSupportati, this.impl, this.count).get(0);
}
}
if(!Costanti.getVALUES_MODALITA_TIPOLOGIA(tipiSupportati, this.impl, this.count).contains(this.engineType)) {
if(runtime) {
throw new Exception("Value '"+this.engineType+"' unsupported for property '"+Costanti.MODALITA_TIPOLOGIA+"'");
}
else {
// default (e' cambiato impl o count)
this.engineType = Costanti.getVALUES_MODALITA_TIPOLOGIA(tipiSupportati, this.impl, this.count).get(0);
}
}
}
}
this.httpMode = getValue(p, Costanti.MODALITA_GENERAZIONE_HEADER_HTTP, Costanti.VALUE_HTTP_HEADER_DEFAULT);
if(!Costanti.VALUES_MODALITA_GENERAZIONE_HEADER_HTTP.contains(this.httpMode)) {
throw new Exception("Value '"+this.httpMode+"' unsupported for property '"+Costanti.MODALITA_GENERAZIONE_HEADER_HTTP+"'");
}
if(Costanti.VALUE_HTTP_HEADER_RIDEFINITO.equals(this.httpMode)) {
this.httpMode_limit = getValue(p, Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_LIMIT, Costanti.VALUE_HTTP_HEADER_DEFAULT);
if(!Costanti.VALUES_MODALITA_GENERAZIONE_HEADER_HTTP_LIMIT.contains(this.httpMode_limit)) {
throw new Exception("Value '"+this.httpMode_limit+"' unsupported for property '"+Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_LIMIT+"'");
}
this.httpMode_remaining = getValue(p, Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_REMAINING, Costanti.VALUE_HTTP_HEADER_DEFAULT);
if(!Costanti.VALUES_MODALITA_GENERAZIONE_HEADER_HTTP_REMAINING.contains(this.httpMode_remaining)) {
throw new Exception("Value '"+this.httpMode_remaining+"' unsupported for property '"+Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_REMAINING+"'");
}
this.httpMode_reset = getValue(p, Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RESET, Costanti.VALUE_HTTP_HEADER_DEFAULT);
if(!Costanti.VALUES_MODALITA_GENERAZIONE_HEADER_HTTP_RESET.contains(this.httpMode_reset)) {
throw new Exception("Value '"+this.httpMode_reset+"' unsupported for property '"+Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RESET+"'");
}
this.httpMode_retry_after = getValue(p, Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RETRY_AFTER, Costanti.VALUE_HTTP_HEADER_DEFAULT);
if(!Costanti.VALUES_MODALITA_GENERAZIONE_HEADER_HTTP_RETRY_AFTER.contains(this.httpMode_retry_after)) {
throw new Exception("Value '"+this.httpMode_retry_after+"' unsupported for property '"+Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RETRY_AFTER+"'");
}
if(Costanti.VALUE_HTTP_HEADER_ABILITATO_BACKOFF.equals(this.httpMode_retry_after)) {
this.httpMode_retry_after_backoff = getValue(p, Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RETRY_AFTER_BACKOFF_SECONDS, null);
}
}
}
this.initRuntimeInfo(runtime);
}
private static String getValue(List<Proprieta> p, String name, String defaultV) {
String tmp = null;
if(p!=null && !p.isEmpty()) {
for (Proprieta proprieta : p) {
if(proprieta.getNome().equals(name)) {
tmp = proprieta.getValore();
break;
}
}
}
if(tmp!=null) {
tmp = tmp.trim();
}
if(tmp!=null && StringUtils.isNotEmpty(tmp)) {
return tmp;
}
else {
return defaultV;
}
}
private static Map<String, PolicyGroupByActiveThreadsType> mappingCostantiToHazelcastExact = Map.of(
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_CONTATORI_ATOMIC_LONG, PolicyGroupByActiveThreadsType.HAZELCAST_ATOMIC_LONG,
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_FULL_SYNC, PolicyGroupByActiveThreadsType.HAZELCAST_MAP
);
private static Map<String, PolicyGroupByActiveThreadsType> mappingCostantiToHazelcastApprox = Map.of(
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_CONTATORI_PNCOUNTER, PolicyGroupByActiveThreadsType.HAZELCAST_PNCOUNTER,
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_CONTATORI_ATOMIC_LONG_ASYNC, PolicyGroupByActiveThreadsType.HAZELCAST_ATOMIC_LONG_ASYNC,
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_NEAR_CACHE, PolicyGroupByActiveThreadsType.HAZELCAST_NEAR_CACHE,
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_LOCAL_CACHE, PolicyGroupByActiveThreadsType.HAZELCAST_LOCAL_CACHE
);
private static Map<String, PolicyGroupByActiveThreadsType> mappingCostantiToHazelcastInconsistent = Map.of(
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_REMOTE_SYNC, PolicyGroupByActiveThreadsType.HAZELCAST_NEAR_CACHE_UNSAFE_SYNC_MAP,
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_REMOTE_ASYNC, PolicyGroupByActiveThreadsType.HAZELCAST_NEAR_CACHE_UNSAFE_ASYNC_MAP,
Costanti.VALUE_MODALITA_TIPOLOGIA_HAZELCAST_REPLICATED_MAP, PolicyGroupByActiveThreadsType.HAZELCAST_REPLICATED_MAP
);
private static Map<String, PolicyGroupByActiveThreadsType> mappingCostantiToRedisExact = Map.of(
Costanti.VALUE_MODALITA_TIPOLOGIA_REDIS_CONTATORI_ATOMIC_LONG, PolicyGroupByActiveThreadsType.REDISSON_ATOMIC_LONG,
Costanti.VALUE_MODALITA_TIPOLOGIA_REDIS_REDDISSON_MAP, PolicyGroupByActiveThreadsType.REDISSON_MAP
);
private static Map<String, PolicyGroupByActiveThreadsType> mappingCostantiToRedisInconsistent= Map.of(
Costanti.VALUE_MODALITA_TIPOLOGIA_REDIS_CONTATORI_LONGADDER, PolicyGroupByActiveThreadsType.REDISSON_LONGADDER
);
private void initRuntimeInfo(boolean all) throws Exception {
if(!Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_DEFAULT.equals(this.syncMode)) {
if(Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_LOCALE.equals(this.syncMode)) {
this.type = PolicyGroupByActiveThreadsType.LOCAL;
}
else if(Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_LOCALE_SUDDIVISA_TRA_NODI.equals(this.syncMode)) {
this.type = PolicyGroupByActiveThreadsType.LOCAL_DIVIDED_BY_NODES;
}
else if(Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_DISTRIBUITA.equals(this.syncMode)) {
if(Costanti.VALUE_MODALITA_IMPLEMENTAZIONE_DATABASE.equals(this.impl)) {
this.type = PolicyGroupByActiveThreadsType.DATABASE;
}
else if(Costanti.VALUE_MODALITA_IMPLEMENTAZIONE_HAZELCAST.equals(this.impl)) {
if(Costanti.VALUE_MODALITA_CONTATORI_EXACT.equals(this.count)) {
this.type = mappingCostantiToHazelcastExact.get(this.engineType);
}
else if(Costanti.VALUE_MODALITA_CONTATORI_APPROXIMATED.equals(this.count)) {
this.type = mappingCostantiToHazelcastApprox.get(this.engineType);
}
else if(Costanti.VALUE_MODALITA_CONTATORI_INCONSISTENT.equals(this.count)) {
this.type = mappingCostantiToHazelcastInconsistent.get(this.engineType);
}
}
else if(Costanti.VALUE_MODALITA_IMPLEMENTAZIONE_REDIS.equals(this.impl)) {
if(Costanti.VALUE_MODALITA_CONTATORI_EXACT.equals(this.count)) {
this.type = mappingCostantiToRedisExact.get(this.engineType);
}
// else if(Costanti.VALUE_MODALITA_CONTATORI_APPROXIMATED.equals(this.count)) {
// this.type = mappingCostantiToRedisApprox.get(this.engineType);
// }
else if(Costanti.VALUE_MODALITA_CONTATORI_INCONSISTENT.equals(this.count)) {
this.type = mappingCostantiToRedisInconsistent.get(this.engineType);
}
}
}
}
if(all) {
initRuntimeInfoAll();
}
}
protected abstract void initRuntimeInfoAll() throws Exception;
public void saveIn(List<Proprieta> list) throws Exception {
this.initRuntimeInfo(false);
if(this.type!=null) {
list.add(newProprieta(Costanti.GESTORE, this.type.name()));
}
if(this.gestorePolicyConfigDate!=null) {
list.add(newProprieta(Costanti.GESTORE_CONFIG_DATE, this.gestorePolicyConfigDate.longValue()+""));
}
list.add(newProprieta(Costanti.MODALITA_SINCRONIZZAZIONE, this.syncMode));
if(this.impl!=null && StringUtils.isNotEmpty(this.impl)) {
list.add(newProprieta(Costanti.MODALITA_IMPLEMENTAZIONE, this.impl));
}
if(this.count!=null && StringUtils.isNotEmpty(this.count)) {
list.add(newProprieta(Costanti.MODALITA_CONTATORI, this.count));
}
if(this.engineType!=null && StringUtils.isNotEmpty(this.engineType)) {
list.add(newProprieta(Costanti.MODALITA_TIPOLOGIA, this.engineType));
}
list.add(newProprieta(Costanti.MODALITA_GENERAZIONE_HEADER_HTTP, this.httpMode));
if(this.httpMode_limit!=null && StringUtils.isNotEmpty(this.httpMode_limit)) {
list.add(newProprieta(Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_LIMIT, this.httpMode_limit));
}
if(this.httpMode_remaining!=null && StringUtils.isNotEmpty(this.httpMode_remaining)) {
list.add(newProprieta(Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_REMAINING, this.httpMode_remaining));
}
if(this.httpMode_reset!=null && StringUtils.isNotEmpty(this.httpMode_reset)) {
list.add(newProprieta(Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RESET, this.httpMode_reset));
}
if(this.httpMode_retry_after!=null && StringUtils.isNotEmpty(this.httpMode_retry_after)) {
list.add(newProprieta(Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RETRY_AFTER, this.httpMode_retry_after));
}
if(this.httpMode_retry_after_backoff!=null && StringUtils.isNotEmpty(this.httpMode_retry_after_backoff)) {
list.add(newProprieta(Costanti.MODALITA_GENERAZIONE_HEADER_HTTP_RETRY_AFTER_BACKOFF_SECONDS, this.httpMode_retry_after_backoff));
}
}
private Proprieta newProprieta(String nome, String valore) {
Proprieta p = new Proprieta();
p.setNome(nome);
p.setValore(valore);
return p;
}
public Long getGestorePolicyConfigDate() {
return this.gestorePolicyConfigDate;
}
public void setGestorePolicyConfigDate(Long gestorePolicyConfigDate) {
this.gestorePolicyConfigDate = gestorePolicyConfigDate;
}
public String getSyncMode() {
return this.syncMode;
}
public void setSyncMode(String syncMode) {
if(syncMode!=null && StringUtils.isNotEmpty(syncMode)) {
this.syncMode = syncMode;
}
else {
this.syncMode = Costanti.VALUE_MODALITA_SINCRONIZZAZIONE_DEFAULT;
}
}
public String getImpl() {
return this.impl;
}
public void setImpl(String impl) {
if(impl!=null && StringUtils.isNotEmpty(impl)) {
this.impl = impl;
}
else {
this.impl = null;
}
}
public String getCount() {
return this.count;
}
public void setCount(String count) {
if(count!=null && StringUtils.isNotEmpty(count)) {
this.count = count;
}
else {
this.count = null;
}
}
public String getEngineType() {
return this.engineType;
}
public void setEngineType(String engineType) {
if(engineType!=null && StringUtils.isNotEmpty(engineType)) {
this.engineType = engineType;
}
else {
this.engineType = null;
}
}
public String getHttpMode() {
return this.httpMode;
}
public void setHttpMode(String httpMode) {
if(httpMode!=null && StringUtils.isNotEmpty(httpMode)) {
this.httpMode = httpMode;
}
else {
this.httpMode = Costanti.VALUE_HTTP_HEADER_DEFAULT;
}
}
public String getHttpMode_limit() {
return this.httpMode_limit;
}
public void setHttpMode_limit(String httpMode_limit) {
if(httpMode_limit!=null && StringUtils.isNotEmpty(httpMode_limit)) {
this.httpMode_limit = httpMode_limit;
}
else {
this.httpMode_limit = null;
}
}
public String getHttpMode_remaining() {
return this.httpMode_remaining;
}
public void setHttpMode_remaining(String httpMode_remaining) {
if(httpMode_remaining!=null && StringUtils.isNotEmpty(httpMode_remaining)) {
this.httpMode_remaining = httpMode_remaining;
}
else {
this.httpMode_remaining = null;
}
}
public String getHttpMode_reset() {
return this.httpMode_reset;
}
public void setHttpMode_reset(String httpMode_reset) {
if(httpMode_reset!=null && StringUtils.isNotEmpty(httpMode_reset)) {
this.httpMode_reset = httpMode_reset;
}
else {
this.httpMode_reset = null;
}
}
public String getHttpMode_retry_after() {
return this.httpMode_retry_after;
}
public void setHttpMode_retry_after(String httpMode_retry_after) {
if(httpMode_retry_after!=null && StringUtils.isNotEmpty(httpMode_retry_after)) {
this.httpMode_retry_after = httpMode_retry_after;
}
else {
this.httpMode_retry_after = null;
}
}
public String getHttpMode_retry_after_backoff() {
return this.httpMode_retry_after_backoff;
}
public void setHttpMode_retry_after_backoff(String httpMode_retry_after_backoff) {
if(httpMode_retry_after_backoff!=null && StringUtils.isNotEmpty(httpMode_retry_after_backoff)) {
this.httpMode_retry_after_backoff = httpMode_retry_after_backoff;
}
else {
this.httpMode_retry_after_backoff = null;
}
}
public boolean isGestionePolicyRidefinita() {
return this.gestionePolicyRidefinita;
}
public PolicyGroupByActiveThreadsType getType() {
return this.type;
}
public boolean isLOCAL_DIVIDED_BY_NODES_remaining_zeroValue() {
return this.LOCAL_DIVIDED_BY_NODES_remaining_zeroValue;
}
public boolean isLOCAL_DIVIDED_BY_NODES_limit_roundingDown() {
return this.LOCAL_DIVIDED_BY_NODES_limit_roundingDown;
}
public boolean isLOCAL_DIVIDED_BY_NODES_limit_normalizedQuota() {
return this.LOCAL_DIVIDED_BY_NODES_limit_normalizedQuota;
}
public boolean isGestioneHttpHeadersRidefinita() {
return this.gestioneHttpHeadersRidefinita;
}
public boolean isDisabledHttpHeaders() {
return this.disabledHttpHeaders;
}
public boolean isDisabledHttpHeaders_limit() {
return this.disabledHttpHeaders_limit;
}
public boolean isForceHttpHeaders_limit_no_windows() {
return this.forceHttpHeaders_limit_no_windows;
}
public boolean isForceHttpHeaders_limit_windows() {
return this.forceHttpHeaders_limit_windows;
}
public boolean isDisabledHttpHeaders_remaining() {
return this.disabledHttpHeaders_remaining;
}
public boolean isDisabledHttpHeaders_reset() {
return this.disabledHttpHeaders_reset;
}
public boolean isDisabledHttpHeaders_retryAfter() {
return this.disabledHttpHeaders_retryAfter;
}
public boolean isForceDisabledHttpHeaders_retryAfter_backoff() {
return this.forceDisabledHttpHeaders_retryAfter_backoff;
}
public int getForceHttpHeaders_retryAfter_backoff() {
return this.forceHttpHeaders_retryAfter_backoff;
}
}