001 /*****************************************************************************
002 * Copyright (c) PicoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 *****************************************************************************/
009
010 package org.picocontainer.gems.jndi;
011
012 import java.io.Serializable;
013 import java.lang.reflect.Type;
014
015 import javax.naming.NamingException;
016
017 import org.picocontainer.ComponentAdapter;
018 import org.picocontainer.PicoCompositionException;
019 import org.picocontainer.PicoContainer;
020 import org.picocontainer.PicoVisitor;
021
022 /**
023 * represents dependency provided via JNDI. This dependency is not
024 * to be managed by container at all, so there is no lifecycle, no
025 * monitoring etc.
026 * @author Konstantin Pribluda
027 *
028 */
029 @SuppressWarnings("serial")
030 public class JNDIProvided<T> implements ComponentAdapter<T> , Serializable {
031
032
033 JNDIObjectReference<T> jndiReference;
034
035 Object componentKey;
036
037 /**
038 * create adapter with specified key and reference
039 * @param componentKey component key
040 * @param reference JNDI reference storing component
041 */
042 public JNDIProvided(final Object componentKey,final JNDIObjectReference<T> reference) {
043 this.componentKey = componentKey;
044 this.jndiReference = reference;
045 }
046
047 /**
048 * create adapter with JNDI reference. referenced object class will be
049 * takes as key
050 * @param reference JNDI reference storing component
051 */
052 public JNDIProvided(final JNDIObjectReference<T> reference) {
053 this(reference.get().getClass(),reference);
054 }
055
056 /**
057 * create adapter based on JNDI name. I leave this unchecked because
058 * type is really not known at this time
059 * @param jndiName name to be used
060 * @throws NamingException will be thrown if something goes
061 * wrong in JNDI
062 */
063 @SuppressWarnings("unchecked")
064 public JNDIProvided(final String jndiName) throws NamingException {
065 this(new JNDIObjectReference(jndiName));
066 }
067
068 public Object getComponentKey() {
069 return componentKey;
070 }
071
072 @SuppressWarnings("unchecked")
073 public Class getComponentImplementation() {
074 return jndiReference.get().getClass();
075 }
076
077 public T getComponentInstance(final PicoContainer container) throws PicoCompositionException {
078 return getComponentInstance(container, null);
079 }
080
081 /**
082 * retrieve instance out of JNDI
083 */
084 public T getComponentInstance(final PicoContainer container, final Type into)
085 throws PicoCompositionException {
086 return jndiReference.get();
087 }
088
089 /**
090 * we have nothing to verify here
091 */
092 public void verify(final PicoContainer container) throws PicoCompositionException {
093 }
094
095 /**
096 * as there is no puprose of proceeding further down,
097 * we do nothing here
098 */
099 public void accept(final PicoVisitor visitor) {
100 }
101
102 public ComponentAdapter<T> getDelegate() {
103 return null;
104 }
105
106 public <U extends ComponentAdapter> U findAdapterOfType(final Class<U> adapterType) {
107 return null;
108 }
109
110 public String getDescriptor() {
111 return "JNDI(" + jndiReference.getName() + ")";
112 }
113
114 }