/*
 * 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.ode.bpel.engine;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.ode.bpel.iapi.Endpoint;
import org.apache.ode.bpel.iapi.PartnerRoleChannel;
import org.apache.ode.bpel.obj.OPartnerLink;

/**
 * @author Matthieu Riou <mriou at apache dot org>
 */
class PartnerLinkPartnerRoleImpl extends PartnerLinkRoleImpl {
    static final Logger __log = LoggerFactory.getLogger(BpelProcess.class);

    Endpoint _initialPartner;

    public PartnerRoleChannel _channel;

    public boolean usePeer2Peer = true;

    PartnerLinkPartnerRoleImpl(BpelProcess process, OPartnerLink plink, Endpoint initialPartner) {
        super(process, plink);
        _initialPartner = initialPartner;
    }

    public void processPartnerResponse(PartnerRoleMessageExchangeImpl messageExchange) {
        if (__log.isDebugEnabled()) {
            __log.debug("Processing partner's response for partnerLink: " + messageExchange);
        }

        BpelRuntimeContextImpl processInstance =
                _process.createRuntimeContext(messageExchange.getDAO().getInstance(), null, null);
        processInstance.invocationResponse(messageExchange);
        processInstance.execute();
    }

}
