Package net.karneim.pojobuilder.model

Examples of net.karneim.pojobuilder.model.TypeM


    this.javaModelAnalyzerUtil = javaModelAnalyzerUtil;
    this.typeMFactory = typeMFactory;
  }

  public void scan(ExecutableElement factoryMethodEl, Output output) {
    TypeM ownerType = typeMFactory.getTypeM((TypeElement) factoryMethodEl.getEnclosingElement());

    output.getBuilderModel().setFactoryMethod(
        new FactoryMethodM(factoryMethodEl.getSimpleName().toString(), factoryMethodEl.getModifiers())
            .declaredIn(ownerType));

    if (factoryMethodEl.getParameters().isEmpty()) {
      return;
    }
    FactoryProperties factoryPropertiesAnno = factoryMethodEl.getAnnotation(FactoryProperties.class);
    List<? extends VariableElement> parameters = factoryMethodEl.getParameters();
    if (factoryPropertiesAnno == null) {
      // use declared parameter names to map parameters to property names
      int i = 0;
      for (VariableElement param : parameters) {
        String propertyName = param.getSimpleName().toString();
        TypeMirror propertyTypeMirror = param.asType();
        TypeM propertyType = typeMFactory.getTypeM(propertyTypeMirror);
        output
            .getBuilderModel()
            .getProperties()
            .getOrCreate(propertyName, propertyType)
            .writableVia(
                new FactoryMethodParameterM(i).withName(propertyName).withVarArgs(
                    factoryMethodEl.isVarArgs() && i == parameters.size() - 1));
        i++;
      }
    } else {
      // use @FactoryProperties to map parameters to property names
      String[] propertyNames = factoryPropertiesAnno.value();
      if (propertyNames.length != parameters.size()) {
        String message =
            String.format("Incorrect number of values in annotation @%s! Expected %d, but was %d.",
                FactoryProperties.class.getSimpleName(), factoryMethodEl.getParameters().size(), propertyNames.length);
        throw new InvalidElementException(message, factoryMethodEl);
      }
      for (int i = 0; i < propertyNames.length; ++i) {
        String propertyName = propertyNames[i];
        if (!javaModelAnalyzerUtil.isValidJavaIdentifier(propertyName)) {
          String message =
              String.format("Illegal value in annotation @%s! Value '%s' is not a valid identifier.",
                  FactoryProperties.class.getSimpleName(), propertyName);
          throw new InvalidElementException(message, factoryMethodEl);
        }
        TypeMirror propertyTypeMirror = factoryMethodEl.getParameters().get(i).asType();
        TypeM propertyType = typeMFactory.getTypeM(propertyTypeMirror);
        output
            .getBuilderModel()
            .getProperties()
            .getOrCreate(propertyName, propertyType)
            .writableVia(
View Full Code Here


      List<? extends VariableElement> parameters = constrEl.getParameters();
      int i = 0;
      for (VariableElement paramEl : parameters) {
        String propertyName = paramEl.getSimpleName().toString();
        TypeMirror propertyTypeMirror = paramEl.asType();
        TypeM propertyType = typeMFactory.getTypeM(propertyTypeMirror);
        output
            .getBuilderModel()
            .getProperties()
            .getOrCreate(propertyName, propertyType)
            .writableVia(
                new ConstructorParameterM(i).withName(propertyName).withVarArgs(
                    constrEl.isVarArgs() && i == parameters.size() - 1));
        i++;
      }
    } else {
      // use @ConstructorProperties to map parameters to property names
      String[] propertyNames = constrPropsAnno.value();
      List<? extends VariableElement> parameters = constrEl.getParameters();
      if (propertyNames.length != parameters.size()) {
        String message =
            String.format("Incorrect number of values in annotation @%s! Expected %d, but was %d.",
                ConstructorProperties.class.getSimpleName(), parameters.size(), propertyNames.length);
        throw new InvalidElementException(message, constrEl);
      }

      for (int i = 0; i < propertyNames.length; ++i) {
        String propertyName = propertyNames[i];
        if (!javaModelAnalyzerUtil.isValidJavaIdentifier(propertyName)) {
          String message =
              String.format("Illegal value in annotation @%s! Value '%s' is not a valid identifier.",
                  ConstructorProperties.class.getSimpleName(), propertyName);
          throw new InvalidElementException(message, constrEl);
        }
        TypeMirror propertyTypeMirror = parameters.get(i).asType();
        TypeM propertyType = typeMFactory.getTypeM(propertyTypeMirror);
        output
            .getBuilderModel()
            .getProperties()
            .getOrCreate(propertyName, propertyType)
            .writableVia(
View Full Code Here

  public Output analyze(Input input) {
    LOG.fine(String.format("elem=%s", input));
    Output result = new Output(input);

    TypeM pojoType = typeMFactory.getTypeM(input.getPojoType());
    result.getBuilderModel().setPojoType(pojoType);
    result.getBuilderModel().setBuildMethod(new BuildMethodM());

    if (input.getDirectives().isGenerationGap()) {
      processBaseClass(result);
      processGenericBuilderInterface(result);

      result.getBuilderModel().setType(
          new TypeM(constructBuilderPackage(input), constructAbstractBuilderClassname(input))
              .withTypeParameter(pojoType.getTypeParameters()
                  .collectDistinctTypeVariablesRecursevly(new TypeListM()).asArray()));
      result.getBuilderModel().setAbstract(true);

      result.setManualBuilderModel(new ManualBuilderM());
      result.getManualBuilderModel().setType(
          new TypeM(constructBuilderPackage(input), constructBuilderClassname(input))
              .withTypeParameter(pojoType.getTypeParameters()
                  .collectDistinctTypeVariablesRecursevly(new TypeListM()).asArray()));
      result.getManualBuilderModel().setBaseType(result.getBuilderModel().getType());
      result.getManualBuilderModel().setPojoType(pojoType);
      result.getBuilderModel().setSelfType(result.getManualBuilderModel().getType());
    } else {
      processBaseClass(result);
      processGenericBuilderInterface(result);

      result.getBuilderModel().setType(
          new TypeM(constructBuilderPackage(input), constructBuilderClassname(input))
              .withTypeParameter(pojoType.getTypeParameters()
                  .collectDistinctTypeVariablesRecursevly(new TypeListM()).asArray()));
      result.getBuilderModel().setSelfType(result.getBuilderModel().getType());
    }

    scanSourceCode(input, result);
View Full Code Here

    if ( !hasPublicNoArgsConstructor) {
      String message =
          String.format("Class %s must have a public default constructor!", validatorClassname);
      throw new InvalidElementException(message, output.getInput().getAnnotatedElement());
    }
    TypeM type = typeMFactory.getTypeM(validatorTypeEl);
    output.getBuilderModel().setValidator(new ValidatorM(type, "validate"));
    output.getInput().getOrginatingElements().add(validatorTypeEl);
  }
View Full Code Here

    TypeElement interfaceTypeElement = elements.getTypeElement(builderInterfaceName);
    if (interfaceTypeElement == null) {
      String message = String.format("Can not resolve interface %s!", builderInterfaceName);
      throw new InvalidElementException(message, output.getInput().getAnnotatedElement());
    }
    TypeM interfaceType = typeMFactory.getTypeM(interfaceTypeElement);
    if (interfaceTypeElement.getTypeParameters().size() != 1) {
      String message =
          String
              .format(
                  "Illegal interface %s! A builder's interface must declare exactly 1 generic type parameter!",
                  interfaceTypeElement.getSimpleName());
      throw new InvalidElementException(message, output.getInput().getAnnotatedElement());
    }
    TypeParameterElement typeParamEl = interfaceTypeElement.getTypeParameters().get(0);
    if (!javaModelAnalyzerUtil.isUpperBoundToObject(typeParamEl)) {
      String message =
          String
              .format(
                  "Illegal interface %s! A builder's interface must declare exactly 1 generic type parameter with an upper bound of Object!",
                  interfaceTypeElement.getSimpleName());
      throw new InvalidElementException(message, output.getInput().getAnnotatedElement());
    }
    interfaceType.getTypeParameters().clear();
    interfaceType.getTypeParameters().add(output.getBuilderModel().getPojoType());

    boolean hasBuildMethod =
        javaModelAnalyzerUtil.hasBuildMethod(interfaceTypeElement, output.getInput()
            .getPojoElement().asType());
    if (hasBuildMethod) {
View Full Code Here

      String message =
          String.format("Illegal baseclass %s! A builder's baseclass must not be final.",
              baseTypeElement.getSimpleName());
      throw new InvalidElementException(message, output.getInput().getAnnotatedElement());
    }
    TypeM baseType = typeMFactory.getTypeM(baseTypeElement);
    if (!baseTypeElement.getTypeParameters().isEmpty()) {
      TypeElement pojoTypeElement = output.getInput().getPojoElement();
      if (baseTypeElement.getTypeParameters().size() > 1) {
        String message =
            String
                .format(
                    "Illegal baseclass %s! A builder's baseclass must not have more than 1 generic type parameter!",
                    baseTypeElement.getSimpleName());
        throw new InvalidElementException(message, output.getInput().getAnnotatedElement());
      }
      TypeParameterElement typeParamEl = baseTypeElement.getTypeParameters().get(0);
      if (!javaModelAnalyzerUtil.matchesUpperBound(pojoTypeElement, typeParamEl)) {
        String message =
            String.format("Illegal baseclass %s! %s can not be assigned to type parameter %s!",
                baseTypeElement.getSimpleName(), pojoTypeElement.getSimpleName(),
                typeParamEl.getSimpleName());
        throw new InvalidElementException(message, output.getInput().getAnnotatedElement());
      }
      baseType.getTypeParameters().clear();
      baseType.getTypeParameters().add(output.getBuilderModel().getPojoType());
    }
    boolean hasBuildMethod =
        javaModelAnalyzerUtil.hasBuildMethod(baseTypeElement, output.getInput().getPojoElement()
            .asType());
    if (hasBuildMethod) {
View Full Code Here

TOP

Related Classes of net.karneim.pojobuilder.model.TypeM

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.