Search in sources :

Example 1 with ROOT

use of java.util.Locale.ROOT in project beam by apache.

the class PipelineOptionsFactory method parseObjects.

/**
 * Using the parsed string arguments, we convert the strings to the expected return type of the
 * methods that are found on the passed-in class.
 *
 * <p>For any return type that is expected to be an array or a collection, we further split up
 * each string on ','.
 *
 * <p>We special case the "runner" option. It is mapped to the class of the {@link PipelineRunner}
 * based off of the {@link PipelineRunner PipelineRunners} simple class name. If the provided
 * runner name is not registered via a {@link PipelineRunnerRegistrar}, we attempt to obtain the
 * class that the name represents using {@link Class#forName(String)} and use the result class if
 * it subclasses {@link PipelineRunner}.
 *
 * <p>If strict parsing is enabled, unknown options or options that cannot be converted to the
 * expected java type using an {@link ObjectMapper} will be ignored.
 */
private static <T extends PipelineOptions> Map<String, Object> parseObjects(Class<T> klass, ListMultimap<String, String> options, boolean strictParsing) {
    Map<String, Method> propertyNamesToGetters = Maps.newHashMap();
    Cache cache = CACHE.get();
    cache.validateWellFormed(klass);
    @SuppressWarnings("unchecked") Iterable<PropertyDescriptor> propertyDescriptors = cache.getPropertyDescriptors(Stream.concat(getRegisteredOptions().stream(), Stream.of(klass)).collect(Collectors.toSet()));
    for (PropertyDescriptor descriptor : propertyDescriptors) {
        propertyNamesToGetters.put(descriptor.getName(), descriptor.getReadMethod());
    }
    Map<String, Object> convertedOptions = Maps.newHashMap();
    for (final Map.Entry<String, Collection<String>> entry : options.asMap().entrySet()) {
        try {
            // Either off by one or off by two character errors.
            if (!propertyNamesToGetters.containsKey(entry.getKey())) {
                SortedSet<String> closestMatches = new TreeSet<>(Sets.filter(propertyNamesToGetters.keySet(), input -> StringUtils.getLevenshteinDistance(entry.getKey(), input) <= 2));
                switch(closestMatches.size()) {
                    case 0:
                        throw new IllegalArgumentException(String.format("Class %s missing a property named '%s'.", klass, entry.getKey()));
                    case 1:
                        throw new IllegalArgumentException(String.format("Class %s missing a property named '%s'. Did you mean '%s'?", klass, entry.getKey(), Iterables.getOnlyElement(closestMatches)));
                    default:
                        throw new IllegalArgumentException(String.format("Class %s missing a property named '%s'. Did you mean one of %s?", klass, entry.getKey(), closestMatches));
                }
            }
            Method method = propertyNamesToGetters.get(entry.getKey());
            // Only allow empty argument values for String, String Array, and Collection<String>.
            Class<?> returnType = method.getReturnType();
            JavaType type = MAPPER.getTypeFactory().constructType(method.getGenericReturnType());
            if ("runner".equals(entry.getKey())) {
                String runner = Iterables.getOnlyElement(entry.getValue());
                final Map<String, Class<? extends PipelineRunner<?>>> pipelineRunners = cache.supportedPipelineRunners;
                if (pipelineRunners.containsKey(runner.toLowerCase())) {
                    convertedOptions.put("runner", pipelineRunners.get(runner.toLowerCase(ROOT)));
                } else {
                    try {
                        Class<?> runnerClass = Class.forName(runner, true, ReflectHelpers.findClassLoader());
                        if (!PipelineRunner.class.isAssignableFrom(runnerClass)) {
                            throw new IllegalArgumentException(String.format("Class '%s' does not implement PipelineRunner. " + "Supported pipeline runners %s", runner, cache.getSupportedRunners()));
                        }
                        convertedOptions.put("runner", runnerClass);
                    } catch (ClassNotFoundException e) {
                        String msg = String.format("Unknown 'runner' specified '%s', supported pipeline runners %s", runner, cache.getSupportedRunners());
                        throw new IllegalArgumentException(msg, e);
                    }
                }
            } else if (isCollectionOrArrayOfAllowedTypes(returnType, type)) {
                // Split any strings with ","
                List<String> values = entry.getValue().stream().flatMap(input -> Arrays.stream(input.split(","))).collect(Collectors.toList());
                if (values.contains("")) {
                    checkEmptyStringAllowed(returnType, type, method.getGenericReturnType().toString());
                }
                convertedOptions.put(entry.getKey(), MAPPER.convertValue(values, type));
            } else if (isSimpleType(returnType, type)) {
                String value = Iterables.getOnlyElement(entry.getValue());
                if (value.isEmpty()) {
                    checkEmptyStringAllowed(returnType, type, method.getGenericReturnType().toString());
                }
                convertedOptions.put(entry.getKey(), MAPPER.convertValue(value, type));
            } else {
                String value = Iterables.getOnlyElement(entry.getValue());
                if (value.isEmpty()) {
                    checkEmptyStringAllowed(returnType, type, method.getGenericReturnType().toString());
                }
                try {
                    convertedOptions.put(entry.getKey(), tryParseObject(value, method));
                } catch (IOException e) {
                    throw new IllegalArgumentException("Unable to parse JSON value " + value, e);
                }
            }
        } catch (IllegalArgumentException e) {
            if (strictParsing) {
                throw e;
            } else {
                LOG.warn("Strict parsing is disabled, ignoring option '{}' with value '{}' because {}", entry.getKey(), entry.getValue(), e.getMessage());
            }
        }
    }
    return convertedOptions;
}
Also used : Arrays(java.util.Arrays) PipelineOptionDescriptor(org.apache.beam.model.jobmanagement.v1.JobApi.PipelineOptionDescriptor) Joiner(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Joiner) ImmutableMap(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap) TreeTraversingParser(com.fasterxml.jackson.databind.node.TreeTraversingParser) DefaultSerializerProvider(com.fasterxml.jackson.databind.ser.DefaultSerializerProvider) ImmutableSet(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSet) Strings(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Strings) KeyFor(org.checkerframework.checker.nullness.qual.KeyFor) Map(java.util.Map) JsonSerializer(com.fasterxml.jackson.databind.JsonSerializer) JsonNode(com.fasterxml.jackson.databind.JsonNode) BigInteger(java.math.BigInteger) Predicates(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Predicates) Iterators(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Iterators) BeanProperty(com.fasterxml.jackson.databind.BeanProperty) Set(java.util.Set) TreeMultimap(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.TreeMultimap) IntrospectionException(java.beans.IntrospectionException) Stream(java.util.stream.Stream) VisibleForTesting(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.annotations.VisibleForTesting) PropertyDescriptor(java.beans.PropertyDescriptor) RowSortedTable(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.RowSortedTable) TypeResolutionContext(com.fasterxml.jackson.databind.introspect.TypeResolutionContext) JsonDeserialize(com.fasterxml.jackson.databind.annotation.JsonDeserialize) Preconditions.checkNotNull(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull) InjectableValues(com.fasterxml.jackson.databind.InjectableValues) Proxy(java.lang.reflect.Proxy) Experimental(org.apache.beam.sdk.annotations.Experimental) DefaultDeserializationContext(com.fasterxml.jackson.databind.deser.DefaultDeserializationContext) Optional(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Optional) TreeSet(java.util.TreeSet) ImmutableListMultimap(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableListMultimap) ArrayList(java.util.ArrayList) Introspector(java.beans.Introspector) SortedSetMultimap(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.SortedSetMultimap) PipelineRunner(org.apache.beam.sdk.PipelineRunner) BeanInfo(java.beans.BeanInfo) PipelineOptionType(org.apache.beam.model.jobmanagement.v1.JobApi.PipelineOptionType) Preconditions.checkArgument(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument) Maps(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Maps) StreamSupport(java.util.stream.StreamSupport) StringUtils(org.apache.beam.sdk.util.StringUtils) JavaType(com.fasterxml.jackson.databind.JavaType) LinkedHashSet(java.util.LinkedHashSet) PipelineRunnerRegistrar(org.apache.beam.sdk.runners.PipelineRunnerRegistrar) IOException(java.io.IOException) TreeMap(java.util.TreeMap) BeanPropertyDefinition(com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition) TokenBuffer(com.fasterxml.jackson.databind.util.TokenBuffer) Ordering(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Ordering) SortedSet(java.util.SortedSet) TypeDeserializer(com.fasterxml.jackson.databind.jsontype.TypeDeserializer) LoggerFactory(org.slf4j.LoggerFactory) TreeBasedTable(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.TreeBasedTable) Sets(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Sets) Iterables(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Iterables) AnnotatedMember(com.fasterxml.jackson.databind.introspect.AnnotatedMember) TypeWrappedDeserializer(com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer) JsonDeserializer(com.fasterxml.jackson.databind.JsonDeserializer) JsonParseException(com.fasterxml.jackson.core.JsonParseException) Method(java.lang.reflect.Method) MethodProperty(com.fasterxml.jackson.databind.deser.impl.MethodProperty) SimpleBeanPropertyDefinition(com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition) Collection(java.util.Collection) Collectors(java.util.stream.Collectors) List(java.util.List) Type(java.lang.reflect.Type) Modifier(java.lang.reflect.Modifier) ReflectHelpers(org.apache.beam.sdk.util.common.ReflectHelpers) Annotation(java.lang.annotation.Annotation) ListMultimap(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ListMultimap) JsonMappingException(com.fasterxml.jackson.databind.JsonMappingException) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings) SortedMap(java.util.SortedMap) Required(org.apache.beam.sdk.options.Validation.Required) CaseFormat(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.CaseFormat) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) ImmutableSortedSet(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableSortedSet) JsonSerialize(com.fasterxml.jackson.databind.annotation.JsonSerialize) TypeBindings(com.fasterxml.jackson.databind.type.TypeBindings) JsonIgnore(com.fasterxml.jackson.annotation.JsonIgnore) AnnotationCollector(com.fasterxml.jackson.databind.introspect.AnnotationCollector) ROOT(java.util.Locale.ROOT) AnnotatedMethod(com.fasterxml.jackson.databind.introspect.AnnotatedMethod) NoSuchElementException(java.util.NoSuchElementException) Nonnull(javax.annotation.Nonnull) Predicate(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Predicate) Nullable(org.checkerframework.checker.nullness.qual.Nullable) PrintStream(java.io.PrintStream) DisplayData(org.apache.beam.sdk.transforms.display.DisplayData) Logger(org.slf4j.Logger) JsonParser(com.fasterxml.jackson.core.JsonParser) Iterator(java.util.Iterator) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Lists(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.Lists) Comparator(java.util.Comparator) Collections(java.util.Collections) PropertyDescriptor(java.beans.PropertyDescriptor) PipelineRunner(org.apache.beam.sdk.PipelineRunner) Method(java.lang.reflect.Method) AnnotatedMethod(com.fasterxml.jackson.databind.introspect.AnnotatedMethod) IOException(java.io.IOException) JavaType(com.fasterxml.jackson.databind.JavaType) TreeSet(java.util.TreeSet) Collection(java.util.Collection) ArrayList(java.util.ArrayList) List(java.util.List) ImmutableMap(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.collect.ImmutableMap) Map(java.util.Map) TreeMap(java.util.TreeMap) SortedMap(java.util.SortedMap)

