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

java.Builder.xpt Maven / Gradle / Ivy

There is a newer version: 1.24.1
Show newest version
«EXTENSION java::Naming»
«EXTENSION java::ObjectMapper»
«EXTENSION java::GeneratorCommons»
«EXTENSION java::OpenAPIFunctions»
«EXTENSION java::Naming»
«EXTENSION entity::ModelProperties»
«EXTENSION functions::Class»
«EXTENSION functions::ClassifierTemplateParameter»
«EXTENSION functions::SoftLink»
«EXTENSION functions::JEAFDeprecated»


«IMPORT uml»
«IMPORT JMM»

«DEFINE GenerateBuilder(String idImpl) FOR uml::Class»
/**
 * Class implements builder to create a new instance of class «this.name».
 */
«EXPAND java::Helper::GenerateDeprecationAnnotation-»
public static «IF isAbstract == true» abstract «ENDIF»class Builder«this.getTemplateParams()» «IF superClass.isEmpty == false»extends «superClass.get(0).fqnWithoutGenerics()».Builder«superClass.get(0).getTemplateParams()»«ENDIF» {
	«REM»Generate instance variables for each property«ENDREM»
	«IF needsToImplementIdentifiable() == true»
	/**
	 * Reference to the identifier of this object. The reference may be null since an id is not mandatory.
	 */
	private com.anaptecs.jeaf.xfun.api.common.ObjectIdentity objectID;
	«ENDIF»
	«IF this.isCompositeDataType()»
		/**
		 * String representation of this object.
		 */
		private String «this.getCompositeDateTypePublicFieldName()»;
	«ELSE»
		«FOREACH this.ownedAttribute.select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false && e.generateBackwardCompatibility() == false) AS attr»
		    «EXPAND BuilderPropertyDeclaration FOR attr»
		«ENDFOREACH»
	«ENDIF»

    /**
     * Use {@link «name»#builder()} instead of private constructor to create new builder.
     */
    protected Builder( ) {
      «IF superClass.isEmpty == false»super();«ENDIF»
    }

    /**
     * Use {@link «name»#builder(«this.name»)} instead of private constructor to create new builder.
     */
    protected Builder( «this.name»«this.getTemplateParams()» pObject ) {
      «IF superClass.isEmpty == false»super(pObject);«ENDIF»
      «IF needsToImplementIdentifiable() || this.isCompositeDataType() || this.ownedAttribute.select(e|e.isPropertySuppressed() == false).isEmpty == false»
      if (pObject != null) {
        // Read attribute values from passed object.
		«IF needsToImplementIdentifiable() == true»
		objectID = pObject.objectID;
		«ENDIF»
        «IF this.isCompositeDataType()»
        	this.set«this.getCompositeDateTypePublicFieldName().toFirstUpper()»(pObject.«this.getCompositeDateTypePublicFieldName()»);
        «ELSE»
	        «FOREACH this.ownedAttribute.select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false && e.generateBackwardCompatibility() == false) AS attr»
	           «IF attr.isStatic == false»
	               «IF attr.isSoftLink()»
	                   this.set«attr.getSoftLinkPropertyName().toFirstUpper()»(pObject.«attr.getSoftLinkPropertyName()»);
	               «ELSE»
	                   this.«attr.asSetter()»(pObject.«attr.name»);
	               «ENDIF»
	           «ENDIF»
	        «ENDFOREACH»
        «ENDIF»
      }
      «ENDIF»
    }

   «IF isAbstract == false && enableLegacyBuilderStyle()»
    /**
     * Method returns a new builder.
     * 
     * @return {@link Builder} New builder that can be used to create new «this.name» objects.
     */
    public static «this.getTemplateParams()» Builder«this.getTemplateParams()» newBuilder( ) {
      return new Builder();
    }

    /**
     * Method creates a new builder and initialize it with the data from the passed object.
     * 
     * @param pObject Object that should be used to initialize the builder. The parameter may be null.
     * @return {@link Builder} New builder that can be used to create new «this.name» objects. The method never
     * returns null.
     */
    public static «this.getTemplateParams()» Builder«this.getTemplateParams()» newBuilder( «this.name» pObject ) {
      return new Builder(pObject);
    }
    «ENDIF»

	«IF needsToImplementIdentifiable() == true»
	/**
	 * Method sets the identifier for the object created using the builder. The reference may be null since an id is not mandatory.
	 */
	public Builder«this.getTemplateParams()» setID(com.anaptecs.jeaf.xfun.api.common.ObjectIdentity pObjectID){
		objectID = pObjectID;
		return this;
	}	
	«ELSE»«IF implementsIdentifiable() == true»
	/**
	 * Method sets the identifier for the object created using the builder. The reference may be null since an id is not mandatory.
	 */
	@Override
	public Builder«this.getTemplateParams()» setID(com.anaptecs.jeaf.xfun.api.common.ObjectIdentity pObjectID){
		super.setID(pObjectID);
		return this;
	}
	«ENDIF»«ENDIF»	
	
	«REM»Overwritte setters for each property of super class with this Builder class as return type.«ENDREM»
	«IF this.superClass.isEmpty == false»
		«FOREACH this.superClass.getAllAttributesFromHierarchy().select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false) AS superAttr»
			«EXPAND OverwriteBuilderSetterFromBaseClasses("Builder"+ this.getTemplateParams()) FOR superAttr»
		«ENDFOREACH»
	«ENDIF»
	
	«REM»Generate setters for each property of the builder«ENDREM»
	«IF this.isCompositeDataType()»
		/**
		 * Method returns the String representation of this object.
		 * 
		 * @return String String representation of this object.
		 */
		public Builder«this.getTemplateParams()» set«this.getCompositeDateTypePublicFieldName().toFirstUpper()»( String p«this.getCompositeDateTypePublicFieldName().toFirstUpper()» ) {
		  «this.getCompositeDateTypePublicFieldName()» = p«this.getCompositeDateTypePublicFieldName().toFirstUpper()»;
		  return this;
		}		
	«ELSE»
		«FOREACH this.ownedAttribute.select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false) AS attr»
			«EXPAND BuilderSetter("Builder") FOR attr»
		«ENDFOREACH»
	«ENDIF»
	
    «EXPAND jeafgenerator::api::ClassExtensionHook::CustomBuilderOperations»
    
	«IF this.isAbstract == false»
	/**
	 * Method creates a new instance of class «this.name». The object will be initialized with the values of the
	 * builder.
	 * 
	 * @return «this.name» Created object. The method never returns null.
	 */
	public «this.name»«this.getTemplateParams()» build( ) {
	  «IF this.validateOnBuild() || generateObjectValidationInBuilder()»
	       «this.name»«this.getTemplateParams()» lObject = new «this.name»«this.getTemplateParams()»(this);
	       «IF isTargetRuntimeJEAF()»
	       com.anaptecs.jeaf.tools.api.validation.ValidationTools.getValidationTools().enforceObjectValidation(lObject);
	       «ENDIF»
	       «IF isTargetRuntimeSpring()»
	       com.anaptecs.jeaf.validation.api.spring.SpringValidationExecutor.getValidationExecutor().validateObject(lObject);
	       «ENDIF»
	       return lObject;
	  «ELSE»
	  return new «this.name»«this.getTemplateParams()»(this);
	  «ENDIF»
	}

	«IF isTargetRuntimeJEAF()»
	/**
	 * Method creates a new validated instance of class «this.name». The object will be initialized with the values of the
	 * builder and validated afterwards.
	 * 
	 * @return «this.name» Created and validated object. The method never returns null.
	 * @throws ConstraintViolationException in case that one or more validations for the created object failed.
	 */
	public «this.name»«this.getTemplateParams()» buildValidated( ) throws «getEnterpriseJavaPackage()».validation.ConstraintViolationException {
      «this.name»«this.getTemplateParams()» lObject = this.build();
      com.anaptecs.jeaf.tools.api.validation.ValidationTools.getValidationTools().enforceObjectValidation(lObject);
      return lObject;
	}
	«ENDIF»
	«ENDIF»
}
«ENDDEFINE»

