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 }