Example 2 with ROOT

use of java.util.Locale.ROOT in project component-runtime by Talend.

the class AsciidoctorService method toHtml.

public String toHtml(final String input) {
    final StringBuilder builder = new StringBuilder();
    try (final BufferedReader reader = new BufferedReader(new StringReader(input))) {
        String line;
        int lineNumber = 0;
        while ((line = reader.readLine()) != null) {
            lineNumber++;
            if (line.startsWith("////")) {
                do {
                    line = reader.readLine();
                    lineNumber++;
                } while (!line.startsWith("////"));
            }
            if (line.startsWith("//")) {
                continue;
            }
            if (line.startsWith(":")) {
                // ignore attributes
                continue;
            }
            if (line.startsWith("[")) {
                if (line.startsWith("[source")) {
                    line = reader.readLine();
                    lineNumber++;
                    if (line != null && line.startsWith("----")) {
                        builder.append("<pre><code>\n");
                        do {
                            line = reader.readLine();
                            if (line == null) {
                                break;
                            }
                            lineNumber++;
                            if (line.startsWith("----")) {
                                break;
                            }
                            builder.append(escapeHtml4(line, false)).append("\n");
                        } while (true);
                        builder.append("</pre></code>\n");
                    }
                }
                // else ignore customizations for now
                continue;
            }
            if (line.trim().isEmpty()) {
                continue;
            }
            if (line.startsWith("=")) {
                final int space = line.indexOf(' ');
                if (space < 0) {
                    throw new IllegalArgumentException("line " + lineNumber + " missing space after equal(s)");
                }
                final String title = line.substring(space).trim();
                builder.append("<h").append(space).append(" id=\"").append("_").append(title.replace(" ", "_").toLowerCase(ROOT)).append("\">").append(escapeHtml4(title, true)).append("</h").append(space).append(">\n");
            } else if (line.startsWith("|===")) {
                builder.append("<table class=\"tableblock frame-all grid-all spread\">\n");
                boolean headersDone = false;
                do {
                    line = reader.readLine();
                    if (line == null) {
                        break;
                    }
                    lineNumber++;
                    if (line.startsWith("|===")) {
                        break;
                    }
                    if (line.trim().isEmpty()) {
                        continue;
                    }
                    if (!headersDone) {
                        builder.append("<thead>\n");
                    }
                    final String[] columns = (line.startsWith("|") ? line.substring(1) : line).split("\\|");
                    builder.append("<tr>\n");
                    if (columns.length > 1) {
                        final boolean data = headersDone;
                        Stream.of(columns).forEach(c -> td(data, builder, c));
                    } else {
                        td(headersDone, builder, line);
                        do {
                            line = reader.readLine();
                            if (line == null) {
                                break;
                            }
                            lineNumber++;
                            if (line.isEmpty()) {
                                break;
                            }
                            line = line.startsWith("|") ? line.substring(1) : line;
                            td(headersDone, builder, line);
                        } while (true);
                    }
                    builder.append("</tr>\n");
                    if (!headersDone) {
                        builder.append("</thead>\n<tbody>\n");
                        headersDone = true;
                    }
                } while (true);
                builder.append("</tbody>\n</table>\n");
            } else {
                // paragraph
                builder.append("<div class=\"paragraph\">\n<p>\n").append(escapeHtml4(line, true)).append("\n");
                do {
                    line = reader.readLine();
                    if (line == null) {
                        break;
                    }
                    lineNumber++;
                    if (line.isEmpty()) {
                        break;
                    }
                    builder.append(escapeHtml4(line, true)).append("\n");
                } while (true);
                builder.append("</p>\n</div>\n");
            }
        }
    } catch (final IOException e) {
        throw new IllegalArgumentException(e);
    }
    return builder.toString();
}
Also used : Slf4j(lombok.extern.slf4j.Slf4j) Stream(java.util.stream.Stream) StringReader(java.io.StringReader) IOException(java.io.IOException) ApplicationScoped(javax.enterprise.context.ApplicationScoped) ROOT(java.util.Locale.ROOT) BufferedReader(java.io.BufferedReader) BufferedReader(java.io.BufferedReader) StringReader(java.io.StringReader) IOException(java.io.IOException)

