1 package org.codehaus.plexus; 2 3 /* 4 * Copyright 2001-2006 Codehaus Foundation. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 import java.util.List; 20 import java.util.Map; 21 22 import org.codehaus.plexus.classworlds.realm.ClassRealm; 23 import org.codehaus.plexus.component.composition.CycleDetectedInComponentGraphException; 24 import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener; 25 import org.codehaus.plexus.component.repository.ComponentDescriptor; 26 import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException; 27 import org.codehaus.plexus.component.repository.exception.ComponentLookupException; 28 import org.codehaus.plexus.configuration.PlexusConfigurationException; 29 import org.codehaus.plexus.context.Context; 30 31 /** 32 * PlexusContainer is the entry-point for loading and accessing other 33 * components. 34 */ 35 public interface PlexusContainer { 36 String ROLE = PlexusContainer.class.getName(); 37 38 // ------------------------------------------------------------------------ 39 // Lookup 40 // ------------------------------------------------------------------------ 41 42 /** 43 * Looks up and returns a component object with the given unique key or role. 44 * @param role a unique key for the desired component 45 * @return a Plexus component object 46 * @throws ComponentLookupException in case of lookup error. 47 */ 48 Object lookup(String role) throws ComponentLookupException; 49 50 /** 51 * Looks up and returns a component object with the given unique role/role-hint combination. 52 * @param role a non-unique key for the desired component 53 * @param roleHint a hint for the desired component implementation 54 * @return a Plexus component object 55 * @throws ComponentLookupException in case of lookup error. 56 */ 57 Object lookup(String role, String roleHint) throws ComponentLookupException; 58 59 /** 60 * Looks up and returns a component object with the given unique key or role. 61 * @param type the unique type of the component within the container 62 * @param <T> The type. 63 * @return a Plexus component object 64 * @throws ComponentLookupException in case of lookup error. 65 */ 66 <T> T lookup(Class<T> type) throws ComponentLookupException; 67 68 /** 69 * Looks up and returns a component object with the given unique role/role-hint combination. 70 * @param type the non-unique type of the component 71 * @param roleHint a hint for the desired component implementation 72 * @param <T> The type. 73 * @return a Plexus component object 74 * @throws ComponentLookupException in case of lookup error. 75 */ 76 <T> T lookup(Class<T> type, String roleHint) throws ComponentLookupException; 77 78 /** 79 * Looks up and returns a component object with the given unique role/role-hint combination. 80 * @param type the non-unique type of the component 81 * @param role a non-unique key for the desired component 82 * @param roleHint a hint for the desired component implementation 83 * @param <T> The type. 84 * @return a Plexus component object 85 * @throws ComponentLookupException in case of lookup error. 86 */ 87 <T> T lookup(Class<T> type, String role, String roleHint) throws ComponentLookupException; 88 89 /** 90 * Looks up and returns a component object matching the given component descriptor. 91 * @param componentDescriptor the descriptor of the component 92 * @param <T> The type. 93 * @return a Plexus component object 94 * @throws ComponentLookupException in case of lookup error. 95 */ 96 <T> T lookup(ComponentDescriptor<T> componentDescriptor) throws ComponentLookupException; 97 98 /** 99 * Looks up and returns a List of component objects with the given role. 100 * @param role a non-unique key for the desired components 101 * @return a List of component objects 102 * @throws ComponentLookupException in case of lookup error. 103 */ 104 List<Object> lookupList(String role) throws ComponentLookupException; 105 106 /** 107 * Looks up and returns a List of component objects with the given role. 108 * @param role a non-unique key for the desired components 109 * @param roleHints the list of hints. 110 * @return a List of component objects 111 * @throws ComponentLookupException in case of lookup error. 112 */ 113 List<Object> lookupList(String role, List<String> roleHints) throws ComponentLookupException; 114 115 /** 116 * Looks up and returns a List of component objects with the given role. 117 * @param type the non-unique type of the components 118 * @param <T> The type. 119 * @return a List of component objects 120 * @throws ComponentLookupException in case of lookup error. 121 */ 122 <T> List<T> lookupList(Class<T> type) throws ComponentLookupException; 123 124 /** 125 * Looks up and returns a List of component objects with the given role. 126 * @param type the non-unique type of the components 127 * @param roleHints the list of hints. 128 * @param <T> The type. 129 * @return a List of component objects 130 * @throws ComponentLookupException in case of lookup error. 131 */ 132 <T> List<T> lookupList(Class<T> type, List<String> roleHints) throws ComponentLookupException; 133 134 /** 135 * Looks up and returns a Map of component objects with the given role, keyed by all available role-hints. 136 * @param role a non-unique key for the desired components 137 * @return a Map of component objects 138 * @throws ComponentLookupException in case of lookup error. 139 */ 140 Map<String, Object> lookupMap(String role) throws ComponentLookupException; 141 142 /** 143 * Looks up and returns a Map of component objects with the given role, keyed by all available role-hints. 144 * @param role a non-unique key for the desired components 145 * @param roleHints the list of hints. 146 * @return a Map of component objects 147 * @throws ComponentLookupException in case of lookup error. 148 */ 149 Map<String, Object> lookupMap(String role, List<String> roleHints) throws ComponentLookupException; 150 151 /** 152 * Looks up and returns a Map of component objects with the given role, keyed by all available role-hints. 153 * @param type the non-unique type of the components 154 * @param <T> The type. 155 * @return a Map of component objects 156 * @throws ComponentLookupException in case of lookup error. 157 */ 158 <T> Map<String, T> lookupMap(Class<T> type) throws ComponentLookupException; 159 160 /** 161 * Looks up and returns a Map of component objects with the given role, keyed by all available role-hints. 162 * @param type the non-unique type of the components 163 * @param roleHints the list of hints. 164 * @param <T> The type. 165 * @return a Map of component objects 166 * @throws ComponentLookupException in case of lookup error. 167 */ 168 <T> Map<String, T> lookupMap(Class<T> type, List<String> roleHints) throws ComponentLookupException; 169 170 // ---------------------------------------------------------------------- 171 // Component Descriptor Lookup 172 // ---------------------------------------------------------------------- 173 174 /** 175 * Returns the ComponentDescriptor with the given component role and the default role hint. 176 * Searches up the hierarchy until one is found, null if none is found. 177 * @param role a unique role for the desired component's descriptor 178 * @return the ComponentDescriptor with the given component role 179 */ 180 ComponentDescriptor<?> getComponentDescriptor(String role); 181 182 /** 183 * Returns the ComponentDescriptor with the given component role and hint. 184 * Searches up the hierarchy until one is found, null if none is found. 185 * @param role a unique role for the desired component's descriptor 186 * @param roleHint a hint showing which implementation should be used 187 * @return the ComponentDescriptor with the given component role 188 */ 189 ComponentDescriptor<?> getComponentDescriptor(String role, String roleHint); 190 191 /** 192 * Returns the ComponentDescriptor with the given component role and hint. 193 * Searches up the hierarchy until one is found, null if none is found. 194 * @param type the Java type of the desired component 195 * @param role a unique role for the desired component's descriptor 196 * @param roleHint a hint showing which implementation should be used 197 * @param <T> The type. 198 * @return the ComponentDescriptor with the given component role 199 */ 200 <T> ComponentDescriptor<T> getComponentDescriptor(Class<T> type, String role, String roleHint); 201 202 /** 203 * Returns a Map of ComponentDescriptors with the given role, keyed by role-hint. Searches up the hierarchy until 204 * all are found, an empty Map if none are found. 205 * @param role a non-unique key for the desired components 206 * @return a Map of component descriptors keyed by role-hint 207 */ 208 Map<String, ComponentDescriptor<?>> getComponentDescriptorMap(String role); 209 210 /** 211 * Returns a Map of ComponentDescriptors with the given role, keyed by role-hint. Searches up the hierarchy until 212 * all are found, an empty Map if none are found. 213 * @param type the Java type of the desired components 214 * @param role a non-unique key for the desired components 215 * @param <T> The type. 216 * @return a Map of component descriptors keyed by role-hint 217 */ 218 <T> Map<String, ComponentDescriptor<T>> getComponentDescriptorMap(Class<T> type, String role); 219 220 /** 221 * Returns a List of ComponentDescriptors with the given role. Searches up the hierarchy until all are found, an 222 * empty List if none are found. 223 * @param role a non-unique key for the desired components 224 * @return a List of component descriptors 225 */ 226 List<ComponentDescriptor<?>> getComponentDescriptorList(String role); 227 228 /** 229 * Returns a List of ComponentDescriptors with the given role. Searches up the hierarchy until all are found, an 230 * empty List if none are found. 231 * @param type the Java type of the desired components 232 * @param role a non-unique key for the desired components 233 * @param <T> The type. 234 * @return a List of component descriptors 235 */ 236 <T> List<ComponentDescriptor<T>> getComponentDescriptorList(Class<T> type, String role); 237 238 /** 239 * Adds a component descriptor to this container. componentDescriptor should have realmId set. 240 * @param componentDescriptor {@link ComponentDescriptor} 241 * @throws CycleDetectedInComponentGraphException In case of an error. 242 */ 243 void addComponentDescriptor(ComponentDescriptor<?> componentDescriptor) 244 throws CycleDetectedInComponentGraphException; 245 246 /** 247 * Releases the component from the container. This is dependent upon how the implementation manages the component, 248 * but usually enacts some standard lifecycle shutdown procedure on the component. In every case, the component is 249 * no longer accessible from the container (unless another is created). 250 * @param component the plexus component object to release 251 * @throws ComponentLifecycleException in case of an error. 252 */ 253 void release(Object component) throws ComponentLifecycleException; 254 255 /** 256 * Releases all Mapped component values from the container. 257 * @see PlexusContainer#release( Object component ) 258 * @param components Map of plexus component objects to release 259 * @throws ComponentLifecycleException in case of an error. 260 */ 261 void releaseAll(Map<String, ?> components) throws ComponentLifecycleException; 262 263 /** 264 * Releases all Listed components from the container. 265 * @see PlexusContainer#release( Object component ) 266 * @param components List of plexus component objects to release 267 * @throws ComponentLifecycleException in case of an error. 268 */ 269 void releaseAll(List<?> components) throws ComponentLifecycleException; 270 271 /** 272 * Returns true if this container has the keyed component. 273 * @param role a non-unique key for the desired component 274 * @return true if this container has the keyed component 275 */ 276 boolean hasComponent(String role); 277 278 /** 279 * Returns true if this container has a component with the given role/role-hint. 280 * @param role a non-unique key for the desired component 281 * @param roleHint a hint for the desired component implementation 282 * @return true if this container has a component with the given role/role-hint 283 */ 284 boolean hasComponent(String role, String roleHint); 285 286 /** 287 * Returns true if this container has a component with the given role/role-hint. 288 * @param type the non-unique type of the component 289 * @return true if this container has a component with the given role/role-hint 290 */ 291 boolean hasComponent(Class<?> type); 292 293 /** 294 * Returns true if this container has a component with the given role/role-hint. 295 * @param type the non-unique type of the component 296 * @param roleHint a hint for the desired component implementation 297 * @return true if this container has a component with the given role/role-hint 298 */ 299 boolean hasComponent(Class<?> type, String roleHint); 300 301 /** 302 * Returns true if this container has a component with the given role/role-hint. 303 * @param type the non-unique type of the component 304 * @param role a non-unique key for the desired component 305 * @param roleHint a hint for the desired component implementation 306 * @return true if this container has a component with the given role/role-hint 307 */ 308 boolean hasComponent(Class<?> type, String role, String roleHint); 309 310 /** 311 * Disposes of this container, which in turn disposes all of it's components. This container should also remove 312 * itself from the container hierarchy. 313 */ 314 void dispose(); 315 316 // ---------------------------------------------------------------------- 317 // Context 318 // ---------------------------------------------------------------------- 319 320 /** 321 * Add a key/value pair to this container's Context. 322 * @param key any unique object valid to the Context's implementation 323 * @param value any object valid to the Context's implementation 324 */ 325 void addContextValue(Object key, Object value); 326 327 /** 328 * Returns this container's context. A Context is a simple data store used to hold values which may alter the 329 * execution of the Container. 330 * @return this container's context. 331 */ 332 Context getContext(); 333 334 /** 335 * Returns the Classworld's ClassRealm of this Container, which acts as the default parent for all contained 336 * components. 337 * @return the ClassRealm of this Container 338 */ 339 ClassRealm getContainerRealm(); 340 341 // ---------------------------------------------------------------------- 342 // Discovery 343 // ---------------------------------------------------------------------- 344 345 /** 346 * Adds the listener to this container. ComponentDiscoveryListeners have the ability to respond to various 347 * ComponentDiscoverer events. 348 * @param listener A listener which responds to different ComponentDiscoveryEvents 349 */ 350 void registerComponentDiscoveryListener(ComponentDiscoveryListener listener); 351 352 /** 353 * Removes the listener from this container. 354 * @param listener A listener to remove 355 */ 356 void removeComponentDiscoveryListener(ComponentDiscoveryListener listener); 357 358 /** 359 * Discovers components in the given realm. 360 * @param childRealm {@link ClassRealm} 361 * @return list {@link ComponentDescriptor} 362 * @throws PlexusConfigurationException in case of an error. 363 * @throws CycleDetectedInComponentGraphException in case of an error. 364 */ 365 List<ComponentDescriptor<?>> discoverComponents(ClassRealm childRealm) 366 throws PlexusConfigurationException, CycleDetectedInComponentGraphException; 367 368 /** 369 * Discovers components in the given realm. 370 * @param realm the {@link ClassRealm}. 371 * @param data The data. 372 * @return list {@link ComponentDescriptor} 373 * @throws PlexusConfigurationException in case of an error. 374 * @throws CycleDetectedInComponentGraphException in case of an error. 375 */ 376 List<ComponentDescriptor<?>> discoverComponents(ClassRealm realm, Object data) 377 throws PlexusConfigurationException, CycleDetectedInComponentGraphException; 378 379 // ---------------------------------------------------------------------------- 380 // Component/Plugin ClassRealm creation 381 // ---------------------------------------------------------------------------- 382 383 ClassRealm createChildRealm(String id); 384 385 ClassRealm getComponentRealm(String realmId); 386 387 /** 388 * Dissociate the realm with the specified id from the container. This will 389 * remove all components contained in the realm from the component repository. 390 * 391 * @param componentRealm Realm to remove from the container. 392 * @throws PlexusContainerException {@link PlexusContainerException}. 393 */ 394 void removeComponentRealm(ClassRealm componentRealm) throws PlexusContainerException; 395 396 /** 397 * Returns the lookup realm for this container, which is either 398 * the container realm or the realm set by {@link MutablePlexusContainer#setLookupRealm(ClassRealm)}. 399 * @return {@link ClassRealm} 400 */ 401 ClassRealm getLookupRealm(); 402 403 /** 404 * Sets the lookup realm to use for lookup calls that don't have a ClassRealm parameter. 405 * @param realm the new realm to use. 406 * @return The previous lookup realm. It is advised to set it back once the old-style lookups have completed. 407 */ 408 ClassRealm setLookupRealm(ClassRealm realm); 409 410 /** 411 * XXX ideally i'd like to place this in a plexus container specific utility class. 412 * 413 * Utility method to retrieve the lookup realm for a component instance. 414 * If the component's classloader is a ClassRealm, that realm is returned, 415 * otherwise the result of getLookupRealm is returned. 416 * @param component The component. 417 * @return {@link ClassRealm} 418 */ 419 ClassRealm getLookupRealm(Object component); 420 421 void addComponent(Object component, String role) throws CycleDetectedInComponentGraphException; 422 423 /** 424 * Adds live component instance to this container. 425 * 426 * Component instance is not associated with any class realm and will 427 * be ignored during lookup is lookup realm is provided using thread context 428 * classloader. 429 * @param component The component. 430 * @param role The role. 431 * @param roleHint The hint. 432 * @param <T> The type. 433 */ 434 <T> void addComponent(T component, Class<?> role, String roleHint); 435 }