Skip to content

Commit

Permalink
Add verification for adding all definitions.
Browse files Browse the repository at this point in the history
Signed-off-by: Achim Kraus <achim.kraus@cloudcoap.net>
  • Loading branch information
boaks committed Jan 16, 2024
1 parent a0c619f commit 6052840
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.eclipse.californium.elements.EndpointIdentityResolver;
import org.eclipse.californium.elements.config.BooleanDefinition;
import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.DefinitionUtils;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
import org.eclipse.californium.elements.config.EnumDefinition;
import org.eclipse.californium.elements.config.FloatDefinition;
Expand Down Expand Up @@ -697,8 +698,9 @@ public enum CongestionControlMode {
* The {@link EndpointIdentityResolver} enables Californium to use a
* different remote identity instead of the inet-address to process states.
* For congestion control that may result in less good results, if an
* inet-address change, maybe caused by a NAT, also causes the quality of
* the ip-route.
* inet-address change, maybe caused by a NAT, also changes the quality of
* the ip-route. In such cases, it may be better to switch to inet-address
* based congestion control.
*
* @since 3.8
*/
Expand Down Expand Up @@ -827,6 +829,7 @@ public void applyDefinitions(Configuration config) {
config.set(MAX_RESOURCE_BODY_SIZE, DEFAULT_MAX_RESOURCE_BODY_SIZE);
config.set(BLOCKWISE_STATUS_LIFETIME, DEFAULT_BLOCKWISE_STATUS_LIFETIME_IN_SECONDS, TimeUnit.SECONDS);
config.set(BLOCKWISE_STATUS_INTERVAL, DEFAULT_BLOCKWISE_STATUS_INTERVAL_IN_SECONDS, TimeUnit.SECONDS);
config.set(BLOCKWISE_STRICT_BLOCK1_OPTION, DEFAULT_BLOCKWISE_STRICT_BLOCK1_OPTION);
config.set(BLOCKWISE_STRICT_BLOCK2_OPTION, DEFAULT_BLOCKWISE_STRICT_BLOCK2_OPTION);
config.set(BLOCKWISE_ENTITY_TOO_LARGE_AUTO_FAILOVER, DEFAULT_BLOCKWISE_ENTITY_TOO_LARGE_AUTO_FAILOVER);
config.set(BLOCKWISE_REUSE_TOKEN, false);
Expand All @@ -838,6 +841,7 @@ public void applyDefinitions(Configuration config) {
config.set(NOTIFICATION_REREGISTRATION_BACKOFF, 2000, TimeUnit.MILLISECONDS);

config.set(CONGESTION_CONTROL_ALGORITHM, CongestionControlMode.NULL);
config.set(CONGESTION_CONTROL_USE_INET_ADDRESS, false);
config.set(PROTOCOL_STAGE_THREAD_COUNT, CORES);

config.set(DEDUPLICATOR, DEFAULT_DEDUPLICATOR);
Expand All @@ -851,6 +855,7 @@ public void applyDefinitions(Configuration config) {
config.set(STRICT_EMPTY_MESSAGE_FORMAT, true);

config.set(MAX_SERVER_OBSERVES, DEFAULT_MAX_SERVER_OBSERVES);
DefinitionUtils.verify(CoapConfig.class, config);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import org.eclipse.californium.core.config.CoapConfig;
import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.DefinitionUtils;
import org.eclipse.californium.elements.config.SystemConfig;
import org.eclipse.californium.elements.config.TimeDefinition;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
Expand Down Expand Up @@ -108,7 +109,7 @@ public void applyDefinitions(Configuration config) {
config.set(HTTP_CONNECT_TIMEOUT, DEFAULT_HTTP_CONNECT_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
config.set(HTTP_VERSION_POLICY, HttpVersion.NEGOTIATE);
config.set(HTTPS_HANDSHAKE_TIMEOUT, DEFAULT_HTTPS_HANDSHAKE_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);

DefinitionUtils.verify(Proxy2Config.class, config);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1131,6 +1131,26 @@ public <T> Configuration setDeprecated(DocumentedDefinition<T> deprecatedDefinit
return this;
}

/**
* Check, if definitions is already available.
*
* Definitions are automatically added by their first use with one of the
* getter or setter. This checks, if the definition has been added before
* calling this method.
*
* @param <T> value type
* @param definition definition to check
* @return {@code true}, if available, {@code false}, if not.
* @throws NullPointerException if definition is {@code null}
* @since 3.11
*/
public <T> boolean hasDefinition(DocumentedDefinition<T> definition) {
if (definition == null) {
throw new NullPointerException("definition must not be null");
}
return definitions.get(definition.getKey()) != null;
}

/**
* Associates the specified textual value with the specified definition.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,20 @@
******************************************************************************/
package org.eclipse.californium.elements.config;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Collection of utility functions for {@link DocumentedDefinition}.
*
* @since 3.0
*/
public class DefinitionUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(DefinitionUtils.class);

/**
* Get element class from array of enumeration values.
Expand Down Expand Up @@ -124,4 +130,33 @@ public static <E extends Enum<?>> E toValue(String text, List<E> values) {
return null;
}

/**
* Verify, if all declared {@link DocumentedDefinition} fields in the
* provided class are available in the configuration.
*
* @param definitionClz class with {@code static final}
* {@link DocumentedDefinition} fields.
* @param config configuration to check, if fields are available.
* @since 3.11
*/
public static void verify(Class<?> definitionClz, Configuration config) {
Field[] declaredFields = definitionClz.getDeclaredFields();
for (Field field : declaredFields) {
int modifiers = field.getModifiers();
if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
try {
Object value = field.get(null);
if (value instanceof DocumentedDefinition<?>) {
DocumentedDefinition<?> definition = (DocumentedDefinition<?>) value;
if (!config.hasDefinition(definition)) {
LOGGER.warn("Missing definition {} in {}.", definition.getKey(),
definitionClz.getSimpleName());
}
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public void applyDefinitions(Configuration config) {

// 0 for disable
config.set(HEALTH_STATUS_INTERVAL, 0, TimeUnit.SECONDS);

DefinitionUtils.verify(SystemConfig.class, config);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ public void applyDefinitions(Configuration config) {
config.set(TLS_SESSION_TIMEOUT, 1, TimeUnit.HOURS);
config.set(TLS_CLIENT_AUTHENTICATION_MODE, CertificateAuthenticationMode.WANTED);
config.set(TLS_VERIFY_SERVER_CERTIFICATES_SUBJECT, true);
DefinitionUtils.verify(TcpConfig.class, config);
}

};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ public void applyDefinitions(Configuration config) {
config.set(UDP_RECEIVE_BUFFER_SIZE, null);
config.set(UDP_SEND_BUFFER_SIZE, null);
config.set(UDP_CONNECTOR_OUT_CAPACITY, Integer.MAX_VALUE);
DefinitionUtils.verify(UdpConfig.class, config);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.eclipse.californium.elements.config.CertificateAuthenticationMode;
import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
import org.eclipse.californium.elements.config.DefinitionUtils;
import org.eclipse.californium.elements.config.EnumDefinition;
import org.eclipse.californium.elements.config.EnumListDefinition;
import org.eclipse.californium.elements.config.FloatDefinition;
Expand Down Expand Up @@ -1133,6 +1134,8 @@ public void applyDefinitions(Configuration config) {
config.set(DTLS_MAC_ERROR_FILTER_THRESHOLD, 0);
config.set(DTLS_SECURE_RENEGOTIATION, DEFAULT_SECURE_RENEGOTIATION);
config.set(DTLS_SUPPORT_KEY_MATERIAL_EXPORT, false);

DefinitionUtils.verify(DtlsConfig.class, config);
}
};

Expand Down

0 comments on commit 6052840

Please sign in to comment.