«DEFINE GenerateBuilderBase(String idImpl) FOR uml::Class»
/**
 * Class implements builder to create a new instance of class «this.name». As the class has read only attributes or associations instances can not be created directly. Instead this builder class has to be used.
 */
public static abstract class BuilderBase«this.getTemplateParams()» «IF superClass.isEmpty == false»extends «superClass.get(0).fqnWithoutGenerics()».Builder«superClass.get(0).getTemplateParams()»«ENDIF» {
	«REM»Generate instance variables for each property«ENDREM»
	«IF needsToImplementIdentifiable() == true»
	/**
	 * Reference to the identifier of this object. The reference may be null since an id is not mandatory.
	 */
	private com.anaptecs.jeaf.xfun.api.common.ObjectIdentity objectID;
	«ENDIF»

	«IF this.isCompositeDataType()»
		/**
		 * String representation of this object.
		 */
		private String «this.getCompositeDateTypePublicFieldName()»;
	«ELSE»
		«FOREACH ownedAttribute.select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false) AS attr»
		«EXPAND BuilderPropertyDeclaration FOR attr»
		«ENDFOREACH»
	«ENDIF»

    /**
     * Use {@link «this.name».builder()} instead of protected constructor to create new builder.
     */
    protected BuilderBase( ) {
      «IF superClass.isEmpty == false && superClass.get(0).hasReadOnlyProperties()== true»super();«ENDIF»
    }

    /**
     * Use {@link «this.name».builder(«this.name»)} instead of protected constructor to create new builder.
     */
    protected BuilderBase( «this.name»Base«this.getTemplateParams()» pObject ) {
      «IF superClass.isEmpty == false && superClass.get(0).hasReadOnlyProperties()== true»super(pObject);«ENDIF»
      if (pObject != null) {
        // Read attribute values from passed object.
		«IF needsToImplementIdentifiable() == true»
		objectID = pObject.objectID;
		«ENDIF»

        «IF this.isCompositeDataType()»
        	«this.getCompositeDateTypePublicFieldName()» = pObject.«this.getCompositeDateTypePublicFieldName()»;
        «ELSE»
	        «FOREACH ownedAttribute.select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false) AS attr»
               «IF attr.isStatic == false»
                   «IF attr.isSoftLink()»
                       this.set«attr.getSoftLinkPropertyName().toFirstUpper()»(pObject.«attr.getSoftLinkPropertyName()»);
                   «ELSE»
                       this.«attr.asSetter()»(pObject.«attr.name»);
                   «ENDIF»
               «ENDIF»
	        «ENDFOREACH»
        «ENDIF»
      }
    }

	«IF needsToImplementIdentifiable() == true»
	/**
	 * Method sets the identifier for the object created using the builder. The reference may be null since an id is not mandatory.
	 */
	public BuilderBase«this.getTemplateParams()» setID(com.anaptecs.jeaf.xfun.api.common.ObjectIdentity pObjectID){
		objectID = pObjectID;
		return this;
	}
	«ELSE»«IF implementsIdentifiable() == true»
	/**
	 * Method sets the identifier for the object created using the builder. The reference may be null since an id is not mandatory.
	 */
	@Override 
	public BuilderBase«this.getTemplateParams()» setID(com.anaptecs.jeaf.xfun.api.common.ObjectIdentity pObjectID){
		super.setID(pObjectID);
		return this;
	}
	«ENDIF»«ENDIF»
	
	«REM»Overwritte setters for each property of super class with this Builder class as return type.«ENDREM»
	«IF this.superClass.isEmpty == false»
		«FOREACH this.superClass.getAllAttributesFromHierarchy().select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false) AS superAttr»
			«EXPAND OverwriteBuilderSetterFromBaseClasses("BuilderBase"+ this.getTemplateParams()) FOR superAttr»
		«ENDFOREACH»
	«ENDIF»
	
	«REM»Generate setters for each property of the builder«ENDREM»
	«IF this.isCompositeDataType()»
		/**
		 * Method returns the String representation of this object.
		 * 
		 * @return String String representation of this object.
		 */
		public BuilderBase set«this.getCompositeDateTypePublicFieldName().toFirstUpper()»( String p«this.getCompositeDateTypePublicFieldName().toFirstUpper()» ) {
		  «this.getCompositeDateTypePublicFieldName()» = p«this.getCompositeDateTypePublicFieldName().toFirstUpper()»;
		  return this;
		}		
	«ELSE»
		«FOREACH ownedAttribute.select(e|e.isPropertySuppressed() == false && e.belongsToTransientBidirectionalBackReference() == false) AS attr»
			«EXPAND BuilderSetter("BuilderBase") FOR attr»
		«ENDFOREACH»
	«ENDIF»

    «EXPAND jeafgenerator::api::ClassExtensionHook::CustomBuilderOperations»
    
	«IF this.isAbstract == false»
	/**
	 * Method creates a new instance of class «this.name». The object will be initialized with the values of the
	 * builder.
	 * 
	 * @return «this.name» Created object. The method never returns null.
	 */
    public «this.name»«this.getTemplateParams()» build( ) {
      «IF this.validateOnBuild() || generateObjectValidationInBuilder()»
           «this.name»«this.getTemplateParams()» lObject = new «this.name»«this.getTemplateParams()»(this);
           «IF isTargetRuntimeJEAF()»
           com.anaptecs.jeaf.tools.api.validation.ValidationTools.getValidationTools().enforceObjectValidation(lObject);
           «ENDIF»
           «IF isTargetRuntimeSpring()»
           com.anaptecs.jeaf.validation.api.spring.SpringValidationExecutor.getValidationExecutor().validateObject(lObject);
           «ENDIF»
           return lObject;
      «ELSE»
      return new «this.name»«this.getTemplateParams()»(this);
      «ENDIF»
    }

	«IF isTargetRuntimeJEAF()»
	/**
	 * Method creates a new validated instance of class «this.name». The object will be initialized with the values of the
	 * builder and validated afterwards.
	 * 
	 * @return «this.name» Created and validated object. The method never returns null.
	 * @throws ConstraintViolationException in case that one or more validations for the created object failed.
	 */
	public «this.name»«this.getTemplateParams()» buildValidated( ) throws «getEnterpriseJavaPackage()».validation.ConstraintViolationException {
      «this.name»«this.getTemplateParams()» lPOJO = this.build();
      com.anaptecs.jeaf.tools.api.validation.ValidationTools.getValidationTools().enforceObjectValidation(lPOJO);
      return lPOJO;
	}
	«ENDIF»
	«ENDIF»
}
«ENDDEFINE»

