Skip to content

Commit

Permalink
eclipse-leshanGH-1395: Add Builder to Server/BootstrapServer Endpoint…
Browse files Browse the repository at this point in the history
…Factory.
  • Loading branch information
sbernard31 authored and Warmek committed Mar 28, 2023
1 parent 92c1f02 commit 7b8c4d9
Show file tree
Hide file tree
Showing 13 changed files with 542 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,20 @@

import java.net.InetSocketAddress;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

import org.eclipse.californium.core.config.CoapConfig;
import org.eclipse.californium.core.config.CoapConfig.TrackerMode;
import org.eclipse.californium.core.network.CoapEndpoint;
import org.eclipse.californium.core.network.CoapEndpoint.Builder;
import org.eclipse.californium.elements.Connector;
import org.eclipse.californium.elements.UDPConnector;
import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
import org.eclipse.californium.elements.config.SystemConfig;
import org.eclipse.californium.elements.config.UdpConfig;
import org.eclipse.leshan.core.californium.DefaultExceptionTranslator;
import org.eclipse.leshan.core.californium.ExceptionTranslator;
import org.eclipse.leshan.core.californium.identity.DefaultCoapIdentityHandler;
Expand All @@ -35,21 +43,41 @@

public class CoapBootstrapServerEndpointFactory implements CaliforniumBootstrapServerEndpointFactory {

public static Protocol getSupportedProtocol() {
return Protocol.COAP;
}

public static void applyDefaultValue(Configuration configuration) {
configuration.set(CoapConfig.MID_TRACKER, TrackerMode.NULL);
}

public static List<ModuleDefinitionsProvider> getModuleDefinitionsProviders() {
return Arrays.asList(SystemConfig.DEFINITIONS, CoapConfig.DEFINITIONS, UdpConfig.DEFINITIONS);
}

protected final URI endpointUri;
protected final String loggingTagPrefix;
protected URI endpointUri = null;
protected final Configuration configuration;
protected final Consumer<CoapEndpoint.Builder> coapEndpointConfigInitializer;

public CoapBootstrapServerEndpointFactory(URI uri) {
this(uri, "Bootstrap Server");
this(uri, null, null, null);
}

public CoapBootstrapServerEndpointFactory(URI uri, String loggingTagPrefix) {
public CoapBootstrapServerEndpointFactory(URI uri, String loggingTagPrefix, Configuration configuration,
Consumer<Builder> coapEndpointConfigInitializer) {
EndpointUriUtil.validateURI(uri);

this.endpointUri = uri;
this.loggingTagPrefix = loggingTagPrefix;
this.loggingTagPrefix = loggingTagPrefix == null ? "Bootstrap Server" : loggingTagPrefix;
this.configuration = configuration;
this.coapEndpointConfigInitializer = coapEndpointConfigInitializer;

}

@Override
public Protocol getProtocol() {
return Protocol.COAP;
return getSupportedProtocol();
}

@Override
Expand All @@ -68,7 +96,18 @@ protected String getLoggingTag() {
@Override
public CoapEndpoint createCoapEndpoint(Configuration defaultConfiguration, ServerSecurityInfo serverSecurityInfo,
LeshanBootstrapServer server) {
return createEndpointBuilder(EndpointUriUtil.getSocketAddr(endpointUri), defaultConfiguration, server).build();

// defined Configuration to use
Configuration configurationToUse;
if (configuration == null) {
// if specific configuration for this endpoint is null, used the default one which is the coapServer
// Configuration shared with all endpoints by default.
configurationToUse = defaultConfiguration;
} else {
configurationToUse = configuration;
}

return createEndpointBuilder(EndpointUriUtil.getSocketAddr(endpointUri), configurationToUse, server).build();
}

/**
Expand All @@ -85,6 +124,10 @@ protected CoapEndpoint.Builder createEndpointBuilder(InetSocketAddress address,
builder.setConnector(createConnector(address, coapConfig));
builder.setConfiguration(coapConfig);
builder.setLoggingTag(getLoggingTag());

if (coapEndpointConfigInitializer != null)
coapEndpointConfigInitializer.accept(builder);

return builder;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*******************************************************************************
* Copyright (c) 2023 Sierra Wireless and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v20.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.html.
*
* Contributors:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.leshan.server.californium.bootstrap.endpoint.coap;

import java.util.List;

import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
import org.eclipse.leshan.core.endpoint.Protocol;
import org.eclipse.leshan.server.californium.endpoint.AbstractEndpointFactoryBuilder;
import org.eclipse.leshan.server.californium.endpoint.coap.CoapServerEndpointFactory;

public class CoapBootstrapServerEndpointFactoryBuilder extends
AbstractEndpointFactoryBuilder<CoapBootstrapServerEndpointFactoryBuilder, CoapBootstrapServerEndpointFactory> {

@Override
protected Protocol getSupportedProtocol() {
return CoapServerEndpointFactory.getSupportedProtocol();
}

@Override
public void applyDefaultValue(Configuration configuration) {
CoapServerEndpointFactory.applyDefaultValue(configuration);

}

@Override
public List<ModuleDefinitionsProvider> getModuleDefinitionsProviders() {
return CoapServerEndpointFactory.getModuleDefinitionsProviders();
}

@Override
public CoapBootstrapServerEndpointFactory build() {
return new CoapBootstrapServerEndpointFactory(uri, loggingTagPrefix, configuration,
coapEndpointConfigInitializer);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,11 @@

import java.net.InetSocketAddress;
import java.net.URI;
import java.util.Arrays;
import java.util.List;

import org.eclipse.californium.core.config.CoapConfig;
import org.eclipse.californium.core.config.CoapConfig.TrackerMode;
import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
import org.eclipse.californium.elements.config.SystemConfig;
import org.eclipse.californium.elements.config.UdpConfig;
import org.eclipse.leshan.core.endpoint.EndpointUriUtil;
import org.eclipse.leshan.core.endpoint.Protocol;
import org.eclipse.leshan.server.californium.bootstrap.endpoint.BootstrapServerProtocolProvider;
Expand All @@ -35,17 +31,17 @@ public class CoapBootstrapServerProtocolProvider implements BootstrapServerProto

@Override
public Protocol getProtocol() {
return Protocol.COAP;
return CoapBootstrapServerEndpointFactory.getSupportedProtocol();
}

@Override
public void applyDefaultValue(Configuration configuration) {
configuration.set(CoapConfig.MID_TRACKER, TrackerMode.NULL);
CoapBootstrapServerEndpointFactory.applyDefaultValue(configuration);
}

@Override
public List<ModuleDefinitionsProvider> getModuleDefinitionsProviders() {
return Arrays.asList(SystemConfig.DEFINITIONS, CoapConfig.DEFINITIONS, UdpConfig.DEFINITIONS);
return CoapBootstrapServerEndpointFactory.getModuleDefinitionsProviders();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@
import java.net.URI;
import java.security.Principal;
import java.security.PublicKey;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

import javax.security.auth.x500.X500Principal;

import org.eclipse.californium.core.coap.Message;
import org.eclipse.californium.core.coap.Request;
import org.eclipse.californium.core.config.CoapConfig;
import org.eclipse.californium.core.config.CoapConfig.TrackerMode;
import org.eclipse.californium.core.network.CoapEndpoint;
import org.eclipse.californium.core.network.CoapEndpoint.Builder;
import org.eclipse.californium.elements.AddressEndpointContext;
Expand All @@ -39,8 +43,12 @@
import org.eclipse.californium.elements.auth.RawPublicKeyIdentity;
import org.eclipse.californium.elements.auth.X509CertPath;
import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
import org.eclipse.californium.elements.config.SystemConfig;
import org.eclipse.californium.elements.config.UdpConfig;
import org.eclipse.californium.scandium.DTLSConnector;
import org.eclipse.californium.scandium.config.DtlsConfig;
import org.eclipse.californium.scandium.config.DtlsConfig.DtlsRole;
import org.eclipse.californium.scandium.config.DtlsConnectorConfig;
import org.eclipse.californium.scandium.dtls.CertificateType;
import org.eclipse.californium.scandium.dtls.DtlsHandshakeTimeoutException;
Expand Down Expand Up @@ -68,21 +76,45 @@ public class CoapsBootstrapServerEndpointFactory implements CaliforniumBootstrap

private static final Logger LOG = LoggerFactory.getLogger(CoapsBootstrapServerEndpointFactory.class);

public static Protocol getSupportedProtocol() {
return Protocol.COAPS;
}

public static void applyDefaultValue(Configuration configuration) {
configuration.set(CoapConfig.MID_TRACKER, TrackerMode.NULL);
configuration.set(DtlsConfig.DTLS_ROLE, DtlsRole.SERVER_ONLY);
}

public static List<ModuleDefinitionsProvider> getModuleDefinitionsProviders() {
return Arrays.asList(SystemConfig.DEFINITIONS, CoapConfig.DEFINITIONS, UdpConfig.DEFINITIONS,
DtlsConfig.DEFINITIONS);
}

protected final URI endpointUri;
protected final String loggingTagPrefix;
protected URI endpointUri = null;
protected final Configuration configuration;
protected final Consumer<DtlsConnectorConfig.Builder> dtlsConnectorConfigInitializer;
protected final Consumer<CoapEndpoint.Builder> coapEndpointConfigInitializer;

public CoapsBootstrapServerEndpointFactory(URI uri) {
this(uri, "Bootstrap Server");
this(uri, null, null, null, null);
}

public CoapsBootstrapServerEndpointFactory(URI uri, String loggingTagPrefix) {
public CoapsBootstrapServerEndpointFactory(URI uri, String loggingTagPrefix, Configuration configuration,
Consumer<org.eclipse.californium.scandium.config.DtlsConnectorConfig.Builder> dtlsConnectorConfigInitializer,
Consumer<Builder> coapEndpointConfigInitializer) {
EndpointUriUtil.validateURI(uri);

this.endpointUri = uri;
this.loggingTagPrefix = loggingTagPrefix;
this.loggingTagPrefix = loggingTagPrefix == null ? "Bootstrap Server" : loggingTagPrefix;
this.configuration = configuration;
this.dtlsConnectorConfigInitializer = dtlsConnectorConfigInitializer;
this.coapEndpointConfigInitializer = coapEndpointConfigInitializer;
}

@Override
public Protocol getProtocol() {
return Protocol.COAPS;
return getSupportedProtocol();
}

@Override
Expand All @@ -106,8 +138,18 @@ public CoapEndpoint createCoapEndpoint(Configuration defaultConfiguration, Serve
return null;
}

// defined Configuration to use
Configuration configurationToUse;
if (configuration == null) {
// if specific configuration for this endpoint is null, used the default one which is the coapServer
// Configuration shared with all endpoints by default.
configurationToUse = defaultConfiguration;
} else {
configurationToUse = configuration;
}

// create DTLS connector Config
DtlsConnectorConfig.Builder dtlsConfigBuilder = createDtlsConnectorConfigBuilder(defaultConfiguration);
DtlsConnectorConfig.Builder dtlsConfigBuilder = createDtlsConnectorConfigBuilder(configurationToUse);
setUpDtlsConfig(dtlsConfigBuilder, EndpointUriUtil.getSocketAddr(endpointUri), serverSecurityInfo, server);
DtlsConnectorConfig dtlsConfig;
try {
Expand All @@ -118,13 +160,16 @@ public CoapEndpoint createCoapEndpoint(Configuration defaultConfiguration, Serve
}

// create CoAP endpoint
CoapEndpoint endpoint = createEndpointBuilder(dtlsConfig, defaultConfiguration).build();
CoapEndpoint endpoint = createEndpointBuilder(dtlsConfig, configurationToUse).build();

return endpoint;
}

protected DtlsConnectorConfig.Builder createDtlsConnectorConfigBuilder(Configuration configuration) {
return new DtlsConnectorConfig.Builder(configuration);
DtlsConnectorConfig.Builder builder = new DtlsConnectorConfig.Builder(configuration);
if (dtlsConnectorConfigInitializer != null)
dtlsConnectorConfigInitializer.accept(builder);
return builder;
}

protected void setUpDtlsConfig(DtlsConnectorConfig.Builder dtlsConfigBuilder, InetSocketAddress address,
Expand Down Expand Up @@ -215,6 +260,9 @@ protected CoapEndpoint.Builder createEndpointBuilder(DtlsConnectorConfig dtlsCon
builder.setConfiguration(coapConfig);
builder.setLoggingTag(getLoggingTag());
builder.setEndpointContextMatcher(createEndpointContextMatcher());

if (coapEndpointConfigInitializer != null)
coapEndpointConfigInitializer.accept(builder);
return builder;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*******************************************************************************
* Copyright (c) 2023 Sierra Wireless and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v20.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.html.
*
* Contributors:
* Sierra Wireless - initial API and implementation
*******************************************************************************/
package org.eclipse.leshan.server.californium.bootstrap.endpoint.coaps;

import java.util.List;
import java.util.function.Consumer;

import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.elements.config.Configuration.ModuleDefinitionsProvider;
import org.eclipse.californium.scandium.config.DtlsConnectorConfig;
import org.eclipse.leshan.core.endpoint.Protocol;
import org.eclipse.leshan.server.californium.endpoint.AbstractEndpointFactoryBuilder;

public class CoapsBootstrapServerEndpointFactoryBuilder extends
AbstractEndpointFactoryBuilder<CoapsBootstrapServerEndpointFactoryBuilder, CoapsBootstrapServerEndpointFactory> {

protected Consumer<DtlsConnectorConfig.Builder> dtlsConnectorConfigInitializer;

@Override
protected Protocol getSupportedProtocol() {
return CoapsBootstrapServerEndpointFactory.getSupportedProtocol();
}

@Override
public void applyDefaultValue(Configuration configuration) {
CoapsBootstrapServerEndpointFactory.applyDefaultValue(configuration);

}

@Override
public List<ModuleDefinitionsProvider> getModuleDefinitionsProviders() {
return CoapsBootstrapServerEndpointFactory.getModuleDefinitionsProviders();
}

public CoapsBootstrapServerEndpointFactoryBuilder setDtlsConnectorConfig(
Consumer<DtlsConnectorConfig.Builder> dtlsConnectorConfigInitializer) {
this.dtlsConnectorConfigInitializer = dtlsConnectorConfigInitializer;
return this;
}

@Override
public CoapsBootstrapServerEndpointFactory build() {
return new CoapsBootstrapServerEndpointFactory(uri, loggingTagPrefix, configuration,
dtlsConnectorConfigInitializer, coapEndpointConfigInitializer);
}
}
Loading

0 comments on commit 7b8c4d9

Please sign in to comment.