/** * @return A new {@link ModelManager} instance. */ public ModelManager build() { return new ModelManager(resolver.resolve()); } }
/** * Adds the specified {@link CompositeModelBuilder} and its children to the * manager as a default provider. * @param provider The provider to add. * @return This, as per the builder pattern. */ public Builder addDefaultProvider(CompositeModelBuilder<?, ?> provider) { resolver.addDefault(provider); for (final ModelBuilder<?, ?> mb : provider.getChildren()) { addDefaultProvider(mb); } return this; }
/** * Adds the specified {@link CompositeModelBuilder} and its children to the * manager. * @param builder The builder to add. * @return This, as per the builder pattern. */ public Builder add(CompositeModelBuilder<?, ?> builder) { doAdd(builder); for (final ModelBuilder<?, ?> mb : builder.getChildren()) { add(mb); } return this; }
/** * Adds the specified {@link ModelBuilder} to the manager as a default * provider. A default provider will only be used if there is no regular * {@link ModelBuilder} (added via {@link #add(ModelBuilder)}) that provides * the same types. * @param provider The builder to add. * @return This, as per the builder pattern. */ public Builder addDefaultProvider(ModelBuilder<?, ?> provider) { if (provider instanceof CompositeModelBuilder<?, ?>) { return addDefaultProvider((CompositeModelBuilder<?, ?>) provider); } resolver.addDefault(provider); return this; }
/** * Adds the specified {@link ModelBuilder} to the manager. The * {@link ModelBuilder} will be used to obtain a {@link Model} instance. * @param builder The builder to add. * @return This, as per the builder pattern. */ public Builder add(ModelBuilder<?, ?> builder) { if (builder instanceof CompositeModelBuilder<?, ?>) { return add((CompositeModelBuilder<?, ?>) builder); } doAdd(builder); return this; }
/** * Adds the specified {@link ModelBuilder} to the simulator. The * {@link ModelBuilder} will be used to obtain a {@link Model} instance that * will be added to the simulator. * @param builder The builder to add. * @return This, as per the builder pattern. */ public Builder addModel(ModelBuilder<?, ?> builder) { mmBuilder.add(builder); return this; }
/** * Returns all models registered in the simulator. * @return immutable list of models. */ public ImmutableSet<Model<?>> getModels() { return modelManager.getModels(); }
Dependency(DependencyProvider dp, ModelBuilder<?, ?> mb, ImmutableSet<Class<?>> deps) { modelBuilder = mb; dependencyProvider = new DependencyProviderAccessDecorator(dp, deps, mb); if (deps.isEmpty()) { build(); } }
@Override public ImmutableSet<ModelBuilder<?, ?>> getChildren() { return ImmutableSet.<ModelBuilder<?, ?>>of( new ModelAsub1.Builder(), new ModelAsub2.Builder()); } }
@Override public boolean register(ModelReceiver element) { element.registerModelProvider(modelManager); return true; }
/** * @return A new {@link Builder} instance. */ public static Builder builder() { return new Builder(); }
Builder() { resolver = new DependencyResolver(); }
void doAdd(ModelBuilder<?, ?> b) { resolver.add(b); }
@Override public ModelAsub1sub1 build(DependencyProvider dependencyProvider) { return new ModelAsub1sub1(); } }
@Override public ModelAsub2 build(DependencyProvider dependencyProvider) { return new ModelAsub2(); } }
@Override public AbstractModelVoid build(DependencyProvider dependencyProvider) { counter++; return new NoOpModel(); }
@Override public ModelAsub1 build(DependencyProvider dependencyProvider) { return new ModelAsub1(); }
Builder() { setProvidingTypes(ModelAsub1sub1.class); }