«DEFINE BuilderPropertyDeclaration FOR Property»
    «IF this.isStatic == false»
	    «EXPAND functions::Javadoc::JavadocForProperty»
        «EXPAND jeafgenerator::api::ClassExtensionHook::BeforeBuilderPropertyDeclaration(this.type.fqn())»
	    «IF this.isSoftLink()»
	       «EXPAND SoftLinkBuilderPropertyDeclaration FOR ((SoftLink) this)»
	    «ELSEIF this.association == null»
	        «EXPAND DoBuilderPropertyDeclaration»
	    «ELSE»
	        «EXPAND DoBuilderAssociationPropertyDeclaration»
	    «ENDIF»
	    «EXPAND jeafgenerator::api::ClassExtensionHook::AfterBuilderPropertyDeclaration(this.type.fqn())»
    «ENDIF»
«ENDDEFINE»


// processing the properties
«DEFINE DoBuilderPropertyDeclaration FOR Property»
	«EXPAND java::Helper::GenerateDeprecationAnnotation-»
    «EXPAND Validation::ValidationAnnotation»
	private «this.fqn()» «name»«IF this.isRealInitValue() && this.isMultivalued()== false » = «IF this.isJEAFEnumerationProperty()»«this.type.name».«ENDIF»«this.initValue()»«ENDIF»;
