/** Create the appropriate properties for a bean. */
  public void createProperties(DeployBeanDescriptor<?> desc) {

    createProperties(desc, desc.getBeanType(), 0);
    desc.sortProperties();

    // check the transient properties...
    Iterator<DeployBeanProperty> it = desc.propertiesAll();

    while (it.hasNext()) {
      DeployBeanProperty prop = it.next();
      if (prop.isTransient()) {
        if (prop.getWriteMethod() == null || prop.getReadMethod() == null) {
          // Typically a helper method ... this is expected
          logger.finest("... transient: " + prop.getFullBeanName());
        } else {
          // dubious, possible error...
          String msg = Message.msg("deploy.property.nofield", desc.getFullName(), prop.getName());
          logger.warning(msg);
        }
      }
    }
  }
  @SuppressWarnings({"unchecked", "rawtypes"})
  private DeployBeanProperty createProp(DeployBeanDescriptor<?> desc, Field field) {

    Class<?> propertyType = field.getType();
    Class<?> innerType = propertyType;

    // check for Collection type (list, set or map)
    ManyType manyType = determineManyType.getManyType(propertyType);

    if (manyType != null) {
      // List, Set or Map based object
      Class<?> targetType = determineTargetType(field);
      if (targetType == null) {
        Transient transAnnotation = field.getAnnotation(Transient.class);
        if (transAnnotation != null) {
          // not supporting this field (generic type used)
          return null;
        }
        logger.warning(
            "Could not find parameter type (via reflection) on "
                + desc.getFullName()
                + " "
                + field.getName());
      }
      return createManyType(desc, targetType, manyType);
    }

    if (innerType.isEnum() || innerType.isPrimitive()) {
      return new DeployBeanProperty(desc, propertyType, null, null);
    }

    ScalarType<?> scalarType = typeManager.getScalarType(innerType);
    if (scalarType != null) {
      return new DeployBeanProperty(desc, propertyType, scalarType, null);
    }

    CtCompoundType<?> compoundType = typeManager.getCompoundType(innerType);
    if (compoundType != null) {
      return new DeployBeanPropertyCompound(desc, propertyType, compoundType, null);
    }

    if (!isTransientField(field)) {
      try {
        CheckImmutableResponse checkImmutable = typeManager.checkImmutable(innerType);
        if (checkImmutable.isImmutable()) {
          if (checkImmutable.isCompoundType()) {
            // use reflection to support compound immutable value objects
            typeManager.recursiveCreateScalarDataReader(innerType);
            compoundType = typeManager.getCompoundType(innerType);
            if (compoundType != null) {
              return new DeployBeanPropertyCompound(desc, propertyType, compoundType, null);
            }

          } else {
            // use reflection to support simple immutable value objects
            scalarType = typeManager.recursiveCreateScalarTypes(innerType);
            return new DeployBeanProperty(desc, propertyType, scalarType, null);
          }
        }
      } catch (Exception e) {
        logger.log(Level.SEVERE, "Error with " + desc + " field:" + field.getName(), e);
      }
    }

    return new DeployBeanPropertyAssocOne(desc, propertyType);
  }