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.
007 ******************************************************************************/
008 package org.picocontainer.script.util;
009
010 import org.picocontainer.Parameter;
011 import org.picocontainer.classname.ClassLoadingPicoContainer;
012 import org.picocontainer.classname.ClassName;
013 import org.picocontainer.script.ScriptedPicoContainerMarkupException;
014
015 import java.util.Properties;
016
017
018 public class ComponentElementHelper {
019
020 public static Object makeComponent(Object classNamekey, Object key, Parameter[] parameters, Object classValue, ClassLoadingPicoContainer current, Object instance, Properties[] properties) {
021 ClassLoadingPicoContainer container = current;
022 if (properties.length != 0) {
023 container = (ClassLoadingPicoContainer) current.as(properties);
024 }
025 if (classNamekey != null) {
026 key = new ClassName((String)classNamekey);
027 }
028
029 if (classValue instanceof Class) {
030 Class<?> clazz = (Class<?>) classValue;
031 key = key == null ? clazz : key;
032 return container.addComponent(key, clazz, parameters);
033 } else if (classValue instanceof String) {
034 String className = (String) classValue;
035 key = key == null ? className : key;
036 return container.addComponent(key, new ClassName(className), parameters);
037 } else if (instance != null) {
038 key = key == null ? instance.getClass() : key;
039 return container.addComponent(key, instance);
040 } else {
041 throw new ScriptedPicoContainerMarkupException("Must specify a 'class' attribute for a component as a class name (string) or Class.");
042 }
043 }
044
045 public static Object makeComponent(Object classNameKey,
046 Object key,
047 Parameter[] parameters,
048 Object classValue,
049 ClassLoadingPicoContainer container, Object instance) {
050 return makeComponent(classNameKey, key, parameters, classValue, container, instance, new Properties[0]);
051 }
052 }