«ENDDEFINE»

«DEFINE DoBuilderAssociationPropertyDeclaration FOR Property»
	«IF isNavigable()»
		«EXPAND java::Helper::GenerateDeprecationAnnotation-»
		«IF isMultivalued()»
			private «this.fqn()» «asInstanceVar()»;
		«ELSE»
			private «type.fqn()» «asInstanceVar()»«IF this.isRealInitValue() && this.isMultivalued()== false » = «IF this.isJEAFEnumerationProperty()»«this.type.name».«ENDIF»«this.initValue()»«ENDIF»;
		«ENDIF»
	«ENDIF»
«ENDDEFINE»

«DEFINE SoftLinkBuilderPropertyDeclaration FOR SoftLink»
        «EXPAND java::Helper::GenerateDeprecationAnnotation-»
        «EXPAND Validation::ValidationAnnotation»
        «IF isMultivalued()»
            «IF generateValidationAnnotationsForAssociationsFromMultiplicity() && isStatic == false && isTransient() == false && this.hasValidationStereotype() == false && lower > 0»@«getEnterpriseJavaPackage()».validation.constraints.Size(min = «lower»)«ENDIF»
            «IF generateValidationAnnotationsForAssociationsFromMultiplicity() && isStatic == false && isTransient() == false && this.requiresNotNullAnnotation() && lower > 0»@«getEnterpriseJavaPackage()».validation.constraints.NotNull«ENDIF»
            «visibility» «IF isTransient()»transient «ENDIF» «this.getCollectionType()»<«this.getMultivaluedJavaSoftLinkType()»> «this.getSoftLinkPropertyName()»;
        «ELSE»
            «IF generateValidationAnnotationsForAssociationsFromMultiplicity() && isStatic == false && isTransient() == false && this.requiresNotNullAnnotation() && lower > 0»@«getEnterpriseJavaPackage()».validation.constraints.NotNull«ENDIF»
            «visibility» «IF isTransient()»transient «ENDIF» «this.getJavaSoftLinkType()» «this.getSoftLinkPropertyName()»;
        «ENDIF»
