Skip to content

Commit

Permalink
restructure adapters to avoid unnecessary casts
Browse files Browse the repository at this point in the history
Signed-off-by: Dominik Guggemos <dominik.guggemos@bosch-si.com>
  • Loading branch information
dguggemos committed Jan 17, 2020
1 parent de1ca2a commit ebef79a
Show file tree
Hide file tree
Showing 64 changed files with 994 additions and 686 deletions.
Expand Up @@ -17,23 +17,23 @@

import java.util.Map;

import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonParseException;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.model.base.common.HttpStatusCode;
import org.eclipse.ditto.model.base.exceptions.DittoJsonException;
import org.eclipse.ditto.model.base.headers.DittoHeaders;
import org.eclipse.ditto.model.base.headers.DittoHeadersBuilder;
import org.eclipse.ditto.model.base.json.Jsonifiable;
import org.eclipse.ditto.model.messages.MessageHeaderDefinition;
import org.eclipse.ditto.model.things.ThingDefinition;
import org.eclipse.ditto.model.things.ThingId;
import org.eclipse.ditto.model.things.ThingsModelFactory;

/**
* Abstract implementation of {@link Adapter} to provide common functionality.
*/
abstract class AbstractAdapter<T extends Jsonifiable> implements Adapter<T> {
public abstract class AbstractAdapter<T extends Jsonifiable.WithPredicate<JsonObject, JsonField>>
implements Adapter<T> {

private final Map<String, JsonifiableMapper<T>> mappingStrategies;
private final HeaderTranslator headerTranslator;
Expand Down Expand Up @@ -140,7 +140,7 @@ private static DittoHeaders addTopicPathInfo(final DittoHeaders filteredHeaders,
* @return headers containing extra information from topic path.
*/
private static DittoHeaders mapTopicPathToHeaders(final TopicPath topicPath) {
final DittoHeadersBuilder headersBuilder = DittoHeaders.newBuilder();
final DittoHeadersBuilder<?, ?> headersBuilder = DittoHeaders.newBuilder();
if (topicPath.getNamespace() != null && topicPath.getId() != null) {
// add thing ID for known topic-paths for error reporting.
headersBuilder.putHeader(MessageHeaderDefinition.THING_ID.getKey(),
Expand Down

This file was deleted.

Expand Up @@ -26,12 +26,12 @@
/**
* Adapter for mapping a {@link ErrorResponse} to and from an {@link Adaptable}.
*/
abstract class AbstractErrorResponseAdapter<T extends ErrorResponse<T>> implements Adapter<T> {
public abstract class AbstractErrorResponseAdapter<T extends ErrorResponse<T>> implements Adapter<T> {

private final HeaderTranslator headerTranslator;
private final ErrorRegistry<DittoRuntimeException> errorRegistry;

AbstractErrorResponseAdapter(final HeaderTranslator headerTranslator,
protected AbstractErrorResponseAdapter(final HeaderTranslator headerTranslator,
final ErrorRegistry<DittoRuntimeException> errorRegistry) {
this.headerTranslator = headerTranslator;
this.errorRegistry = errorRegistry;
Expand Down Expand Up @@ -90,9 +90,9 @@ public Adaptable toAdaptable(final T errorResponse, final TopicPath.Channel chan
}

// TODO javadoc
abstract TopicPathBuilder getTopicPathBuilder(final T errorResponse);
public abstract TopicPathBuilder getTopicPathBuilder(final T errorResponse);

// TODO javadoc
abstract T buildErrorResponse(final TopicPath topicPath, final DittoRuntimeException exception,
public abstract T buildErrorResponse(final TopicPath topicPath, final DittoRuntimeException exception,
final DittoHeaders dittoHeaders);
}
Expand Up @@ -19,7 +19,7 @@
*
* @param <T> the type mapped by this {@code Adapter}.
*/
public interface Adapter<T extends Jsonifiable> {
public interface Adapter<T extends Jsonifiable<?>> {

/**
* Maps the given {@code adaptable} to it's corresponding {@code T}.
Expand Down
Expand Up @@ -13,10 +13,6 @@
package org.eclipse.ditto.protocoladapter;

import org.eclipse.ditto.signals.base.Signal;
import org.eclipse.ditto.signals.commands.base.CommandResponse;
import org.eclipse.ditto.signals.commands.base.ErrorResponse;
import org.eclipse.ditto.signals.commands.messages.MessageCommand;
import org.eclipse.ditto.signals.events.base.Event;

/**
* Resolves the propert {@link Adapter} for the given {@link Adaptable}. Subclasses should extend the abstract class
Expand All @@ -25,52 +21,12 @@
*/
interface AdapterResolver {

/**
* @return the query command adapter
*/
Adapter<? extends Signal> getQueryCommandAdapter();

/**
* @return the query command response adapter
*/
Adapter<? extends CommandResponse> getQueryCommandResponseAdapter();

/**
* @return the modify command adapter
*/
Adapter<? extends Signal> getModifyCommandAdapter();

/**
* @return the modify command response adapter
*/
Adapter<? extends CommandResponse> getModifyCommandResponseAdapter();

/**
* @return the message command adapter
*/
Adapter<? extends MessageCommand> getMessageCommandAdapter();

/**
* @return the message command response adapter
*/
Adapter<? extends Signal> getMessageCommandResponseAdapter();

/**
* @return the event adapter
*/
Adapter<? extends Event<?>> getEventAdapter();

/**
* @return the error response adapter
*/
Adapter<? extends ErrorResponse> getErrorResponseAdapter();

/**
* Select the correct {@link Adapter} for the given {@link Adaptable}.
*
* @param adaptable the adaptable that is converted to a {@link Signal}
* @return the appropriate {@link Adaptable} capable of converting the {@link Adaptable} to a {@link Signal}
*/
Adapter<? extends Signal> getAdapter(final Adaptable adaptable);
Adapter<? extends Signal<?>> getAdapter(final Adaptable adaptable);

}
@@ -0,0 +1,65 @@
/*
* Copyright (c) 2019 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.protocoladapter;

import java.util.Collections;
import java.util.Map;
import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.ditto.json.JsonPointer;

/**
* Utility class for matching {@link Payload} path.
* TODO test
*/
public final class DefaultPathMatcher implements PathMatcher {

private final Map<String, Pattern> patterns;

private DefaultPathMatcher(final Map<String, Pattern> patterns) {
this.patterns = patterns;
}

public static PathMatcher from(final Map<String, Pattern> patterns) {
return new DefaultPathMatcher(patterns);
}

public static PathMatcher empty() {
return new DefaultPathMatcher(Collections.emptyMap());
}

/**
* Matches a given {@code path} against known schemes and returns the corresponding entity name.
*
* @param path the path to match.
* @return the entity name which matched.
* @throws UnknownPathException if {@code path} matched no known scheme.
*/
@Override
public String match(final JsonPointer path) {
final Predicate<Map.Entry<String, Pattern>> pathMatchesPattern = entry -> {
final Pattern pattern = entry.getValue();
final Matcher matcher = pattern.matcher(path);
return matcher.matches();
};

return patterns.entrySet()
.stream()
.filter(pathMatchesPattern)
.findFirst()
.map(Map.Entry::getKey)
.orElseThrow(() -> UnknownPathException.newBuilder(path).build());
}
}

0 comments on commit ebef79a

Please sign in to comment.