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

org.joda.beans.gen.PropertyData Maven / Gradle / Ivy

There is a newer version: 2.11.1
Show newest version
/*
 *  Copyright 2001-present Stephen Colebourne
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.joda.beans.gen;

import static java.util.stream.Collectors.joining;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;

import org.joda.beans.PropertyStyle;

/**
 * A bean that can be generated.
 */
class PropertyData {

    /** Collection types. */
    private static final Set COLLECTIONS = new HashSet<>(
            Arrays.asList(
                    "Collection", "Set", "SortedSet", "NavigableSet", "List",
                    "ArrayList", "LinkedList",
                    "HashSet", "LinkedHashSet", "TreeSet", "ConcurrentSkipListSet, EnumSet",
                    "ImmutableCollection", "ImmutableList", "ImmutableSet", "ImmutableSortedSet"));
    /** Set types. */
    private static final Set SETS = new HashSet<>(
            Arrays.asList(
                    "Set", "SortedSet", "NavigableSet",
                    "HashSet", "LinkedHashSet", "TreeSet", "ConcurrentSkipListSet, EnumSet",
                    "ImmutableSet", "ImmutableSortedSet"));
    /** Set types. */
    private static final Set SORTED_SETS = new HashSet<>(
            Arrays.asList(
                    "SortedSet", "NavigableSet",
                    "TreeSet", "ConcurrentSkipListSet",
                    "ImmutableSortedSet"));
    /** Map types. */
    private static final Set MAPS = new HashSet<>(
            Arrays.asList(
                    "Map", "SortedMap", "NavigableMap", "ConcurrentMap", "ConcurrentNavigableMap",
                    "HashMap", "LinkedHashMap", "TreeMap", "ConcurrentHashMap", "ConcurrentSkipListMap",
                    "BiMap", "HashBiMap",
                    "ImmutableMap", "ImmutableSortedMap", "ImmutableBiMap"));

    /** Owning bean. */
    private final BeanData bean;
    /** Annotation line index for {@code PropertyDefinition} in input file. */
    private final int lineIndex;
    /** Property name. */
    private String propertyName;
    /** Field name. */
    private String fieldName;
    /** Meta field name. */
    private String metaFieldName;
    /** Upper property name. */
    private String upperName;
    /** Property type. */
    private String type;
    /** The builder type. */
    private String builderType;
    /** Property field type. */
    private String fieldType;
    /** Whether the field is declared final. */
    private boolean isFinal;
    /** The field initializer. */
    private String initializer;
    /** The alias. */
    private String alias;
    /** The getter style. */
    private String getStyle;
    /** The setter style. */
    private String setStyle;
    /** The override style. */
    private boolean overrideGet;
    /** The override style. */
    private boolean overrideSet;
    /** The type style. */
    private String typeStyle;
    /** The builder type style. */
    private String builderTypeStyle;
    /** The equals hashCode style. */
    private String equalsHashCodeStyle;
    /** The toString style. */
    private String toStringStyle;
    /** The validation string. */
    private String validation;
    /** Deprecated flag. */
    private boolean deprecated;
    /** First comment about the property. */
    private String firstComment;
    /** Other comments about the property. */
    private final List comments = new ArrayList<>();
    /** Deprecated comment about the property, null if not deprecated. */
    private String deprecatedComment;
    /** The getter generator. */
    private GetterGen getterGen;
    /** The setter generator. */
    private SetterGen setterGen;
    /** The flag for bound properties. */
    private boolean bound;
    /** The copy generator. */
    private CopyGen copyGen;
    /** The builder generator. */
    private BuilderGen builderGen;
    /** The config. */
    private BeanGenConfig config;

