001    // Copyright 2004, 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.hivemind;
016    
017    import java.util.Collection;
018    
019    /**
020     * Static utility class for HiveMind.
021     * 
022     * @author Howard Lewis Ship
023     */
024    public final class HiveMind
025    {
026        /**
027         * The full id of the {@link org.apache.hivemind.service.ThreadEventNotifier} service.
028         */
029        public static final String THREAD_EVENT_NOTIFIER_SERVICE = "hivemind.ThreadEventNotifier";
030    
031        /**
032         * The full id of the {@link org.apache.hivemind.service.ThreadLocale} service.
033         * 
034         * @since 1.1
035         */
036    
037        public static final String THREAD_LOCALE_SERVICE = "hivemind.ThreadLocale";
038    
039        /**
040         * The full id of the {@link org.apache.hivemind.service.InterfaceSynthesizer} service.
041         * 
042         * @since 1.1
043         */
044    
045        public static final String INTERFACE_SYNTHESIZER_SERVICE = "hivemind.InterfaceSynthesizer";
046    
047        /**
048         * An object used to synchronize access to {@link java.beans.Introspector} (which is not fully
049         * threadsafe).
050         * 
051         * @since 1.1
052         */
053    
054        public static final Object INTROSPECTOR_MUTEX = new Object();
055    
056        private HiveMind()
057        {
058            // Prevent instantiation
059        }
060    
061        public static ApplicationRuntimeException createRegistryShutdownException()
062        {
063            return new ApplicationRuntimeException(HiveMindMessages.registryShutdown());
064        }
065    
066        /**
067         * Selects the first {@link Location} in an array of objects. Skips over nulls. The objects may
068         * be instances of Location or {@link Locatable}. May return null if no Location can be found.
069         */
070    
071        public static Location findLocation(Object[] locations)
072        {
073            for (int i = 0; i < locations.length; i++)
074            {
075                Object location = locations[i];
076    
077                Location result = getLocation(location);
078    
079                if (result != null)
080                    return result;
081    
082            }
083    
084            return null;
085        }
086    
087        /**
088         * Extracts a location from an object, checking to see if it implement {@link Location} or
089         * {@link Locatable}.
090         * 
091         * @return the Location, or null if it can't be found
092         */
093        public static Location getLocation(Object object)
094        {
095            if (object == null)
096                return null;
097    
098            if (object instanceof Location)
099                return (Location) object;
100    
101            if (object instanceof Locatable)
102            {
103                Locatable locatable = (Locatable) object;
104    
105                return locatable.getLocation();
106            }
107    
108            return null;
109        }
110    
111        /**
112         * Invokes {@link #getLocation(Object)}, then translate the result to a string value, or
113         * "unknown location" if null.
114         */
115        public static String getLocationString(Object object)
116        {
117            Location l = getLocation(object);
118    
119            if (l != null)
120                return l.toString();
121    
122            return HiveMindMessages.unknownLocation();
123        }
124    
125        /**
126         * Returns true if the string is null, empty, or contains only whitespace.
127         * <p>
128         * The commons-lang library provides a version of this, but the naming and behavior changed
129         * between 1.0 and 2.0, which causes some dependency issues.
130         */
131        public static boolean isBlank(String string)
132        {
133            if (string == null || string.length() == 0)
134                return true;
135    
136            if (string.trim().length() == 0)
137                return true;
138    
139            return false;
140        }
141    
142        /**
143         * As with {@link #isBlank(String)}, but inverts the response.
144         */
145        public static boolean isNonBlank(String string)
146        {
147            return !isBlank(string);
148        }
149    
150        /**
151         * Updates the location of an object, if the object implements {@link LocationHolder}.
152         * 
153         * @param holder
154         *            the object to be updated
155         * @param location
156         *            the location to assign to the holder object
157         */
158        public static void setLocation(Object holder, Location location)
159        {
160            if (holder != null && holder instanceof LocationHolder)
161            {
162                LocationHolder lh = (LocationHolder) holder;
163    
164                lh.setLocation(location);
165            }
166        }
167    
168        /**
169         * Returns true if the Collection is null or empty.
170         */
171        public static boolean isEmpty(Collection c)
172        {
173            return c == null || c.isEmpty();
174        }
175    }