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.util;
018    
019    import java.util.Collection;
020    
021    import org.apache.camel.Service;
022    import org.apache.commons.logging.Log;
023    import org.apache.commons.logging.LogFactory;
024    
025    /**
026     * A collection of helper methods for working with {@link Service} objects
027     *
028     * @version $Revision: 788067 $
029     */
030    public final class ServiceHelper {
031        private static final transient Log LOG = LogFactory.getLog(ServiceHelper.class);
032    
033        /**
034         * Utility classes should not have a public constructor.
035         */
036        private ServiceHelper() {
037        }
038    
039        public static void startService(Object value) throws Exception {
040            if (value instanceof Service) {
041                Service service = (Service)value;
042                if (LOG.isTraceEnabled()) {
043                    LOG.trace("Starting service: " + service);
044                }
045                service.start();
046            } else if (value instanceof Collection) {
047                startServices((Collection)value);
048            }
049        }
050    
051        /**
052         * Starts all of the given services
053         */
054        public static void startServices(Object... services) throws Exception {
055            for (Object value : services) {
056                startService(value);
057            }
058        }
059    
060        /**
061         * Starts all of the given services
062         */
063        public static void startServices(Collection services) throws Exception {
064            for (Object value : services) {
065                if (value instanceof Service) {
066                    Service service = (Service)value;
067                    if (LOG.isTraceEnabled()) {
068                        LOG.trace("Starting service: " + service);
069                    }
070                    service.start();
071                }
072            }
073        }
074    
075        /**
076         * Stops all of the given services, throwing the first exception caught
077         */
078        public static void stopServices(Object... services) throws Exception {
079            Exception firstException = null;
080            for (Object value : services) {
081                if (value instanceof Service) {
082                    Service service = (Service)value;
083                    try {
084                        if (LOG.isTraceEnabled()) {
085                            LOG.trace("Stopping service: " + service);
086                        }
087                        service.stop();
088                    } catch (Exception e) {
089                        LOG.debug("Caught exception shutting down: " + e, e);
090                        if (firstException == null) {
091                            firstException = e;
092                        }
093                    }
094                }
095            }
096            if (firstException != null) {
097                throw firstException;
098            }
099        }
100    
101        public static void stopService(Object value) throws Exception {
102            if (value instanceof Service) {
103                Service service = (Service)value;
104                service.stop();
105            } else if (value instanceof Collection) {
106                stopServices((Collection)value);
107            }
108        }
109    
110        /**
111         * Stops all of the given services, throwing the first exception caught
112         */
113        public static void stopServices(Collection services) throws Exception {
114            Exception firstException = null;
115            for (Object value : services) {
116                if (value instanceof Service) {
117                    Service service = (Service)value;
118                    try {
119                        if (LOG.isTraceEnabled()) {
120                            LOG.trace("Stopping service: " + service);
121                        }
122                        service.stop();
123                    } catch (Exception e) {
124                        LOG.debug("Caught exception shutting down: " + e, e);
125                        if (firstException == null) {
126                            firstException = e;
127                        }
128                    }
129                }
130            }
131            if (firstException != null) {
132                throw firstException;
133            }
134        }
135    }