All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dakusui.floorplan.utils.FloorPlanUtils Maven / Gradle / Ivy

package com.github.dakusui.floorplan.utils;

import com.github.dakusui.actionunit.core.Action;
import com.github.dakusui.floorplan.component.Attribute;
import com.github.dakusui.floorplan.component.Component;
import com.github.dakusui.floorplan.component.Configurator;
import com.github.dakusui.floorplan.component.Ref;
import com.github.dakusui.floorplan.core.Fixture;
import com.github.dakusui.floorplan.core.FixtureConfigurator;
import com.github.dakusui.floorplan.core.FixtureDescriptor;
import com.github.dakusui.floorplan.core.FloorPlan;
import com.github.dakusui.floorplan.policy.Policy;

import java.util.Arrays;
import java.util.function.Function;

import static com.github.dakusui.actionunit.core.ActionSupport.parallel;
import static com.github.dakusui.actionunit.core.ActionSupport.sequential;
import static java.util.stream.Collectors.toList;

/**
 * A utility class that collects useful methods for users of the 'FloorPlan' library.
 */
public enum FloorPlanUtils {
  ;

  public static Action createGroupedAction(
      boolean parallel,
      Function, Action> actionFactoryCreator,
      Fixture fixture,
      Ref... refs
  ) {
    Action[] actions = Arrays.stream(
        refs
    ).map(
        fixture::lookUp
    ).map(
        actionFactoryCreator::apply
    ).collect(
        toList()
    ).toArray(
        new Action[refs.length]
    );
    return parallel ?
        parallel(actions) :
        sequential(actions);
  }

  @SuppressWarnings("unchecked")
  public static  T resolve(A attr, Configurator configurator, Policy policy) {
    return (T) Function.class.cast(Function.class.cast(configurator.resolverFor(attr, policy).apply(attr)).apply(configurator)).apply(policy);
  }

  public static Fixture buildFixture(FixtureDescriptor fixtureDescriptor) {
    return createFixture(fixtureDescriptor, createPolicy(fixtureDescriptor));
  }

  @SuppressWarnings("unchecked")
  private static Fixture createFixture(FixtureDescriptor fixtureDescriptor, Policy policy) {
    FixtureConfigurator fixtureConfigurator = policy.fixtureConfigurator();
    fixtureDescriptor.attributes().forEach(
        each -> fixtureConfigurator.configure(
            each.target,
            each.attribute,
            each.resolver
        )
    );
    fixtureDescriptor.operatorFactoryAdders().forEach(
        each -> each.accept(fixtureConfigurator)
    );
    return fixtureConfigurator.build();
  }

  private static Policy createPolicy(FixtureDescriptor fixtureDescriptor) {
    Policy.Builder policyBuilder = new Policy.Builder().setProfile(
        fixtureDescriptor.profile()
    );
    fixtureDescriptor.specs().forEach(policyBuilder::addComponentSpec);
    policyBuilder.setFloorPlan(createFloorPlan(fixtureDescriptor));
    return policyBuilder.build();
  }

  private static FloorPlan createFloorPlan(FixtureDescriptor fixtureDescriptor) {
    FloorPlan floorPlan = new FloorPlan.Impl();
    fixtureDescriptor.refs().forEach(floorPlan::add);
    fixtureDescriptor.wires().forEach(each -> floorPlan.wire(each.from, each.as, each.tos));
    return floorPlan;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy