    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    }