[CVS nano] update
Paul Hammant <paul-yCVjj/[email protected]> Mon, 17 Nov 2003 15:04:18 -0600
| Newsgroups | gmane.comp.java.nanocontainer.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit in nano on MAIN
picoidea/src/java/org/picoextras/idea/ActionID.java +10 added 1.1
/ExecutePicoAction.java +16 added 1.1
/PicoPlugin.java +82 added 1.1
/PicoToggleAction.java +112 added 1.1
reflection/src/java/org/picoextras/reflection/Converter.java +16 added 1.1
/DefaultReflectionFrontEnd.java +149 added 1.1
/InvalidConversionException.java +20 added 1.1
/NanoTextRegistrationException.java +21 added 1.1
/ReflectionFrontEnd.java +58 added 1.1
/StringToObjectConverter.java +62 added 1.1
reflection/src/test/org/picoextras/reflection/DefaultReflectionFrontEndTestCase.java +189 added 1.1
/StringToObjectConverterTestCase.java +80 added 1.1
+815
12 added files
update
----------
nano /picoidea /src /java /org /picoextras /idea
ActionID.java added at 1.1
diff -N ActionID.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ActionID.java 17 Nov 2003 21:04:16 -0000 1.1
@@ -0,0 +1,10 @@
+package org.picoextras.idea;
+/**
+ * Common Action Ids.
+ */
+public interface ActionID {
+ public static final String MAIN_TOOLBAR = "MainToolBar";
+ public static final String MAIN_MENU = "MainMenu";
+ public static final String WINDOW_MENU = "WindowMenu";
+ public static final String WINDOW_MENU_INSPECTION = "PicoContainer";
+}
----------
nano /picoidea /src /java /org /picoextras /idea
ExecutePicoAction.java added at 1.1
diff -N ExecutePicoAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ExecutePicoAction.java 17 Nov 2003 21:04:16 -0000 1.1
@@ -0,0 +1,16 @@
+package org.picoextras.idea;
+
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+
+/**
+ * Action that executes XDoclet.
+ *
+ * @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
+ * @version $Revision: 1.1 $
+ */
+public class ExecutePicoAction extends AnAction {
+ public void actionPerformed(AnActionEvent event) {
+ System.out.println("Run Pico, Ruuuun!");
+ }
+}
----------
nano /picoidea /src /java /org /picoextras /idea
PicoPlugin.java added at 1.1
diff -N PicoPlugin.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PicoPlugin.java 17 Nov 2003 21:04:16 -0000 1.1
@@ -0,0 +1,82 @@
+package org.picoextras.idea;
+
+import com.intellij.openapi.actionSystem.ActionManager;
+import com.intellij.openapi.actionSystem.Anchor;
+import com.intellij.openapi.actionSystem.Constraints;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.components.ApplicationComponent;
+import com.intellij.openapi.diagnostic.Logger;
+
+/**
+ * Main class for the PicoContainer Plugin for IDEA.
+ *
+ * @author Aslak Hellesøy
+ * @version $Revision: 1.1 $
+ */
+public class PicoPlugin implements ApplicationComponent {
+ /** Logger */
+ private static final Logger log = Logger.getInstance(PicoPlugin.class.getName());
+
+ private DefaultActionGroup spg;
+ private PicoToggleAction toggleAction;
+
+ public PicoPlugin() {
+ toggleAction = new PicoToggleAction();
+ spg = new DefaultActionGroup();
+ spg.addSeparator();
+ spg.add(toggleAction);
+ }
+
+ /**
+ * Method is called after plugin is already created and configured. Plugin can start to communicate with
+ * other plugin only in this method.
+ */
+ public void initComponent() {
+ final ActionManager actionManager = ActionManager.getInstance();
+ // try register action
+ if (actionManager.getAction(PicoToggleAction.ID) == null) {
+ actionManager.registerAction(PicoToggleAction.ID, toggleAction);
+ }
+
+ // add toggle icon into IntelliJ UI, add to MainToolbar
+ DefaultActionGroup mainToolBar = (DefaultActionGroup) actionManager.getAction(ActionID.MAIN_TOOLBAR);
+ if (mainToolBar != null) {
+ mainToolBar.add(spg);
+ }
+ else {
+ log.info("Can't find " + ActionID.MAIN_TOOLBAR + " group");
+ }
+
+ // add to menu "Window"
+ DefaultActionGroup menuWindow = (DefaultActionGroup) actionManager.getAction(ActionID.WINDOW_MENU);
+ if (menuWindow != null) {
+ menuWindow.add(toggleAction, new Constraints(Anchor.AFTER, ActionID.WINDOW_MENU_INSPECTION));
+ }
+ else {
+ log.info("Can't find " + ActionID.WINDOW_MENU + " group");
+ }
+ }
+
+ public void disposeComponent() {
+ ActionManager actionManager = ActionManager.getInstance();
+ // remove toggle icon from InteliJ UI
+ DefaultActionGroup mainToolBar = (DefaultActionGroup) actionManager.getAction(ActionID.MAIN_TOOLBAR);
+ if (mainToolBar != null) {
+ mainToolBar.remove(spg);
+ }
+
+ DefaultActionGroup menuWindow = (DefaultActionGroup) actionManager.getAction(ActionID.WINDOW_MENU);
+ if (menuWindow != null) {
+ menuWindow.remove(toggleAction);
+ }
+
+ toggleAction.clear();
+ if (actionManager.getAction(PicoToggleAction.ID) != null) {
+ actionManager.unregisterAction(PicoToggleAction.ID);
+ }
+ }
+
+ public String getComponentName() {
+ return PicoPlugin.class.getName();
+ }
+}
----------
nano /picoidea /src /java /org /picoextras /idea
PicoToggleAction.java added at 1.1
diff -N PicoToggleAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PicoToggleAction.java 17 Nov 2003 21:04:16 -0000 1.1
@@ -0,0 +1,112 @@
+package org.picoextras.idea;
+
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.DataConstants;
+import com.intellij.openapi.actionSystem.ToggleAction;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.wm.ToolWindow;
+import com.intellij.openapi.wm.ToolWindowAnchor;
+import com.intellij.openapi.wm.ToolWindowManager;
+
+import javax.swing.*;
+import java.util.*;
+
+import org.picoextras.gui.swing.PicoGui;
+import org.picocontainer.defaults.DefaultPicoContainer;
+
+/**
+ * Toggle action for XDoclet Build.
+ *
+ * @author <a href="mailto:mbo at jcs.be">Mathias Bogaert</a>
+ * @version $Revision: 1.1 $
+ */
+public class PicoToggleAction extends ToggleAction {
+ public static final String ID = "PicoToggleAction";
+ public static final String PICO_CONTAINER = "PicoContainer";
+ // todo get from pico gui
+ private static final Icon ICON = new ImageIcon(PicoToggleAction.class.getResource("picocontainer.gif"));
+
+ private Map consoles = new HashMap();
+ private List managers = new ArrayList();
+
+ public boolean isSelected(AnActionEvent event) {
+ Project project = (Project) event.getDataContext().getData(DataConstants.PROJECT);
+ return project != null && consoles.get(project) != null;
+ }
+
+ public void setSelected(AnActionEvent event, boolean isSelected) {
+ Project project = (Project) event.getDataContext().getData(DataConstants.PROJECT);
+ if (project != null) {
+ final ToolWindowManager manager = ToolWindowManager.getInstance(project);
+ ToolWindow console = (ToolWindow) consoles.get(project);
+ if (isSelected && console == null) {
+ PicoGui picoGui = new PicoGui(new DefaultPicoContainer());
+
+ // show window
+ manager.registerToolWindow(PICO_CONTAINER,
+ picoGui,
+ ToolWindowAnchor.RIGHT);
+
+ console = manager.getToolWindow(PICO_CONTAINER);
+
+ if (console != null) {
+ // Add manager to array to do unregister on finalize
+ managers.add(manager);
+ consoles.put(project, console);
+ console.setIcon(ICON);
+ console.show(null);
+ console.activate(null);
+
+// BeanContextSupportEx xdocletContainer = new BeanContextSupportEx();
+// XDoclet xdoclet = new XDoclet();
+// xdocletContainer.add(xdoclet);
+//
+// try {
+// xdoclet.createPlugin("velocity");
+// xdoclet.createPlugin("jelly");
+// }
+// catch (XDocletException e) {
+// e.printStackTrace();
+// }
+//
+// // show window
+// manager.registerToolWindow(PICO_CONTAINER,
+// new BeanContextConfigurationPanel(xdocletContainer),
+// ToolWindowAnchor.RIGHT);
+//
+// console = manager.getToolWindow(PICO_CONTAINER);
+//
+// if (console != null) {
+// // Add manager to array to do unregister on finalize
+// managers.add(manager);
+// consoles.put(project, console);
+// console.setIcon(ICON);
+// console.show(null);
+// console.activate(null);
+ }
+ }
+ else if (!isSelected && console != null) {
+ // Hide window
+ console.hide(null);
+ manager.unregisterToolWindow(PICO_CONTAINER);
+ managers.remove(manager);
+ consoles.remove(project);
+ }
+ }
+ }
+
+ public PicoToggleAction() {
+ super(PICO_CONTAINER, "Show/Hide " + PICO_CONTAINER, ICON);
+ }
+
+ public void clear() {
+ // unregister all created ToolWindows
+ Iterator iterator = managers.iterator();
+ while (iterator.hasNext()) {
+ ToolWindowManager manager = (ToolWindowManager) iterator.next();
+ manager.unregisterToolWindow(PICO_CONTAINER);
+ }
+ managers.clear();
+ consoles.clear();
+ }
+}
----------
nano /reflection /src /java /org /picoextras /reflection
Converter.java added at 1.1
diff -N Converter.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ Converter.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,16 @@
+/*****************************************************************************
+ * Copyright (C) NanoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Joe Walnes *
+ *****************************************************************************/
+
+
+package org.picoextras.reflection;
+
+public interface Converter {
+ Object convert(String in);
+}
----------
nano /reflection /src /java /org /picoextras /reflection
DefaultReflectionFrontEnd.java added at 1.1
diff -N DefaultReflectionFrontEnd.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ DefaultReflectionFrontEnd.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,149 @@
+/*****************************************************************************
+ * Copyright (C) NanoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Aslak Hellesoy and Paul Hammant *
+ *****************************************************************************/
+
+package org.picoextras.reflection;
+
+import org.picocontainer.*;
+import org.picocontainer.defaults.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * This class is a front-end to {@link MutablePicoContainer} that uses reflection
+ * to register components.
+ *
+ * This class replaces the former StringRegistrationNanoContainer.
+ */
+public class DefaultReflectionFrontEnd implements ReflectionFrontEnd {
+ private final List urls = new ArrayList();
+
+ private final StringToObjectConverter converter = new StringToObjectConverter();
+
+ private final MutablePicoContainer picoContainer;
+
+ // Either supplied specifically or built up by added URLs.
+ private ClassLoader classLoader;
+ private ReflectionFrontEnd parent;
+
+ public DefaultReflectionFrontEnd(ClassLoader classLoader, MutablePicoContainer picoContainer) {
+ this.classLoader = classLoader;
+ this.picoContainer = picoContainer;
+ }
+
+ public DefaultReflectionFrontEnd(ClassLoader classLoader) {
+ this(
+ classLoader,
+ new DefaultPicoContainer()
+ );
+ }
+
+ public DefaultReflectionFrontEnd(MutablePicoContainer picoContainer) {
+ this(
+ (DefaultReflectionFrontEnd) null,
+ picoContainer
+ );
+ }
+
+ public DefaultReflectionFrontEnd(ReflectionFrontEnd parent, MutablePicoContainer picoContainer) {
+ this.parent = parent;
+ this.picoContainer = picoContainer;
+ if (parent != null) {
+ MutablePicoContainer parentContainer = parent.getPicoContainer();
+ picoContainer.addParent(parentContainer);
+ }
+ }
+
+ public DefaultReflectionFrontEnd(ReflectionFrontEnd parent) {
+ this(parent, new DefaultPicoContainer());
+ }
+
+ public DefaultReflectionFrontEnd() {
+ this(
+ (DefaultReflectionFrontEnd) null,
+ new DefaultPicoContainer()
+ );
+ }
+
+ public void registerComponentImplementation(String componentImplementationClassName) throws PicoRegistrationException, ClassNotFoundException, PicoIntrospectionException {
+ picoContainer.registerComponentImplementation(getClassLoader().loadClass(componentImplementationClassName));
+ }
+
+ public void registerComponent(Object key, String componentImplementationClassName) throws ClassNotFoundException {
+ Class componentImplementation = getClassLoader().loadClass(componentImplementationClassName);
+ picoContainer.registerComponentImplementation(key, componentImplementation);
+ }
+
+ public void registerComponentWithClassKey(String classKey, String componentImplementationClassName) throws ClassNotFoundException {
+ Class typeKey = getClassLoader().loadClass(classKey);
+ Class componentImplementation = getClassLoader().loadClass(componentImplementationClassName);
+ picoContainer.registerComponentImplementation(typeKey, componentImplementation);
+ }
+
+
+ public void registerComponent(
+ Object key,
+ String componentImplementationClassName,
+ String[] parameterTypesAsString,
+ String[] parameterValuesAsString
+ ) throws PicoRegistrationException, ClassNotFoundException, PicoIntrospectionException {
+ Class componentImplementation = getClassLoader().loadClass(componentImplementationClassName);
+ Parameter[] parameters = new Parameter[parameterTypesAsString.length];
+ for (int i = 0; i < parameters.length; i++) {
+ Class paramTypeClass = getClassLoader().loadClass(parameterTypesAsString[i]);
+ Object value = converter.convertTo(paramTypeClass, parameterValuesAsString[i]);
+ parameters[i] = new ConstantParameter(value);
+ }
+ picoContainer.registerComponentImplementation(key, componentImplementation, parameters);
+ }
+
+ /**
+ * Sets what classloader to use. This will reset all previously set URLs.
+ * This overrides the ClassLoaders that may have been set by addClassLoaderURL(..)
+ * @see #addClassLoaderURL
+ * @param classLoader
+ */
+ public void setClassLoader(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ urls.clear();
+ }
+
+ /**
+ * Adds a new URL.
+ * This overrides the ClassLoader that may have been set by setClassLoader(..)
+ * @param url
+ */
+ public void addClassLoaderURL(URL url) {
+ classLoader = null;
+ urls.add(url);
+ }
+
+ private ClassLoader getParentClassLoader() {
+ if (parent != null) {
+ return parent.getClassLoader();
+ } else {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ }
+
+ public ClassLoader getClassLoader() {
+ if (classLoader == null) {
+ URL[] urlz = (URL[]) urls.toArray(new URL[urls.size()]);
+ classLoader = new URLClassLoader(urlz, getParentClassLoader());
+ }
+ return classLoader;
+ }
+
+ public MutablePicoContainer getPicoContainer() {
+ return picoContainer;
+ }
+}
----------
nano /reflection /src /java /org /picoextras /reflection
InvalidConversionException.java added at 1.1
diff -N InvalidConversionException.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ InvalidConversionException.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,20 @@
+/*****************************************************************************
+ * Copyright (C) NanoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Joe Walnes *
+ *****************************************************************************/
+
+
+package org.picoextras.reflection;
+
+public class InvalidConversionException extends RuntimeException {
+
+ public InvalidConversionException(String message) {
+ super(message);
+ }
+
+}
----------
nano /reflection /src /java /org /picoextras /reflection
NanoTextRegistrationException.java added at 1.1
diff -N NanoTextRegistrationException.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ NanoTextRegistrationException.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,21 @@
+/*****************************************************************************
+ * Copyright (C) NanoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Aslak Hellesoy and Paul Hammant *
+ *****************************************************************************/
+
+package org.picoextras.reflection;
+
+import org.picocontainer.PicoRegistrationException;
+
+public class NanoTextRegistrationException extends PicoRegistrationException {
+
+ public NanoTextRegistrationException(String message) {
+ super(message);
+ }
+
+}
----------
nano /reflection /src /java /org /picoextras /reflection
ReflectionFrontEnd.java added at 1.1
diff -N ReflectionFrontEnd.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ReflectionFrontEnd.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * Copyright (C) NanoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Aslak Hellesoy and Paul Hammant *
+ *****************************************************************************/
+
+package org.picoextras.reflection;
+
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.PicoIntrospectionException;
+import org.picocontainer.PicoRegistrationException;
+
+import java.net.URL;
+
+/**
+ * This class is a front-end to {@link MutablePicoContainer} that uses reflection
+ * to register components.
+ *
+ * This class replaces the former StringRegistrationNanoContainer.
+ */
+public interface ReflectionFrontEnd {
+
+ void registerComponentImplementation(String componentImplementationClassName) throws PicoRegistrationException, ClassNotFoundException, PicoIntrospectionException;
+
+ void registerComponent(Object key, String componentImplementationClassName) throws ClassNotFoundException;
+
+ void registerComponentWithClassKey(String classKey, String componentImplementationClassName) throws ClassNotFoundException;
+
+ void registerComponent(
+ Object key,
+ String componentImplementationClassName,
+ String[] parameterTypesAsString,
+ String[] parameterValuesAsString
+ ) throws PicoRegistrationException, ClassNotFoundException, PicoIntrospectionException;
+
+ /**
+ * Sets what classloader to use. This will reset all previously set URLs.
+ * This overrides the ClassLoaders that may have been set by addClassLoaderURL(..)
+ * @see #addClassLoaderURL
+ * @param classLoader
+ */
+ void setClassLoader(ClassLoader classLoader);
+
+ /**
+ * Adds a new URL.
+ * This overrides the ClassLoader that may have been set by setClassLoader(..)
+ * @param url
+ */
+ void addClassLoaderURL(URL url);
+
+ MutablePicoContainer getPicoContainer();
+
+ ClassLoader getClassLoader();
+}
----------
nano /reflection /src /java /org /picoextras /reflection
StringToObjectConverter.java added at 1.1
diff -N StringToObjectConverter.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ StringToObjectConverter.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ * Copyright (C) NanoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Joe Walnes *
+ *****************************************************************************/
+
+
+package org.picoextras.reflection;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class StringToObjectConverter {
+
+ private final Map converters = new HashMap();
+
+ public StringToObjectConverter() {
+ register(String.class, new Converter() {
+ public Object convert(String in) {
+ return in;
+ }
+ });
+
+ register(Integer.class, new Converter() {
+ public Object convert(String in) {
+ return in == null ? new Integer(0) : Integer.valueOf(in);
+ }
+ });
+
+ register(Long.class, new Converter() {
+ public Object convert(String in) {
+ return in == null ? new Long(0) : Long.valueOf(in);
+ }
+ });
+
+ register(Boolean.class, new Converter() {
+ public Object convert(String in) {
+ if (in == null || in.length() == 0) {
+ return Boolean.FALSE;
+ }
+ char c = in.toLowerCase().charAt(0);
+ return c == '1' || c == 'y' || c == 't' ? Boolean.TRUE : Boolean.FALSE;
+ }
+ });
+ }
+
+ public Object convertTo(Class desiredClass, String inputString) {
+ Converter converter = (Converter) converters.get(desiredClass);
+ if (converter == null) {
+ throw new InvalidConversionException("Cannot convert to type " + desiredClass.getName());
+ }
+ return converter.convert(inputString);
+ }
+
+ public void register(Class type, Converter converter) {
+ converters.put(type, converter);
+ }
+}
----------
nano /reflection /src /test /org /picoextras /reflection
DefaultReflectionFrontEndTestCase.java added at 1.1
diff -N DefaultReflectionFrontEndTestCase.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ DefaultReflectionFrontEndTestCase.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,189 @@
+/*****************************************************************************
+ * Copyright (C) NanoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Aslak Hellesoy and Paul Hammant *
+ *****************************************************************************/
+
+package org.picoextras.reflection;
+
+import junit.framework.TestCase;
+import org.picoextras.testmodel.DefaultWebServerConfig;
+import org.picoextras.testmodel.ThingThatTakesParamsInConstructor;
+import org.picoextras.testmodel.WebServerImpl;
+import org.picocontainer.*;
+
+import java.net.MalformedURLException;
+import java.util.Collection;
+import java.util.Vector;
+import java.io.File;
+
+public class DefaultReflectionFrontEndTestCase extends TestCase {
+
+ public void testBasic() throws PicoRegistrationException, PicoInitializationException, ClassNotFoundException {
+ ReflectionFrontEnd reflectionFrontEnd = new DefaultReflectionFrontEnd();
+ reflectionFrontEnd.registerComponentImplementation("org.picoextras.testmodel.DefaultWebServerConfig");
+ reflectionFrontEnd.registerComponent("org.picoextras.testmodel.WebServer", "org.picoextras.testmodel.WebServerImpl");
+ }
+
+ public void testProvision() throws PicoException, PicoInitializationException, ClassNotFoundException {
+ ReflectionFrontEnd reflectionFrontEnd = new DefaultReflectionFrontEnd();
+ reflectionFrontEnd.registerComponentImplementation("org.picoextras.testmodel.DefaultWebServerConfig");
+ reflectionFrontEnd.registerComponentImplementation("org.picoextras.testmodel.WebServerImpl");
+
+ assertTrue("WebServerImpl should exist", reflectionFrontEnd.getPicoContainer().hasComponent(WebServerImpl.class));
+ assertNotNull("WebServerImpl should exist", reflectionFrontEnd.getPicoContainer().getComponentInstance(WebServerImpl.class));
+ assertTrue("WebServerImpl should exist", reflectionFrontEnd.getPicoContainer().getComponentInstance(WebServerImpl.class) instanceof WebServerImpl);
+ }
+
+ public void testNoGenerationRegistration() throws PicoRegistrationException, PicoIntrospectionException {
+ ReflectionFrontEnd reflectionFrontEnd = new DefaultReflectionFrontEnd();
+ try {
+ reflectionFrontEnd.registerComponentImplementation("Ping");
+ fail("should have failed");
+ } catch (ClassNotFoundException e) {
+ // expected
+ }
+ }
+
+ public void testParametersCanBePassedInStringForm() throws ClassNotFoundException, PicoException, PicoInitializationException {
+ ReflectionFrontEnd reflectionFrontEnd = new DefaultReflectionFrontEnd();
+ String className = ThingThatTakesParamsInConstructor.class.getName();
+
+ reflectionFrontEnd.registerComponent(
+ className,
+ className,
+ new String[] {
+ "java.lang.String",
+ "java.lang.Integer"
+ },
+ new String[] {
+ "hello",
+ "22"
+ }
+ );
+
+ ThingThatTakesParamsInConstructor thing =
+ (ThingThatTakesParamsInConstructor) reflectionFrontEnd.getPicoContainer().getComponentInstance(ThingThatTakesParamsInConstructor.class);
+ assertNotNull("component not present", thing);
+ assertEquals("hello22", thing.getValue());
+ }
+
+ public void testGetComponentTypes() throws ClassNotFoundException, PicoInitializationException, PicoRegistrationException {
+
+ ReflectionFrontEnd reflectionFrontEnd = new DefaultReflectionFrontEnd();
+
+ reflectionFrontEnd.registerComponentImplementation("org.picoextras.testmodel.DefaultWebServerConfig");
+ reflectionFrontEnd.registerComponentImplementation("org.picoextras.testmodel.WebServerImpl");
+
+ Collection keys = reflectionFrontEnd.getPicoContainer().getComponentKeys();
+ assertEquals("There should be 2 keys", 2, keys.size());
+ assertTrue("There should be a One key", keys.contains(DefaultWebServerConfig.class));
+ }
+
+ public void testStringContainerWithClassLoader() throws ClassNotFoundException, PicoException, PicoRegistrationException {
+
+ ReflectionFrontEnd reflectionFrontEnd = new DefaultReflectionFrontEnd(DefaultWebServerConfig.class.getClassLoader());
+
+ reflectionFrontEnd.registerComponentImplementation("org.picoextras.testmodel.DefaultWebServerConfig");
+
+ Collection keys = reflectionFrontEnd.getPicoContainer().getComponentKeys();
+ assertEquals("There should be 1 key", 1, keys.size());
+
+ try
+ {
+ reflectionFrontEnd.getPicoContainer().getComponentInstance(Vector.class);
+ //fail("should have barfed");
+ }
+ catch (ClassCastException e)
+ {
+ // ecpected
+ }
+ }
+
+ public void testChildFrontEndCanRelyOnParentFrontEnd() throws MalformedURLException, ClassNotFoundException {
+ ReflectionFrontEnd parentFrontEnd = new DefaultReflectionFrontEnd();
+
+ String testcompJarFileName = System.getProperty("testcomp.jar");
+
+ // Paul's path to TestComp. PLEASE do not take out.
+ //testcompJarFileName = "D:/DEV/nano/reflection/src/test-comp/TestComp.jar";
+
+ assertNotNull("The testcomp.jar system property should point to nano/reflection/src/test-comp/TestComp.jar", testcompJarFileName);
+ File testCompJar = new File(testcompJarFileName);
+ File testCompJar2 = new File(testCompJar.getParentFile(), "TestComp2.jar");
+ assertTrue(testCompJar.isFile());
+ assertTrue(testCompJar2.isFile());
+
+ parentFrontEnd.addClassLoaderURL(testCompJar.toURL());
+
+ parentFrontEnd.registerComponent("foo", "TestComp");
+
+ PicoContainer parentFrontEndPico = parentFrontEnd.getPicoContainer();
+ Object fooTestComp = parentFrontEndPico.getComponentInstance("foo");
+ assertEquals("TestComp", fooTestComp.getClass().getName());
+
+ ReflectionFrontEnd childFrontEnd = new DefaultReflectionFrontEnd(parentFrontEnd);
+ childFrontEnd.addClassLoaderURL(testCompJar2.toURL());
+
+ childFrontEnd.registerComponent("bar", "TestComp2");
+
+ PicoContainer childFrontEndPico = childFrontEnd.getPicoContainer();
+ Object barTestComp = childFrontEndPico.getComponentInstance("bar");
+ assertEquals("TestComp2", barTestComp.getClass().getName());
+
+ assertNotSame(fooTestComp, barTestComp);
+ assertEquals("foo classloader should be parent of bar",fooTestComp.getClass().getClassLoader(),
+ barTestComp.getClass().getClassLoader().getParent());
+ Collection childContainers = parentFrontEndPico.getChildContainers();
+ assertTrue(childContainers.contains(childFrontEndPico));
+ }
+
+ public static class AnotherFooComp {
+
+ }
+
+ public void testClassLoaderJugglingIsPossible() throws MalformedURLException, ClassNotFoundException {
+ ReflectionFrontEnd parentFrontEnd = new DefaultReflectionFrontEnd();
+
+ String testcompJarFileName = System.getProperty("testcomp.jar");
+ // Paul's path to TestComp. PLEASE do not take out.
+ //testcompJarFileName = "D:\\DEV\\nano\\reflection\\src\\test-comp\\TestComp.jar";
+ assertNotNull("The testcomp.jar system property should point to nano/reflection/src/test-comp/TestComp.jar", testcompJarFileName);
+ File testCompJar = new File(testcompJarFileName);
+ assertTrue(testCompJar.isFile());
+
+ parentFrontEnd.registerComponent("foo", "org.picoextras.testmodel.DefaultWebServerConfig");
+
+ Object fooWebServerConfig = parentFrontEnd.getPicoContainer().getComponentInstance("foo");
+ assertEquals("org.picoextras.testmodel.DefaultWebServerConfig", fooWebServerConfig.getClass().getName());
+
+ ReflectionFrontEnd childFrontEnd = new DefaultReflectionFrontEnd(parentFrontEnd);
+ childFrontEnd.addClassLoaderURL(testCompJar.toURL());
+ childFrontEnd.registerComponent("bar", "TestComp");
+
+ Object barTestComp = childFrontEnd.getPicoContainer().getComponentInstance("bar");
+ assertEquals("TestComp", barTestComp.getClass().getName());
+
+ assertNotSame(fooWebServerConfig.getClass().getClassLoader(), barTestComp.getClass().getClassLoader());
+
+ // This kludge is needed because IDEA, Eclipse and Maven have different numbers of
+ // classloaders in their hierachies for junit invocation.
+ ClassLoader fooCL = fooWebServerConfig.getClass().getClassLoader();
+ ClassLoader barCL1 = barTestComp.getClass().getClassLoader().getParent();
+ ClassLoader barCL2, barCL3;
+ if (barCL1 != null && barCL1 != fooCL) {
+ barCL2 = barCL1.getParent();
+ if (barCL2 != null && barCL2 != fooCL) {
+ barCL3 = barCL2.getParent();
+ if (barCL3 != null && barCL3 != fooCL) {
+ fail("One of the parent classloaders of TestComp, should be that of DefaultWebServerConfig");
+ }
+ }
+ }
+ }
+
+}
----------
nano /reflection /src /test /org /picoextras /reflection
StringToObjectConverterTestCase.java added at 1.1
diff -N StringToObjectConverterTestCase.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ StringToObjectConverterTestCase.java 17 Nov 2003 21:04:17 -0000 1.1
@@ -0,0 +1,80 @@
+package org.picoextras.reflection;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+
+public class StringToObjectConverterTestCase extends TestCase {
+ private StringToObjectConverter converter = new StringToObjectConverter();
+
+ public void testConvertsToString() {
+ assertEquals("hello", converter.convertTo(String.class, "hello"));
+ assertEquals("", converter.convertTo(String.class, ""));
+ }
+
+ public void testConvertsToInts() {
+ assertEquals(new Integer(22), converter.convertTo(Integer.class, "22"));
+ assertEquals(new Integer(-9), converter.convertTo(Integer.class, "-9"));
+ }
+
+ public void testConvertsToLong() {
+ assertEquals(new Long(123456789012L), converter.convertTo(Long.class, "123456789012"));
+ assertEquals(new Long(-123456789012L), converter.convertTo(Long.class, "-123456789012"));
+ assertEquals(new Long(0), converter.convertTo(Long.class, "0"));
+ }
+
+ public void testConvertsToBooleanUsingBestGuess() {
+ assertEquals(Boolean.TRUE, converter.convertTo(Boolean.class, "t"));
+ assertEquals(Boolean.TRUE, converter.convertTo(Boolean.class, "true"));
+ assertEquals(Boolean.TRUE, converter.convertTo(Boolean.class, "T"));
+ assertEquals(Boolean.TRUE, converter.convertTo(Boolean.class, "TRUE"));
+ assertEquals(Boolean.TRUE, converter.convertTo(Boolean.class, "1"));
+ assertEquals(Boolean.TRUE, converter.convertTo(Boolean.class, "yes"));
+ assertEquals(Boolean.TRUE, converter.convertTo(Boolean.class, "Yo!"));
+
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, "f"));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, "false"));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, "FALSE"));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, "0"));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, "no"));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, "nada!"));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, ""));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, "I'm a lumberjack and I'm okay"));
+ }
+
+ public void testCustomConversionsCanBeRegistered() {
+ converter.register(File.class, new Converter() {
+ public Object convert(String in) {
+ return new File(in);
+ }
+ });
+ assertEquals("hello", converter.convertTo(String.class, "hello"));
+ assertEquals(new File("hello"), converter.convertTo(File.class, "hello"));
+ }
+
+ public void testNullsMapToDefaultValues() {
+ assertNull(converter.convertTo(String.class, null));
+ assertEquals(new Integer(0), converter.convertTo(Integer.class, null));
+ assertEquals(new Long(0), converter.convertTo(Long.class, null));
+ assertEquals(Boolean.FALSE, converter.convertTo(Boolean.class, null));
+ }
+
+ public void testExceptionThrownIfConverterNotRegistered() {
+ try {
+ converter.convertTo(File.class, "hello");
+ fail("Should have thrown exception");
+ } catch (InvalidConversionException e) {
+ // good
+ }
+ }
+
+ public void testDodgyFormatThrowExceptions() {
+ try {
+ converter.convertTo(Integer.class, "fooo");
+ fail("Should have thrown exception");
+ } catch (NumberFormatException e) {
+ // good
+ }
+ }
+
+}