/*
 * 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.core.osgi;

import java.util.Map;

import org.apache.camel.CamelContext;
import org.apache.camel.Component;
import org.apache.camel.Endpoint;
import org.apache.camel.component.file.FileComponent;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.spi.Registry;
import org.apache.camel.support.DefaultRegistry;
import org.apache.camel.support.service.ServiceSupport;
import org.junit.Test;

public class OsgiComponentResolverTest extends CamelOsgiTestSupport {

    @Test
    public void testOsgiResolverFindComponentTest() throws Exception {
        CamelContext camelContext = new DefaultCamelContext();
        OsgiComponentResolver resolver = new OsgiComponentResolver(getBundleContext());
        Component component = resolver.resolveComponent("file_test", camelContext);
        assertNotNull("We should find file_test component", component);
        assertTrue("We should get the file component here", component instanceof FileComponent);
    }

    @Test
    public void testOsgiResolverFindComponentFallbackTest() throws Exception {
        Registry registry = new DefaultRegistry();
        registry.bind("allstar-component", new SampleComponent(true));

        CamelContext camelContext = new DefaultCamelContext(registry);

        OsgiComponentResolver resolver = new OsgiComponentResolver(getBundleContext());
        Component component = resolver.resolveComponent("allstar", camelContext);
        assertNotNull("We should find the super component", component);
        assertTrue("We should get the super component here", component instanceof SampleComponent);
    }

    @Test
    public void testOsgiResolverFindLanguageDoubleFallbackTest() throws Exception {
        Registry registry = new DefaultRegistry();
        registry.bind("allstar", new SampleComponent(false));
        registry.bind("allstar-component", new SampleComponent(true));

        CamelContext camelContext = new DefaultCamelContext(registry);

        OsgiComponentResolver resolver = new OsgiComponentResolver(getBundleContext());
        Component component = resolver.resolveComponent("allstar", camelContext);
        assertNotNull("We should find the super component", component);
        assertTrue("We should get the super component here", component instanceof SampleComponent);
        assertFalse("We should NOT find the fallback component", ((SampleComponent) component).isFallback());
    }

    private static class SampleComponent extends ServiceSupport implements Component {

        private boolean fallback;

        SampleComponent(boolean fallback) {
            this.fallback = fallback;
        }

        @Override
        public void setCamelContext(CamelContext camelContext) {
            throw new UnsupportedOperationException("Should not be called");
        }

        @Override
        public CamelContext getCamelContext() {
            throw new UnsupportedOperationException("Should not be called");
        }

        @Override
        public Endpoint createEndpoint(String uri) throws Exception {
            throw new UnsupportedOperationException("Should not be called");
        }

        @Override
        public Endpoint createEndpoint(String uri, Map<String, Object> parameters) throws Exception {
            throw new UnsupportedOperationException("Should not be called");
        }

        @Override
        public boolean useRawUri() {
            throw new UnsupportedOperationException("Should not be called");
        }

        public boolean isFallback() {
            return fallback;
        }

        public void setFallback(boolean fallback) {
            this.fallback = fallback;
        }

        @Override
        protected void doStart() throws Exception {
            // noop
        }

        @Override
        protected void doStop() throws Exception {
            // noop
        }
    }

}
