/*
* Copyright (c) 2006 jDiameter.
* https://jdiameter.dev.java.net/
*
* License: GPL v3
*
* e-mail: erick.svenson@yahoo.com
*
*/
package org.jdiameter.client.impl.helpers;
import org.jdiameter.api.Configuration;
import org.jdiameter.client.api.IAssembler;
import static org.jdiameter.client.impl.helpers.ExtensionPoint.*;
import static org.jdiameter.client.impl.helpers.Parameters.ExtensioinName;
import static org.jdiameter.client.impl.helpers.Parameters.Extensions;
import org.picocontainer.MutablePicoContainer;
import org.picocontainer.defaults.DefaultPicoContainer;
/**
* IOC for stack
*/
public class AssemblerImpl implements IAssembler {
AssemblerImpl parent;
final AssemblerImpl[] childs = new AssemblerImpl[ExtensionPoint.COUNT];
final MutablePicoContainer pico = new DefaultPicoContainer();
/**
* Create instance of class with predefined configiration
* @param config configuration of stack
* @throws Exception if generated internal exception
*/
public AssemblerImpl(Configuration config) throws Exception {
Configuration[] ext = config.getChildren(Extensions.ordinal());
for (Configuration e : ext) {
String extName = e.getStringValue(ExtensioinName.ordinal(), "");
// Create structure of containers
if ( extName.equals(ExtensionPoint.Internal.name()) ) {
fill(ExtensionPoint.Internal.getArrayOfParameters(), e, true);
} else
if ( extName.equals(ExtensionPoint.StackLayer.name()) ) {
updatePicoContainer(config, StackLayer, InternalMetaData, InternalSessionFactory, InternalMessageParser, InternalElementParser);
}
else
if ( extName.equals(ExtensionPoint.ControllerLayer.name()) ) {
updatePicoContainer(config, ControllerLayer, InternalPeerController, InternalPeerFsmFactory, InternalRouterEngine);
}
else
if ( extName.equals(ExtensionPoint.TransportLayer.name()) ) {
updatePicoContainer(config, TransportLayer, InternalTransportFactory );
}
}
}
private void updatePicoContainer(Configuration config, ExtensionPoint pointType, ExtensionPoint... updEntries) throws ClassNotFoundException {
for (ExtensionPoint e : updEntries) {
String oldValue = config.getChildren(Extensions.ordinal())[ Internal.id() ].getStringValue(e.ordinal(), null);
String newValue = config.getChildren(Extensions.ordinal())[ pointType.id()].getStringValue(e.ordinal(), null);
if (oldValue != null && newValue != null ) {
pico.unregisterComponent( Class.forName( oldValue) );
pico.registerComponentImplementation( Class.forName( newValue ));
}
}
}
/**
* Create child Assembler
* @param parent parent assembler
* @param e child configuration
* @param p extension poit
* @throws Exception
*/
protected AssemblerImpl(AssemblerImpl parent, Configuration e, ExtensionPoint p) throws Exception {
this.parent = parent;
fill(p.getArrayOfParameters(), e, false);
}
private void fill(ExtensionPoint[] codes, Configuration e, boolean check) throws Exception {
for (ExtensionPoint c : codes) {
String value = e.getStringValue( c.ordinal(), c.defValue() );
if (!check && (value == null || value.trim().length() == 0))
return;
try {
pico.registerComponentImplementation( Class.forName(value) );
} catch(NoClassDefFoundError exc) {
throw new Exception(exc);
}
}
}
/**
* @see org.picocontainer.MutablePicoContainer
*/
public Object getComponentInstance(Class<?> aClass) {
return pico.getComponentInstanceOfType(aClass);
}
/**
* @see org.picocontainer.MutablePicoContainer
*/
public void registerComponentInstance(Object object) {
pico.registerComponentInstance(object);
}
public void registerComponentImplementation(Class aClass) {
pico.registerComponentImplementation( aClass );
}
/**
* @see org.picocontainer.MutablePicoContainer
*/
public void registerComponentImplementation(Class<?> aClass, Object object) {
pico.registerComponentImplementation(object, aClass);
}
public void unregister(Class aClass) {
pico.unregisterComponent(aClass);
}
/**
* @see org.picocontainer.MutablePicoContainer
*/
public void destroy() {
pico.dispose();
}
/**
* return parent IOC
*/
public IAssembler getParent() {
return parent;
}
/**
* Get childs IOCs
* @return childs IOCs
*/
public IAssembler[] getChilds() {
return childs;
}
}