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.List;
018    import java.util.Locale;
019    import java.util.Map;
020    
021    import org.apache.hivemind.internal.Module;
022    
023    /**
024     * The HiveMind registry; primarily this is used to gain access to services.
025     * <p>
026     * In addition, Registry implements {@link org.apache.hivemind.SymbolSource} which allows
027     * programatic access to substitution symbols.
028     * 
029     * @author Howard Lewis Ship
030     */
031    
032    public interface Registry extends SymbolSource
033    {
034        /**
035         * Returns true if a configuration for the specified id exists.
036         * 
037         * @param configurationId
038         * @return true if a configuration for the specified id exists
039         */
040        public boolean containsConfiguration(String configurationId);
041    
042        /**
043         * Returns true if a single service for the specified service interface class exists.
044         * 
045         * @param serviceInterface
046         * @return true if a single service for the specified service interface exists
047         */
048        public boolean containsService(Class serviceInterface);
049    
050        /**
051         * Returns true if a service for the specified service id and service interface exists.
052         * 
053         * @param serviceId
054         * @param serviceInterface
055         * @return true if a service for the specified service id and service interface exists
056         */
057        public boolean containsService(String serviceId, Class serviceInterface);
058    
059        /**
060         * Returns a configuration as a List of elements (as defined by the schema for the configuration
061         * point, or as {@link org.apache.hivemind.Element}s if no configuration point does not define
062         * a schema.
063         * 
064         * @param configurationId
065         *            the fully qualified id of the configuration to obtain
066         * @return the configuration as an immutable List
067         * @throws ApplicationRuntimeException
068         *             if the configuration does not exist, etc.
069         */
070        public List getConfiguration(String configurationId);
071    
072        /**
073         * Returns true if the elements contributed to the given configuration point can be
074         * {@link #getConfigurationAsMap(String) retrieved as a Map}.
075         * 
076         * @param configurationId
077         *            the fully qualified id of the configuration
078         * @throws ApplicationRuntimeException
079         *             if the configuration does not exist, etc.
080         * @see Module#isConfigurationMappable(String)
081         * @since 1.1
082         */
083        public boolean isConfigurationMappable(String configurationId);
084    
085        /**
086         * Returns the elements of the given configuration point as an unmodifiable {@link Map}. It may
087         * be empty, but not null.
088         * 
089         * @param configurationId
090         *            the fully qualified id of the configuration
091         * @throws ApplicationRuntimeException
092         *             if no public configuration point with the given id exists or if the elements
093         *             can't be mapped.
094         * @see Module#getConfigurationAsMap(String)
095         * @see #isConfigurationMappable(String)
096         * @since 1.1
097         */
098        public Map getConfigurationAsMap(String configurationId);
099    
100        /**
101         * Expands any substitution symbols in the input string, replacing each symbol with the symbols
102         * value (if known). If a symbol is unknown, then the symbol is passed through unchanged
103         * (complete with the <code>${</code> and <code>}</code> delimiters) and an error is logged.
104         * 
105         * @param input
106         *            input string to be converted, which may (or may not) contain any symbols.
107         * @param location
108         *            the location from which the string was obtained, used if an error is logged.
109         */
110    
111        public String expandSymbols(String input, Location location);
112    
113        /**
114         * Obtains a service from the registry. Typically, what's returned is a proxy, but that's
115         * irrelevant to the caller, which simply will invoke methods of the service interface.
116         * 
117         * @param serviceId
118         *            the fully qualified id of the service to obtain
119         * @param serviceInterface
120         *            the class to which the service will be cast
121         * @return the service
122         * @throws ApplicationRuntimeException
123         *             if the service does not exist, or if it can't be cast to the specified service
124         *             interface
125         */
126    
127        public Object getService(String serviceId, Class serviceInterface);
128    
129        /**
130         * Convenience method to obtain a service with a single implementation from the registry.
131         * Exactly one service point must implement the service.
132         * 
133         * @param serviceInterface
134         *            the class to which the service will be cast.
135         * @return the service implementing the given interface.
136         * @throws ApplicationRuntimeException
137         *             if there are no service extension points implementing the given interface, or if
138         *             there multiple service points implementing it.
139         * @see #getService(String, Class)
140         */
141    
142        public Object getService(Class serviceInterface);
143    
144        /**
145         * Returns the locale for which the registry was created.
146         */
147    
148        public Locale getLocale();
149    
150        /**
151         * Shuts down the registry; this notifies all
152         * {@link org.apache.hivemind.events.RegistryShutdownListener} services and objects. Once the
153         * registry is shutdown, it is no longer valid to obtain new services or configurations, or even
154         * use existing services and configurations.
155         */
156    
157        public void shutdown();
158    
159        /**
160         * To be invoked at the start of each request in a multi-threaded environment. Ensures that the
161         * receiving Registry will be used if any service proxies are de-serialized.
162         * 
163         * @since 1.1
164         * @see org.apache.hivemind.internal.ser.ServiceSerializationHelper
165         * @see org.apache.hivemind.internal.ser.ServiceSerializationSupport
166         */
167    
168        public void setupThread();
169    
170        /**
171         * Convienience for invoking
172         * {@link org.apache.hivemind.service.ThreadEventNotifier#fireThreadCleanup()}.
173         */
174    
175        public void cleanupThread();
176    
177        /**
178         * Returns a list of service ids for service points which implement the desired service
179         * interface.
180         * 
181         * @return Returns an empty List if no matching service points exist.
182         * @since 1.1
183         */
184        public List getServiceIds(Class serviceInterface);
185    
186        /**
187         * Returns the Messages object for the specified module.
188         * 
189         * @param moduleId
190         *            the module id
191         * @return the Messages object for the specified module.
192         */
193        public Messages getModuleMessages(String moduleId);
194    }