Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ public int handleExecutionException(
CommandLine cmd,
CommandLine.ParseResult parseResult
) {

cmd.getErr().println(cmd.getColorScheme().errorText(ex.getMessage()));
if (ex.getCause() != null) {
cmd.getErr().println(cmd.getColorScheme().errorText(ex.getCause().getMessage()));
Throwable cause = ex;
while (cause != null) {
cmd.getErr().println(cmd.getColorScheme().errorText(cause.getMessage()));
cause = cause.getCause();
}

return cmd.getExitCodeExceptionMapper() != null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
import com.here.naksha.cli.loggers.LoggingMixin;
import com.here.naksha.cli.parsers.JsonFileParser;
import com.here.naksha.cli.parsers.JsonFileParserException;
import com.here.naksha.cli.results.CommandFailure;
import com.here.naksha.cli.results.CommandResult;
import com.here.naksha.cli.results.CommandSuccess;
import com.here.naksha.cli.results.FailureResult;
import com.here.naksha.cli.results.Result;
import com.here.naksha.cli.results.SuccessResult;
import naksha.model.NakshaContext;
import naksha.model.SessionOptions;
import naksha.model.objects.NakshaStorage;
Expand Down Expand Up @@ -102,11 +102,13 @@ public Integer call() throws JsonFileParserException, CopyServiceException {

NakshaContext.currentContext().withAppId("nakshacli");
SessionOptions sessionOptions = SessionOptions.from(NakshaContext.currentContext());
CommandResult<CopyServiceSuccessResultPayload, CopyServiceException> copyResult = copy(

Result<CopyServiceSuccessResultPayload, CopyServiceException> copyResult = copy(
srcCopyElement,
targetCopyElement,
sessionOptions
);

CopyServiceSuccessResultPayload resultPayload = requireSuccessResultAndGetPayload(copyResult);

PrintWriter commandLineOut = getCommandLineOut();
Expand Down Expand Up @@ -134,11 +136,11 @@ private String buildCopySuccessMessage(
}

private CopyServiceSuccessResultPayload requireSuccessResultAndGetPayload(
CommandResult<CopyServiceSuccessResultPayload, CopyServiceException> copyResult
Result<CopyServiceSuccessResultPayload, CopyServiceException> copyResult
) throws CopyServiceException {
return switch (copyResult) {
case CommandFailure(CopyServiceException exception) -> throw exception;
case CommandSuccess(CopyServiceSuccessResultPayload payload) -> payload;
case FailureResult(CopyServiceException exception) -> throw exception;
case SuccessResult(CopyServiceSuccessResultPayload payload) -> payload;
};
}

Expand All @@ -158,7 +160,7 @@ private CopyElement buildTargetCopyElement() throws JsonFileParserException {
.build();
}

private CommandResult<CopyServiceSuccessResultPayload, CopyServiceException> copy(
private Result<CopyServiceSuccessResultPayload, CopyServiceException> copy(
CopyElement srcCopyElement,
CopyElement targetCopyElement,
SessionOptions sessionOptions
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.here.naksha.cli.copy.service;

import com.here.naksha.cli.results.CommandFailure;
import com.here.naksha.cli.results.CommandResult;
import com.here.naksha.cli.results.CommandSuccess;
import com.here.naksha.cli.results.FailureResult;
import com.here.naksha.cli.results.Result;
import com.here.naksha.cli.results.SuccessResult;
import naksha.base.StringList;
import naksha.model.IStorage;
import naksha.model.NakshaError;
Expand Down Expand Up @@ -35,7 +35,7 @@ public CopyService(
}

@NotNull
public CommandResult<CopyServiceSuccessResultPayload, CopyServiceException> copy(
public Result<CopyServiceSuccessResultPayload, CopyServiceException> copy(
@NotNull CopyElement src,
@NotNull CopyElement target,
boolean autoCreateTarget
Expand All @@ -47,9 +47,9 @@ public CommandResult<CopyServiceSuccessResultPayload, CopyServiceException> copy
}
List<NakshaFeature> features = readFeaturesFromSrc(src);
writeFeaturesToTarget(features, target, targetStorage);
return new CommandSuccess<>(buildSuccessResultPayload(features));
return new SuccessResult<>(buildSuccessResultPayload(features));
} catch (CopyServiceException exception) {
return new CommandFailure<>(exception);
return new FailureResult<>(exception);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import naksha.base.Platform;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.nio.file.FileSystemException;
import java.nio.file.Files;
import java.nio.file.Path;

Expand All @@ -12,28 +14,18 @@
public final class JsonFileParser {
@NotNull
public <T> T parse(@NotNull Path path, @NotNull Class<T> clazz) throws JsonFileParserException {
requireFileExists(path);
requireIsRegularFile(path);
String json = readFile(path);
Object raw = parseJsonToObject(json, path);
return box(raw, clazz, path);
}

private void requireFileExists(Path path) throws JsonFileParserException {
if (!Files.exists(path)) {
throw new JsonFileParserException("File does not exist!", path);
}
}

private void requireIsRegularFile(Path path) throws JsonFileParserException {
if (!Files.isRegularFile(path)) {
throw new JsonFileParserException("It is not a file!", path);
}
}

private String readFile(Path path) throws JsonFileParserException {
try {
return Files.readString(path);
} catch (FileSystemException e) {
throw new JsonFileParserException("Problem with reading! " + e.getClass().getSimpleName(), path);
} catch (IOException e) {
throw new JsonFileParserException("Problem with reading! " + e.getMessage(), path);
} catch (Exception e) {
throw new JsonFileParserException("Problem with reading!", path, e);
}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.here.naksha.cli.results;

public record FailureResult<T, S>(S payload) implements Result<T, S> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.here.naksha.cli.results;

/**
* @param <T> type of {@link SuccessResult}'s payload
* @param <S> type of {@link FailureResult}'s payload
*/
public sealed interface Result<T, S> permits SuccessResult, FailureResult {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.here.naksha.cli.results;

public record SuccessResult<T, S>(T payload) implements Result<T, S> {
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.here.naksha.cli.storages;

import com.here.naksha.cli.validations.exceptions.FieldValidationException;
import naksha.model.*;
import naksha.model.objects.NakshaCollection;
import naksha.model.objects.NakshaFeature;
Expand Down Expand Up @@ -30,6 +31,7 @@ final class GeneratingSession implements IReadSession {
public Response execute(@NotNull Request request) {
GeneratingStorageService service = storage.getService();
GeneratingStorageConfig config = storage.getConfig();
requireValidConfig(config);
List<NakshaFeature> generatedFeatures = service.generateFeatures(config.getProperties());
return new SuccessResponse(generatedFeatures);
}
Expand Down Expand Up @@ -125,4 +127,12 @@ public void loadTuples(@NotNull List<? extends FeatureTuple> featureTuples) {
public void loadTuples(@NotNull List<? extends FeatureTuple> featureTuples, int from, int to, int mode) {
throw new NakshaException(NakshaError.UNSUPPORTED_OPERATION, "");
}

private void requireValidConfig(GeneratingStorageConfig config) {
try {
config.validateFields();
} catch (FieldValidationException e) {
throw new NakshaException(NakshaError.EXCEPTION, "Generating storage config is invalid!", e);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package com.here.naksha.cli.storages;

import com.here.naksha.cli.validations.Validator;
import com.here.naksha.cli.validations.exceptions.FieldValidationException;
import naksha.base.AnyMap;
import naksha.base.JvmBoxingUtil;
import naksha.model.objects.NakshaProperties;
import naksha.model.objects.NakshaStorage;
import org.jetbrains.annotations.NotNull;

import static com.here.naksha.cli.validations.ValidatorUtils.requireValidArgument;
import static com.here.naksha.cli.validations.ValidatorUtils.requireValidField;
import static com.here.naksha.cli.validations.Validators.canBeBoxed;
import static com.here.naksha.cli.validations.Validators.isNotNull;
import static java.util.Objects.requireNonNull;

public final class GeneratingStorageConfig extends NakshaStorage {
Expand All @@ -12,4 +20,36 @@ public final class GeneratingStorageConfig extends NakshaStorage {
public GeneratingStorageConfigProperties getProperties() {
return requireNonNull(JvmBoxingUtil.box(super.getProperties(), GeneratingStorageConfigProperties.class));
}

@Override
public void setProperties(@NotNull NakshaProperties generatingStorageConfigProperties) {
requireValidArgument(propertiesFieldValidator.validate(generatingStorageConfigProperties));
super.setProperties(generatingStorageConfigProperties);
}

@Override
@NotNull
public GeneratingStorageConfig withProperties(@NotNull NakshaProperties generatingStorageConfigProperties) {
setProperties(generatingStorageConfigProperties);
return this;
}

@Override
public void onCreation() {
super.onCreation();
setRaw(PROPERTIES_KEY, new GeneratingStorageConfigProperties());
}

public void validateFields() throws FieldValidationException {
AnyMap map = requireNonNull(JvmBoxingUtil.box(platformObject(), AnyMap.class));
validatePropertiesField(map);
}

private final Validator<Object, GeneratingStorageConfigProperties> propertiesFieldValidator = isNotNull()
.and(canBeBoxed(GeneratingStorageConfigProperties.class));

private void validatePropertiesField(AnyMap map) throws FieldValidationException {
requireValidField(PROPERTIES_KEY, map, propertiesFieldValidator);
getProperties().validateFields();
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,41 @@
package com.here.naksha.cli.storages;

import naksha.base.JvmBoxingUtil;
import naksha.base.JvmList;
import naksha.base.StringList;
import com.here.naksha.cli.validations.Validator;
import com.here.naksha.cli.validations.exceptions.FieldValidationException;
import naksha.base.*;
import naksha.model.objects.NakshaProperties;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static com.here.naksha.cli.validations.ValidatorUtils.requireValidArgument;
import static com.here.naksha.cli.validations.ValidatorUtils.requireValidField;
import static com.here.naksha.cli.validations.Validators.*;
import static java.util.Objects.requireNonNull;

public final class GeneratingStorageConfigProperties extends NakshaProperties {
private static final String COUNT_KEY = "count";
private static final String IDS_PREFIX_KEY = "idsPrefix";
private static final String TILE_IDS_KEY = "tileIds";
private static final String TILE_IDS_CSV_FILE_PATH_KEY = "tileIdsCsvFile";
private static final String FEATURE_TEMPLATE_FILE_PATH_KEY = "featureTemplateFile";
public static final String COUNT_KEY = "count";
public static final String IDS_PREFIX_KEY = "idsPrefix";
public static final String TILE_IDS_KEY = "tileIds";
public static final String TILE_IDS_CSV_FILE_PATH_KEY = "tileIdsCsvFile";
public static final String FEATURE_TEMPLATE_FILE_PATH_KEY = "featureTemplateFile";

@Override
public void onCreation() {
super.onCreation();
setRaw(COUNT_KEY, 0);
}

@Nullable
public Integer getCount() {
return (Integer) getRaw(COUNT_KEY);
public int getCount() {
return (int) requireNonNull(getRaw(COUNT_KEY));
}

public void setCount(@Nullable Integer count) {
public void setCount(int count) {
requireValidArgument(countFieldValidator.validate(count));
setRaw(COUNT_KEY, count);
}

@NotNull
public GeneratingStorageConfigProperties withCount(@NotNull Integer count) {
public GeneratingStorageConfigProperties withCount(int count) {
setCount(count);
return this;
}
Expand All @@ -46,8 +57,8 @@ public GeneratingStorageConfigProperties withIdsPrefix(@Nullable String idsPrefi

@Nullable
public StringList getTileIds() {
JvmList jvmList = (JvmList) getRaw(TILE_IDS_KEY);
return JvmBoxingUtil.box(jvmList, StringList.class);
PlatformList platformList = (PlatformList) getRaw(TILE_IDS_KEY);
return JvmBoxingUtil.box(platformList, StringList.class);
}

public void setTileIds(@Nullable StringList tileIds) {
Expand Down Expand Up @@ -89,4 +100,37 @@ public GeneratingStorageConfigProperties withFeatureTemplateFilePath(@Nullable S
setFeatureTemplateFilePath(path);
return this;
}

public void validateFields() throws FieldValidationException {
AnyMap map = requireNonNull(JvmBoxingUtil.box(platformObject(), AnyMap.class));
validateCountField(map);
validateTileIdsField(map);
requireStringOrNull(IDS_PREFIX_KEY, map);
requireStringOrNull(TILE_IDS_CSV_FILE_PATH_KEY, map);
requireStringOrNull(FEATURE_TEMPLATE_FILE_PATH_KEY, map);
}

private void requireStringOrNull(String key, AnyMap map) throws FieldValidationException {
Validator<Object, String> validator = isNotNull()
.and(isInstanceOf(String.class))
.or(isNull());
requireValidField(key, map, validator);
}

private final Validator<Object, Integer> countFieldValidator = isNotNull()
.and(isInstanceOf(Integer.class))
.and(fulfillPredicate(count -> count >= 0, "The count should be >= 0, but %s is provided."::formatted));

private void validateTileIdsField(AnyMap map) throws FieldValidationException {
Validator<Object, StringList> validator = isNotNull()
.and(canBeBoxed(AnyList.class))
.and(allElements(isInstanceOf(String.class)))
.and(canBeBoxed(StringList.class))
.or(isNull());
requireValidField(TILE_IDS_KEY, map, validator);
}

private void validateCountField(AnyMap map) throws FieldValidationException {
requireValidField(COUNT_KEY, map, countFieldValidator);
}
}
Loading
Loading