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

jeaf.Enumeration.xpt Maven / Gradle / Ivy

There is a newer version: 1.24.1
Show newest version
«EXTENSION java::Naming»
«EXTENSION java::GeneratorCommons»
«EXTENSION functions::Enumeration»

«IMPORT uml»
«IMPORT java»
«IMPORT JMM»


«DEFINE JEAFEnumTemplate FOR JEAFEnumeration»
«FILE packagePath()+"/"+name+".java" src_gen»
«getFileHeader()»
package «packageName()»;

«EXPAND functions::Javadoc::JavadocForType»
«EXPAND java::Helper::GenerateDeprecationAnnotation-»

«IF this.extensibleEnum == false || generateHeavyStyleExtensibleEnums() == false»
	public enum «name» «IF this.general.isEmpty== false»implements «FOREACH this.general AS interface SEPARATOR ", "»«interface.fqn()»«ENDFOREACH»«ENDIF» {
	«FOREACH this.ownedLiteral AS literal SEPARATOR ", "»
	  «EXPAND functions::Javadoc::JavadocForLiteral FOR literal»
	  «EXPAND java::Helper::GenerateDeprecationAnnotation FOR literal -»  
	  «literal.name»«IF literal.slot.size > 0»( 
	  	«FOREACH literal.getOrderedSlots() AS slot SEPARATOR ", "»«slot.getSlotValue()»«ENDFOREACH»	  
	  )«ENDIF»	  
	«ENDFOREACH»
	«IF this.hasDynamicLiterals»
	   «EXPAND jeafgenerator::api::JavaEnumerationExtensionPoint::AddDynamicLiterals» 
	«ENDIF»
	«IF extensibleEnum && this.hasUnknownLiteral() == false»
	   ,
		/**
		 * Literal UNKNOWN is used in case that an unknown literal of this enumeration is received e.g. via an external interface. 
		 */
		UNKNOWN
	«ENDIF»
	;
	
	«IF this.ownedAttribute.size > 0»
        «IF this.extensibleEnum && this.hasUnknownLiteral() == false»
        /**
         * Empty constructor is required for UNKNWON literal. 
         */
        private «this.name»() {
          «FOREACH this.ownedAttribute AS attr»
          «IF attr.type.isStringType()»
          «attr.name» = null;
          «ELSE»«IF attr.type.isBooleanType()»
          «attr.name» = false;
          «ELSE»
            «IF attr.type.isEnumeration()»
                «attr.name» = null;
            «ELSE»
                «attr.name» = -1;
            «ENDIF»
          «ENDIF»             
          «ENDIF»
          «ENDFOREACH»
        }
        «ENDIF»

		/**
		 * Initialize object.
		 */
		private «this.name»(«this.ownedAttribute.asParameterDefinitionList()») {
		  «FOREACH this.ownedAttribute AS attr»
		  «attr.name» = «attr.asParameter()»;
		  «ENDFOREACH»
		}
		«EXPAND Attribute::DoPropertyDeclaration FOREACH this.ownedAttribute»
		«EXPAND Attribute::Getter FOREACH this.ownedAttribute»
	«ENDIF»
	
	«IF this.hasCustomImplementation»
		«PROTECT CSTART "/*" CEND "*/" ID this.fqn()»
		// TODO: Please add your custom implementation here.
	    «ENDPROTECT»
    «ENDIF»
	
«ELSE»
public final class «name» {
  public static enum «name»Type {
	«FOREACH this.ownedLiteral AS literal SEPARATOR ", "»
	  «EXPAND functions::Javadoc::JavadocForLiteral FOR literal»
	  «EXPAND java::Helper::GenerateDeprecationAnnotation FOR literal -»  
	  «literal.name»«IF literal.slot.size > 0»( 
	  	«FOREACH literal.getOrderedSlots() AS slot SEPARATOR ", "»«IF slot.isEnumTypeSlot()»«slot.definingFeature.type.fqn()».«ENDIF»«IF slot.isStringTypeSlot()»"«ENDIF»«slot.value.first().stringValue()»«IF slot.isStringTypeSlot()»"«ENDIF»«IF slot.isFloatTypeSlot()»f«ENDIF»«ENDFOREACH»	  
	  )«ENDIF»
	«ENDFOREACH»
	  «IF extensibleEnum && this.hasUnknownLiteral() == false»
	  ,
	  /**
	   * Literal UNKNOWN is used in case that an unknown literal of this enumeration is received e.g. via an external interface. 
	   */
	  UNKNOWN
	  «ENDIF»
	  ;

		«IF this.ownedAttribute.size > 0»
			/**
			 * Empty constructor is required for UNKNWON literal. 
			 */
			private «this.name»Type() {
			  «FOREACH this.ownedAttribute AS attr»
			  «IF attr.type.isStringType()»
			  «attr.name» = null;
			  «ELSE»«IF attr.type.isBooleanType()»
			  «attr.name» = false;
			  «ELSE»
			  	«IF attr.type.isEnumeration()»
			  		«attr.name» = null;
			  	«ELSE»
			  		«attr.name» = -1;
			  	«ENDIF»
			  «ENDIF»			  
			  «ENDIF»
			  «ENDFOREACH»
			}
			
			/**
			 * Initialize object.
			 */
			private «this.name»Type(«this.ownedAttribute.asParameterDefinitionList()») {
			  «FOREACH this.ownedAttribute AS attr»
			  «attr.name» = «attr.asParameter()»;
			  «ENDFOREACH»
			}
			«EXPAND Attribute::DoPropertyDeclaration FOREACH this.ownedAttribute»
			«EXPAND Attribute::Getter FOREACH this.ownedAttribute»
		«ENDIF»
  }

  «FOREACH this.ownedLiteral AS literal»
  «EXPAND functions::Javadoc::JavadocForLiteral FOR literal»
  «EXPAND java::Helper::GenerateDeprecationAnnotation FOR literal -»  
  public static final «name» «literal.name» = new «name»(«name»Type.«literal.name»);
  «ENDFOREACH»
	
	
  /**
   * Literal of the enumeration that is represented by this instance.
   */
  private «name»Type literal;
	
  /**
   * In case that the literal is unknown then also it's actual name is still available as unknownLiteralName
   */
  private String unknownLiteralName;
	
  /**
   * Method returns extensible enumeration based on the passed name. If the literal name is unknown then an instance
   * representing "unknown" will be returned.
   * 
   * @param pLiteral Enumeration literal that should be used to initialize the extensible enumeration. The parameter
   * must not be null.
   * @return
   */
  public static «name» valueOf( String pLiteralName ) {
    «name» lEnum;
    try {
      «name»Type lEnumValue = Enum.valueOf(«name»Type.class, pLiteralName);
      switch (lEnumValue) {
        «FOREACH this.ownedLiteral AS literal»
        case «literal.name»:
          lEnum = «literal.name»;
          break;
        «ENDFOREACH»
        default:
          lEnum = new «name»(lEnumValue);
      }
    }
    catch (IllegalArgumentException e) {
      lEnum = new «name»(pLiteralName);
    }
    return lEnum;
  }

  /**
   * Default constructor is only intended to be used for deserialization as many frameworks required that. For "normal" object creation available constructors {@link #«name»(«name»Type)} and {@link #«name»(String)} should be used.
   */
  «name»( ) {
  }

  /**
   * Initialize object from real enumeration literal
   * 
   * @param pLiteral Enumeration literal that should be used to initialize the extensible enumeration. The parameter must not be null.
   */
  public «name»( «name»Type pLiteral ) {
    «IF isTargetRuntimeJEAF()»
    com.anaptecs.jeaf.xfun.api.checks.Check.checkInvalidParameterNull(pLiteral, "pLiteral");
    «ENDIF»
    literal = pLiteral;
    unknownLiteralName = null;
  }

  /**
   * Initialize object using the name of the literal.
   * 
   * @param pLiteralName Literal name that should be used to initialize the extensible enumeration. If the parameter is null or has an unknown literal name then a "unknown" version will be created.
   * 
   * @see «name»#isUnknownLiteral()
   */
  public «name»( String pLiteralName ) {
    try {
      literal = Enum.valueOf(«name»Type.class, pLiteralName);
      unknownLiteralName = null;
    }
    // Literal is unknown
    catch (IllegalArgumentException e) {
      literal = «name»Type.UNKNOWN;
      unknownLiteralName = pLiteralName;
    }
  }

  /**
   * Method returns the literal that is represented by this object.
   * 
   * @return {@link «name»} Literal that is represented by this object. The method never returns null.
   */
  public «name»Type getLiteral( ) {
    return literal;
  }

  /**
   * Method checks if the represented literal is actually unknown or not.
   * 
   * @return boolean Method returns true if this object represents an unknown literal.
   */
  public boolean isUnknownLiteral( ) {
    return literal == «name»Type.UNKNOWN;
  }

  /**
   * Method returns the actual name of the unknown literal
   * 
   * @return {@link String} Name of the unknown literal or null in case that the literal is known.
   */
  public String getUnknownLiteralName( ) {
    return unknownLiteralName;
  }

  /**
   * {@link Object#hashCode()}
   */
  @Override
  public int hashCode( ) {
    int lHashCode;
    if (unknownLiteralName != null && this.isUnknownLiteral() == true) {
      lHashCode = unknownLiteralName.hashCode();
    }
    else {
      lHashCode = literal.hashCode();
    }
    return lHashCode;
  }

  /**
   * {@link Object#equals(Object)}
   */
  @Override
  public boolean equals( Object pObject ) {
    boolean lEquals;
    if (pObject != null) {
      if (this == pObject) {
        lEquals = true;
      }
      // Passed object is of same type
      else if (this.getClass() == pObject.getClass()) {
        «name» lEnum = («name») pObject;

        // Compare if unknown literal is the same
        if (this.isUnknownLiteral() && lEnum.isUnknownLiteral()) {
          if (this.unknownLiteralName != null) {
            lEquals = this.unknownLiteralName.equals(lEnum.unknownLiteralName);
          }
          else if (lEnum.unknownLiteralName == null) {
            lEquals = true;
          }
          else {
            lEquals = false;
          }
        }
        // Compare based on literals
        else {
          lEquals = this.literal == lEnum.literal;
        }
      }
      // Passed object is of different type
      else {
        lEquals = false;
      }
    }
    // Passed object is null.
    else {
      lEquals = false;
    }
    return lEquals;
  }

  /**
   * {@link Object#toString()}
   */
  @Override
  public String toString( ) {
    String lLiteralName;
    if (this.isUnknownLiteral() == false) {
      lLiteralName = this.getLiteral().name();
    }
    // Object represents unknown literal.
    else {
      String lUnknownLiteralName = this.getUnknownLiteralName();
      if (lUnknownLiteralName != null) {
        lLiteralName = lUnknownLiteralName;
      }
      else {
        lLiteralName = this.getLiteral().name();
      }
    }
    return lLiteralName;
  }
«ENDIF»
}
«ENDFILE»
«ENDDEFINE»

«DEFINE GenerateExtensibleEnumSerializer FOR JEAFEnumeration -»
	«FILE packagePath() + "/serializers/" + name +"Serializer.java" src_gen»
		«getFileHeader()»
		package «this.packageName()».serializers;
		
		«EXPAND java::Helper::GenerateDeprecationAnnotation-»
		/**
		 * Class implements a JSON / Jackson serializer for class «name».
		 */
		public class «name»Serializer extends com.fasterxml.jackson.databind.JsonSerializer<«name»> {
		  @Override
		  public void serialize( «this.fqn()» pObject, com.fasterxml.jackson.core.JsonGenerator pGenerator, com.fasterxml.jackson.databind.SerializerProvider pSerializers ) throws java.io.IOException {
		    // Write value directly to JSON and avoid nesting object structures. Existing toString() operation is exactly what we need.
		    pGenerator.writeString(pObject.toString());
		  }		    
		}
	«ENDFILE»
«ENDDEFINE»

«DEFINE GenerateExtensibleEnumDeserializer FOR JEAFEnumeration -»
	«FILE packagePath() + "/serializers/" + name +"Deserializer.java" src_gen»
		«getFileHeader()»
		package «this.packageName()».serializers;
		
		«EXPAND java::Helper::GenerateDeprecationAnnotation-»
		/**
		 * Class implements a JSON / Jackson deserializer for class «name».
		 */
		public class «name»Deserializer extends com.fasterxml.jackson.databind.JsonDeserializer<«this.fqn()»> {

		@Override
		public «this.fqn()» deserialize( com.fasterxml.jackson.core.JsonParser pParser, com.fasterxml.jackson.databind.DeserializationContext pContext ) throws java.io.IOException {
			// Parse JSON content.
			com.fasterxml.jackson.databind.JsonNode lNode = pParser.getCodec().readTree(pParser);
		
		    // We expect that enumerations are always serialized as plain text which will result in a TextNode.
		    if (lNode instanceof com.fasterxml.jackson.databind.node.TextNode) {
		        «IF generateHeavyStyleExtensibleEnums()»
					String lLiteralName = lNode.asText();
					return «this.fqn()».valueOf(lLiteralName);
                «ELSE»
					«this.fqn()» lLiteral;
					try {
					  String lLiteralName = lNode.asText();
					  lLiteral = «this.fqn()».valueOf(lLiteralName);
					}
					// Literal is unknown.
					catch (IllegalArgumentException e) {
					  lLiteral = «this.fqn()».UNKNOWN;
					}
					return lLiteral;
	            «ENDIF»
		    }
		    // Node is not a TextNode
		    else {
		      «IF isTargetRuntimeJEAF()»
		      throw new com.anaptecs.jeaf.xfun.api.errorhandling.JEAFSystemException(com.anaptecs.jeaf.json.api.JSONMessages.UNEXPECTED_NODE_TYPE_FOR_DESERIALIZATION, «this.fqn()».class.getName(), lNode.toString(), lNode.getClass().getName());
		      «ELSE»
		      throw new java.io.IOException("Unable to deserialize object of type ''«this.fqn()»''. Expected text node but received other type of JSON content. Current JSON node ''" + lNode.toString() + "'' is of type ''"+  lNode.getClass().getName() + "''.");
		      «ENDIF»
		    }
		}
	}
	«ENDFILE»
«ENDDEFINE»




© 2015 - 2024 Weber Informatics LLC | Privacy Policy