Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (c) 2017 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.ditto.connectivity.service.messaging.validation;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.concurrent.Immutable;
import org.eclipse.ditto.base.model.acks.AcknowledgementLabel;
import org.eclipse.ditto.base.model.acks.AcknowledgementLabelInvalidException;
import org.eclipse.ditto.base.model.acks.AcknowledgementLabelNotUniqueException;
import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel;
import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.connectivity.service.placeholders.ConnectivityPlaceholders;
import org.eclipse.ditto.connectivity.model.ClientCertificateCredentials;
import org.eclipse.ditto.connectivity.model.Connection;
import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException;
import org.eclipse.ditto.connectivity.model.ConnectionId;
import org.eclipse.ditto.connectivity.model.ConnectionType;
import org.eclipse.ditto.connectivity.model.Credentials;
import org.eclipse.ditto.connectivity.model.CredentialsVisitor;
import org.eclipse.ditto.connectivity.model.HmacCredentials;
import org.eclipse.ditto.connectivity.model.OAuthClientCredentials;
import org.eclipse.ditto.connectivity.model.PayloadMapping;
import org.eclipse.ditto.connectivity.model.Source;
import org.eclipse.ditto.connectivity.model.SshPublicKeyCredentials;
import org.eclipse.ditto.connectivity.model.Target;
import org.eclipse.ditto.connectivity.model.UserPasswordCredentials;
import org.eclipse.ditto.connectivity.service.config.ConnectionConfig;
import org.eclipse.ditto.connectivity.service.config.ConnectivityConfig;
import org.eclipse.ditto.connectivity.service.config.mapping.MapperLimitsConfig;
import org.eclipse.ditto.connectivity.service.messaging.internal.ssl.SSLContextCreator;
import org.eclipse.ditto.connectivity.service.messaging.monitoring.logs.ConnectionLogger;
import org.eclipse.ditto.placeholders.ExpressionResolver;
import org.eclipse.ditto.placeholders.PlaceholderFactory;
import org.eclipse.ditto.placeholders.TimePlaceholder;
import org.eclipse.ditto.protocol.placeholders.ResourcePlaceholder;
import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder;
import org.eclipse.ditto.rql.parser.RqlPredicateParser;
import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory;
import akka.actor.ActorSystem;
import akka.event.LoggingAdapter;
/**
* Validate a connection according to its type.
*/
@Immutable
public final class ConnectionValidator {
private final Map specMap;
private final QueryFilterCriteriaFactory queryFilterCriteriaFactory;
private final LoggingAdapter loggingAdapter;
private final ConnectivityConfig connectivityConfig;
private ConnectionValidator(LoggingAdapter loggingAdapter,
final ConnectivityConfig connectivityConfig,
final AbstractProtocolValidator... connectionSpecs) {
this.loggingAdapter = loggingAdapter;
this.connectivityConfig = connectivityConfig;
final Map theSpecMap = Arrays.stream(connectionSpecs)
.collect(Collectors.toMap(AbstractProtocolValidator::type, Function.identity()));
this.specMap = Collections.unmodifiableMap(theSpecMap);
queryFilterCriteriaFactory = QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance(),
TopicPathPlaceholder.getInstance(), ResourcePlaceholder.getInstance(), TimePlaceholder.getInstance());
}
/**
* Create a connection validator from connection specs.
*
* @param loggingAdapter a logging adapter
* @param connectivityConfig the connectivity config
* @param connectionSpecs specs of supported connection types.
* @return a connection validator.
*/
public static ConnectionValidator of(LoggingAdapter loggingAdapter, final ConnectivityConfig connectivityConfig,
final AbstractProtocolValidator... connectionSpecs) {
return new ConnectionValidator(loggingAdapter, connectivityConfig, connectionSpecs);
}
/**
* Read the declared acknowledgement labels of sources and the issued acknowledgement labels of targets
* and compute the set of acknowledgement labels the connection needs to declare.
*
* @param connection the connection.
* @return the set of acknowledgement labels to declare.
*/
public static Stream getAcknowledgementLabelsToDeclare(final Connection connection) {
final Stream sourceDeclaredAcks =
getSourceDeclaredAcknowledgementLabels(connection.getId(), connection.getSources());
final Stream targetIssuedAcks = getTargetIssuedAcknowledgementLabels(connection);
return Stream.concat(sourceDeclaredAcks, targetIssuedAcks);
}
private static Stream getTargetIssuedAcknowledgementLabels(final Connection connection) {
return getTargetIssuedAcknowledgementLabels(connection.getId(), connection.getTargets())
// live-response is permitted as issued acknowledgement without declaration
.filter(label -> !DittoAcknowledgementLabel.LIVE_RESPONSE.equals(label));
}
/**
* Read the declared acknowledgement labels of sources after placeholder resolution.
*
* @param connectionId the connection ID.
* @param sources the sources.
* @return the source declared acknowledgement labels.
*/
public static Stream getSourceDeclaredAcknowledgementLabels(
final ConnectionId connectionId,
final Collection