<commit_before>package hu.eltesoft.modelexecution.m2t.java.templates

import hu.eltesoft.modelexecution.m2m.metamodel.base.Named
import hu.eltesoft.modelexecution.m2m.metamodel.base.NamedReference
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClAssociation
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClAttribute
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClClass
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClInheritedAttribute
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClOperation
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClOperationSpec
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClReception
import hu.eltesoft.modelexecution.m2t.java.Template
import hu.eltesoft.modelexecution.m2t.smap.xtend.SourceMappedTemplate
import hu.eltesoft.modelexecution.runtime.Runtime
import hu.eltesoft.modelexecution.runtime.base.Class
import hu.eltesoft.modelexecution.runtime.base.ClassWithState
import hu.eltesoft.modelexecution.runtime.base.SignalEvent
import hu.eltesoft.modelexecution.runtime.base.StateMachineRegion
import java.util.concurrent.atomic.AtomicInteger

import static hu.eltesoft.modelexecution.m2t.java.Languages.*

@SourceMappedTemplate(stratumName=XUML_RT)
class ClassTemplate extends Template {

	val ClClass classDefinition
	val boolean hasStateMachine
	val NamedReference region

	new(ClClass classDefinition) {
		super(classDefinition)
		this.classDefinition = classDefinition
		this.hasStateMachine = classDefinition.region != null || classDefinition.inheritedRegion != null
		region = if (classDefinition.region != null) classDefinition.region else classDefinition.inheritedRegion
	}

	override wrapContent(CharSequence content) '''
		«IF hasStateMachine»
			«generateClassWithState(content)»
		«ELSE»
			«generateClassWithoutState(content)»
		«ENDIF»
	'''

	/**
	 * Generates a class with a state machine. It will be a descendant of {@linkplain ClassWithState}.
	 */
	def generateClassWithState(CharSequence content) '''
		/** Implementation class for UML class «classDefinition.javadoc» */
		«generatedHeaderForClass(classDefinition)»
		public class «classDefinition.implementation» 
			extends «ClassWithState.canonicalName» 
			implements «classDefinition.identifier» {
			
			/** Constructor for UML class «classDefinition.javadoc» */
			public «classDefinition.implementation»(«Runtime.canonicalName» runtime
					«FOR parent : classDefinition.parents», «parent.implementation» «parent.inherited»«ENDFOR») {
				super(runtime, instanceCount.getAndIncrement());
				«FOR parent : classDefinition.parents»
					this.«parent.inherited» = «parent.inherited»;
				«ENDFOR»
			}
			
			/** Creator for UML class «classDefinition.javadoc» */
			public static «classDefinition.identifier» create(«Runtime.canonicalName» runtime) {
				«FOR rec : classDefinition.ctorRecords»
					«rec.implementation» «rec.inherited» 
						= new «rec.implementation»(runtime«FOR par : rec.usedArgs», «par.inherited»«ENDFOR»);
				«ENDFOR»
				return new «classDefinition.implementation»(runtime«FOR parent : classDefinition.parents», «parent.inherited»«ENDFOR»);
			}
			«content»
		}
	'''

	/**
	 * Generates a class that does not have a state machine.
	 */
	def generateClassWithoutState(CharSequence content) '''
		/** Data class for UML class «classDefinition.javadoc» */
		«generatedHeaderForClass(classDefinition)»
		public class «classDefinition.implementation» 
			extends «Class.canonicalName» 
			implements «classDefinition.identifier» {
				
			/** Constructor for UML class «classDefinition.javadoc» */
			public «classDefinition.implementation»(«Runtime.canonicalName» runtime
					«FOR parent : classDefinition.parents», «parent.implementation» «parent.inherited»«ENDFOR») {
				«FOR parent : classDefinition.parents»
					this.«parent.inherited» = «parent.inherited»;
				«ENDFOR»
			}
				
			/** Creator for UML class «classDefinition.javadoc» */
			public static «classDefinition.identifier» create(«Runtime.canonicalName» runtime) {
				«FOR rec : classDefinition.ctorRecords»
					«rec.implementation» «rec.inherited» 
						= new «rec.implementation»(runtime«FOR par : rec.usedArgs», «par.inherited»«ENDFOR»);
				«ENDFOR»
				return new «classDefinition.implementation»(runtime«FOR parent : classDefinition.parents», «parent.inherited»«ENDFOR»);
			}
			«content»
		}
	'''

