blob: 4950bc455172c7369b1a698a20ef38a9cc6c1e91 [file] [log] [blame]
/*
* 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.k.quarkus;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import io.quarkus.arc.Arc;
import io.quarkus.arc.ArcContainer;
import io.quarkus.arc.InstanceHandle;
import io.quarkus.runtime.Quarkus;
import org.apache.camel.CamelContext;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.main.BaseMainSupport;
import org.apache.camel.main.MainListener;
import org.apache.camel.main.RoutesCollector;
public final class Application {
private Application() {
}
/**
* The camel-k runtime impl based on camel-quarkus
*/
public static class Runtime implements org.apache.camel.k.Runtime {
private final BaseMainSupport main;
private final AtomicBoolean stopped;
public Runtime(BaseMainSupport main) {
this.main = main;
this.main.configure().setAutoConfigurationLogSummary(false);
this.stopped = new AtomicBoolean();
}
@Override
public CamelContext getCamelContext() {
return main.getCamelContext();
}
@Override
public void addRoutes(RoutesBuilder builder) {
main.configure().addRoutesBuilder(builder);
}
@Override
public void setProperties(Properties properties) {
main.setOverrideProperties(properties);
}
@Override
public void stop() throws Exception {
if (!this.stopped.compareAndExchange(false, true)) {
Quarkus.asyncExit();
}
}
}
/**
* Adapts main events to camel-k runtime lifecycle
*/
public static class ListenerAdapter implements MainListener {
private final org.apache.camel.k.Runtime.Listener[] listeners;
public ListenerAdapter(List<org.apache.camel.k.Runtime.Listener> listeners) {
this.listeners = listeners.stream()
.sorted(Comparator.comparingInt(org.apache.camel.k.Runtime.Listener::getOrder))
.toArray(org.apache.camel.k.Runtime.Listener[]::new);
}
@Override
public void beforeInitialize(BaseMainSupport main) {
invokeListeners(org.apache.camel.k.Runtime.Phase.Initializing);
invokeListeners(org.apache.camel.k.Runtime.Phase.ConfigureProperties);
}
@Override
public void beforeConfigure(BaseMainSupport main) {
invokeListeners(org.apache.camel.k.Runtime.Phase.ConfigureRoutes);
}
@Override
public void afterConfigure(BaseMainSupport main) {
invokeListeners(org.apache.camel.k.Runtime.Phase.ConfigureContext);
}
@Override
public void configure(CamelContext context) {
// no-op
}
@Override
public void beforeStart(BaseMainSupport main) {
invokeListeners(org.apache.camel.k.Runtime.Phase.Starting);
}
@Override
public void afterStart(BaseMainSupport main) {
invokeListeners(org.apache.camel.k.Runtime.Phase.Started);
}
@Override
public void beforeStop(BaseMainSupport main) {
invokeListeners(org.apache.camel.k.Runtime.Phase.Stopping);
}
@Override
public void afterStop(BaseMainSupport main) {
invokeListeners(org.apache.camel.k.Runtime.Phase.Stopped);
}
private void invokeListeners(org.apache.camel.k.Runtime.Phase phase) {
org.apache.camel.k.Runtime runtime = instance(org.apache.camel.k.Runtime.class)
.orElseThrow(() -> new IllegalStateException("Unable to fine a Runtime instance"));
for (int i = 0; i < listeners.length; i ++) {
listeners[i].accept(phase, runtime);
}
}
}
/**
* Since routes are programmatically loaded, create a no-hop collector
*/
public static class NoRoutesCollector implements RoutesCollector {
@Override
public Collection<RoutesBuilder> collectRoutesFromDirectory(CamelContext camelContext, String excludePattern, String includePattern) {
return Collections.emptyList();
}
@Override
public List<RoutesBuilder> collectRoutesFromRegistry(CamelContext camelContext, String excludePattern, String includePattern) {
return Collections.emptyList();
}
}
// *********************************
//
// Helpers
//
// *********************************
public static Optional<ArcContainer> container() {
return Optional.of(Arc.container());
}
public static <T> Optional<T> instance(Class<T> type) {
return container()
.map(container -> container.instance(type))
.map(InstanceHandle::get);
}
}