«ENDDEFINE»


«DEFINE BuilderSetter(String builderClassName) FOR Property»
    «IF this.isStatic == false»
	    «IF this.isSoftLink()»
	       «EXPAND CreateBuilderSoftLinkSetter(builderClassName) FOR ((SoftLink) this)»
	    «ELSEIF this.isCollectionType() || association != null»
            «EXPAND CreateBuilderAssociationSetter(builderClassName)»
	    «ELSE»
            «EXPAND CreateBuilderPropertySetter(builderClassName)»
	    «ENDIF»
	    «IF this.isMultivalued() && this.type.isEnumeration() && this.association != null»
	    	«EXPAND CreateBuilderVarArgsSetter(builderClassName)»
	    «ENDIF»
	    «EXPAND jeafgenerator::api::ClassExtensionHook::AfterBuilderPropertyAccessors(this.type.fqn(), builderClassName)»
    «ENDIF»
«ENDDEFINE»

«DEFINE CreateBuilderPropertySetter(String builderClassName) FOR Property»
	«EXPAND functions::Javadoc::JavadocForBuilderSetter(builderClassName)»
	«EXPAND java::Helper::GenerateDeprecationAnnotation-»
	public «builderClassName»«owner.asClass().getTemplateParams()» «asSetter()»(«EXPAND java::Helper::NotNullAnnotationForProperty» «this.fqn()» «asParameter()») {
		«IF this.generateBackwardCompatibility() == false»
			// Assign value to attribute
			«IF this.isMultivalued() == false»
				«asInstanceVar()»=«asParameter()»;
			«ELSE»
				if(«asParameter()» != null) {
				«IF this.isBinaryType()»
					«IF disableBinaryDataImmutability()»
						«asInstanceVar()» = «asParameter()»;
					«ELSE»
						«asInstanceVar()» = new «type.fqn()»[«asParameter()».length];
						System.arraycopy(«asParameter()», 0, «asInstanceVar()», 0, «asParameter()».length);
					«ENDIF»
				«ELSE»
					«IF disableArrayImmutability()»
						«asInstanceVar()» = «asParameter()»;
					«ELSE»
						«asInstanceVar()» = new «type.fqn()»[«asParameter()».length];
						System.arraycopy(«asParameter()», 0, «asInstanceVar()», 0, «asParameter()».length);
					«ENDIF»
				«ENDIF»
				}
				else {
					«asInstanceVar()» = null;
				}
			«ENDIF»
		«ELSE»
		    «EXPAND java::Helper::CallSetterForSuccessor»
		«ENDIF»
		return this;
	}
«ENDDEFINE»

