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

com.github.dakusui.jcunit.runners.standard.annotations.Value Maven / Gradle / Ivy

package com.github.dakusui.jcunit.runners.standard.annotations;

import com.github.dakusui.jcunit.core.Checks;
import com.github.dakusui.jcunit.core.Utils;
import com.github.dakusui.jcunit.plugins.Plugin;
import com.github.dakusui.jcunit.plugins.PluginUtils;

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.LinkedList;
import java.util.List;

@Retention(RetentionPolicy.RUNTIME)
public @interface Value {
  String[] value();

  class Builder {
    private String[] values;

    public Builder() {
    }

    public Builder add(String... values) {
      this.values = values;
      return this;
    }

    public Value build() {
      return new Value() {
        @Override
        public Class annotationType() {
          return Value.class;
        }

        @Override
        public String[] value() {
          return Builder.this.values;
        }
      };
    }
  }

  class ArrayBuilder {
    private final List values = new LinkedList();

    public ArrayBuilder() {
    }

    public ArrayBuilder add(String... values) {
      this.values.add(new Builder().add(values).build());
      return this;
    }

    public Value[] build() {
      return this.values.toArray(new Value[this.values.size()]);
    }
  }

  /**
   * A resolver that converts {@literal @}{@code Value} into a value whose type is specified as
   * a parameter type of constructor.
   *
   * By this resolver, values given by {@literal @}{@code Value} annotation become actual values
   * that are used by plug-in implementations.
   */
  class Resolver extends Plugin.Param.Resolver {
    public Resolver() {
      super(createConverters(PluginUtils.StringArrayResolver.INSTANCE.allConverters()));
    }

    private static List> createConverters(List> converters) {
      return Utils.transform(
          Checks.checknotnull(converters),
          new Utils.Form, Plugin.Param.Converter>() {
            @Override
            public Plugin.Param.Converter apply(final Plugin.Param.Converter inConverter) {
              return new Plugin.Param.Converter() {
                @Override
                public Object convert(Class requested, Value inValue) {
                  return inConverter.convert(requested, inValue.value());
                }

                @Override
                public boolean supports(Class target) {
                  return inConverter.supports(target);
                }
              };
            }
          }
      );
    }

    @Override
    protected  Plugin.Param.Converter chooseConverter(Class clazz, List> from) {
      return from.get(0);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy