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 package org.picocontainer.composers; 009 010 import org.picocontainer.ComponentAdapter; 011 import org.picocontainer.PicoContainer; 012 import org.picocontainer.monitors.ComposingMonitor; 013 014 import java.util.ArrayList; 015 import java.util.Collection; 016 import java.util.List; 017 import java.util.regex.Matcher; 018 import java.util.regex.Pattern; 019 020 /** 021 * Subsets components in a container, the keys for which match a regular expression. 022 */ 023 public 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 }