«DEFINE CreateBuilderAssociationSetter(String builderClassName) FOR Property»
	«IF isNavigable()»
        «EXPAND functions::Javadoc::JavadocForBuilderSetter(builderClassName)»
        «EXPAND java::Helper::GenerateDeprecationAnnotation-»
		«IF isMultivalued()»
			public «builderClassName»«owner.asClass().getTemplateParams()» set«name.toFirstUpper()»(«EXPAND java::Helper::NotNullAnnotationForProperty» «this.fqn()» «asParameter()») {
			    «IF this.generateBackwardCompatibility() == false»
				    // To ensure immutability we have to copy the content of the passed collection.
				    if(«asParameter()» != null) {
				      «asInstanceVar()» = new «this.getCollectionImplType()»<«type.fqn()»>(«asParameter()»);
				    }
				    else {
				      «asInstanceVar()» = null;
				    }
			    «ELSE»
			        «EXPAND java::Helper::CallSetterForSuccessor»
			    «ENDIF»
			    return this;
			}

	        «EXPAND functions::Javadoc::JavadocForBuilderAddTo(builderClassName)»
	        «EXPAND java::Helper::GenerateDeprecationAnnotation-»
            public «builderClassName»«owner.asClass().getTemplateParams()» addTo«name.toFirstUpper()»(«EXPAND java::Helper::NotNullAnnotationForProperty» «IF type.owner.isClassifierTemplateParameter()»@SuppressWarnings("unchecked") «ENDIF»«type.fqn()»... «asParameter()») {
                «IF this.generateBackwardCompatibility() == false»
	                if(«asParameter()» != null) {
		                if(«asInstanceVar()» == null) {
		                  «asInstanceVar()» = new «this.getCollectionImplType()»<«type.fqn()»>();
		                }
		                «asInstanceVar()».addAll(java.util.Arrays.asList(«asParameter()»));
		            }
                «ELSE»
                    «EXPAND java::Helper::CallAddToForSuccessor»
                «ENDIF»
                return this;
            }
		«ELSE»
			public «builderClassName»«owner.asClass().getTemplateParams()» «asSetter()» («EXPAND java::Helper::NotNullAnnotationForProperty» «type.fqn()» «asParameter()») {
				«IF this.generateBackwardCompatibility() == false»
				    «asInstanceVar()» = «asParameter()»;
				«ELSE»
				    «EXPAND java::Helper::CallSetterForSuccessor»
				«ENDIF»
				return this;
			}
		«ENDIF»
	«ENDIF»
«ENDDEFINE»

«DEFINE CreateBuilderSoftLinkSetter(String builderClassName) FOR SoftLink»
    «IF isNavigable()»
        «EXPAND functions::Javadoc::JavadocForBuilderSetter(builderClassName)»
        «EXPAND java::Helper::GenerateDeprecationAnnotation-»
        «IF isMultivalued()»
            public «builderClassName»«owner.asClass().getTemplateParams()» set«this.getSoftLinkPropertyName().toFirstUpper()»(«EXPAND java::Helper::NotNullAnnotationForProperty» «this.getCollectionType()»<«this.getMultivaluedJavaSoftLinkType()»> «asParameter()») {
                // To ensure immutability we have to copy the content of the passed collection.
                if(«asParameter()» != null) {
                  «this.getSoftLinkPropertyName()» = new «this.getCollectionImplType()»<«this.getMultivaluedJavaSoftLinkType()»>(«asParameter()»);
                }
                else {
                  «this.getSoftLinkPropertyName()» = null;
                }
                return this;
            }
        «ELSE»
            public «builderClassName»«owner.asClass().getTemplateParams()» set«this.getSoftLinkPropertyName().toFirstUpper()» («EXPAND java::Helper::NotNullAnnotationForProperty» «this.getJavaSoftLinkType()» «asParameter()») {
                «this.getSoftLinkPropertyName()» = «asParameter()»;
                return this;
            }
        «ENDIF»
    «ENDIF»
«ENDDEFINE»


«DEFINE CreateBuilderVarArgsSetter(String builderClassName) FOR Property»
	«IF isNavigable()»
		«IF isMultivalued()»
			«EXPAND functions::Javadoc::JavadocForBuilderVarArgsSetter(builderClassName)»
			«EXPAND java::Helper::GenerateDeprecationAnnotation-»
			public «builderClassName»«owner.asClass().getTemplateParams()» set«name.toFirstUpper()»(«EXPAND java::Helper::NotNullAnnotationForProperty» «this.type.fqn()»... «asParameter()») {
			    // To ensure immutability we have to copy the content of the passed array.
			    if(«asParameter()» != null) {
			      «asInstanceVar()» = new «this.getCollectionImplType()»<«type.fqn()»>(java.util.Arrays.asList(«asParameter()»));
			    }
			    else {
			      «asInstanceVar()» = null;
			    }
			    return this;
			}
		«ENDIF»
	«ENDIF»
«ENDDEFINE»


