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 *****************************************************************************/
008package org.picocontainer.composers;
009
010import org.picocontainer.ComponentAdapter;
011import org.picocontainer.PicoContainer;
012import org.picocontainer.monitors.ComposingMonitor;
013
014import java.util.ArrayList;
015import java.util.Collection;
016import java.util.List;
017import java.util.regex.Matcher;
018import java.util.regex.Pattern;
019
020/**
021 * Subsets components in a container, the keys for which match a regular expression.
022 */
023public class RegexComposer implements ComposingMonitor.Composer {
024
025    private final Pattern pattern;
026    private final String forNamedComponent;
027
028    public RegexComposer(String pattern, String forNamedComponent) {
029        this.pattern = Pattern.compile(pattern);
030        this.forNamedComponent = forNamedComponent;
031    }
032
033    public RegexComposer() {
034        pattern = null;
035        forNamedComponent = null;
036    }
037
038    public Object compose(PicoContainer container, Object componentKey) {
039        if (componentKey instanceof String
040                && (forNamedComponent == null || forNamedComponent.equals(componentKey))) {
041            Pattern pat = null;
042            if (pattern == null) {
043                pat = Pattern.compile((String) componentKey);
044            } else {
045                pat = pattern;
046            }
047            Collection<ComponentAdapter<?>> cas = container.getComponentAdapters();
048            List retVal = new ArrayList();
049            for (ComponentAdapter<?> componentAdapter : cas) {
050                Object key = componentAdapter.getComponentKey();
051                if (key instanceof String) {
052                    Matcher matcher = pat.matcher((String) key);
053                    if (matcher != null && matcher.find()) {
054                        retVal.add(componentAdapter.getComponentInstance(container, ComponentAdapter.NOTHING.class));
055                    }
056                }
057            }
058            return retVal;
059        }
060        return null;
061    }
062}