/**
 * 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.example.guice.jms;

import java.util.Properties;
import java.util.Set;

import javax.naming.Context;

import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Provider;
import com.google.inject.ProvisionException;

import org.apache.camel.CamelContext;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.osgi.CamelContextFactory;
import org.guiceyfruit.jndi.JndiBindings;
import org.guiceyfruit.jndi.internal.JndiContext;
import org.osgi.framework.BundleContext;

public class OSGiCamelContextProvider implements Provider<CamelContext> {
    private final CamelContextFactory factory;
    @Inject
    private Set<RoutesBuilder> routeBuilders;
    @Inject
    private Injector injector;
    
    public OSGiCamelContextProvider(BundleContext context) {
        // In this we can support to run this provider with or without OSGI
        if (context != null) {
            factory = new CamelContextFactory();
            factory.setBundleContext(context);
        } else {
            factory = null;
        }
    }
    
    protected Context getJndiContext() {
        try {
            JndiContext context = new JndiContext(null);
            if (injector != null) {
                //Feed the empty properties to get the code work
                JndiBindings.bindInjectorAndBindings(context, injector, new Properties());
            }
            return context;
        } catch (Exception e) {
            throw new ProvisionException("Failed to create JNDI bindings. Reason: " + e, e);
        }
    }
    
    // set the JndiRegistry to the camel context
    protected void updateRegistry(DefaultCamelContext camelContext) {
        camelContext.setRegistry(new JndiRegistry(getJndiContext()));
    }

    public CamelContext get() {
        DefaultCamelContext camelContext;
        if (factory != null) {
            camelContext = factory.createContext();
        } else {
            camelContext = new DefaultCamelContext();
        }
        if (routeBuilders != null) {
            for (RoutesBuilder builder : routeBuilders) {
                try {
                    camelContext.addRoutes(builder);
                } catch (Exception e) {
                    throw new ProvisionException("Failed to add the router. Reason: " + e, e);
                }
            }
        }
        updateRegistry(camelContext);        
        return camelContext;
    }

}
