/*
 * 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.servicemix.maven.plugin.jbi;

import java.io.File;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.xbean.spring.context.FileSystemXmlApplicationContext;
import org.springframework.beans.factory.DisposableBean;

/**
 * Starts a ServiceMix JBI container in embedded mode using the servicemix.xml
 * 
 * @author <a href="pdodds@apache.org">Philip Dodds</a>
 * @version $Id: GenerateComponentDescriptorMojo 314956 2005-10-12 16:27:15Z
 *          brett $
 * @goal embeddedServicemix
 * @execute phase="compile"
 * @requiresDependencyResolution runtime
 * @description Starts a local servicemix instance using the servicemix config
 *              provided
 */
public class ServiceMixEmbeddedMojo extends AbstractJbiMojo {

    /**
     * @parameter default-value="${basedir}/src/main/resources/servicemix.xml"
     */
    private File servicemixConfig;

    private FileSystemXmlApplicationContext context;

    public void execute() throws MojoExecutionException, MojoFailureException {

        try {
            startServiceMix();

            while (true) {
                Thread.sleep(1000);
            }

        } catch (InterruptedException e) {
            throw new MojoFailureException("Interrupted");
        } finally {
            if (context instanceof DisposableBean) {
                try {
                    ((DisposableBean) context).destroy();
                } catch (Exception e) {
                    // Ignore
                }
            }
        } 

    }

    private void startServiceMix() throws MojoExecutionException {
        ClassLoader old = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(getClassLoader());
            context = new FileSystemXmlApplicationContext("file:///"
                    + servicemixConfig.getAbsolutePath());
            context.getBean("jbi");
        } catch (Exception e) {
            throw new MojoExecutionException(
                    "Unable to start the ServiceMix container", e);
        } finally {
            Thread.currentThread().setContextClassLoader(old);
        }
    }

}
