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;
009
010 import org.picocontainer.BehaviorFactory;
011 import org.picocontainer.ComponentFactory;
012 import org.picocontainer.DefaultPicoContainer;
013 import org.picocontainer.MutablePicoContainer;
014 import org.picocontainer.PicoBuilder;
015 import org.picocontainer.PicoContainer;
016 import org.picocontainer.ComponentMonitor;
017 import org.picocontainer.PicoClassNotFoundException;
018 import org.picocontainer.InjectionFactory;
019 import org.picocontainer.classname.ClassLoadingPicoContainer;
020 import org.picocontainer.classname.DefaultClassLoadingPicoContainer;
021 import org.picocontainer.containers.TransientPicoContainer;
022
023 import java.net.URL;
024 import java.util.List;
025 import java.util.ArrayList;
026
027 /**
028 * Facade to build ScriptedScriptedPicoContainer
029 *
030 * @author Paul Hammant
031 */
032 public final class ScriptedBuilder {
033
034 private Class<? extends ClassLoadingPicoContainer> scriptClass = DefaultClassLoadingPicoContainer.class;
035 private final PicoBuilder picoBuilder;
036 private ClassLoader classLoader = DefaultClassLoadingPicoContainer.class.getClassLoader();
037 private List<URL> urls = new ArrayList<URL>();
038
039 public ScriptedBuilder(PicoContainer parentcontainer, InjectionFactory injectionType) {
040 picoBuilder = new PicoBuilder(parentcontainer, injectionType);
041 }
042
043 public ScriptedBuilder(PicoContainer parentcontainer) {
044 picoBuilder = new PicoBuilder(parentcontainer);
045 }
046
047 public ScriptedBuilder(InjectionFactory injectionType) {
048 picoBuilder = new PicoBuilder(injectionType);
049 }
050
051 public ScriptedBuilder() {
052 picoBuilder = new PicoBuilder();
053 }
054
055 public ClassLoadingPicoContainer build() {
056 DefaultPicoContainer tpc = new TransientPicoContainer();
057 tpc.addComponent(ClassLoader.class, classLoader);
058 tpc.addComponent("sc", scriptClass);
059 tpc.addComponent(MutablePicoContainer.class, picoBuilder.build());
060 ClassLoadingPicoContainer pico = (ClassLoadingPicoContainer) tpc.getComponent("sc");
061 for (URL url : urls) {
062 pico.addClassLoaderURL(url);
063 }
064 return pico;
065 }
066
067 public ScriptedBuilder withConsoleMonitor() {
068 picoBuilder.withConsoleMonitor();
069 return this;
070 }
071
072 public ScriptedBuilder withLifecycle() {
073 picoBuilder.withLifecycle();
074 return this;
075 }
076
077 public ScriptedBuilder withReflectionLifecycle() {
078 picoBuilder.withReflectionLifecycle();
079 return this;
080 }
081
082 public ScriptedBuilder withMonitor(Class<? extends ComponentMonitor> clazz) {
083 picoBuilder.withMonitor(clazz);
084 return this;
085 }
086
087 public ScriptedBuilder withHiddenImplementations() {
088 picoBuilder.withHiddenImplementations();
089 return this;
090 }
091
092 public ScriptedBuilder withComponentFactory(ComponentFactory componentFactory) {
093 picoBuilder.withComponentFactory(componentFactory);
094 return this;
095 }
096
097 public ScriptedBuilder withBehaviors(BehaviorFactory... factories) {
098 picoBuilder.withBehaviors(factories);
099 return this;
100 }
101
102 public ScriptedBuilder withSetterInjection() {
103 picoBuilder.withSetterInjection();
104 return this;
105 }
106
107 public ScriptedBuilder withAnnotatedMethodInjection() {
108 picoBuilder.withAnnotatedMethodInjection();
109 return this;
110 }
111
112 public ScriptedBuilder withConstructorInjection() {
113 picoBuilder.withConstructorInjection();
114 return this;
115 }
116
117 public ScriptedBuilder withCaching() {
118 picoBuilder.withCaching();
119 return this;
120 }
121
122 public ScriptedBuilder withSynchronizing() {
123 picoBuilder.withSynchronizing();
124 return this;
125 }
126
127 public ScriptedBuilder implementedBy(Class<? extends ClassLoadingPicoContainer> scriptedContainerClass) {
128 scriptClass = scriptedContainerClass;
129 return this;
130 }
131
132 public ScriptedBuilder implementedBy(String scriptedContainerClass) {
133 scriptClass = loadClass(scriptedContainerClass, ClassLoadingPicoContainer.class);
134 return this;
135 }
136
137 public ScriptedBuilder picoImplementedBy(Class<? extends MutablePicoContainer> picoContainerClass) {
138 picoBuilder.implementedBy(picoContainerClass);
139 return this;
140 }
141
142 public ScriptedBuilder withClassLoader(ClassLoader usingClassloader) {
143 this.classLoader = usingClassloader;
144 return this;
145 }
146
147 public ScriptedBuilder withComponentFactory(String componentFactoryName) {
148 if (componentFactoryName != null && !componentFactoryName.equals("")) {
149 picoBuilder.withComponentFactory(loadClass(componentFactoryName, ComponentFactory.class));
150 }
151 return this;
152 }
153
154 private <T> Class<? extends T> loadClass(String className, Class<T> asClass) {
155 try {
156 return classLoader.loadClass(className).asSubclass(asClass);
157 } catch (ClassNotFoundException e) {
158 throw new PicoClassNotFoundException(className, e);
159 }
160 }
161
162 public ScriptedBuilder withMonitor(String monitorName) {
163 if (monitorName != null && !monitorName.equals("")) {
164 picoBuilder.withMonitor(loadClass(monitorName, ComponentMonitor.class));
165 }
166 return this;
167 }
168
169 public ScriptedBuilder addClassLoaderURL(URL url) {
170 urls.add(url);
171 return this;
172 }
173 }