«DEFINE OverwriteBuilderSetterFromBaseClasses(String builderClassName) FOR Property»
    «IF this.isStatic == false»
	    «IF this.isSoftLink()»
	       «EXPAND OverwriteBuilderSoftLinkSetter(builderClassName) FOR ((SoftLink) this)»
	    «ELSEIF this.association == null»
	        «EXPAND OverwriteBuilderPropertySetter(builderClassName)»
	    «ELSE»
	        «EXPAND OverwriteBuilderAssociationSetter(builderClassName)»
	    «ENDIF»
    «ENDIF»
«ENDDEFINE»

«DEFINE OverwriteBuilderPropertySetter(String builderClassName) FOR Property»
	«EXPAND functions::Javadoc::JavadocForBuilderSetter(builderClassName)»
	«EXPAND java::Helper::GenerateDeprecationAnnotation-»
	@Override
	public «builderClassName» «asSetter()»(«this.fqn()» «asParameter()») {
		// Call super class implementation.
		super.«asSetter()»(«asParameter()»);
		return this;
	}
«ENDDEFINE»

«DEFINE OverwriteBuilderAssociationSetter(String builderClassName) FOR Property»
	«IF isNavigable()»
	    «EXPAND functions::Javadoc::JavadocForBuilderSetter(builderClassName)»
	    «EXPAND java::Helper::GenerateDeprecationAnnotation-»
		«IF isMultivalued()»
			@Override
			public «builderClassName» set«name.toFirstUpper()»(«this.fqn()» «asParameter()») {
				// Call super class implementation.
				super.set«name.toFirstUpper()»(«asParameter()»);
				return this;
			}
			
			«EXPAND functions::Javadoc::JavadocForBuilderAddTo(builderClassName)»
            «EXPAND java::Helper::GenerateDeprecationAnnotation-»
			public «builderClassName» addTo«name.toFirstUpper()»(«type.fqn()»... «asParameter()») {
                // Call super class implementation.
                super.addTo«name.toFirstUpper()»(«asParameter()»);
                return this;
			}
			
			«IF isEnumeration()»
	            «EXPAND functions::Javadoc::JavadocForBuilderVarArgsSetter(builderClassName)»
	            «EXPAND java::Helper::GenerateDeprecationAnnotation-»
	            @Override
	            public «builderClassName» set«name.toFirstUpper()»(«this.type.fqn()»... «asParameter()») {
	                // Call super class implementation.
	                super.set«name.toFirstUpper()»(«asParameter()»);
	                return this;
	            }
			«ENDIF»
		«ELSE»
			@Override
			public «builderClassName» «asSetter()» («type.fqn()» «asParameter()») {
				// Call super class implementation.
				super.«asSetter()»(«asParameter()»);
				return this;
			}
		«ENDIF»
	«ENDIF»
«ENDDEFINE»

«DEFINE OverwriteBuilderSoftLinkSetter(String builderClassName) FOR SoftLink»
    «IF isNavigable()»
	    «EXPAND functions::Javadoc::JavadocForBuilderSetter(builderClassName)»
	    «EXPAND java::Helper::GenerateDeprecationAnnotation-»
        «IF isMultivalued()»
            @Override
            public «builderClassName» set«this.getSoftLinkPropertyName().toFirstUpper()»(«this.getCollectionType()»<«this.getMultivaluedJavaSoftLinkType()»> «asParameter()») {
                // Call super class implementation.
                super.set«this.getSoftLinkPropertyName().toFirstUpper()»(«asParameter()»);
                return this;
            }
        «ELSE»
            @Override
            public «builderClassName» set«this.getSoftLinkPropertyName().toFirstUpper()» («this.getJavaSoftLinkType()» «asParameter()») {
                // Call super class implementation.
                super.set«this.getSoftLinkPropertyName().toFirstUpper()»(«asParameter()»);
                return this;
            }
        «ENDIF»
    «ENDIF»
«ENDDEFINE»

