/*
 * 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.axis2.deployment;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.Constants;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.deployment.repository.util.DeploymentFileData;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.description.TransportInDescription;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.util.XMLUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.xml.namespace.QName;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

public class TransportDeployer implements Deployer {

    private static Log log = LogFactory.getLog(TransportDeployer.class);

    private ConfigurationContext configCtx;
    private AxisConfiguration axisConfig;

    public void init(ConfigurationContext configCtx) {
        this.configCtx = configCtx;
        axisConfig = configCtx.getAxisConfiguration();
    }

    public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
        boolean isDirectory = deploymentFileData.getFile().isDirectory();
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        try {
            deploymentFileData.setClassLoader(isDirectory,
                    axisConfig.getModuleClassLoader(),
                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));

            ClassLoader loader = deploymentFileData.getClassLoader();
            Thread.currentThread().setContextClassLoader(loader);
            InputStream xmlStream = loader.getResourceAsStream("META-INF/transport.xml");
            OMElement element = (OMElement) XMLUtils.toOM(xmlStream);
            element.build();
            AxisConfigBuilder builder = new AxisConfigBuilder(axisConfig);
            // Processing Transport Receivers
            Iterator trs_Reivers =
                    element.getChildrenWithName(new QName(DeploymentConstants.TAG_TRANSPORT_RECEIVER));
            ArrayList transportReceivers = builder.processTransportReceivers(trs_Reivers);
            for (int i = 0; i < transportReceivers.size(); i++) {
                TransportInDescription transportInDescription = (TransportInDescription) transportReceivers.get(i);
                Parameter paramter = transportInDescription.getParameter("AutoStart");
                if (paramter != null) {
                    configCtx.getListenerManager().addListener(transportInDescription, false);
                    log.info("starting the transport : " + transportInDescription.getName());
                }
            }

            // Processing Transport Senders
            Iterator trs_senders =
                    element.getChildrenWithName(new QName(DeploymentConstants.TAG_TRANSPORT_SENDER));

            builder.processTransportSenders(trs_senders);


        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            Thread.currentThread().setContextClassLoader(contextClassLoader);
        }
    }

    public void setDirectory(String directory) {
    }

    public void setExtension(String extension) {
    }

    public void unDeploy(String fileName) throws DeploymentException {
    }
}
