/**
* 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.spi;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.camel.CamelContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The <code>Container</code> interface defines an object that can be used
* to customize all Camel CONTEXTS created.
* <p/>
* A container can be used to globally intercept and customize {@link org.apache.camel.CamelContext}s,
* by registering a <code>LifecycleStrategy</code>, a <code>ProcessorFactory</code>,
* or any other SPI object.
* <p/>
* This implementation is <b>not</b> thread-safe. The {@link #manage(org.apache.camel.CamelContext)} method
* may be invoked concurrently if multiple Camel applications is being started concurrently, such as from
* application servers that may start deployments concurrently.
*
* @deprecated use {@link CamelContextTracker} and {@link org.apache.camel.impl.CamelContextTrackerRegistry}
*/
// [TODO] Remove in 3.0
@Deprecated
public interface Container {
/**
* The <code>Instance</code> class holds a <code>Container</code> singleton.
*/
final class Instance {
private static final Logger LOG = LoggerFactory.getLogger(Container.class);
private static Container container;
private static final Set<CamelContext> CONTEXTS = new LinkedHashSet<CamelContext>();
private Instance() {
}
/**
* Access the registered Container.
*
* @return the Container singleton
*/
public static Container get() {
return container;
}
/**
* Register the Container.
*
* @param container the Container to register
*/
public static void set(Container container) {
Instance.container = container;
if (container == null) {
CONTEXTS.clear();
} else if (!CONTEXTS.isEmpty()) {
// manage any pending CamelContext which was started before a Container was set
for (CamelContext context : CONTEXTS) {
manageCamelContext(container, context);
}
CONTEXTS.clear();
}
}
/**
* Called by Camel when a <code>CamelContext</code> is being started.
*
* @param camelContext the CamelContext to manage
*/
public static void manage(CamelContext camelContext) {
Container cnt = container;
if (cnt != null) {
manageCamelContext(cnt, camelContext);
} else {
// Container not yet set so need to remember this CamelContext
CONTEXTS.add(camelContext);
}
}
private static void manageCamelContext(Container container, CamelContext context) {
try {
container.manage(context);
} catch (Throwable t) {
LOG.warn("Error during manage CamelContext " + context.getName() + ". This exception is ignored.", t);
}
}
/**
* Called by Camel when a <code>CamelContext</code> is being stopped.
*
* @param camelContext the CamelContext which is being stopped
*/
public static void unmanage(CamelContext camelContext) {
CONTEXTS.remove(camelContext);
}
}
/**
* Called by Camel before a <code>CamelContext</code> has been started.
* <p/>
* Notice this method is invoked when the {@link org.apache.camel.CamelContext} has been started.
* The context is <b>not</b> yet finished being configured. For example the id/name of the {@link org.apache.camel.CamelContext}
* has not been resolved yet, and may return <tt>null</tt>.
* <p/>
* The intention is implementations of {@link org.apache.camel.spi.Container} is able to configure the {@link org.apache.camel.CamelContext}
* before it has been fully started.
* <p/>
* To receive callbacks when the {@link org.apache.camel.CamelContext} is fully configured and has been started, then
* use {@link org.apache.camel.spi.EventNotifier} to listen for the {@link org.apache.camel.management.event.CamelContextStartedEvent}
* event.
*
* @param camelContext the CamelContext to manage
*/
void manage(CamelContext camelContext);
}