    /**
     * Constructor.
     */
    PropertyData(BeanData bean, BeanGenConfig config, int lineIndex) {
        this.bean = bean;
        this.config = config;
        this.lineIndex = lineIndex;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the bean.
     * @return the bean, not null
     */
    public BeanData getBean() {
        return bean;
    }

    /**
     * Gets the configuration.
     * 
     * @return the configuration, not null
     */
    public BeanGenConfig getConfig() {
        return config;
    }

    /**
     * Sets the configuration.
     * 
     * @param config  the new configuration, not null
     */
    public void setConfig(BeanGenConfig config) {
        this.config = config;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the property line index.
     * @return the property line index
     */
    public int getLineIndex() {
        return lineIndex;
    }

    /**
     * Gets the property name.
     * @return the property name
     */
    public String getPropertyName() {
        return propertyName;
    }

    /**
     * Sets the property name.
     * @param propertyName  the property name to set
     */
    public void setPropertyName(String propertyName) {
        this.propertyName = propertyName;
    }

    /**
     * Gets the field name.
     * @return the field name
     */
    public String getFieldName() {
        return fieldName;
    }

    /**
     * Sets the field name.
     * @param fieldName  the field name to set
     */
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    /**
     * Gets the meta field name.
     * @return the meta field name
     */
    public String getMetaFieldName() {
        return metaFieldName;
    }

    /**
     * Sets the meta field name.
     * @param metaFieldName  the meta field name to set
     */
    public void setMetaFieldName(String metaFieldName) {
        this.metaFieldName = metaFieldName;
    }

    /**
     * Gets the upper property name.
     * @return the upper name
     */
    public String getUpperName() {
        return upperName;
    }

    /**
     * Sets the upper property name.
     * @param upperName  the upper name to set
     */
    public void setUpperName(String upperName) {
        this.upperName = upperName;
    }

    /**
     * Gets the type.
     * @return the type
     */
    public String getType() {
        return type;
    }

    /**
     * Sets the type.
     * @param type  the type to set
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * Gets the builder type.
     * @return the type
     */
    public String getBuilderType() {
        return builderType;
    }

    /**
     * Sets the builder type.
     * @param builderType  the type to set
     */
    public void setBuilderType(String builderType) {
        this.builderType = builderType;
    }

    /**
     * Gets the field type.
     * @return the field type
     */
    public String getFieldType() {
        return fieldType;
    }

    /**
     * Sets the field type.
     * @param fieldType  the field type to set
     */
    public void setFieldType(String fieldType) {
        this.fieldType = fieldType;
    }

    /**
     * Resolves the field type.
     */
    public void resolveType() {
        if (getTypeStyle() == null) {
            setTypeStyle("");
        }
        final String fieldType = getFieldType();
        String generics = "";
        if (fieldType.contains("<")) {
            generics = fieldType.substring(fieldType.indexOf('<'));
        }
        if (getTypeStyle().equals("smart")) {
            setType(fieldType);
        } else if (getTypeStyle().length() > 0) {
            if (getTypeStyle().contains("<>")) {
                setType(getTypeStyle().replace("<>", generics));
            } else if (getTypeStyle().contains("<")) {
                setType(getTypeStyle());
            } else {
                setType(getTypeStyle() + generics);
            }
        } else {
            setType(fieldType);
        }
    }

    /**
     * Resolves the field builder type.
     */
    public void resolveBuilderType() {
        if (getBuilderTypeStyle() == null) {
            setBuilderTypeStyle("");
        }
        final String fieldType = getFieldType();
        String generics = "";
        if (fieldType.contains("<")) {
            generics = fieldType.substring(fieldType.indexOf('<'));
        }
        if (getBuilderTypeStyle().equals("smart")) {
            setBuilderType(fieldType);
        } else if (getBuilderTypeStyle().length() > 0) {
            if (getBuilderTypeStyle().contains("<>")) {
                setBuilderType(getBuilderTypeStyle().replace("<>", generics));
            } else if (getBuilderTypeStyle().contains("<")) {
                setBuilderType(getBuilderTypeStyle());
            } else {
                setBuilderType(getBuilderTypeStyle() + generics);
            }
        } else {
            setBuilderType(fieldType);
        }
    }

    /**
     * Gets whether the field is declared final.
     * @return the type
     */
    public boolean isFinal() {
        return isFinal;
    }

    /**
     * Sets whether the field is declared final.
     * @param isFinal  the field is final flag
     */
    public void setFinal(boolean isFinal) {
        this.isFinal = isFinal;
    }

    /**
     * Gets the field initializer.
     * @return the initializer
     */
    public String getInitializer() {
        return initializer;
    }

    /**
     * Sets the field initializer.
     * @param initializer  the field initializer
     */
    public void setInitializer(String initializer) {
        this.initializer = initializer;
    }

    /**
     * Gets the alias.
     * @return the alias
     */
    public String getAlias() {
        return alias;
    }

    /**
     * Sets the alias.
     * @param alias  the alias
     */
    public void setAlias(String alias) {
        this.alias = (alias != null && alias.isEmpty() == false ? alias : null);
    }

    /**
     * Gets the getter style.
     * @return the getter style
     */
    public String getGetStyle() {
        return getStyle;
    }

    /**
     * Sets the getter style.
     * @param getStyle  the getter style to set
     */
    public void setGetStyle(String getStyle) {
        this.getStyle = getStyle;
    }

    /**
     * Gets the type style.
     * @return the type style
     */
    public String getTypeStyle() {
        return typeStyle;
    }

    /**
     * Sets the type style.
     * @param typeStyle  the type style to set
     */
    public void setTypeStyle(String typeStyle) {
        this.typeStyle = typeStyle;
    }

    /**
     * Gets the type builder type style.
     * @return the builder type style
     */
    public String getBuilderTypeStyle() {
        return builderTypeStyle;
    }

    /**
     * Sets the builder type style.
     * @param builderTypeStyle  the builder type style to set
     */
    public void setBuilderTypeStyle(String builderTypeStyle) {
        this.builderTypeStyle = builderTypeStyle;
    }

    /**
     * Gets the equals hashCode style.
     * @return the equals hashCode style
     */
    public String getEqualsHashCodeStyle() {
        return equalsHashCodeStyle;
    }

    /**
     * Sets the equals hashCode style.
     * @param equalsHashCodeStyle  the equals hashCode style
     */
    public void setEqualsHashCodeStyle(String equalsHashCodeStyle) {
        this.equalsHashCodeStyle = equalsHashCodeStyle;
    }

    /**
     * Resolves the equals hashCode generator.
     * @param file  the file
     * @param lineIndex  the line index
     */
    public void resolveEqualsHashCodeStyle(File file, int lineIndex) {
        if (equalsHashCodeStyle.equals("smart")) {
            equalsHashCodeStyle = (bean.isImmutable() ? "field" : "getter");
        }
        if (equalsHashCodeStyle.equals("omit") ||
                equalsHashCodeStyle.equals("getter") ||
                equalsHashCodeStyle.equals("field")) {
            return;
        }
        throw new BeanCodeGenException("Invalid equals/hashCode style: " + equalsHashCodeStyle +
                " in " + getBean().getTypeRaw() + "." + getPropertyName(), file, lineIndex);
    }

    /**
     * Gets the toString style.
     * @return the toString style
     */
    public String getToStringStyle() {
        return toStringStyle;
    }

    /**
     * Sets the toString style.
     * @param toStringStyle  the toString style
     */
    public void setToStringStyle(String toStringStyle) {
        this.toStringStyle = toStringStyle;
    }

    /**
     * Resolves the toString generator.
     * @param file  the file
     * @param lineIndex  the line index
     */
    public void resolveToStringStyle(File file, int lineIndex) {
        if (toStringStyle.equals("smart")) {
            toStringStyle = (bean.isImmutable() ? "field" : "getter");
        }
        if (toStringStyle.equals("omit") ||
                toStringStyle.equals("getter") ||
                toStringStyle.equals("field")) {
            return;
        }
        throw new BeanCodeGenException("Invalid toString style: " + toStringStyle +
                " in " + getBean().getTypeRaw() + "." + getPropertyName(), file, lineIndex);
    }

    /**
     * Gets the setter style.
     * @return the setter style
     */
    public String getSetStyle() {
        return setStyle;
    }

    /**
     * Sets the setter style.
     * @param setStyle  the setter style to set
     */
    public void setSetStyle(String setStyle) {
        this.setStyle = setStyle;
    }

    /**
     * Gets the override get flag.
     * @return the setter style
     */
    public boolean isOverrideGet() {
        return overrideGet;
    }

    /**
     * Sets the override get flag.
     * @param overrideGet  the setter style to set
     */
    public void setOverrideGet(boolean overrideGet) {
        this.overrideGet = overrideGet;
    }

    /**
     * Gets the override get flag.
     * @return the setter style
     */
    public boolean isOverrideSet() {
        return overrideSet;
    }

    /**
     * Sets the override get flag.
     * @param overrideSet  the setter style to set
     */
    public void setOverrideSet(boolean overrideSet) {
        this.overrideSet = overrideSet;
    }

    /**
     * Gets the validation.
     * @return the validation
     */
    public String getValidation() {
        return validation;
    }

    /**
     * Sets the validation.
     * @param validation  the validation to set
     */
    public void setValidation(String validation) {
        this.validation = validation;
    }

    /**
     * Resolves validation.
     */
    public void resolveValidation() {
        if (isFinal() && getInitializer().length() > 0 &&  getValidation().length() == 0) {
            setValidation("notNull");
        }
    }

    /**
     * Checks if the property is deprecated.
     * @return the deprecated flag
     */
    public boolean isDeprecated() {
        return deprecated;
    }

    /**
     * Sets if the property is deprecated.
     * @param deprecated  the deprecated to set
     */
    public void setDeprecated(boolean deprecated) {
        this.deprecated = deprecated;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the first comment line.
     * @return the first comment
     */
    public String getFirstComment() {
        return firstComment;
    }

    /**
     * Sets the first comment line.
     * @param firstComment  the first comment to set
     */
    public void setFirstComment(String firstComment) {
        this.firstComment = firstComment;
    }

    /**
     * Gets the remaining comments.
     * @return the remaining comments, not null
     */
    public List getComments() {
        return comments;
    }

    /**
     * Gets the deprecated comment line.
     * @return the deprecated comment
     */
    public String getDeprecatedComment() {
        return deprecatedComment;
    }

    /**
     * Sets the deprecated comment line.
     * @param deprecatedComment  the deprecated comment to set
     */
    public void setDeprecatedComment(String deprecatedComment) {
        this.deprecatedComment = deprecatedComment;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the property is parameterised with generics.
     * @return true if generified
     */
    public boolean isGenericParamType() {
        return type.indexOf("<") >= 0;
    }

    /**
     * Checks if the property is parameterised with generics.
     * {@code Foo} will return true, {@code Foo will return false}.
     * @return true if generified
     */
    public boolean isGenericWildcardParamType() {
        return type.endsWith("");
    }

    /**
     * Gets the parameterisation of the property.
     * {@code Foo} will return {@code String}.
     * @return the generic type, or a blank string if not generic, not null
     */
    public String getGenericParamType() {
        int pos = type.indexOf("<");
        if (pos < 0) {
            return "";
        }
        return type.substring(pos + 1, type.length() - 1);
    }

    /**
     * Checks if the type is the generic type of the bean.
     * For example, if the property is of type T or T[] in a bean of Foo[T].
     * @return true if matches
     */
    public boolean isBeanGenericType() {
        String stripped = type;
        if (isArrayType()) {
            stripped = type.substring(0, type.length() - 2);
        }
        return bean.isTypeGenerifiedBy(stripped);
    }

    /**
     * Checks if the property is generic in some way.
     * @return true if generic
     */
    public boolean isGeneric() {
        return isGenericParamType() || isBeanGenericType();
    }

    /**
     * Gets the raw type of the property without generics.
     * {@code Foo} will return {@code Foo}.
     * @return the raw type
     */
    public String getTypeRaw() {
        int pos = type.indexOf("<");
        return (pos < 0 ? type : type.substring(0, pos));
    }

    /**
     * Gets the raw type of the property.
     * @return the raw type
     */
    public String getFieldTypeRaw() {
        int pos = fieldType.indexOf("<");
        return (pos < 0 ? fieldType : fieldType.substring(0, pos));
    }

    /**
     * Gets the generic part of the property type.
     * 

* For example, "{@literal Foo}" will return "{@literal }". * * @return the generic part of the type, not null */ public String getTypeGenerics() { final String type = getType(); if (type.contains("<")) { return type.substring(type.indexOf('<')); } return ""; } /** * Gets the generic part of the property type. *

* For example, "{@literal Foo}" will return "String". * * @return the generic part of the type, empty if not generic, not null */ public String getTypeGenericsSimple() { final String type = getType(); if (type.contains("<")) { return type.substring(type.indexOf('<') + 1, type.length() - 1); } return ""; } /** * Gets the type of the property, erasing generics attached to the bean. * {@code Foo} will return {@code Foo} where {@code T extends Number}. * @return the raw type */ public String getTypeBeanErased() { if (isBeanGenericType()) { for (int i = 0; i < bean.getTypeGenericCount(); i++) { if (type.equals(bean.getTypeGenericName(i, false))) { return bean.getTypeGenericErased(i); } } } String generic = getTypeGenericsSimple(); if (generic.isEmpty()) { return type; } StringTokenizer tkn = new StringTokenizer(generic, ","); List altered = new ArrayList<>(); while (tkn.hasMoreTokens()) { String genericType = tkn.nextToken().trim(); String erased = genericType; if (bean.isTypeGenerifiedBy(genericType)) { for (int i = 0; i < bean.getTypeGenericCount(); i++) { if (genericType.equals(bean.getTypeGenericName(i, false))) { erased = bean.getTypeGenericErased(i); } } } altered.add(erased); } return getTypeRaw() + "<" + altered.stream().collect(joining(", ")) + ">"; } /** * Checks if the property is derived. * @return true if derived */ public boolean isDerived() { return fieldName == null; } //----------------------------------------------------------------------- /** * Resolves the getter generator. * @param file the file * @param lineIndex the line index */ public void resolveGetterGen(File file, int lineIndex) { if (getGetStyle() == null) { setGetStyle(""); } String style = getGetStyle(); String access = "public"; if (style.equals("private")) { style = "smart"; access = "private"; } else if (style.equals("package")) { style = "smart"; access = "package"; } else if (style.equals("protected")) { style = "smart"; access = "protected"; } if (style.equals("get")) { getterGen = GetterGen.GetGetterGen.PUBLIC; } else if (style.equals("is")) { getterGen = GetterGen.IsGetterGen.PUBLIC; } else if (style.equals("smart")) { if (bean.isImmutable()) { String clone = config.getImmutableGetClones().get(getFieldTypeRaw()); if ("clone".equals(clone)) { getterGen = isNotNull() ? GetterGen.CloneNNGetterGen.of(access) : GetterGen.CloneGetterGen.of(access); } else if ("cloneCast".equals(clone)) { getterGen = isNotNull() ? GetterGen.CloneCastNNGetterGen.of(access) : GetterGen.CloneCastGetterGen.of(access); } else if (getType().equals("boolean")) { getterGen = GetterGen.IsGetterGen.of(access); } else { getterGen = GetterGen.GetGetterGen.of(access); } } else if (getType().equals("boolean")) { getterGen = GetterGen.IsGetterGen.of(access); } else { getterGen = GetterGen.GetGetterGen.of(access); } } else if (style.equals("")) { getterGen = GetterGen.NoGetterGen.INSTANCE; } else if (style.equals("field")) { getterGen = GetterGen.NoGetterGen.INSTANCE; } else if (style.equals("clone")) { getterGen = isNotNull() ? GetterGen.CloneNNGetterGen.PUBLIC : GetterGen.CloneGetterGen.PUBLIC; } else if (style.equals("cloneCast")) { getterGen = isNotNull() ? GetterGen.CloneCastNNGetterGen.PUBLIC : GetterGen.CloneCastGetterGen.PUBLIC; } else if (style.equals("optional")) { getterGen = GetterGen.Optional8GetterGen.PUBLIC; } else if (style.equals("optionalGuava")) { getterGen = GetterGen.OptionalGuavaGetterGen.PUBLIC; } else if (style.equals("manual")) { getterGen = GetterGen.ManualGetterGen.INSTANCE; } else { throw new BeanCodeGenException("Unable to locate getter generator '" + style + "'" + " in " + getBean().getTypeRaw() + "." + getPropertyName(), file, lineIndex); } } /** * Gets the getter generator. * @return the getter generator */ public GetterGen getGetterGen() { return getterGen; } //----------------------------------------------------------------------- /** * Resolves the setter generator. * @param file the file * @param lineIndex the line index */ public void resolveSetterGen(File file, int lineIndex) { if (getSetStyle() == null) { setSetStyle(""); } String style = getSetStyle().replace("\\n", "\n"); String access = "public"; if (style.equals("private")) { style = "smart"; access = "private"; } else if (style.equals("package")) { style = "smart"; access = "package"; } else if (style.equals("protected")) { style = "smart"; access = "protected"; } if (style.equals("set")) { setterGen = SetterGen.SetSetterGen.PUBLIC; } else if (style.equals("setClearAddAll")) { setterGen = new SetterGen.PatternSetterGen("$field.clear();\n$field.addAll($value);"); } else if (style.equals("setClearPutAll")) { setterGen = new SetterGen.PatternSetterGen("$field.clear();\n$field.putAll($value);"); } else if (style.equals("bound")) { if (isFinal()) { throw new IllegalArgumentException("Final field must not have a bound setter"); } else { setterGen = SetterGen.ObservableSetterGen.PUBLIC; bound = true; } } else if (style.equals("smart")) { if (isDerived()) { setterGen = SetterGen.NoSetterGen.INSTANCE; } else if (isFinal()) { if (isCollectionType()) { setterGen = new SetterGen.PatternSetterGen("$field.clear();\n$field.addAll($value);", access); } else if (isMapType()) { setterGen = new SetterGen.PatternSetterGen("$field.clear();\n$field.putAll($value);", access); } else { setterGen = SetterGen.NoSetterGen.INSTANCE; } } else { setterGen = SetterGen.SetSetterGen.of(access); } } else if (style.equals("")) { setterGen = SetterGen.NoSetterGen.INSTANCE; } else if (style.equals("field")) { setterGen = SetterGen.FieldSetterGen.INSTANCE; } else if (style.equals("manual")) { setterGen = SetterGen.NoSetterGen.INSTANCE; } else if (style.contains("$field") || style.contains("$value")) { if (style.contains("$field") || style.contains("\n")) { setterGen = new SetterGen.PatternSetterGen(style); } else { setterGen = new SetterGen.PatternSetterGen("$field = " + style); } } else { throw new BeanCodeGenException("Unable to locate setter generator '" + style + "'" + " in " + getBean().getTypeRaw() + "." + getPropertyName(), file, lineIndex); } } /** * Gets the setter generator. * @return the setter generator */ public SetterGen getSetterGen() { return setterGen; } /** * Gets the setter scope. * @return the setter scope */ public String getSetterScope() { if (getSetStyle().equals("private")) { return "private"; } return "public"; } /** * Gets whether the property is bound. * @return true if bound */ public boolean isBound() { return bound; } //----------------------------------------------------------------------- /** * Resolves the copy generator. * @param file the file * @param lineIndex the line index */ public void resolveCopyGen(File file, int lineIndex) { if (getBean().isMutable() && getBean().isBuilderScopeVisible() == false) { return; // no copying } if (config.getInvalidImmutableTypes().contains(getFieldTypeRaw())) { throw new BeanCodeGenException("Invalid collection type for immutable bean: " + getFieldTypeRaw() + " in " + getBean().getTypeRaw() + "." + getPropertyName(), file, lineIndex); } if (isDerived()) { copyGen = CopyGen.NoCopyGen.INSTANCE; } else { CopyGen copier = config.getCopyGenerators().get(getFieldTypeRaw()); if (copier != null) { copyGen = copier; } else { String clone = config.getImmutableGetClones().get(getFieldTypeRaw()); if (clone != null) { if (clone.equals("clone")) { copyGen = CopyGen.CLONE; } else { copyGen = CopyGen.CLONE_CAST; } } else { copyGen = CopyGen.ASSIGN; } } } } /** * Gets the copy generator. * @return the copy generator */ public CopyGen getCopyGen() { return copyGen; } //----------------------------------------------------------------------- /** * Resolves the copy generator. */ public void resolveBuilderGen() { if (getBean().isMutable()) { if (!getBean().isBuilderScopeVisible() && !getBean().isBeanStyleLightOrMinimal()) { return; // no builder } } if (isDerived()) { builderGen = BuilderGen.NoBuilderGen.INSTANCE; } else { BuilderGen builder = config.getBuilderGenerators().get(getFieldTypeRaw()); if (builder != null) { builderGen = builder; } else { builderGen = new BuilderGen.SimpleBuilderGen(); } } } /** * Gets the builder generator. * @return the builder generator */ public BuilderGen getBuilderGen() { return builderGen; } //----------------------------------------------------------------------- /** * Checks if this property is an array type. * * @return true if it is an array type */ public boolean isArrayType() { return getType().endsWith("[]"); } /** * Checks if this property is an array type. * * @return true if it is an array type */ public boolean isGenericArrayType() { return getType().endsWith("[]") && getType().length() == 3; } /** * Checks if this property is a known collection type. * * @return true if it is a known collection type */ public boolean isCollectionType() { return isGeneric() && COLLECTIONS.contains(getTypeRaw()); } /** * Checks if this property is a known set type. * * @return true if it is a known set type */ public boolean isSetType() { return isGeneric() && SETS.contains(getTypeRaw()); } /** * Checks if this property is a known sorted set type. * * @return true if it is a known set type */ public boolean isSortedSetType() { return isGeneric() && SORTED_SETS.contains(getTypeRaw()); } /** * Checks if this property is a known map type. * * @return true if it is a known map type */ public boolean isMapType() { return "FlexiBean".equals(getType()) || (isGeneric() && MAPS.contains(getTypeRaw())); } /** * Gets the read-write flag. * * @return the read write */ public PropertyStyle getStyle() { if (isDerived()) { return PropertyStyle.DERIVED; } if (getBean().isImmutable()) { return PropertyStyle.IMMUTABLE; } if (getGetStyle().length() > 0 && getSetStyle().length() > 0 && (getSetterGen().isSetterGenerated(this) || getSetStyle().equals("manual"))) { return PropertyStyle.READ_WRITE; } if (getGetStyle().length() > 0) { if (bean.isBuilderScopeVisible()) { return PropertyStyle.READ_ONLY_BUILDABLE; } else { return PropertyStyle.READ_ONLY; } } if (getSetStyle().length() > 0) { return PropertyStyle.WRITE_ONLY; } throw new RuntimeException("Property must have a getter or setter: " + getBean().getTypeRaw() + "." + getPropertyName()); } //----------------------------------------------------------------------- /** * Checks if the validation is non-null. * @return true if non-null */ public boolean isValidated() { return getValidation() != null && getValidation().length() > 0; } /** * Checks if the validation is non-null. * @return true if non-null */ public boolean isNotNull() { return getValidation().equals("notNull") || getValidation().equals("notEmpty") || getValidation().equals("notBlank"); } /** * Gets the validation non-null Javadoc. * @return the non-null text */ public String getNotNullJavadoc() { if (getValidation().equals("notNull")) { return ", not null"; } if (getValidation().equals("notEmpty")) { return ", not empty"; } if (getValidation().equals("notBlank")) { return ", not blank"; } return ""; } /** * Gets the validation method name. * @return the method name */ public String getValidationMethodName() { if (isValidated() == false) { throw new IllegalStateException(); } if (getValidation().equals("notNull") || getValidation().equals("notEmpty") || getValidation().equals("notBlank")) { return "JodaBeanUtils." + getValidation(); } return getValidation(); // method in bean or static } /** * Gets the varargs code. * * @return the varargs code, null if not applicable */ public String getVarArgsCode() { return config.getImmutableVarArgs().get(getTypeRaw()); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy