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

import org.apache.camel.CamelExchangeException;
import org.apache.camel.Exchange;

/**
 * The correlation key has been closed and the Exchange cannot be aggregated.
 *
 * @version 
 */
public class ClosedCorrelationKeyException extends CamelExchangeException {
    private final String correlationKey;

    public ClosedCorrelationKeyException(String correlationKey, Exchange exchange) {
        super("The correlation key [" + correlationKey + "] has been closed", exchange);
        this.correlationKey = correlationKey;
    }

    public ClosedCorrelationKeyException(String correlationKey, Exchange exchange, Throwable cause) {
        super("The correlation key [" + correlationKey + "] has been closed", exchange, cause);
        this.correlationKey = correlationKey;
    }

    public String getCorrelationKey() {
        return correlationKey;
    }
}
