org.picocontainer.behaviors.AbstractBehavior Maven / Gradle / Ivy
/*****************************************************************************
* Copyright (C) PicoContainer 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 Jon Tirsen *
*****************************************************************************/
package org.picocontainer.behaviors;
import org.picocontainer.ComponentAdapter;
import org.picocontainer.ComponentMonitor;
import org.picocontainer.ComponentMonitorStrategy;
import org.picocontainer.LifecycleStrategy;
import org.picocontainer.PicoCompositionException;
import org.picocontainer.PicoContainer;
import org.picocontainer.PicoVisitor;
import java.io.Serializable;
import java.lang.reflect.Type;
/**
*
* Component adapter which decorates another adapter.
*
*
* This adapter supports a {@link org.picocontainer.ComponentMonitorStrategy component monitor strategy}
* and will propagate change of monitor to the delegate if the delegate itself
* support the monitor strategy.
*
*
* This adapter also supports a {@link Behavior lifecycle manager} and a
* {@link org.picocontainer.LifecycleStrategy lifecycle strategy} if the delegate does.
*
*
* @author Jon Tirsen
* @author Aslak Hellesoy
* @author Mauro Talevi
*/
public abstract class AbstractBehavior implements org.picocontainer.Behavior, ComponentMonitorStrategy,
LifecycleStrategy, Serializable {
protected final ComponentAdapter delegate;
public AbstractBehavior(ComponentAdapter delegate) {
this.delegate = delegate;
}
public Object getComponentKey() {
return delegate.getComponentKey();
}
public Class extends T> getComponentImplementation() {
return delegate.getComponentImplementation();
}
public T getComponentInstance(PicoContainer container) throws PicoCompositionException {
return getComponentInstance(container, NOTHING.class);
}
public T getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
return (T) delegate.getComponentInstance(container, into);
}
public void verify(PicoContainer container) throws PicoCompositionException {
delegate.verify(container);
}
public final ComponentAdapter getDelegate() {
return delegate;
}
@SuppressWarnings("unchecked")
public final U findAdapterOfType(Class adapterType) {
if (adapterType.isAssignableFrom(this.getClass())) {
return (U) this;
} else {
return delegate.findAdapterOfType(adapterType);
}
}
public void accept(PicoVisitor visitor) {
visitor.visitComponentAdapter(this);
delegate.accept(visitor);
}
/**
* Delegates change of monitor if the delegate supports
* a component monitor strategy.
* {@inheritDoc}
*/
public void changeMonitor(ComponentMonitor monitor) {
if (delegate instanceof ComponentMonitorStrategy ) {
((ComponentMonitorStrategy)delegate).changeMonitor(monitor);
}
}
/**
* Returns delegate's current monitor if the delegate supports
* a component monitor strategy.
* {@inheritDoc}
* @throws PicoCompositionException if no component monitor is found in delegate
*/
public ComponentMonitor currentMonitor() {
if (delegate instanceof ComponentMonitorStrategy ) {
return ((ComponentMonitorStrategy)delegate).currentMonitor();
}
throw new PicoCompositionException("No component monitor found in delegate");
}
/**
* Invokes delegate start method if the delegate is a Behavior
* {@inheritDoc}
*/
public void start(PicoContainer container) {
if (delegate instanceof org.picocontainer.Behavior) {
((org.picocontainer.Behavior>)delegate).start(container);
}
}
/**
* Invokes delegate stop method if the delegate is a Behavior
* {@inheritDoc}
*/
public void stop(PicoContainer container) {
if (delegate instanceof org.picocontainer.Behavior) {
((org.picocontainer.Behavior>)delegate).stop(container);
}
}
/**
* Invokes delegate dispose method if the delegate is a Behavior
* {@inheritDoc}
*/
public void dispose(PicoContainer container) {
if (delegate instanceof org.picocontainer.Behavior) {
((org.picocontainer.Behavior>)delegate).dispose(container);
}
}
/**
* Invokes delegate hasLifecycle method if the delegate is a Behavior
* {@inheritDoc}
*/
public boolean componentHasLifecycle() {
if (delegate instanceof org.picocontainer.Behavior) {
return ((org.picocontainer.Behavior>)delegate).componentHasLifecycle();
}
return false;
}
public boolean isStarted() {
if (delegate instanceof org.picocontainer.Behavior) {
return ((org.picocontainer.Behavior>)delegate).isStarted();
}
return false;
}
// ~~~~~~~~ LifecycleStrategy ~~~~~~~~
/**
* Invokes delegate start method if the delegate is a LifecycleStrategy
* {@inheritDoc}
*/
public void start(Object component) {
if (delegate instanceof LifecycleStrategy ) {
((LifecycleStrategy)delegate).start(component);
}
}
/**
* Invokes delegate stop method if the delegate is a LifecycleStrategy
* {@inheritDoc}
*/
public void stop(Object component) {
if (delegate instanceof LifecycleStrategy ) {
((LifecycleStrategy)delegate).stop(component);
}
}
/**
* Invokes delegate dispose method if the delegate is a LifecycleStrategy
* {@inheritDoc}
*/
public void dispose(Object component) {
if (delegate instanceof LifecycleStrategy ) {
((LifecycleStrategy)delegate).dispose(component);
}
}
/**
* Invokes delegate hasLifecycle(Class) method if the delegate is a LifecycleStrategy
* {@inheritDoc}
*/
public boolean hasLifecycle(Class> type) {
return delegate instanceof LifecycleStrategy && ((LifecycleStrategy) delegate).hasLifecycle(type);
}
public boolean isLazy(ComponentAdapter> adapter) {
return delegate instanceof LifecycleStrategy && ((LifecycleStrategy) delegate).isLazy(adapter);
}
public String toString() {
return getDescriptor() + ":" + delegate.toString();
}
}