/**
 * 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.List;

import org.apache.camel.Consumer;
import org.apache.camel.Route;

/**
 * Information about a route to be started where we want to control the order
 * in which they are started by {@link org.apache.camel.CamelContext}.
 *
 * @version 
 */
public interface RouteStartupOrder {

    /**
     * Get the order this route should be started.
     * <p/>
     * See more at <a href="http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html">
     * configuring route startup ordering</a>.
     *
     * @return the order
     */
    int getStartupOrder();

    /**
     * Gets the route
     *
     * @return the route
     */
    Route getRoute();

    /**
     * Gets the input to this route (often only one consumer)
     *
     * @return the input consumers.
     */
    List<Consumer> getInputs();

}
