This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 07d7692afc82ddb752b911b42f214fd177478234 Author: lburgazzoli <lburgazz...@gmail.com> AuthorDate: Tue May 12 12:47:18 2020 +0200 Move support classes to util package --- .../quarkus/core/deployment/util/CamelSupport.java | 121 +++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/util/CamelSupport.java b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/util/CamelSupport.java new file mode 100644 index 0000000..5c2850c --- /dev/null +++ b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/util/CamelSupport.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.quarkus.core.deployment.util; + +import java.io.IOError; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Modifier; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Objects; +import java.util.Properties; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import io.quarkus.deployment.ApplicationArchive; +import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem; +import org.apache.camel.impl.engine.AbstractCamelContext; +import org.apache.camel.quarkus.core.deployment.spi.CamelServiceBuildItem; +import org.jboss.jandex.ClassInfo; + +public final class CamelSupport { + public static final String CAMEL_SERVICE_BASE_PATH = "META-INF/services/org/apache/camel"; + public static final String CAMEL_ROOT_PACKAGE_DIRECTORY = "org/apache/camel"; + + private CamelSupport() { + } + + public static boolean isConcrete(ClassInfo ci) { + return (ci.flags() & Modifier.ABSTRACT) == 0; + } + + public static boolean isPublic(ClassInfo ci) { + return (ci.flags() & Modifier.PUBLIC) != 0; + } + + public static Stream<Path> safeWalk(Path p) { + try { + return Files.walk(p); + } catch (IOException e) { + throw new IOError(e); + } + } + + public static Stream<CamelServiceBuildItem> services(ApplicationArchivesBuildItem archives, PathFilter pathFilter) { + final Set<CamelServiceBuildItem> answer = new HashSet<>(); + final Predicate<Path> filter = pathFilter.asPathPredicate(); + + for (ApplicationArchive archive : archives.getAllApplicationArchives()) { + for (Path root : archive.getRootDirs()) { + final Path resourcePath = root.resolve(CAMEL_SERVICE_BASE_PATH); + + if (!Files.isDirectory(resourcePath)) { + continue; + } + + safeWalk(resourcePath).filter(Files::isRegularFile).forEach(file -> { + // the root archive may point to a jar file or the absolute path of + // a project's build output so we need to relativize to make the + // FastFactoryFinder work as expected + Path key = root.relativize(file); + + if (filter.test(key)) { + String clazz = readProperties(file).getProperty("class"); + if (clazz != null) { + answer.add(new CamelServiceBuildItem(key, clazz)); + } + } + }); + } + } + + return answer.stream(); + } + + private static Properties readProperties(Path path) { + try (InputStream in = Files.newInputStream(path)) { + final Properties result = new Properties(); + result.load(in); + return result; + } catch (IOException e) { + throw new RuntimeException("Could not read " + path, e); + } + } + + @SafeVarargs + public static <T> Set<T> setOf(T... items) { + return Stream.of(items).collect(Collectors.toCollection(HashSet::new)); + } + + public static String getCamelVersion() { + String version = null; + + Package aPackage = AbstractCamelContext.class.getPackage(); + if (aPackage != null) { + version = aPackage.getImplementationVersion(); + if (version == null) { + version = aPackage.getSpecificationVersion(); + } + } + + return Objects.requireNonNull(version, "Could not determine Camel version"); + } +}