«DEFINE GenerateBuilderImpl FOR uml::Class»
	/**
	 * Class implements builder to create a new instance of class «this.name». As the class has readonly attributes
	 * or associations instances can not be created directly. Instead this builder class has to be used.
	 */
	public static «IF isAbstract == true» abstract «ENDIF»class Builder«this.getTemplateParams()» extends «this.name».BuilderBase«this.getTemplateParams()» {
	  /**
	   * Use {@link «name»#builder()} instead of protected constructor to create new builder.
	   */
	  protected Builder( ) {
	  }
	
	  /**
	   * Use {@link «name»#builder(«this.name»)} instead of protected constructor to create new builder.
	   */
	  protected Builder( «this.name»«this.getTemplateParams()» pObject ) {
	    super(pObject);
	  }
	
	  «IF isAbstract == false && enableLegacyBuilderStyle()»
	  /**
	   * Method returns a new builder.
	   * 
	   * @return {@link Builder} New builder that can be used to create new «this.name» objects.
	   */
	  public static «this.getTemplateParams()» Builder«this.getTemplateParams()» newBuilder( ) {
	    return new Builder();
	  }
	
	  /**
	   * Method creates a new builder and initialize it with the data from the passed object.
	   * 
	   * @param pObject Object that should be used to initialize the builder. The parameter may be null.
	   * @return {@link Builder} New builder that can be used to create new POJOWithIDnMethod objects. The method never returns null.
	   */
	  public static «this.getTemplateParams()» Builder«this.getTemplateParams()» newBuilder( «this.name»«this.getTemplateParams()» pObject ) {
	    return new Builder(pObject);
	  }
	  «ENDIF»
	}
«ENDDEFINE»

«DEFINE StaticBuilderMethods FOR uml::Class»
   «IF isAbstract == false»
    /**
     * Method returns a new builder.
     * 
     * @return {@link Builder} New builder that can be used to create new «this.name» objects.
     */
    public static «this.getTemplateParams()» Builder«this.getTemplateParams()» builder() {
      return new Builder«this.getTemplateParams()»();
    }

    «IF this.getTemplateParams().length > 0»
    /**
     * Method returns a new builder.
     * 
     * @return {@link Builder} New builder that can be used to create new «this.name» objects.
     */
    public static «this.getTemplateParams()» Builder«this.getTemplateParams()» builder(Class«this.getTemplateParams()» pClass) {
      return new Builder«this.getTemplateParams()»();
    }
    «ENDIF»

   «IF generateBuilderMethodWithAllManadatoryFields() && this.getRequiredPropertiesForBuilder().size > 0 && this.isCompositeDataType() == false»
   /**
    * Method creates a new builder and initializes it with the passed attributes.
    */
    public static «this.getTemplateParams()» Builder«this.getTemplateParams()» builder(«FOREACH this.getRequiredPropertiesForBuilder() AS property SEPARATOR ", "» «IF property.isSoftLink()»«((SoftLink) property).getJavaSoftLinkType()» «ELSE»«property.type.fqn()» «ENDIF»p«property.name.toFirstUpper()»«ENDFOREACH») {
      Builder«this.getTemplateParams()» lBuilder = builder();
      «FOREACH this.getRequiredPropertiesForBuilder() AS property-»
			lBuilder.«property.asSetter()»(p«property.name.toFirstUpper()»);
		«ENDFOREACH -»
	  return lBuilder;
    }
    «ENDIF»
    
    «IF this.isCompositeDataType() »
    public static «this.getTemplateParams()» Builder«this.getTemplateParams()» builder(String p«this.getCompositeDateTypePublicFieldName().toFirstUpper()») {
      Builder lBuilder = builder( );
      lBuilder.set«this.getCompositeDateTypePublicFieldName().toFirstUpper()»(p«this.getCompositeDateTypePublicFieldName().toFirstUpper()»);
      return lBuilder;
    }
    «ENDIF»
    «ENDIF»
«ENDDEFINE»

«DEFINE ToBuilderMethod FOR uml::Class»
  «IF this.isAbstract == false»
	  /**
	   * Method creates a new builder and initializes it with the data of this object.
	   * @return {@link Builder} New builder that can be used to create new «this.name» objects. The method never returns null.
	   */
	  public Builder«this.getTemplateParams()» toBuilder( ) {
	    return new Builder«this.getTemplateParams()»(this);
	  }
  «ENDIF»
«ENDDEFINE»

«DEFINE ToBuilderMethodForBaseClass FOR uml::Class»
  «IF this.isAbstract == false»
	  /**
	   * Method creates a new builder and initializes it with the data of this object.
	   * @return {@link Builder} New builder that can be used to create new «this.name» objects. The method never returns null.
	   */
	  public «name».Builder«this.getTemplateParams()» toBuilder( ) {
	    return new «name».Builder«this.getTemplateParams()»((«name»«this.getTemplateParams()»)this);
	  }
  «ENDIF»
«ENDDEFINE»






© 2015 - 2024 Weber Informatics LLC | Privacy Policy