AssemblyHelper helper = new AssemblyHelper();
ApplicationAssemblyImpl applicationAssembly = (ApplicationAssemblyImpl) assembly;
ActivatorsModel<Application> applicationActivators = new ActivatorsModel<>( applicationAssembly.activators() );
List<LayerModel> layerModels = new ArrayList<>();
final ApplicationModel applicationModel = new ApplicationModel( applicationAssembly.name(),
applicationAssembly.version(),
applicationAssembly.mode(),
applicationAssembly.metaInfo(),
applicationActivators,
layerModels );
Map<LayerAssembly, LayerModel> mapAssemblyModel = new HashMap<>();
Map<LayerAssembly, List<LayerModel>> mapUsedLayers = new HashMap<>();
// Build all layers
List<LayerAssemblyImpl> layerAssemblies = new ArrayList<>( applicationAssembly.layerAssemblies() );
for( LayerAssemblyImpl layerAssembly : layerAssemblies )
{
List<LayerModel> usedLayers = new ArrayList<>();
mapUsedLayers.put( layerAssembly, usedLayers );
UsedLayersModel usedLayersModel = new UsedLayersModel( usedLayers );
List<ModuleModel> moduleModels = new ArrayList<>();
String name = layerAssembly.name();
if( name == null )
{
throw new AssemblyException( "Layer must have name set" );
}
ActivatorsModel<Layer> layerActivators = new ActivatorsModel<>( layerAssembly.activators() );
LayerModel layerModel = new LayerModel( name, layerAssembly.metaInfo(), usedLayersModel, layerActivators, moduleModels );
for( ModuleAssemblyImpl moduleAssembly : layerAssembly.moduleAssemblies() )
{
moduleModels.add( moduleAssembly.assembleModule( helper ) );
}
mapAssemblyModel.put( layerAssembly, layerModel );
layerModels.add( layerModel );
}
// Populate used layer lists
for( LayerAssemblyImpl layerAssembly : layerAssemblies )
{
Set<LayerAssembly> usesLayers = layerAssembly.uses();
List<LayerModel> usedLayers = mapUsedLayers.get( layerAssembly );
for( LayerAssembly usesLayer : usesLayers )
{
LayerModel layerModel = mapAssemblyModel.get( usesLayer );
usedLayers.add( layerModel );
}
}
// Bind model
// This will resolve all dependencies
try
{
// applicationModel.bind();
applicationModel.accept( new BindingVisitor( applicationModel ) );
}
catch( BindingException e )
{
throw new AssemblyException( "Unable to bind: " + applicationModel, e );
}