001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.component.servlet;
018    
019    import java.util.HashSet;
020    import java.util.List;
021    import java.util.Map;
022    import java.util.Set;
023    
024    import javax.servlet.Servlet;
025    
026    import org.apache.camel.component.http.CamelServlet;
027    import org.apache.camel.component.http.HttpConsumer;
028    import org.slf4j.Logger;
029    import org.slf4j.LoggerFactory;
030    
031    public class DefaultHttpRegistry implements HttpRegistry {
032        private static final transient Logger LOG = LoggerFactory.getLogger(DefaultHttpRegistry.class);
033    
034        private static HttpRegistry singleton;
035        
036        private final Set<HttpConsumer> consumers;
037        private final Set<CamelServlet> providers;
038        
039        public DefaultHttpRegistry() {
040            consumers = new HashSet<HttpConsumer>();
041            providers = new HashSet<CamelServlet>();
042        }
043        
044        /**
045         * Lookup or create a HttpRegistry
046         */
047        public static synchronized HttpRegistry getSingletonHttpRegistry() {
048            if (singleton == null) {
049                singleton = new DefaultHttpRegistry();
050            }
051            return singleton;
052        }
053        
054        @Override
055        public void register(HttpConsumer consumer) {
056            LOG.debug("Registering consumer for path {} providers present: {}",
057                    consumer.getPath(), providers.size());
058            consumers.add(consumer);
059            for (CamelServlet provider : providers) {
060                provider.connect(consumer);
061            }
062        }
063        
064        @Override
065        public void unregister(HttpConsumer consumer) {
066            LOG.debug("Unregistering consumer for path {} ", consumer.getPath());
067            consumers.remove(consumer);
068            for (CamelServlet provider : providers) {
069                provider.disconnect(consumer);
070            }
071        }
072        
073        @SuppressWarnings("rawtypes")
074        public void register(CamelServlet provider, Map properties) {
075            LOG.debug("Registering provider through OSGi service listener {}", properties);
076            CamelServlet camelServlet = (CamelServlet)provider;
077            camelServlet.setServletName((String) properties.get("servlet-name"));
078            register(camelServlet);
079        }
080    
081        public void unregister(CamelServlet provider, Map<String, Object> properties) {
082            unregister((CamelServlet)provider);
083        }
084        
085        @Override
086        public void register(CamelServlet provider) {
087            LOG.debug("Registering CamelServlet with name {} consumers present: {}", 
088                    provider.getServletName(), consumers.size());
089            providers.add(provider);
090            for (HttpConsumer consumer : consumers) {
091                provider.connect(consumer);
092            }
093        }
094    
095        @Override
096        public void unregister(CamelServlet provider) {
097            providers.remove(provider);
098        }
099        
100        public void setServlets(List<Servlet> servlets) {
101            providers.clear();
102            for (Servlet servlet : servlets) {
103                if (servlet instanceof CamelServlet) {
104                    providers.add((CamelServlet) servlet);
105                }
106            }
107        }
108    
109    }