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 * Original code by * 009 *****************************************************************************/ 010 package org.picocontainer.containers; 011 012 import java.io.IOException; 013 import java.io.LineNumberReader; 014 import java.io.StringReader; 015 import java.util.List; 016 017 import org.picocontainer.ComponentAdapter; 018 import org.picocontainer.DefaultPicoContainer; 019 import org.picocontainer.MutablePicoContainer; 020 import org.picocontainer.PicoCompositionException; 021 import org.picocontainer.PicoContainer; 022 023 /** 024 * CommandLineArgumentsPicoContainer configured itself from array of strings 025 * which are most likely coming in as command line arguments 026 * 027 */ 028 @SuppressWarnings("serial") 029 public class CommandLinePicoContainer extends AbstractDelegatingPicoContainer { 030 public CommandLinePicoContainer(String separator, String[] arguments) { 031 this(separator,arguments,null); 032 } 033 034 public CommandLinePicoContainer(String separator, String[] arguments, PicoContainer parent ) { 035 super(new DefaultPicoContainer(parent)); 036 for (String argument : arguments) { 037 processArgument(argument, separator); 038 } 039 } 040 public CommandLinePicoContainer(String separator, StringReader argumentsProps) throws IOException { 041 this(separator, argumentsProps, new String[0]); 042 } 043 044 public CommandLinePicoContainer(String separator, StringReader argumentProperties, String[] arguments) throws IOException{ 045 this(separator,argumentProperties,arguments,null); 046 } 047 048 public CommandLinePicoContainer(String separator, StringReader argumentProperties, String[] arguments, PicoContainer parent) 049 throws IOException { 050 super(new DefaultPicoContainer(parent)); 051 052 LineNumberReader lnr = new LineNumberReader(argumentProperties); 053 String line = lnr.readLine(); 054 while (line != null) { 055 processArgument(line, separator); 056 line = lnr.readLine(); 057 } 058 for (String argument : arguments) { 059 processArgument(argument, separator); 060 } 061 } 062 063 public CommandLinePicoContainer(String[] arguments) { 064 this("=", arguments); 065 } 066 067 public CommandLinePicoContainer(String[] arguments, PicoContainer parent) { 068 this("=", arguments,parent); 069 } 070 071 private void addConfig(String key, Object val) { 072 if (getDelegate().getComponent(key) != null) { 073 getDelegate().removeComponent(key); 074 } 075 getDelegate().addConfig(key, val); 076 } 077 078 public <T> T getComponent(Class<T> componentType) { 079 return null; 080 } 081 082 public <T> List<ComponentAdapter<T>> getComponentAdapters(Class<T> componentType) { 083 return null; 084 } 085 086 public PicoContainer getParent() { 087 return new EmptyPicoContainer(); 088 } 089 090 private void processArgument(String argument, String separator) { 091 String[] kvs = argument.split(separator); 092 if (kvs.length == 2) { 093 addConfig(kvs[0], kvs[1]); 094 } else if (kvs.length == 1) { 095 addConfig(kvs[0], "true"); 096 } else if (kvs.length > 2) { 097 throw new PicoCompositionException( 098 "Argument name'"+separator+"'value pair '" + argument + "' has too many '"+separator+"' characters"); 099 } 100 } 101 102 public MutablePicoContainer getDelegate() { 103 return (MutablePicoContainer) super.getDelegate(); 104 } 105 106 public void setName(String s) { 107 ((DefaultPicoContainer)getDelegate()).setName(s); 108 } 109 110 }