catch up with branch daily

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.xtend b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.xtend
index 209c336..70d97fa 100644
--- a/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.xtend
+++ b/org.eclipse.osbp.xtext.statemachine/src/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.xtend
@@ -174,6 +174,9 @@
 import org.osgi.service.component.annotations.ReferenceCardinality
 import org.osgi.service.component.annotations.ReferencePolicy
 import org.slf4j.Logger
+import org.eclipse.osbp.dsl.semantic.entity.LBean
+import org.eclipse.osbp.xtext.statemachine.services.StatemachineDSLGrammarAccess.FSMControlElements
+import org.eclipse.osbp.xtext.statemachine.FSMEvent
 
 /**
  * <p>
@@ -225,6 +228,18 @@
 					packageName = pkgName
 				]
 			)
+			// create event emitter to be bound to components' events (focus, blur etc)
+			val eventCls = statemachinePkg.toClass("EventEmitter");
+			eventCls.simpleName = eventCls.simpleName.toFirstUpper
+			eventCls.superTypes.add(_typeReferenceBuilder.typeRef(AbstractEventSource))
+			acceptor.accept(
+				eventCls,
+				[
+					// events
+					it.generateEventEmitters(statemachine)
+					packageName = pkgName
+				]
+			)
 			// collect display associated dtos
 			val associatedDtos = <FSMControlDTOAttribute>newArrayList
 			statemachine.controls.stream.filter[it instanceof FSMControlPeripheral].forEach[p|(p as FSMControlPeripheral).displays.forEach[associatedDtos.add(it.output)]]
@@ -292,6 +307,32 @@
 		}
 	}
 	
+	def void generateEventEmitters(JvmGenericType eventCls, FSM statemachine) {
+		for (event : statemachine.events) {
+			var JvmField field = event.toField(event.name, _typeReferenceBuilder.typeRef(Number))
+			field.visibility = JvmVisibility::PRIVATE
+			eventCls.members += field
+			var JvmOperation operation = event.toMethod('''get«event.name.toFirstUpper»Event''', _typeReferenceBuilder.typeRef(Number)) [
+				body = [append('''return «event.name»;''')]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			eventCls.members += operation
+			operation = event.toMethod('''set«event.name.toFirstUpper»Event''',
+				_typeReferenceBuilder.typeRef(Void::TYPE)) [
+				visibility = JvmVisibility.PUBLIC
+				parameters += event.toParameter(event.name, _typeReferenceBuilder.typeRef(Number));
+				body = [
+					append(
+						'''
+					statemachine.processEvent(statemachine, new MessageEvent(EventType.TRIGGER, "«event.name»"));
+					this.«event.name» = «event.name»;''')
+				]
+			]
+			operation.visibility = JvmVisibility::PUBLIC
+			eventCls.members += operation
+		}
+	}
+	
 	def generatePeripheral(JvmGenericType controlCls, FSMControlPeripheral peripheral) {
 		var JvmOperation init = peripheral.toMethod("initDevices", _typeReferenceBuilder.typeRef(boolean)) [
 			annotations += _annotationTypesBuilder.annotationRef(Override)
@@ -836,27 +877,57 @@
 				control.buildDTOAttribute(controlCls, dto, f.inheritedFeature, f, associatedDtos)
 			}
 			if (f instanceof LDtoReference) {
-				operation = control.toMethod('''set«dto.name.toFirstUpper»«f.name.toFirstUpper»''',
-					_typeReferenceBuilder.typeRef(Void::TYPE)) [
-					visibility = JvmVisibility::PUBLIC
-					parameters += control.toParameter(f.name, type)
-					body = [
-							append(
-							'''
-							if(«dto.name»!=null) {
-								«dto.name».set«f.name.toFirstUpper»((«f.type.name.toString»)«f.name»);«dto.notifySlaveReference(f, associatedDtos)»
-							}''')
+				val LDto targetDto = f.type
+				if (f.toMany) {
+					if (dtos !== null && dtos.exists[it.attributeType.attributeType.name == targetDto.name]) {
+						operation = control.
+							toMethod('''addTo«dto.name.toFirstUpper»«f.name.toFirstUpper»''',
+								_typeReferenceBuilder.typeRef(Void::TYPE)) [
+								visibility = JvmVisibility::PUBLIC
+								parameters +=
+									control.toParameter(f.name,
+										type)
+								body = [
+										append('''«dto.name».addTo«f.name.toFirstUpper»((«f.type.name.toString»)«f.name»);''')
+									]
+								]
+						controlCls.members += operation
+						operation = control.
+							toMethod('''removeFrom«dto.name.toFirstUpper»«f.name.toFirstUpper»''',
+								_typeReferenceBuilder.typeRef(Void::TYPE)) [
+								visibility = JvmVisibility::PUBLIC
+								parameters +=
+									control.toParameter(f.name,
+										type)
+								body = [
+									append('''«dto.name».removeFrom«f.name.toFirstUpper»((«f.type.name.toString»)«f.name»);''')
+								]
+							]
+						controlCls.members += operation
+					}
+				} else {
+					operation = control.toMethod('''set«dto.name.toFirstUpper»«f.name.toFirstUpper»''',
+						_typeReferenceBuilder.typeRef(Void::TYPE)) [
+						visibility = JvmVisibility::PUBLIC
+						parameters += control.toParameter(f.name, type)
+						body = [
+								append(
+								'''
+								if(«dto.name»!=null) {
+									«dto.name».set«f.name.toFirstUpper»((«f.type.name.toString»)«f.name»);«dto.notifySlaveReference(f, associatedDtos)»
+								}''')
+							]
 						]
-					]
-				controlCls.members += operation
-				operation = control.toMethod('''get«dto.name.toFirstUpper»«f.name.toFirstUpper»''',	type) [
-					visibility = JvmVisibility::PUBLIC
-					parameters += control.toParameter(f.name, type)
-					body = [
-							append('''return «dto.name».get«f.name.toFirstUpper»();''')
+					controlCls.members += operation
+					operation = control.toMethod('''get«dto.name.toFirstUpper»«f.name.toFirstUpper»''',	type) [
+						visibility = JvmVisibility::PUBLIC
+						parameters += control.toParameter(f.name, type)
+						body = [
+								append('''return «dto.name».get«f.name.toFirstUpper»();''')
+							]
 						]
-					]
-				controlCls.members += operation
+					controlCls.members += operation
+				}
 			}
 			if (f instanceof LDtoInheritedReference) {
 				val LDto targetDto = f.type
@@ -1007,6 +1078,12 @@
 							typeRef = prop.toDtoTypeReference
 						}
 					}
+					LBean: {
+						st = f.type as LBean
+						if(prop !== null) {
+							typeRef = prop.toDtoTypeReference
+						}
+					}
 				}
 				if (isTimestamp) {
 					typeRef = _typeReferenceBuilder.typeRef("org.joda.time.DateTime")
@@ -1323,6 +1400,12 @@
 							@Override
 							public States process(final IStateMachine statemachine, final MessageEvent event) {
 								statemachine.dispatchMessages(event);
+								«IF state.functionalKeyEvent !== null»
+								if(event.getType()==EventType.FUNCTIONALKEYBOARD && "«state.functionalKeyCode.getName()»".equals(event.getId())) {
+									event.setType(EventType.TRIGGER);
+									event.setId("«state.functionalKeyEvent.name»");
+								}
+								«ENDIF»
 								switch (event.getType()) {
 							«IF state.keystroke !== null»		case KEYBOARD:
 										statemachine.append("«state.keystroke.name»", event.getId());«IF state.hasKeyOperation»
@@ -1330,12 +1413,12 @@
 								«ENDIF»
 								break;
 							«ENDIF»
-							«IF state.functionalKeyEvent !== null»		case FUNCTIONALKEYBOARD:
-										if("«state.functionalKeyCode.getName()»".equals(event.getId())) {
-											statemachine.schedule(statemachine, 100, new MessageEvent(EventType.TRIGGER, "«state.functionalKeyEvent.name»"));
-										}
-										break;
-							«ENDIF»
+«««							«IF state.functionalKeyEvent !== null»		case FUNCTIONALKEYBOARD:
+«««										if("«state.functionalKeyCode.getName()»".equals(event.getId())) {
+«««											statemachine.schedule(statemachine, 100, new MessageEvent(EventType.TRIGGER, "«state.functionalKeyEvent.name»"));
+«««										}
+«««										break;
+«««							«ENDIF»
 							«IF state.identity !== null»		case ID:
 										«state.identity.decodeOperation(true, 0)»
 										break;
diff --git a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.java b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.java
index 1117420..ae9d1a0 100644
--- a/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.java
+++ b/org.eclipse.osbp.xtext.statemachine/xtend-gen/org/eclipse/osbp/xtext/statemachine/jvmmodel/StatemachineDSLJvmModelInferrer.java
@@ -52,6 +52,7 @@
 import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
 import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedReference;
 import org.eclipse.osbp.dsl.semantic.dto.LDtoReference;
+import org.eclipse.osbp.dsl.semantic.entity.LBean;
 import org.eclipse.osbp.dsl.semantic.entity.LBeanAttribute;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
@@ -275,17 +276,25 @@
           it.setPackageName(pkgName);
         };
         acceptor.<JvmGenericType>accept(cls, _function_1);
+        final JvmGenericType eventCls = this._jvmTypesBuilder.toClass(statemachinePkg, "EventEmitter");
+        eventCls.setSimpleName(StringExtensions.toFirstUpper(eventCls.getSimpleName()));
+        eventCls.getSuperTypes().add(this._typeReferenceBuilder.typeRef(AbstractEventSource.class));
+        final Procedure1<JvmGenericType> _function_2 = (JvmGenericType it) -> {
+          this.generateEventEmitters(it, statemachine);
+          it.setPackageName(pkgName);
+        };
+        acceptor.<JvmGenericType>accept(eventCls, _function_2);
         final ArrayList<FSMControlDTOAttribute> associatedDtos = CollectionLiterals.<FSMControlDTOAttribute>newArrayList();
-        final Predicate<FSMControl> _function_2 = (FSMControl it) -> {
+        final Predicate<FSMControl> _function_3 = (FSMControl it) -> {
           return (it instanceof FSMControlPeripheral);
         };
-        final Consumer<FSMControl> _function_3 = (FSMControl p) -> {
-          final Consumer<FSMPeripheralDeviceDisplay> _function_4 = (FSMPeripheralDeviceDisplay it) -> {
+        final Consumer<FSMControl> _function_4 = (FSMControl p) -> {
+          final Consumer<FSMPeripheralDeviceDisplay> _function_5 = (FSMPeripheralDeviceDisplay it) -> {
             associatedDtos.add(it.getOutput());
           };
-          ((FSMControlPeripheral) p).getDisplays().forEach(_function_4);
+          ((FSMControlPeripheral) p).getDisplays().forEach(_function_5);
         };
-        statemachine.getControls().stream().filter(_function_2).forEach(_function_3);
+        statemachine.getControls().stream().filter(_function_3).forEach(_function_4);
         EList<FSMControl> _controls = statemachine.getControls();
         for (final FSMControl control : _controls) {
           {
@@ -296,54 +305,54 @@
             if (control instanceof FSMControlScheduler) {
               _matched=true;
               controlCls.getSuperTypes().add(this._typeReferenceBuilder.typeRef(AbstractEventSource.class));
-              final Procedure1<JvmGenericType> _function_4 = (JvmGenericType it) -> {
+              final Procedure1<JvmGenericType> _function_5 = (JvmGenericType it) -> {
                 this.generateSchedulers(it, ((FSMControlScheduler)control));
                 it.setPackageName(pkgName);
               };
-              acceptor.<JvmGenericType>accept(controlCls, _function_4);
+              acceptor.<JvmGenericType>accept(controlCls, _function_5);
             }
             if (!_matched) {
               if (control instanceof FSMControlButton) {
                 _matched=true;
                 controlCls.getSuperTypes().add(this._typeReferenceBuilder.typeRef(AbstractEventSource.class));
-                final Procedure1<JvmGenericType> _function_4 = (JvmGenericType it) -> {
+                final Procedure1<JvmGenericType> _function_5 = (JvmGenericType it) -> {
                   this.generateButtons(it, ((FSMControlButton)control));
                   it.setPackageName(pkgName);
                 };
-                acceptor.<JvmGenericType>accept(controlCls, _function_4);
+                acceptor.<JvmGenericType>accept(controlCls, _function_5);
               }
             }
             if (!_matched) {
               if (control instanceof FSMControlField) {
                 _matched=true;
                 controlCls.getSuperTypes().add(this._typeReferenceBuilder.typeRef(AbstractEventSource.class));
-                final Procedure1<JvmGenericType> _function_4 = (JvmGenericType it) -> {
+                final Procedure1<JvmGenericType> _function_5 = (JvmGenericType it) -> {
                   this.generateFields(it, ((FSMControlField)control));
                   it.setPackageName(pkgName);
                 };
-                acceptor.<JvmGenericType>accept(controlCls, _function_4);
+                acceptor.<JvmGenericType>accept(controlCls, _function_5);
               }
             }
             if (!_matched) {
               if (control instanceof FSMControlDTO) {
                 _matched=true;
                 controlCls.getSuperTypes().add(this._typeReferenceBuilder.typeRef(AbstractDataProvider.class));
-                final Procedure1<JvmGenericType> _function_4 = (JvmGenericType it) -> {
+                final Procedure1<JvmGenericType> _function_5 = (JvmGenericType it) -> {
                   this.generateDTOs(it, ((FSMControlDTO)control), associatedDtos);
                   it.setPackageName(pkgName);
                 };
-                acceptor.<JvmGenericType>accept(controlCls, _function_4);
+                acceptor.<JvmGenericType>accept(controlCls, _function_5);
               }
             }
             if (!_matched) {
               if (control instanceof FSMControlPeripheral) {
                 _matched=true;
                 controlCls.getSuperTypes().add(this._typeReferenceBuilder.typeRef(AbstractPeripheralService.class));
-                final Procedure1<JvmGenericType> _function_4 = (JvmGenericType it) -> {
+                final Procedure1<JvmGenericType> _function_5 = (JvmGenericType it) -> {
                   this.generatePeripheral(it, ((FSMControlPeripheral)control));
                   it.setPackageName(pkgName);
                 };
-                acceptor.<JvmGenericType>accept(controlCls, _function_4);
+                acceptor.<JvmGenericType>accept(controlCls, _function_5);
               }
             }
           }
@@ -352,6 +361,71 @@
     }
   }
   
+  public void generateEventEmitters(final JvmGenericType eventCls, final FSM statemachine) {
+    EList<FSMEvent> _events = statemachine.getEvents();
+    for (final FSMEvent event : _events) {
+      {
+        JvmField field = this._jvmTypesBuilder.toField(event, event.getName(), this._typeReferenceBuilder.typeRef(Number.class));
+        field.setVisibility(JvmVisibility.PRIVATE);
+        EList<JvmMember> _members = eventCls.getMembers();
+        this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
+        StringConcatenation _builder = new StringConcatenation();
+        _builder.append("get");
+        String _firstUpper = StringExtensions.toFirstUpper(event.getName());
+        _builder.append(_firstUpper);
+        _builder.append("Event");
+        final Procedure1<JvmOperation> _function = (JvmOperation it) -> {
+          final Procedure1<ITreeAppendable> _function_1 = (ITreeAppendable it_1) -> {
+            StringConcatenation _builder_1 = new StringConcatenation();
+            _builder_1.append("return ");
+            String _name = event.getName();
+            _builder_1.append(_name);
+            _builder_1.append(";");
+            it_1.append(_builder_1);
+          };
+          this._jvmTypesBuilder.setBody(it, _function_1);
+        };
+        JvmOperation operation = this._jvmTypesBuilder.toMethod(event, _builder.toString(), this._typeReferenceBuilder.typeRef(Number.class), _function);
+        operation.setVisibility(JvmVisibility.PUBLIC);
+        EList<JvmMember> _members_1 = eventCls.getMembers();
+        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, operation);
+        StringConcatenation _builder_1 = new StringConcatenation();
+        _builder_1.append("set");
+        String _firstUpper_1 = StringExtensions.toFirstUpper(event.getName());
+        _builder_1.append(_firstUpper_1);
+        _builder_1.append("Event");
+        final Procedure1<JvmOperation> _function_1 = (JvmOperation it) -> {
+          it.setVisibility(JvmVisibility.PUBLIC);
+          EList<JvmFormalParameter> _parameters = it.getParameters();
+          JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(event, event.getName(), this._typeReferenceBuilder.typeRef(Number.class));
+          this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+          final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_1) -> {
+            StringConcatenation _builder_2 = new StringConcatenation();
+            _builder_2.append("statemachine.processEvent(statemachine, new MessageEvent(EventType.TRIGGER, \"");
+            String _name = event.getName();
+            _builder_2.append(_name);
+            _builder_2.append("\"));");
+            _builder_2.newLineIfNotEmpty();
+            _builder_2.append("this.");
+            String _name_1 = event.getName();
+            _builder_2.append(_name_1);
+            _builder_2.append(" = ");
+            String _name_2 = event.getName();
+            _builder_2.append(_name_2);
+            _builder_2.append(";");
+            it_1.append(_builder_2);
+          };
+          this._jvmTypesBuilder.setBody(it, _function_2);
+        };
+        operation = this._jvmTypesBuilder.toMethod(event, _builder_1.toString(), 
+          this._typeReferenceBuilder.typeRef(Void.TYPE), _function_1);
+        operation.setVisibility(JvmVisibility.PUBLIC);
+        EList<JvmMember> _members_2 = eventCls.getMembers();
+        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
+      }
+    }
+  }
+  
   public boolean generatePeripheral(final JvmGenericType controlCls, final FSMControlPeripheral peripheral) {
     boolean _xblockexpression = false;
     {
@@ -1559,163 +1633,165 @@
             this.buildDTOAttribute(control, controlCls, dto, ((LDtoInheritedAttribute)f).getInheritedFeature(), ((LDtoInheritedAttribute)f), associatedDtos);
           }
           if ((f instanceof LDtoReference)) {
-            StringConcatenation _builder_2 = new StringConcatenation();
-            _builder_2.append("set");
-            String _firstUpper_3 = StringExtensions.toFirstUpper(dto.getName());
-            _builder_2.append(_firstUpper_3);
-            String _firstUpper_4 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
-            _builder_2.append(_firstUpper_4);
-            final Procedure1<JvmOperation> _function_2 = (JvmOperation it) -> {
-              it.setVisibility(JvmVisibility.PUBLIC);
-              EList<JvmFormalParameter> _parameters = it.getParameters();
-              JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoReference)f).getName(), type);
-              this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-              final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_1) -> {
-                StringConcatenation _builder_3 = new StringConcatenation();
-                _builder_3.append("if(");
-                String _name = dto.getName();
-                _builder_3.append(_name);
-                _builder_3.append("!=null) {");
-                _builder_3.newLineIfNotEmpty();
-                _builder_3.append("\t");
-                String _name_1 = dto.getName();
-                _builder_3.append(_name_1, "\t");
-                _builder_3.append(".set");
-                String _firstUpper_5 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
-                _builder_3.append(_firstUpper_5, "\t");
-                _builder_3.append("((");
-                String _string = ((LDtoReference)f).getType().getName().toString();
-                _builder_3.append(_string, "\t");
-                _builder_3.append(")");
-                String _name_2 = ((LDtoReference)f).getName();
-                _builder_3.append(_name_2, "\t");
-                _builder_3.append(");");
-                CharSequence _notifySlaveReference = this.notifySlaveReference(dto, ((LDtoReference)f), associatedDtos);
-                _builder_3.append(_notifySlaveReference, "\t");
-                _builder_3.newLineIfNotEmpty();
-                _builder_3.append("}");
-                it_1.append(_builder_3);
-              };
-              this._jvmTypesBuilder.setBody(it, _function_3);
-            };
-            operation = this._jvmTypesBuilder.toMethod(control, _builder_2.toString(), 
-              this._typeReferenceBuilder.typeRef(Void.TYPE), _function_2);
-            EList<JvmMember> _members_2 = controlCls.getMembers();
-            this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
-            StringConcatenation _builder_3 = new StringConcatenation();
-            _builder_3.append("get");
-            String _firstUpper_5 = StringExtensions.toFirstUpper(dto.getName());
-            _builder_3.append(_firstUpper_5);
-            String _firstUpper_6 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
-            _builder_3.append(_firstUpper_6);
-            final Procedure1<JvmOperation> _function_3 = (JvmOperation it) -> {
-              it.setVisibility(JvmVisibility.PUBLIC);
-              EList<JvmFormalParameter> _parameters = it.getParameters();
-              JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoReference)f).getName(), type);
-              this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-              final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_1) -> {
-                StringConcatenation _builder_4 = new StringConcatenation();
-                _builder_4.append("return ");
-                String _name = dto.getName();
-                _builder_4.append(_name);
-                _builder_4.append(".get");
-                String _firstUpper_7 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
-                _builder_4.append(_firstUpper_7);
-                _builder_4.append("();");
-                it_1.append(_builder_4);
-              };
-              this._jvmTypesBuilder.setBody(it, _function_4);
-            };
-            operation = this._jvmTypesBuilder.toMethod(control, _builder_3.toString(), type, _function_3);
-            EList<JvmMember> _members_3 = controlCls.getMembers();
-            this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
-          }
-          if ((f instanceof LDtoInheritedReference)) {
-            final LDto targetDto = ((LDtoInheritedReference)f).getType();
-            boolean _isToMany = this._dtoModelExtensions.isToMany(((LDtoInheritedReference)f).getInheritedFeature());
+            final LDto targetDto = ((LDtoReference)f).getType();
+            boolean _isToMany = this._dtoModelExtensions.isToMany(f);
             if (_isToMany) {
               if (((dtos != null) && IterableExtensions.<FSMControlDTOAttribute>exists(dtos, ((Function1<FSMControlDTOAttribute, Boolean>) (FSMControlDTOAttribute it) -> {
                 String _name = it.getAttributeType().getAttributeType().getName();
                 String _name_1 = targetDto.getName();
                 return Boolean.valueOf(Objects.equal(_name, _name_1));
               })))) {
-                StringConcatenation _builder_4 = new StringConcatenation();
-                _builder_4.append("addTo");
-                String _firstUpper_7 = StringExtensions.toFirstUpper(dto.getName());
-                _builder_4.append(_firstUpper_7);
-                String _firstUpper_8 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
-                _builder_4.append(_firstUpper_8);
-                final Procedure1<JvmOperation> _function_4 = (JvmOperation it) -> {
+                StringConcatenation _builder_2 = new StringConcatenation();
+                _builder_2.append("addTo");
+                String _firstUpper_3 = StringExtensions.toFirstUpper(dto.getName());
+                _builder_2.append(_firstUpper_3);
+                String _firstUpper_4 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+                _builder_2.append(_firstUpper_4);
+                final Procedure1<JvmOperation> _function_2 = (JvmOperation it) -> {
                   it.setVisibility(JvmVisibility.PUBLIC);
                   EList<JvmFormalParameter> _parameters = it.getParameters();
-                  JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoInheritedReference)f).getInheritedFeature().getName(), type);
+                  JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoReference)f).getName(), type);
                   this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-                  final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_1) -> {
-                    StringConcatenation _builder_5 = new StringConcatenation();
+                  final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_1) -> {
+                    StringConcatenation _builder_3 = new StringConcatenation();
                     String _name = dto.getName();
-                    _builder_5.append(_name);
-                    _builder_5.append(".addTo");
-                    String _firstUpper_9 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
-                    _builder_5.append(_firstUpper_9);
-                    _builder_5.append("((");
-                    String _string = ((LDtoInheritedReference)f).getType().getName().toString();
-                    _builder_5.append(_string);
-                    _builder_5.append(")");
-                    String _name_1 = ((LDtoInheritedReference)f).getInheritedFeature().getName();
-                    _builder_5.append(_name_1);
-                    _builder_5.append(");");
-                    it_1.append(_builder_5);
+                    _builder_3.append(_name);
+                    _builder_3.append(".addTo");
+                    String _firstUpper_5 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+                    _builder_3.append(_firstUpper_5);
+                    _builder_3.append("((");
+                    String _string = ((LDtoReference)f).getType().getName().toString();
+                    _builder_3.append(_string);
+                    _builder_3.append(")");
+                    String _name_1 = ((LDtoReference)f).getName();
+                    _builder_3.append(_name_1);
+                    _builder_3.append(");");
+                    it_1.append(_builder_3);
                   };
-                  this._jvmTypesBuilder.setBody(it, _function_5);
+                  this._jvmTypesBuilder.setBody(it, _function_3);
                 };
-                operation = this._jvmTypesBuilder.toMethod(control, _builder_4.toString(), 
-                  this._typeReferenceBuilder.typeRef(Void.TYPE), _function_4);
-                EList<JvmMember> _members_4 = controlCls.getMembers();
-                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
-                StringConcatenation _builder_5 = new StringConcatenation();
-                _builder_5.append("removeFrom");
-                String _firstUpper_9 = StringExtensions.toFirstUpper(dto.getName());
-                _builder_5.append(_firstUpper_9);
-                String _firstUpper_10 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
-                _builder_5.append(_firstUpper_10);
-                final Procedure1<JvmOperation> _function_5 = (JvmOperation it) -> {
+                operation = this._jvmTypesBuilder.toMethod(control, _builder_2.toString(), 
+                  this._typeReferenceBuilder.typeRef(Void.TYPE), _function_2);
+                EList<JvmMember> _members_2 = controlCls.getMembers();
+                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, operation);
+                StringConcatenation _builder_3 = new StringConcatenation();
+                _builder_3.append("removeFrom");
+                String _firstUpper_5 = StringExtensions.toFirstUpper(dto.getName());
+                _builder_3.append(_firstUpper_5);
+                String _firstUpper_6 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+                _builder_3.append(_firstUpper_6);
+                final Procedure1<JvmOperation> _function_3 = (JvmOperation it) -> {
                   it.setVisibility(JvmVisibility.PUBLIC);
                   EList<JvmFormalParameter> _parameters = it.getParameters();
-                  JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoInheritedReference)f).getInheritedFeature().getName(), type);
+                  JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoReference)f).getName(), type);
                   this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
-                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_1) -> {
-                    StringConcatenation _builder_6 = new StringConcatenation();
+                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_1) -> {
+                    StringConcatenation _builder_4 = new StringConcatenation();
                     String _name = dto.getName();
-                    _builder_6.append(_name);
-                    _builder_6.append(".removeFrom");
-                    String _firstUpper_11 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
-                    _builder_6.append(_firstUpper_11);
-                    _builder_6.append("((");
-                    String _string = ((LDtoInheritedReference)f).getType().getName().toString();
-                    _builder_6.append(_string);
-                    _builder_6.append(")");
-                    String _name_1 = ((LDtoInheritedReference)f).getInheritedFeature().getName();
-                    _builder_6.append(_name_1);
-                    _builder_6.append(");");
-                    it_1.append(_builder_6);
+                    _builder_4.append(_name);
+                    _builder_4.append(".removeFrom");
+                    String _firstUpper_7 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+                    _builder_4.append(_firstUpper_7);
+                    _builder_4.append("((");
+                    String _string = ((LDtoReference)f).getType().getName().toString();
+                    _builder_4.append(_string);
+                    _builder_4.append(")");
+                    String _name_1 = ((LDtoReference)f).getName();
+                    _builder_4.append(_name_1);
+                    _builder_4.append(");");
+                    it_1.append(_builder_4);
                   };
-                  this._jvmTypesBuilder.setBody(it, _function_6);
+                  this._jvmTypesBuilder.setBody(it, _function_4);
                 };
-                operation = this._jvmTypesBuilder.toMethod(control, _builder_5.toString(), 
-                  this._typeReferenceBuilder.typeRef(Void.TYPE), _function_5);
-                EList<JvmMember> _members_5 = controlCls.getMembers();
-                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, operation);
+                operation = this._jvmTypesBuilder.toMethod(control, _builder_3.toString(), 
+                  this._typeReferenceBuilder.typeRef(Void.TYPE), _function_3);
+                EList<JvmMember> _members_3 = controlCls.getMembers();
+                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, operation);
               }
             } else {
+              StringConcatenation _builder_4 = new StringConcatenation();
+              _builder_4.append("set");
+              String _firstUpper_7 = StringExtensions.toFirstUpper(dto.getName());
+              _builder_4.append(_firstUpper_7);
+              String _firstUpper_8 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+              _builder_4.append(_firstUpper_8);
+              final Procedure1<JvmOperation> _function_4 = (JvmOperation it) -> {
+                it.setVisibility(JvmVisibility.PUBLIC);
+                EList<JvmFormalParameter> _parameters = it.getParameters();
+                JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoReference)f).getName(), type);
+                this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_1) -> {
+                  StringConcatenation _builder_5 = new StringConcatenation();
+                  _builder_5.append("if(");
+                  String _name = dto.getName();
+                  _builder_5.append(_name);
+                  _builder_5.append("!=null) {");
+                  _builder_5.newLineIfNotEmpty();
+                  _builder_5.append("\t");
+                  String _name_1 = dto.getName();
+                  _builder_5.append(_name_1, "\t");
+                  _builder_5.append(".set");
+                  String _firstUpper_9 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+                  _builder_5.append(_firstUpper_9, "\t");
+                  _builder_5.append("((");
+                  String _string = ((LDtoReference)f).getType().getName().toString();
+                  _builder_5.append(_string, "\t");
+                  _builder_5.append(")");
+                  String _name_2 = ((LDtoReference)f).getName();
+                  _builder_5.append(_name_2, "\t");
+                  _builder_5.append(");");
+                  CharSequence _notifySlaveReference = this.notifySlaveReference(dto, ((LDtoReference)f), associatedDtos);
+                  _builder_5.append(_notifySlaveReference, "\t");
+                  _builder_5.newLineIfNotEmpty();
+                  _builder_5.append("}");
+                  it_1.append(_builder_5);
+                };
+                this._jvmTypesBuilder.setBody(it, _function_5);
+              };
+              operation = this._jvmTypesBuilder.toMethod(control, _builder_4.toString(), 
+                this._typeReferenceBuilder.typeRef(Void.TYPE), _function_4);
+              EList<JvmMember> _members_4 = controlCls.getMembers();
+              this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, operation);
+              StringConcatenation _builder_5 = new StringConcatenation();
+              _builder_5.append("get");
+              String _firstUpper_9 = StringExtensions.toFirstUpper(dto.getName());
+              _builder_5.append(_firstUpper_9);
+              String _firstUpper_10 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+              _builder_5.append(_firstUpper_10);
+              final Procedure1<JvmOperation> _function_5 = (JvmOperation it) -> {
+                it.setVisibility(JvmVisibility.PUBLIC);
+                EList<JvmFormalParameter> _parameters = it.getParameters();
+                JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoReference)f).getName(), type);
+                this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_1) -> {
+                  StringConcatenation _builder_6 = new StringConcatenation();
+                  _builder_6.append("return ");
+                  String _name = dto.getName();
+                  _builder_6.append(_name);
+                  _builder_6.append(".get");
+                  String _firstUpper_11 = StringExtensions.toFirstUpper(((LDtoReference)f).getName());
+                  _builder_6.append(_firstUpper_11);
+                  _builder_6.append("();");
+                  it_1.append(_builder_6);
+                };
+                this._jvmTypesBuilder.setBody(it, _function_6);
+              };
+              operation = this._jvmTypesBuilder.toMethod(control, _builder_5.toString(), type, _function_5);
+              EList<JvmMember> _members_5 = controlCls.getMembers();
+              this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, operation);
+            }
+          }
+          if ((f instanceof LDtoInheritedReference)) {
+            final LDto targetDto_1 = ((LDtoInheritedReference)f).getType();
+            boolean _isToMany_1 = this._dtoModelExtensions.isToMany(((LDtoInheritedReference)f).getInheritedFeature());
+            if (_isToMany_1) {
               if (((dtos != null) && IterableExtensions.<FSMControlDTOAttribute>exists(dtos, ((Function1<FSMControlDTOAttribute, Boolean>) (FSMControlDTOAttribute it) -> {
                 String _name = it.getAttributeType().getAttributeType().getName();
-                String _name_1 = targetDto.getName();
+                String _name_1 = targetDto_1.getName();
                 return Boolean.valueOf(Objects.equal(_name, _name_1));
               })))) {
-                EList<JvmMember> _members_6 = controlCls.getMembers();
-                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, operation);
                 StringConcatenation _builder_6 = new StringConcatenation();
-                _builder_6.append("set");
+                _builder_6.append("addTo");
                 String _firstUpper_11 = StringExtensions.toFirstUpper(dto.getName());
                 _builder_6.append(_firstUpper_11);
                 String _firstUpper_12 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
@@ -1729,7 +1805,7 @@
                     StringConcatenation _builder_7 = new StringConcatenation();
                     String _name = dto.getName();
                     _builder_7.append(_name);
-                    _builder_7.append(".set");
+                    _builder_7.append(".addTo");
                     String _firstUpper_13 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
                     _builder_7.append(_firstUpper_13);
                     _builder_7.append("((");
@@ -1745,9 +1821,84 @@
                 };
                 operation = this._jvmTypesBuilder.toMethod(control, _builder_6.toString(), 
                   this._typeReferenceBuilder.typeRef(Void.TYPE), _function_6);
+                EList<JvmMember> _members_6 = controlCls.getMembers();
+                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, operation);
+                StringConcatenation _builder_7 = new StringConcatenation();
+                _builder_7.append("removeFrom");
+                String _firstUpper_13 = StringExtensions.toFirstUpper(dto.getName());
+                _builder_7.append(_firstUpper_13);
+                String _firstUpper_14 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
+                _builder_7.append(_firstUpper_14);
+                final Procedure1<JvmOperation> _function_7 = (JvmOperation it) -> {
+                  it.setVisibility(JvmVisibility.PUBLIC);
+                  EList<JvmFormalParameter> _parameters = it.getParameters();
+                  JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoInheritedReference)f).getInheritedFeature().getName(), type);
+                  this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                  final Procedure1<ITreeAppendable> _function_8 = (ITreeAppendable it_1) -> {
+                    StringConcatenation _builder_8 = new StringConcatenation();
+                    String _name = dto.getName();
+                    _builder_8.append(_name);
+                    _builder_8.append(".removeFrom");
+                    String _firstUpper_15 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
+                    _builder_8.append(_firstUpper_15);
+                    _builder_8.append("((");
+                    String _string = ((LDtoInheritedReference)f).getType().getName().toString();
+                    _builder_8.append(_string);
+                    _builder_8.append(")");
+                    String _name_1 = ((LDtoInheritedReference)f).getInheritedFeature().getName();
+                    _builder_8.append(_name_1);
+                    _builder_8.append(");");
+                    it_1.append(_builder_8);
+                  };
+                  this._jvmTypesBuilder.setBody(it, _function_8);
+                };
+                operation = this._jvmTypesBuilder.toMethod(control, _builder_7.toString(), 
+                  this._typeReferenceBuilder.typeRef(Void.TYPE), _function_7);
                 EList<JvmMember> _members_7 = controlCls.getMembers();
                 this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, operation);
               }
+            } else {
+              if (((dtos != null) && IterableExtensions.<FSMControlDTOAttribute>exists(dtos, ((Function1<FSMControlDTOAttribute, Boolean>) (FSMControlDTOAttribute it) -> {
+                String _name = it.getAttributeType().getAttributeType().getName();
+                String _name_1 = targetDto_1.getName();
+                return Boolean.valueOf(Objects.equal(_name, _name_1));
+              })))) {
+                EList<JvmMember> _members_8 = controlCls.getMembers();
+                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_8, operation);
+                StringConcatenation _builder_8 = new StringConcatenation();
+                _builder_8.append("set");
+                String _firstUpper_15 = StringExtensions.toFirstUpper(dto.getName());
+                _builder_8.append(_firstUpper_15);
+                String _firstUpper_16 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
+                _builder_8.append(_firstUpper_16);
+                final Procedure1<JvmOperation> _function_8 = (JvmOperation it) -> {
+                  it.setVisibility(JvmVisibility.PUBLIC);
+                  EList<JvmFormalParameter> _parameters = it.getParameters();
+                  JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(control, ((LDtoInheritedReference)f).getInheritedFeature().getName(), type);
+                  this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
+                  final Procedure1<ITreeAppendable> _function_9 = (ITreeAppendable it_1) -> {
+                    StringConcatenation _builder_9 = new StringConcatenation();
+                    String _name = dto.getName();
+                    _builder_9.append(_name);
+                    _builder_9.append(".set");
+                    String _firstUpper_17 = StringExtensions.toFirstUpper(((LDtoInheritedReference)f).getInheritedFeature().getName());
+                    _builder_9.append(_firstUpper_17);
+                    _builder_9.append("((");
+                    String _string = ((LDtoInheritedReference)f).getType().getName().toString();
+                    _builder_9.append(_string);
+                    _builder_9.append(")");
+                    String _name_1 = ((LDtoInheritedReference)f).getInheritedFeature().getName();
+                    _builder_9.append(_name_1);
+                    _builder_9.append(");");
+                    it_1.append(_builder_9);
+                  };
+                  this._jvmTypesBuilder.setBody(it, _function_9);
+                };
+                operation = this._jvmTypesBuilder.toMethod(control, _builder_8.toString(), 
+                  this._typeReferenceBuilder.typeRef(Void.TYPE), _function_8);
+                EList<JvmMember> _members_9 = controlCls.getMembers();
+                this._jvmTypesBuilder.<JvmOperation>operator_add(_members_9, operation);
+              }
             }
           }
         }
@@ -2076,6 +2227,16 @@
           }
         }
       }
+      if (!_matched) {
+        if (_type instanceof LBean) {
+          _matched=true;
+          LScalarType _type_1 = f.getType();
+          st = ((LBean) _type_1);
+          if ((prop != null)) {
+            typeRef = this._dtoModelExtensions.toDtoTypeReference(prop);
+          }
+        }
+      }
       if (isTimestamp) {
         typeRef = this._typeReferenceBuilder.typeRef("org.joda.time.DateTime");
       }
@@ -2791,19 +2952,45 @@
             _builder.append("\t");
             _builder.append("statemachine.dispatchMessages(event);");
             _builder.newLine();
+            {
+              FSMEvent _functionalKeyEvent = state.getFunctionalKeyEvent();
+              boolean _tripleNotEquals = (_functionalKeyEvent != null);
+              if (_tripleNotEquals) {
+                _builder.append("\t");
+                _builder.append("if(event.getType()==EventType.FUNCTIONALKEYBOARD && \"");
+                String _name = state.getFunctionalKeyCode().getName();
+                _builder.append(_name, "\t");
+                _builder.append("\".equals(event.getId())) {");
+                _builder.newLineIfNotEmpty();
+                _builder.append("\t");
+                _builder.append("\t");
+                _builder.append("event.setType(EventType.TRIGGER);");
+                _builder.newLine();
+                _builder.append("\t");
+                _builder.append("\t");
+                _builder.append("event.setId(\"");
+                String _name_1 = state.getFunctionalKeyEvent().getName();
+                _builder.append(_name_1, "\t\t");
+                _builder.append("\");");
+                _builder.newLineIfNotEmpty();
+                _builder.append("\t");
+                _builder.append("}");
+                _builder.newLine();
+              }
+            }
             _builder.append("\t");
             _builder.append("switch (event.getType()) {");
             _builder.newLine();
             {
               FSMControlFieldAttribute _keystroke = state.getKeystroke();
-              boolean _tripleNotEquals = (_keystroke != null);
-              if (_tripleNotEquals) {
+              boolean _tripleNotEquals_1 = (_keystroke != null);
+              if (_tripleNotEquals_1) {
                 _builder.append("\t\tcase KEYBOARD:");
                 _builder.newLineIfNotEmpty();
                 _builder.append("\t\t\t");
                 _builder.append("statemachine.append(\"");
-                String _name = state.getKeystroke().getName();
-                _builder.append(_name, "\t\t\t");
+                String _name_2 = state.getKeystroke().getName();
+                _builder.append(_name_2, "\t\t\t");
                 _builder.append("\", event.getId());");
                 {
                   boolean _isHasKeyOperation = state.isHasKeyOperation();
@@ -2820,32 +3007,6 @@
               }
             }
             {
-              FSMEvent _functionalKeyEvent = state.getFunctionalKeyEvent();
-              boolean _tripleNotEquals_1 = (_functionalKeyEvent != null);
-              if (_tripleNotEquals_1) {
-                _builder.append("\t\tcase FUNCTIONALKEYBOARD:");
-                _builder.newLineIfNotEmpty();
-                _builder.append("\t\t\t");
-                _builder.append("if(\"");
-                String _name_1 = state.getFunctionalKeyCode().getName();
-                _builder.append(_name_1, "\t\t\t");
-                _builder.append("\".equals(event.getId())) {");
-                _builder.newLineIfNotEmpty();
-                _builder.append("\t\t\t\t");
-                _builder.append("statemachine.schedule(statemachine, 100, new MessageEvent(EventType.TRIGGER, \"");
-                String _name_2 = state.getFunctionalKeyEvent().getName();
-                _builder.append(_name_2, "\t\t\t\t");
-                _builder.append("\"));");
-                _builder.newLineIfNotEmpty();
-                _builder.append("\t\t\t");
-                _builder.append("}");
-                _builder.newLine();
-                _builder.append("\t\t\t");
-                _builder.append("break;");
-                _builder.newLine();
-              }
-            }
-            {
               FSMOperation _identity = state.getIdentity();
               boolean _tripleNotEquals_2 = (_identity != null);
               if (_tripleNotEquals_2) {