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 }