Example 3 with ROOT

use of java.util.Locale.ROOT in project component-runtime by Talend.

the class JsonSchemaConverter method convert.

@Override
public CompletionStage<PropertyContext> convert(final CompletionStage<PropertyContext> cs) {
    return cs.thenCompose(context -> {
        final JsonSchema jsonSchema = new JsonSchema();
        jsonSchema.setTitle(context.getProperty().getDisplayName());
        final String type = context.getProperty().getType();
        switch(type.toLowerCase(ROOT)) {
            case "enum":
                return new EnumPropertyConverter(jsonSchema).convert(CompletableFuture.completedFuture(context)).thenCompose(c -> postHandling(context, jsonSchema, type));
            case "array":
                return new ArrayPropertyConverter(jsonb, jsonSchema, properties).convert(CompletableFuture.completedFuture(context)).thenCompose(c -> postHandling(context, jsonSchema, type));
            default:
                if (context.getProperty().getPath().endsWith("[]")) {
                    return CompletableFuture.completedFuture(context);
                }
                jsonSchema.setType(type.toLowerCase(ROOT));
                jsonSchema.setRequired(properties.stream().filter(context::isDirectChild).filter(nested -> new PropertyContext(nested).isRequired()).map(SimplePropertyDefinition::getName).collect(toSet()));
                return CompletableFuture.completedFuture(context).thenCompose(c -> postHandling(context, jsonSchema, type));
        }
    });
}
Also used : EnumPropertyConverter(org.talend.sdk.component.form.internal.converter.impl.schema.EnumPropertyConverter) Optional.ofNullable(java.util.Optional.ofNullable) Collection(java.util.Collection) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) PropertyContext(org.talend.sdk.component.form.internal.converter.PropertyContext) JsonSchema(org.talend.sdk.component.form.model.jsonschema.JsonSchema) ArrayPropertyConverter(org.talend.sdk.component.form.internal.converter.impl.schema.ArrayPropertyConverter) PropertyConverter(org.talend.sdk.component.form.internal.converter.PropertyConverter) ArrayList(java.util.ArrayList) List(java.util.List) CompletionStage(java.util.concurrent.CompletionStage) TreeMap(java.util.TreeMap) SimplePropertyDefinition(org.talend.sdk.component.server.front.model.SimplePropertyDefinition) Arrays.asList(java.util.Arrays.asList) Map(java.util.Map) Optional(java.util.Optional) PropertyValidation(org.talend.sdk.component.server.front.model.PropertyValidation) Jsonb(javax.json.bind.Jsonb) ROOT(java.util.Locale.ROOT) Comparator(java.util.Comparator) AllArgsConstructor(lombok.AllArgsConstructor) Collectors.toSet(java.util.stream.Collectors.toSet) SimplePropertyDefinition(org.talend.sdk.component.server.front.model.SimplePropertyDefinition) PropertyContext(org.talend.sdk.component.form.internal.converter.PropertyContext) JsonSchema(org.talend.sdk.component.form.model.jsonschema.JsonSchema) ArrayPropertyConverter(org.talend.sdk.component.form.internal.converter.impl.schema.ArrayPropertyConverter) EnumPropertyConverter(org.talend.sdk.component.form.internal.converter.impl.schema.EnumPropertyConverter)

