001/**
002 * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.talend.sdk.component.tools.validator;
017
018import java.lang.reflect.Field;
019import java.util.List;
020import java.util.stream.Stream;
021
022import org.apache.xbean.finder.AnnotationFinder;
023import org.talend.sdk.component.api.configuration.Option;
024
025public class OptionNameValidator implements Validator {
026
027    @Override
028    public Stream<String> validate(final AnnotationFinder finder, final List<Class<?>> components) {
029        return finder
030                .findAnnotatedFields(Option.class)
031                .stream() //
032                .filter(field -> {
033                    final String name = nameOption(field); //
034                    return name.contains(".") || name.startsWith("$"); //
035                }) //
036                .distinct() //
037                .map(field -> {
038                    final String name = nameOption(field);
039                    return "Option name `" + name
040                            + "` is invalid, you can't start an option name with a '$' and it can't contain a '.'. "
041                            + "Please fix it on field `" + field.getDeclaringClass().getName() + "#" + field.getName()
042                            + "`";
043                }) //
044                .sorted();
045    }
046
047    private String nameOption(final Field field) {
048        return field.getAnnotation(Option.class).value();
049    }
050}