	override generateContent() '''
		«IF hasStateMachine»
			private static «AtomicInteger.canonicalName» instanceCount = new «AtomicInteger.canonicalName»(0);

			@Override
			protected «StateMachineRegion.canonicalName» createStateMachine() {
				return new «region.identifier»(this);
			}
			
			// receptions
			«FOR reception : classDefinition.receptions»
				
				«generateReception(reception, false)»
				<commit_msg>Removed duplication from ClassTemplate<commit_after>package hu.eltesoft.modelexecution.m2t.java.templates

import hu.eltesoft.modelexecution.m2m.metamodel.base.Named
import hu.eltesoft.modelexecution.m2m.metamodel.base.NamedReference
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClAssociation
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClAttribute
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClClass
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClInheritedAttribute
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClOperation
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClOperationSpec
import hu.eltesoft.modelexecution.m2m.metamodel.classdef.ClReception
import hu.eltesoft.modelexecution.m2t.java.Template
import hu.eltesoft.modelexecution.m2t.smap.xtend.SourceMappedTemplate
import hu.eltesoft.modelexecution.runtime.Runtime
import hu.eltesoft.modelexecution.runtime.base.Class
import hu.eltesoft.modelexecution.runtime.base.ClassWithState
import hu.eltesoft.modelexecution.runtime.base.SignalEvent
import hu.eltesoft.modelexecution.runtime.base.StateMachineRegion
import java.util.concurrent.atomic.AtomicInteger

import static hu.eltesoft.modelexecution.m2t.java.Languages.*

@SourceMappedTemplate(stratumName=XUML_RT)
class ClassTemplate extends Template {

	val ClClass classDefinition
	val boolean hasStateMachine
	val NamedReference region

	new(ClClass classDefinition) {
		super(classDefinition)
		this.classDefinition = classDefinition
		this.hasStateMachine = classDefinition.region != null || classDefinition.inheritedRegion != null
		region = if (classDefinition.region != null) classDefinition.region else classDefinition.inheritedRegion
	}

	override wrapContent(CharSequence content) '''
		/** Implementation class for UML class «classDefinition.javadoc» */
		«generatedHeaderForClass(classDefinition)»
		public class «classDefinition.implementation» 
			extends «IF (hasStateMachine)»«ClassWithState.canonicalName»«ELSE»«Class.canonicalName»«ENDIF»
			implements «classDefinition.identifier» {
			
			/** Constructor for UML class «classDefinition.javadoc» */
			public «classDefinition.implementation»(«Runtime.canonicalName» runtime
					«FOR parent : classDefinition.parents», «parent.implementation» «parent.inherited»«ENDFOR») {
				«IF hasStateMachine»super(runtime, instanceCount.getAndIncrement());«ENDIF»
				«FOR parent : classDefinition.parents»
					this.«parent.inherited» = «parent.inherited»;
				«ENDFOR»
			}
			
			/** Creator for UML class «classDefinition.javadoc» */
			public static «classDefinition.identifier» create(«Runtime.canonicalName» runtime) {
				«FOR rec : classDefinition.ctorRecords»
					«rec.implementation» «rec.inherited» 
						= new «rec.implementation»(runtime«FOR par : rec.usedArgs», «par.inherited»«ENDFOR»);
				«ENDFOR»
				return new «classDefinition.implementation»(runtime«FOR parent : classDefinition.parents», «parent.inherited»«ENDFOR»);
			}
			«content»
		}
	'''
	
	override generateContent() '''
		«IF hasStateMachine»
			private static «AtomicInteger.canonicalName» instanceCount = new «AtomicInteger.canonicalName»(0);

			@Override
			protected «StateMachineRegion.canonicalName» createStateMachine() {
				return new «region.identifier»(this);
			}
			
			// receptions
			«FOR reception : classDefinition.receptions»
				
				«generateReception(reception, false)»
				
{'fraction_non_alphanumeric': 0.10414388139506622, 'fraction_numerical': 0.0034026005589986633, 'mean_word_length': 5.3503086419753085, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '836783', 'n_tokens_mistral': 2877, 'n_tokens_neox': 2487, 'n_words': 703}