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 * Idea by Rachel Davies, Original code by Jon Tirsen * 009 *****************************************************************************/ 010 011 package org.picocontainer.defaults; 012 013 import org.picocontainer.ComponentAdapter; 014 import org.picocontainer.Parameter; 015 import org.picocontainer.PicoContainer; 016 import org.picocontainer.PicoException; 017 import org.picocontainer.PicoIntrospectionException; 018 import org.picocontainer.PicoVisitor; 019 020 import java.io.Serializable; 021 import java.lang.reflect.Field; 022 023 024 /** 025 * A ConstantParameter should be used to pass in "constant" arguments to constructors. This 026 * includes {@link String}s,{@link Integer}s or any other object that is not registered in 027 * the container. 028 * 029 * @author Jon Tirsén 030 * @author Aslak Hellesøy 031 * @author Jörg Schaible 032 * @author Thomas Heller 033 * @version $Revision: 3132 $ 034 */ 035 public class ConstantParameter 036 implements Parameter, Serializable { 037 038 private final Object value; 039 040 public ConstantParameter(Object value) { 041 this.value = value; 042 } 043 044 public Object resolveInstance(PicoContainer container, ComponentAdapter adapter, Class expectedType) { 045 return value; 046 } 047 048 public boolean isResolvable(PicoContainer container, ComponentAdapter adapter, Class expectedType) { 049 try { 050 verify(container, adapter, expectedType); 051 return true; 052 } catch(final PicoIntrospectionException e) { 053 return false; 054 } 055 } 056 057 /** 058 * {@inheritDoc} 059 * 060 * @see org.picocontainer.Parameter#verify(org.picocontainer.PicoContainer, 061 * org.picocontainer.ComponentAdapter, java.lang.Class) 062 */ 063 public void verify(PicoContainer container, ComponentAdapter adapter, Class expectedType) throws PicoException { 064 if (!checkPrimitive(expectedType) && !expectedType.isInstance(value)) { 065 throw new PicoIntrospectionException( 066 ((expectedType != null) ? expectedType.getClass().getName() : "null") 067 + " is not assignable from " 068 + ((value != null) ? value.getClass().getName() : "null")); 069 } 070 } 071 072 /** 073 * Visit the current {@link Parameter}. 074 * 075 * @see org.picocontainer.Parameter#accept(org.picocontainer.PicoVisitor) 076 */ 077 public void accept(final PicoVisitor visitor) { 078 visitor.visitParameter(this); 079 } 080 081 private boolean checkPrimitive(Class expectedType) { 082 try { 083 if (expectedType.isPrimitive()) { 084 final Field field = value.getClass().getField("TYPE"); 085 final Class type = (Class) field.get(value); 086 return expectedType.isAssignableFrom(type); 087 } 088 } catch (NoSuchFieldException e) { 089 } catch (IllegalAccessException e) { 090 } 091 return false; 092 } 093 094 }