Example 4 with ROOT

use of java.util.Locale.ROOT in project component-runtime by Talend.

the class ArrayPropertyConverter method convert.

@Override
public CompletionStage<PropertyContext> convert(final CompletionStage<PropertyContext> cs) {
    return cs.thenCompose(context -> {
        jsonSchema.setType(context.getProperty().getType().toLowerCase(ROOT));
        final String prefix = context.getProperty().getPath() + "[]";
        final List<SimplePropertyDefinition> arrayElements = properties.stream().filter(child -> child.getPath().startsWith(prefix)).collect(toList());
        if (arrayElements.stream().anyMatch(e -> e.getPath().startsWith(prefix + '.'))) {
            // complex object
            final JsonSchema items = new JsonSchema();
            items.setType("object");
            items.setProperties(new HashMap<>());
            jsonSchema.setItems(items);
            return CompletableFuture.allOf(arrayElements.stream().map(PropertyContext::new).map(CompletableFuture::completedFuture).map(e -> new JsonSchemaConverter(jsonb, items, emptyList()).convert(e)).toArray(CompletableFuture[]::new)).thenApply(done -> context);
        } else if (!arrayElements.isEmpty()) {
            // primitive
            final String type = arrayElements.get(0).getType();
            final JsonSchema item = new JsonSchema();
            item.setTitle(jsonSchema.getTitle());
            item.setType("enum".equalsIgnoreCase(type) ? "string" : type.toLowerCase(ROOT));
            jsonSchema.setItems(item);
        }
        return CompletableFuture.completedFuture(context);
    });
}
Also used : Collections.emptyList(java.util.Collections.emptyList) Collection(java.util.Collection) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) PropertyContext(org.talend.sdk.component.form.internal.converter.PropertyContext) JsonSchema(org.talend.sdk.component.form.model.jsonschema.JsonSchema) PropertyConverter(org.talend.sdk.component.form.internal.converter.PropertyConverter) Collectors.toList(java.util.stream.Collectors.toList) List(java.util.List) CompletionStage(java.util.concurrent.CompletionStage) SimplePropertyDefinition(org.talend.sdk.component.server.front.model.SimplePropertyDefinition) JsonSchemaConverter(org.talend.sdk.component.form.internal.converter.impl.JsonSchemaConverter) Jsonb(javax.json.bind.Jsonb) ROOT(java.util.Locale.ROOT) AllArgsConstructor(lombok.AllArgsConstructor) CompletableFuture(java.util.concurrent.CompletableFuture) SimplePropertyDefinition(org.talend.sdk.component.server.front.model.SimplePropertyDefinition) JsonSchemaConverter(org.talend.sdk.component.form.internal.converter.impl.JsonSchemaConverter) JsonSchema(org.talend.sdk.component.form.model.jsonschema.JsonSchema)

Aggregations

ROOT (java.util.Locale.ROOT)4 Collection (java.util.Collection)3 List (java.util.List)3 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 Comparator (java.util.Comparator)2 HashMap (java.util.HashMap)2 Map (java.util.Map)2 TreeMap (java.util.TreeMap)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 CompletionStage (java.util.concurrent.CompletionStage)2 Stream (java.util.stream.Stream)2 Jsonb (javax.json.bind.Jsonb)2 AllArgsConstructor (lombok.AllArgsConstructor)2 PropertyContext (org.talend.sdk.component.form.internal.converter.PropertyContext)2 PropertyConverter (org.talend.sdk.component.form.internal.converter.PropertyConverter)2 JsonSchema (org.talend.sdk.component.form.model.jsonschema.JsonSchema)2 SimplePropertyDefinition (org.talend.sdk.component.server.front.model.SimplePropertyDefinition)2 JsonIgnore (com.fasterxml.jackson.annotation.JsonIgnore)1 JsonParseException (com.fasterxml.jackson.core.JsonParseException)1