Polish ApplicationModelFactoryImpl Split long method into smaller ones, for readability
Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/c7f705bd Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/c7f705bd Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/c7f705bd Branch: refs/heads/develop Commit: c7f705bd2075ae6989b412ad294f9793a88188ad Parents: 21eac24 Author: Paul Merlin <[email protected]> Authored: Mon May 22 17:17:24 2017 +0200 Committer: Paul Merlin <[email protected]> Committed: Mon May 22 17:17:24 2017 +0200 ---------------------------------------------------------------------- .../bootstrap/ApplicationModelFactoryImpl.java | 125 +++++++++++++------ 1 file changed, 86 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c7f705bd/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationModelFactoryImpl.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationModelFactoryImpl.java b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationModelFactoryImpl.java index 5d3b000..d2c788c 100644 --- a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationModelFactoryImpl.java +++ b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/ApplicationModelFactoryImpl.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import org.apache.polygene.api.composite.ModelDescriptor; -import org.apache.polygene.api.structure.Application; import org.apache.polygene.api.structure.ApplicationDescriptor; import org.apache.polygene.api.structure.Layer; import org.apache.polygene.api.util.HierarchicalVisitor; @@ -53,30 +52,42 @@ public final class ApplicationModelFactoryImpl { @Override public ApplicationDescriptor newApplicationModel( ApplicationAssembly assembly ) - throws AssemblyException { AssemblyHelper helper = createAssemblyHelper( assembly ); - + AssemblyMaps maps = new AssemblyMaps(); 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> layerModels = new ArrayList<>(); + + buildAllLayers( helper, maps, layerAssemblies, layerModels ); + populateUsedLayerModels( maps, layerAssemblies ); + + ApplicationModel applicationModel = buildApplicationModel( applicationAssembly, layerModels ); + bindApplicationModel( applicationModel ); + return applicationModel; + } + + private AssemblyHelper createAssemblyHelper( ApplicationAssembly assembly ) + { + if( assembly instanceof ApplicationAssemblyImpl ) { - List<LayerModel> usedLayers = new ArrayList<>(); - mapUsedLayers.put( layerAssembly, usedLayers ); + ApplicationAssemblyImpl impl = (ApplicationAssemblyImpl) assembly; + AssemblyHelper helper = impl.metaInfo().get( AssemblyHelper.class ); + if( helper != null ) + { + return helper; + } + } + return new AssemblyHelper(); + } - UsedLayersModel usedLayersModel = new UsedLayersModel( usedLayers ); + private void buildAllLayers( AssemblyHelper helper, AssemblyMaps maps, + List<LayerAssemblyImpl> layerAssemblies, List<LayerModel> layerModels ) + { + for( LayerAssemblyImpl layerAssembly : layerAssemblies ) + { + UsedLayersModel usedLayersModel = new UsedLayersModel( maps.usedLayersOf( layerAssembly ) ); List<ModuleModel> moduleModels = new ArrayList<>(); String name = layerAssembly.name(); if( name == null ) @@ -84,55 +95,90 @@ public final class ApplicationModelFactoryImpl 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 ); + LayerModel layerModel = new LayerModel( name, + layerAssembly.metaInfo(), + usedLayersModel, + layerActivators, + moduleModels ); for( ModuleAssemblyImpl moduleAssembly : layerAssembly.moduleAssemblies() ) { moduleModels.add( moduleAssembly.assembleModule( layerModel, helper ) ); } - mapAssemblyModel.put( layerAssembly, layerModel ); + maps.addModel( layerAssembly, layerModel ); layerModels.add( layerModel ); } + } - // Populate used layer lists + private void populateUsedLayerModels( AssemblyMaps maps, List<LayerAssemblyImpl> layerAssemblies ) + { for( LayerAssemblyImpl layerAssembly : layerAssemblies ) { Set<LayerAssembly> usesLayers = layerAssembly.uses(); - List<LayerModel> usedLayers = mapUsedLayers.get( layerAssembly ); + List<LayerModel> usedLayers = maps.usedLayersOf( layerAssembly ); for( LayerAssembly usesLayer : usesLayers ) { - LayerModel layerModel = mapAssemblyModel.get( usesLayer ); - usedLayers.add( layerModel ); + usedLayers.add( maps.modelOf( usesLayer ) ); } } + } + - // Bind model + private ApplicationModel buildApplicationModel( ApplicationAssemblyImpl applicationAssembly, + List<LayerModel> layerModels ) + { + return new ApplicationModel( applicationAssembly.name(), + applicationAssembly.version(), + applicationAssembly.mode(), + applicationAssembly.metaInfo(), + new ActivatorsModel<>( applicationAssembly.activators() ), + layerModels ); + } + + private void bindApplicationModel( ApplicationModel applicationModel ) + { // This will resolve all dependencies try { -// applicationModel.bind(); applicationModel.accept( new BindingVisitor( applicationModel ) ); } catch( BindingException e ) { throw new AssemblyException( "Unable to bind: " + applicationModel, e ); } - - return applicationModel; } - private AssemblyHelper createAssemblyHelper( ApplicationAssembly assembly ) + private static class AssemblyMaps { - if( assembly instanceof ApplicationAssemblyImpl ) + private final Map<LayerAssembly, LayerModel> mapAssemblyModel = new HashMap<>(); + private final Map<LayerModel, LayerAssembly> mapModelAssembly = new HashMap<>(); + private final Map<LayerAssembly, List<LayerModel>> mapUsedLayers = new HashMap<>(); + + void addModel( LayerAssembly assembly, LayerModel model ) { - ApplicationAssemblyImpl impl = (ApplicationAssemblyImpl) assembly; - AssemblyHelper helper = impl.metaInfo().get( AssemblyHelper.class ); - if( helper != null ) + mapAssemblyModel.put( assembly, model ); + mapModelAssembly.put( model, assembly ); + usedLayersOf( assembly ); + } + + LayerAssembly assemblyOf( LayerModel model ) + { + return mapModelAssembly.get( model ); + } + + LayerModel modelOf( LayerAssembly assembly ) + { + return mapAssemblyModel.get( assembly ); + } + + List<LayerModel> usedLayersOf( LayerAssembly assembly ) + { + if( !mapUsedLayers.containsKey( assembly ) ) { - return helper; + mapUsedLayers.put( assembly, new ArrayList<>() ); } + return mapUsedLayers.get( assembly ); } - return new AssemblyHelper(); } private static class BindingVisitor @@ -165,12 +211,14 @@ public final class ApplicationModelFactoryImpl else if( visited instanceof CompositeMethodModel ) { compositeMethodModel = (CompositeMethodModel) visited; - resolution = new Resolution( applicationModel, layer, module, objectDescriptor, compositeMethodModel, null ); + resolution = new Resolution( applicationModel, layer, module, + objectDescriptor, compositeMethodModel, null ); } else if( visited instanceof ModelDescriptor ) { objectDescriptor = (ModelDescriptor) visited; - resolution = new Resolution( applicationModel, layer, module, objectDescriptor, null, null ); + resolution = new Resolution( applicationModel, layer, module, + objectDescriptor, null, null ); } else if( visited instanceof InjectedFieldModel ) { @@ -191,7 +239,6 @@ public final class ApplicationModelFactoryImpl @Override public boolean visitLeave( Object visited ) - throws BindingException { return true; }
