001 /******************************************************************************* 002 * Copyright (C) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * style 005 * license a copy of which has been included with this distribution in * the 006 * LICENSE.txt file. * * Original code by * 007 ******************************************************************************/ 008 package org.picocontainer.behaviors; 009 010 import java.io.Serializable; 011 import java.util.Enumeration; 012 import java.util.Properties; 013 014 import org.picocontainer.BehaviorFactory; 015 import org.picocontainer.ComponentAdapter; 016 import org.picocontainer.ComponentFactory; 017 import org.picocontainer.ComponentMonitor; 018 import org.picocontainer.LifecycleStrategy; 019 import org.picocontainer.Parameter; 020 import org.picocontainer.PicoCompositionException; 021 import org.picocontainer.PicoContainer; 022 import org.picocontainer.PicoVisitor; 023 import org.picocontainer.Characteristics; 024 import org.picocontainer.InjectionFactory; 025 import org.picocontainer.injectors.AdaptingInjection; 026 027 @SuppressWarnings("serial") 028 public class AbstractBehaviorFactory implements ComponentFactory, Serializable, BehaviorFactory { 029 030 private ComponentFactory delegate; 031 032 033 public ComponentFactory wrap(ComponentFactory delegate) { 034 this.delegate = delegate; 035 return this; 036 } 037 038 public <T> ComponentAdapter<T> createComponentAdapter(ComponentMonitor componentMonitor, 039 LifecycleStrategy lifecycleStrategy, Properties componentProperties, Object componentKey, 040 Class<T> componentImplementation, Parameter... parameters) throws PicoCompositionException { 041 if (delegate == null) { 042 delegate = new AdaptingInjection(); 043 } 044 ComponentAdapter<T> compAdapter = delegate.createComponentAdapter(componentMonitor, lifecycleStrategy, componentProperties, componentKey, 045 componentImplementation, parameters); 046 047 boolean enableCircular = removePropertiesIfPresent(componentProperties, Characteristics.ENABLE_CIRCULAR); 048 if (enableCircular && delegate instanceof InjectionFactory) { 049 return componentMonitor.newBehavior(new HiddenImplementation(compAdapter)); 050 } else { 051 return compAdapter; 052 } 053 } 054 055 public void verify(PicoContainer container) { 056 delegate.verify(container); 057 } 058 059 public void accept(PicoVisitor visitor) { 060 visitor.visitComponentFactory(this); 061 if (delegate != null) { 062 delegate.accept(visitor); 063 } 064 } 065 066 067 public <T> ComponentAdapter<T> addComponentAdapter(ComponentMonitor componentMonitor, 068 LifecycleStrategy lifecycleStrategy, Properties componentProperties, ComponentAdapter<T> adapter) { 069 if (delegate != null && delegate instanceof BehaviorFactory) { 070 return ((BehaviorFactory) delegate).addComponentAdapter(componentMonitor, lifecycleStrategy, 071 componentProperties, adapter); 072 } 073 return adapter; 074 } 075 076 public static boolean arePropertiesPresent(Properties current, Properties present, boolean compareValueToo) { 077 Enumeration<?> keys = present.keys(); 078 while (keys.hasMoreElements()) { 079 String key = (String) keys.nextElement(); 080 String presentValue = present.getProperty(key); 081 String currentValue = current.getProperty(key); 082 if (currentValue == null) { 083 return false; 084 } 085 if (!presentValue.equals(currentValue) && compareValueToo) { 086 return false; 087 } 088 } 089 return true; 090 } 091 092 public static boolean removePropertiesIfPresent(Properties current, Properties present) { 093 if (!arePropertiesPresent(current, present, true)) { 094 return false; 095 } 096 Enumeration<?> keys = present.keys(); 097 while (keys.hasMoreElements()) { 098 Object key = keys.nextElement(); 099 current.remove(key); 100 } 101 return true; 102 } 103 104 public static String getAndRemovePropertiesIfPresentByKey(Properties current, Properties present) { 105 if (!arePropertiesPresent(current, present, false)) { 106 return null; 107 } 108 Enumeration<?> keys = present.keys(); 109 String value = null; 110 while (keys.hasMoreElements()) { 111 Object key = keys.nextElement(); 112 value = (String) current.remove(key); 113 } 114 return value; 115 } 116 117 protected void mergeProperties(Properties into, Properties from) { 118 Enumeration<?> e = from.propertyNames(); 119 while (e.hasMoreElements()) { 120 String s = (String) e.nextElement(); 121 into.setProperty(s, from.getProperty(s)); 122 } 123 124 } 125 126 }