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.Method;
019import java.util.List;
020import java.util.stream.Collectors;
021import java.util.stream.Stream;
022
023import org.apache.xbean.finder.AnnotationFinder;
024import org.talend.sdk.component.api.service.http.HttpClient;
025import org.talend.sdk.component.api.service.http.Request;
026import org.talend.sdk.component.runtime.manager.service.http.HttpClientFactoryImpl;
027
028public class HttpValidator implements Validator {
029
030    @Override
031    public Stream<String> validate(final AnnotationFinder finder, final List<Class<?>> components) {
032        // If the class extends HttpClient, it should use @Request.
033        List<String> classErrors = components.stream()
034                .filter(c -> HttpClient.class.isAssignableFrom(c)
035                        && finder.findAnnotatedMethods(Request.class).isEmpty())
036                .map(c -> c.getCanonicalName() + " extends HttpClient should use @Request on methods")
037                .collect(Collectors.toList());
038
039        List<String> methodError = finder
040                .findAnnotatedMethods(Request.class) //
041                .stream() //
042                .map(Method::getDeclaringClass) //
043                .distinct() //
044                .flatMap(c -> HttpClientFactoryImpl.createErrors(c).stream())
045                .sorted()
046                .collect(Collectors.toList());
047
048        return Stream.concat(classErrors.stream(), methodError.stream());
049
050    }
051}