/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.ecview.dsl.derivedstate

import com.google.inject.Inject
import java.util.HashSet
import java.util.List
import java.util.Map
import java.util.Set
import java.util.Stack
import org.eclipse.emf.ecore.EClassifier
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EPackage
import org.eclipse.emf.ecore.resource.ResourceSet
import org.eclipse.osbp.ecview.core.common.model.binding.BindingFactory
import org.eclipse.osbp.ecview.core.common.model.binding.YBindingUpdateStrategy
import org.eclipse.osbp.ecview.core.common.model.binding.YECViewModelListBindingEndpoint
import org.eclipse.osbp.ecview.core.common.model.binding.YECViewModelValueBindingEndpoint
import org.eclipse.osbp.ecview.core.common.model.binding.YListBindingEndpoint
import org.eclipse.osbp.ecview.core.common.model.binding.YValueBinding
import org.eclipse.osbp.ecview.core.common.model.binding.YValueBindingEndpoint
import org.eclipse.osbp.ecview.core.common.model.binding.YVisibilityProcessorValueBindingEndpoint
import org.eclipse.osbp.ecview.core.common.model.core.CoreModelFactory
import org.eclipse.osbp.ecview.core.common.model.core.YAlignment
import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlot
import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlotListBindingEndpoint
import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlotValueBindingEndpoint
import org.eclipse.osbp.ecview.core.common.model.core.YDeviceType
import org.eclipse.osbp.ecview.core.common.model.core.YDialog
import org.eclipse.osbp.ecview.core.common.model.core.YElement
import org.eclipse.osbp.ecview.core.common.model.core.YEmbeddable
import org.eclipse.osbp.ecview.core.common.model.core.YExposedAction
import org.eclipse.osbp.ecview.core.common.model.core.YField
import org.eclipse.osbp.ecview.core.common.model.core.YFlatAlignment
import org.eclipse.osbp.ecview.core.common.model.core.YLayout
import org.eclipse.osbp.ecview.core.common.model.core.YOpenDialogCommand
import org.eclipse.osbp.ecview.core.common.model.core.YSendEventCommand
import org.eclipse.osbp.ecview.core.common.model.core.YView
import org.eclipse.osbp.ecview.core.common.model.core.YViewSet
import org.eclipse.osbp.ecview.core.common.model.validation.YBeanValidationValidator
import org.eclipse.osbp.ecview.core.common.model.validation.YClassDelegateValidator
import org.eclipse.osbp.ecview.core.common.model.validation.YMaxLengthValidator
import org.eclipse.osbp.ecview.core.common.model.validation.YMinLengthValidator
import org.eclipse.osbp.ecview.core.common.model.validation.YRegexpValidator
import org.eclipse.osbp.ecview.core.common.model.visibility.VisibilityFactory
import org.eclipse.osbp.ecview.core.common.model.visibility.YVisibilityProcessor
import org.eclipse.osbp.ecview.core.^extension.model.datatypes.YDateTimeFormat
import org.eclipse.osbp.ecview.core.^extension.model.datatypes.YDateTimeResolution
import org.eclipse.osbp.ecview.core.^extension.model.^extension.ExtensionModelFactory
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YAddToTableCommand
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YBeanReferenceField
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YBrowser
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YButton
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YCheckBox
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YColumn
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YComboBox
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YDateTime
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YDecimalField
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YEnumComboBox
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YEnumList
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YEnumOptionsGroup
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YFormLayout
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YGridLayout
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YHorizontalLayout
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YImage
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YLabel
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YList
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YNumericField
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YOptionsGroup
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YPanel
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YPasswordField
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YProgressBar
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YRemoveFromTableCommand
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSearchPanel
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSelectionType
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSetNewBeanInstanceCommand
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSortColumn
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSplitPanel
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YSuggestTextField
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YTab
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YTabSheet
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YTable
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YTextArea
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YTextField
import org.eclipse.osbp.ecview.core.^extension.model.^extension.YVerticalLayout
import org.eclipse.osbp.ecview.core.^extension.model.^extension.util.SimpleExtensionModelFactory
import org.eclipse.osbp.ecview.dsl.autowire.hook.ExtensionsAutowireDelegate
import org.eclipse.osbp.ecview.dsl.extensions.BeanHelper
import org.eclipse.osbp.ecview.dsl.extensions.BindingInfoHelper
import org.eclipse.osbp.ecview.dsl.extensions.I18nKeyProvider
import org.eclipse.osbp.ecview.dsl.extensions.OperationExtensions
import org.eclipse.osbp.ecview.dsl.extensions.TypeHelper
import org.eclipse.osbp.ecview.^extension.model.YECviewFactory
import org.eclipse.osbp.ecview.^extension.model.YRichTextArea
import org.eclipse.osbp.ecview.semantic.uimodel.UiAddToTableCommand
import org.eclipse.osbp.ecview.semantic.uimodel.UiAlignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField
import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot
import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanValidationValidator
import org.eclipse.osbp.ecview.semantic.uimodel.UiBinding
import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias
import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiBrowser
import org.eclipse.osbp.ecview.semantic.uimodel.UiButton
import org.eclipse.osbp.ecview.semantic.uimodel.UiCheckBox
import org.eclipse.osbp.ecview.semantic.uimodel.UiColumn
import org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox
import org.eclipse.osbp.ecview.semantic.uimodel.UiDateField
import org.eclipse.osbp.ecview.semantic.uimodel.UiDateFormat
import org.eclipse.osbp.ecview.semantic.uimodel.UiDateTimeResolution
import org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField
import org.eclipse.osbp.ecview.semantic.uimodel.UiDialog
import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiEmbeddable
import org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction
import org.eclipse.osbp.ecview.semantic.uimodel.UiField
import org.eclipse.osbp.ecview.semantic.uimodel.UiFlatAlignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout
import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayoutAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout
import org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroup
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroupAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayout
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView
import org.eclipse.osbp.ecview.semantic.uimodel.UiImage
import org.eclipse.osbp.ecview.semantic.uimodel.UiLabel
import org.eclipse.osbp.ecview.semantic.uimodel.UiLayout
import org.eclipse.osbp.ecview.semantic.uimodel.UiList
import org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator
import org.eclipse.osbp.ecview.semantic.uimodel.UiMinLengthValidator
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavBarAction
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationButton
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationCommand
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationHandler
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRoot
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRootAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileSearchPanel
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabSheet
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView
import org.eclipse.osbp.ecview.semantic.uimodel.UiModel
import org.eclipse.osbp.ecview.semantic.uimodel.UiNamedElement
import org.eclipse.osbp.ecview.semantic.uimodel.UiNestedProperty
import org.eclipse.osbp.ecview.semantic.uimodel.UiNumericField
import org.eclipse.osbp.ecview.semantic.uimodel.UiOpenDialogCommand
import org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup
import org.eclipse.osbp.ecview.semantic.uimodel.UiPanel
import org.eclipse.osbp.ecview.semantic.uimodel.UiPasswordField
import org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment
import org.eclipse.osbp.ecview.semantic.uimodel.UiPoint
import org.eclipse.osbp.ecview.semantic.uimodel.UiProgressBar
import org.eclipse.osbp.ecview.semantic.uimodel.UiRegexpValidator
import org.eclipse.osbp.ecview.semantic.uimodel.UiRemoveFromTableCommand
import org.eclipse.osbp.ecview.semantic.uimodel.UiRichTextArea
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchDialog
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchField
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchPanel
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchWithDialogCommand
import org.eclipse.osbp.ecview.semantic.uimodel.UiSelectionType
import org.eclipse.osbp.ecview.semantic.uimodel.UiSendEventCommand
import org.eclipse.osbp.ecview.semantic.uimodel.UiSetNewInstanceCommand
import org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder
import org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel
import org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanelAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField
import org.eclipse.osbp.ecview.semantic.uimodel.UiSwitch
import org.eclipse.osbp.ecview.semantic.uimodel.UiTabAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiTabSheet
import org.eclipse.osbp.ecview.semantic.uimodel.UiTable
import org.eclipse.osbp.ecview.semantic.uimodel.UiTextArea
import org.eclipse.osbp.ecview.semantic.uimodel.UiTextField
import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAlias
import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorDef
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroup
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroupAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayout
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayoutAssigment
import org.eclipse.osbp.ecview.semantic.uimodel.UiView
import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor
import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment
import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMHorizontalButtonGroup
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMNavigationBarButton
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMNavigationButton
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMNavigationCommand
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMNavigationPage
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMNavigationRoot
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMSearchPanel
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMSwitch
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMTab
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMTabSheet
import org.eclipse.osbp.mobile.vaadin.ecview.model.VMVerticalComponentGroup
import org.eclipse.osbp.mobile.vaadin.ecview.model.VaadinMobileFactory
import org.eclipse.osbp.xtext.builder.types.loader.api.ITypeLoader
import org.eclipse.osbp.xtext.builder.types.loader.api.ITypeLoaderFactory
import org.eclipse.xtext.common.types.JvmEnumerationType
import org.eclipse.xtext.common.types.JvmGenericType
import org.eclipse.xtext.common.types.JvmType
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.resource.DerivedStateAwareResource
import org.eclipse.xtext.xbase.jvmmodel.JvmModelAssociator
import org.slf4j.Logger
import org.slf4j.LoggerFactory

@SuppressWarnings("restriction")
class UiModelDerivedStateComputerx extends JvmModelAssociator {

	private static final Logger LOGGER = LoggerFactory.getLogger(typeof(UiModelDerivedStateComputerx));

	@Inject
	ITypeLoaderFactory typeLoaderFactory;
	ITypeLoader typeLoader

	@Inject BindingInfoHelper bindingInfoHelper;
	@Inject TypeHelper typeHelper;
	@Inject extension IQualifiedNameProvider;
	@Inject I18nKeyProvider i18nKeyProvider
	@Inject ExtensionsAutowireDelegate autowireHelper

	final Stack<EObject> viewContext = new Stack
	final List<YView> views = newArrayList()
	final Map<EObject, EObject> grammarToUiAssociations = newHashMap();
	final Map<EObject, EObject> uiToGrammarAssociations = newHashMap();
	final SimpleExtensionModelFactory factory = new SimpleExtensionModelFactory

	String currentPackage
	YView currentView;

	DerivedStateAwareResource resource
	List<Runnable> pendingMappings = newArrayList()
	List<UiBinding> pendingBindings = newArrayList()
	List<UiBinding> temporaryPendingBindings = newArrayList()
	List<UiVisibilityProcessorAssignment> pendingVisibilityProcessors = newArrayList()

	List<UiLayout> pendingAutowires = newArrayList()

	def void associateUi(EObject grammarElement, EObject uiElement) {
		grammarToUiAssociations.put(grammarElement, uiElement)
		uiToGrammarAssociations.put(uiElement, grammarElement)

		uiElement.eAdapters += new UiGrammarElementAdapter(grammarElement)
	}

	def <A> A associatedUi(EObject grammarElement) {
		return grammarToUiAssociations.get(grammarElement) as A
	}

	def <A> A associatedGrammar(EObject uiElement) {
		return uiToGrammarAssociations.get(uiElement) as A
	}

	def YView getCurrentView() {
		currentView
	}

	override void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) {

		super.installDerivedState(resource, preLinkingPhase)

		if (resource.getContents().isEmpty()) {
			return;
		}

		if (!preLinkingPhase) {
			val UiModel uiModel = resource.getContents().get(0) as UiModel;
			uiModel.installDerivedStateFor(resource, preLinkingPhase)
		}
	}

	def void installDerivedStateFor(UiModel eObject, DerivedStateAwareResource resource, boolean preLinkingPhase) {

		super.installDerivedState(resource, preLinkingPhase)
		this.resource = resource;
		this.typeLoader = typeLoaderFactory.createTypeLoader(resource.resourceSet)

		if (resource.getContents().isEmpty()) {
			return;
		}

		if (!preLinkingPhase) {

			grammarToUiAssociations.clear
			uiToGrammarAssociations.clear
			pendingAutowires.clear

			currentPackage = eObject.packageName

			try {

				// complete all elements
				eObject.eContents.forEach [
					it.map
				]
			} catch (Exception ex) {
				LOGGER.error("{}", ex)
			}

			if (views.size > 0) {
				resource.contents.addAll(views)
			}
			views.clear
			viewContext.clear
			pendingBindings.clear
			pendingMappings.clear
			pendingVisibilityProcessors.clear
			pendingAutowires.clear
		}

		this.typeLoader.dispose
		this.typeLoader = null;
	}

	def <A> A peek() {
		viewContext.peek as A
	}

	def <A> A pop() {
		viewContext.pop as A
	}

	def String toI18nKey(UiNamedElement element) {
		return i18nKeyProvider.toI18nKey(element)
	}

	def String toI18nKey(UiEmbeddable element) {
		return i18nKeyProvider.toI18nKey(element)
	}

	def dispatch void map(UiModel object) {
		currentPackage = object.packageName
		object.roots.filter[!(it instanceof UiValidatorAlias)].forEach[it.map]
	}

	def dispatch void map(UiView object) {
	}

	def dispatch void map(Void object) {
		println("void")
	}

	def dispatch void map(UiIDEView object) {

		// create a view instance
		val YView yView = factory.createView
		yView.id = object.fullyQualifiedName.toString
		yView.name = object.fullyQualifiedName.toString
		yView.viewName = object.fullyQualifiedName.toString
		yView.sharedStateGroup = object.sharedStateGroup
		yView.category = if(object.viewCategory !== null) object.viewCategory.name else null
		yView.contentAlignment = object.contentAlignment.toYAlignment
		object.associateUi(yView)
		views += yView
		currentView = yView
		yView.push;

		object.beanSlots.forEach[it.map]

		object.bindings.forEach[it.map]

		val element = object.content.create
		yView.content = element
		object.content.map

		object.exposedActions.forEach[it.map]

		pendingAutowires.forEach [
			it.doAutowire
		]

		object.processorAssignments.forEach [
			it.map
		]

		// process the visibility processors
		pendingVisibilityProcessors.forEach [
			it.processor.map
		]

		pendingMappings.forEach [
			it.run
		]

		// install all bindings
		processBindings

		pendingMappings.forEach [
			it.run
		]

		object.validatorAssignments.forEach[it.map]

		// install the I18nKeys based on bindings
		pop
		currentView = null
		pendingAutowires.clear
		pendingBindings.clear
		pendingMappings.clear
		pendingVisibilityProcessors.clear

	}

	def doAutowire(UiLayout embeddable) {
		autowireHelper.autowire(embeddable, this, currentView.deviceType === YDeviceType.MOBILE)
	}

	def dispatch void map(UiMobileView object) {

		// create a view instance
		val YView yView = factory.createView
		yView.name = object.fullyQualifiedName.toString
		yView.viewName = object.fullyQualifiedName.toString
		yView.sharedStateGroup = object.sharedStateGroup
		yView.deviceType = YDeviceType.MOBILE
		yView.contentAlignment = object.contentAlignment.toYAlignment
		object.associateUi(yView)
		views += yView
		currentView = yView
		yView.push;

		object.beanSlots.forEach[it.map]

		val element = object.content.create
		yView.content = element
		object.content.map

		object.bindings.forEach[it.map]

		pendingAutowires.forEach [
			it.doAutowire
		]

		object.processorAssignments.forEach [
			it.map
		]

		// process the visibility processors
		pendingVisibilityProcessors.forEach [
			it.processor.map
		]

		pendingMappings.forEach [
			it.run
		]

		// install all bindings
		processBindings

		// and do autowire again -> Bindings may installed autowires
		pendingAutowires.forEach [
			it.doAutowire
		]

		pendingMappings.forEach [
			it.run
		]

		object.validatorAssignments.forEach[it.map]

		pop
		currentView = null
		pendingAutowires.clear
		pendingBindings.clear
		pendingMappings.clear
		pendingVisibilityProcessors.clear

	}

	def void processBindings() {
		if (pendingBindings.empty) {
			return
		}

		// process bindings
		temporaryPendingBindings = newArrayList(pendingBindings)
		pendingBindings.clear
		temporaryPendingBindings.forEach [
			it.install
		]

		// again process bindings in case that process above created new one
		processBindings
	}

	def push(EObject eObject) {
		viewContext.push(eObject)
	}

	def dispatch void map(UiGridLayout eObject) {
		val YGridLayout yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiGridLayoutAssigment eObject) {
		val YGridLayout layout = peek

		val element = eObject.element
		val newField = element.create
		layout.addElement(newField)

		if (eObject.alignment !== UiAlignment.UNDEFINED) {
			val style = layout.addGridLayoutCellStyle(newField)
			style.alignment = eObject.alignment.toYAlignment
		}

		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}
	}

	def dispatch void map(UiVerticalLayout eObject) {
		val YVerticalLayout yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiVerticalLayoutAssigment eObject) {

		val YVerticalLayout layout = peek

		val element = eObject.element
		val newField = element.create

		layout.addElement(newField)

		if (eObject.alignment !== UiAlignment.UNDEFINED) {
			val style = layout.addCellStyle(newField)
			style.alignment = eObject.alignment.toYAlignment
		}
		element.map

		if (element instanceof UiField) {
			if (newField !== null) {
				newField.push
				val UiField yField = element as UiField
				yField.validators.forEach [
					it.map
				]
				pop
			}
		}
	}

	def dispatch void map(UiMobileNavigationRoot eObject) {
		val VMNavigationRoot yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiMobileNavigationRootAssigment eObject) {

		val VMNavigationRoot layout = peek

		val element = eObject.element
		val newField = element.create

		layout.addElement(newField)

		element.map

		if (element instanceof UiField) {
			if (newField !== null) {
				newField.push
				val UiField yField = element as UiField
				yField.validators.forEach [
					it.map
				]
				pop
			}
		}
	}

	def dispatch void map(UiHorizontalLayout eObject) {
		val YHorizontalLayout yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		if (eObject.autowire) {
			pendingAutowires += eObject
		}

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiHorizontalLayoutAssigment eObject) {

		val YHorizontalLayout layout = peek
		val element = eObject.element
		val newField = element.create
		layout.addElement(newField)
		if (eObject.alignment !== UiAlignment.UNDEFINED) {
			val style = layout.addCellStyle(newField)
			style.alignment = eObject.alignment.toYAlignment
		}

		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}
	}

	def dispatch void map(UiSearchPanel eObject) {
		val YSearchPanel yPanel = eObject.associatedUi
		yPanel.push

		eObject.contents.forEach [
			val newField = it.create
			if (newField === null) {
				return
			}
			yPanel.addElement(newField)
			it.map
			newField.push
			val UiField yField = it as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiMobileSearchPanel eObject) {
		val VMSearchPanel yPanel = eObject.associatedUi
		yPanel.push

		eObject.contents.forEach [
			val newField = it.create
			if (newField === null) {
				return
			}
			yPanel.addElement(newField)
			it.map
			newField.push
			val UiField yField = it as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiSplitpanel eObject) {
		val YSplitPanel yField = eObject.associatedUi
		yField.push

		eObject.firstContent.map
		eObject.secondContent.map

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiSplitpanelAssigment eObject) {

		val YSplitPanel layout = peek
		val element = eObject.element
		val newField = element.create

		if (newField === null) {
			return
		}

		layout.addElement(newField)

		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}
	}

	def dispatch void map(UiPanel eObject) {
		val YPanel yPanel = eObject.associatedUi
		yPanel.push

		val element = eObject.content
		val newField = element.create

		if (newField === null) {
			return
		}

		yPanel.elements += newField
		element.map

		if (element instanceof UiField) {
			if (newField !== null) {
				newField.push
				val UiField yField = element as UiField
				yField.validators.forEach [
					it.map
				]
				pop
			}
		}

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiTabSheet eObject) {
		val YTabSheet yField = eObject.associatedUi
		yField.push

		eObject.tabs.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiTabAssignment eObject) {

		val YTabSheet layout = peek
		val YTab tab = factory.createTab
		tab.label = eObject.name
		tab.labelI18nKey = eObject.toI18nKey
		layout.tabs += tab

		tab.push

		val element = eObject.element
		val newField = element.create
		tab.embeddable = newField

		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}

		pop

	}

	def dispatch void map(UiMobileTabSheet eObject) {
		val VMTabSheet yField = eObject.associatedUi
		yField.push

		eObject.tabs.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiMobileTabAssignment eObject) {

		val VMTabSheet layout = peek
		val VMTab tab = VaadinMobileFactory.eINSTANCE.createVMTab
		tab.label = eObject.name
		layout.tabs += tab

		tab.push

		val element = eObject.element
		val newField = element.create
		tab.embeddable = newField
		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}

		eObject.processorAssignments.forEach [
			it.map
		]

		pop

	}

	def dispatch void map(UiHorizontalButtonGroup eObject) {
		val VMHorizontalButtonGroup yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiHorizontalButtonGroupAssigment eObject) {

		val VMHorizontalButtonGroup layout = peek
		val element = eObject.element
		val newField = element.create
		layout.addElement(newField)
		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}

	}

	def dispatch void map(UiVerticalComponentGroup eObject) {
		val VMVerticalComponentGroup yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiVerticalComponentGroupAssigment eObject) {

		val VMVerticalComponentGroup layout = peek
		val element = eObject.element
		val newField = element.create
		layout.addElement(newField)

		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}
	}

	def dispatch void map(UiMobileNavigationPage eObject) {
		val VMNavigationPage yField = eObject.associatedUi

		yField.push

		eObject.barActions.forEach [
			val newField = it.create
			yField.barActions += newField as VMNavigationBarButton
			it.map
		]

		eObject.contents.forEach [
			it.map
		]

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiDialog eObject) {
		val YDialog layout = CoreModelFactory.eINSTANCE.createYDialog
		layout.name = eObject.name
		layout.label = eObject.name
		layout.labelI18nKey = eObject.toI18nKey

		if (eObject.jvmType !== null) {
			layout.typeQualifiedName = eObject.jvmType.qualifiedName
			layout.type = loadClass(eObject.eResource.resourceSet, eObject.jvmType.qualifiedName)
		}

		currentView.dialogs += layout

		eObject.associateUi(layout)

		layout.push

		eObject.content?.map

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		eObject.processorAssignments.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiSearchDialog eObject) {
		val YDialog dialog = CoreModelFactory.eINSTANCE.createYDialog
		dialog.name = eObject.name
		dialog.label = eObject.name
		dialog.labelI18nKey = eObject.toI18nKey

		val YOpenDialogCommand command = peek
		if (command !== null) {
			command.dialog = dialog
		}

		if (eObject.jvmType !== null) {
			dialog.typeQualifiedName = eObject.jvmType.qualifiedName
			dialog.type = loadClass(eObject.eResource.resourceSet, eObject.jvmType.qualifiedName)
		}

		eObject.associateUi(dialog)
		currentView.dialogs += dialog
		dialog.push

		val YVerticalLayout content = ExtensionModelFactory.eINSTANCE.createYVerticalLayout
		dialog.content = content
		content.push

		val YGridLayout searchFieldLayout = ExtensionModelFactory.eINSTANCE.createYGridLayout
		content.elements += searchFieldLayout
		searchFieldLayout.push

		eObject.searchFields.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		// pop searchFieldLayout
		pop

		// map the content of the search dialog
		eObject.content?.map

		// pop content
		pop

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		// pop dialog
		pop
	}

	def dispatch void map(UiDialogAssignment eObject) {

		val YDialog yDialog = peek

		val element = eObject.element
		val newField = element.create
		yDialog.content = newField
		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}
	}

	def dispatch void map(UiSearchField eObject) {
		// nothing to do
	}

	def dispatch void map(UiDialogSearchFieldAssignment eObject) {

		val YLayout layout = peek
		val element = eObject.element

		val UiNestedProperty property = element.property
		if (property !== null) {
			val JvmType type = property.typeofLastSegment

			var YField newField = null
			if (typeHelper.isString(type)) {
				newField = ExtensionModelFactory.eINSTANCE.createYTextSearchField
			} else if (typeHelper.isNumber(type)) {
				newField = ExtensionModelFactory.eINSTANCE.createYNumericSearchField
			} else if (typeHelper.isBoolean(type)) {
				newField = ExtensionModelFactory.eINSTANCE.createYBooleanSearchField
			}

			if (newField !== null) {
				layout.elements += newField
			}
		}
	}

	def void createTransient(UiMobileNavigationPage eObject) {
		val VMNavigationPage yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiMobileNavigationPageAssignment eObject) {
		val VMNavigationPage layout = peek
		val element = eObject.element
		val newField = element.create
		layout.addElement(newField)

		if (eObject.alignment !== UiAlignment.UNDEFINED) {
			val style = layout.addCellStyle(newField)
			style.alignment = eObject.alignment.toYAlignment
		}

		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}

	}

	def dispatch void map(UiFormLayout eObject) {
		val YFormLayout yField = eObject.associatedUi
		yField.push

		eObject.contents.forEach [
			it.map
		]

		eObject.bindings.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiFormLayoutAssigment eObject) {

		val YFormLayout layout = peek
		val element = eObject.element
		val newField = element.create
		if (newField === null) {
			return
		}
		layout.addElement(newField)

		element.map

		if (element instanceof UiField) {
			newField.push
			val UiField yField = element as UiField
			yField.validators.forEach [
				it.map
			]
			pop
		}

	}

	def dispatch void map(UiOptionsGroup eObject) {
		val YField yOptionsGroup = eObject.associatedUi
		yOptionsGroup.push

		eObject.bindings.forEach [
			it.map
		]

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiList eObject) {
		val YField yList = eObject.associatedUi
		yList.push

		eObject.bindings.forEach [
			it.map
		]

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiTable eObject) {
		val YTable yField = eObject.associatedUi
		yField.push

		if (eObject.columnAssignment !== null) {
			eObject.columnAssignment.columns.forEach [
				it.map
			]
		}

		if (eObject.sortOrderAssignment !== null) {
			eObject.sortOrderAssignment.columns.forEach [
				it.map
			]
		}

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiImage eObject) {
		val YImage yField = eObject.associatedUi
		yField.push

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		pop
	}

	def dispatch void map(UiComboBox eObject) {
		val YField yField = eObject.associatedUi
		yField.push

		if (eObject.bindings !== null) {
			eObject.bindings.forEach [
				it.map
			]
		}

		eObject.processorAssignments.forEach [
			it.map
		]

		pop
	}

	def dispatch void map(UiButton object) {
		object.bindings.forEach [
			it.map
		]

		object.processorAssignments.forEach [
			it.map
		]

	}

	def dispatch void map(UiMobileNavBarAction object) {
		object.bindings.forEach [
			it.map
		]

		object.processorAssignments.forEach [
			it.map
		]
	}

	def dispatch void map(UiMobileNavigationButton object) {
		val VMNavigationButton button = object.associatedUi

		button.push
		if (object.targetPage !== null) {
			val page = object.targetPage.create as VMNavigationPage
			button.page = page
			object.targetPage.map
		} else if (object.targetPageAlias !== null) {
			object.targetPageAlias.map
		}

		object.bindings.forEach [
			it.map
		]

		object.processorAssignments.forEach [
			it.map
		]

		pop

	}

	def dispatch void map(UiColumn eObject) {
		val YTable yField = peek

		val YColumn yColumn = factory.createColumn
		yColumn.alignment = eObject.alignment.toYFlatAlignment
		yColumn.collapsed = eObject.collapsed
		yColumn.collapsible = eObject.collapsible
		yColumn.expandRatio = eObject.expandRatio
		yColumn.icon = eObject.iconName

		val UiNestedProperty property = eObject.property
		if (property !== null) {
			yColumn.propertyPath = property.toPathString
		}

		yColumn.orderable = eObject.orderable
		yColumn.visible = eObject.visible
		yColumn.labelI18nKey = eObject.toI18nKey
		// removed for while
//		if (yColumn.icon === null || yColumn.icon.equals("")) {
//			yColumn.icon = eObject.toI18nKey + ".image"
//		}

		yField.columns += yColumn
	}

	def dispatch void map(UiSortOrder eObject) {
		val YTable yField = peek

		val YSortColumn yColumn = factory.createSortColumn

		yColumn.asc = eObject.asc

		val UiNestedProperty property = eObject.property
		if (property !== null) {
			yColumn.propertyPath = property.toPathString
		}

		yField.sortOrder += yColumn
	}

	def YDateTimeFormat toYDateTimeFormat(UiDateFormat format) {
		switch (format) {
			case DATE:
				return YDateTimeFormat.DATE
			case DATE_TIME:
				return YDateTimeFormat.DATE_TIME
			case TIME:
				return YDateTimeFormat.TIME
		}
	}

	def YDateTimeResolution toYDateTimeResolution(UiDateTimeResolution value) {
		switch (value) {
			case SECOND:
				return YDateTimeResolution.SECOND
			case MINUTE:
				return YDateTimeResolution.MINUTE
			case HOUR:
				return YDateTimeResolution.HOUR
			case DAY:
				return YDateTimeResolution.DAY
			case MONTH:
				return YDateTimeResolution.MONTH
			case YEAR:
				return YDateTimeResolution.YEAR
			case UNDEFINED:
				return YDateTimeResolution.UNDEFINED
		}
	}

	def YFlatAlignment toYFlatAlignment(UiFlatAlignment uiAlign) {
		switch (uiAlign) {
			case LEFT:
				return YFlatAlignment.LEFT
			case CENTER:
				return YFlatAlignment.CENTER
			case RIGHT:
				return YFlatAlignment.RIGHT
		}
	}

	def YAlignment toYAlignment(UiAlignment uiAlign) {
		switch (uiAlign) {
			case BOTTOM_CENTER:
				return YAlignment.BOTTOM_CENTER
			case BOTTOM_FILL:
				return YAlignment.BOTTOM_FILL
			case BOTTOM_LEFT:
				return YAlignment.BOTTOM_LEFT
			case BOTTOM_RIGHT:
				return YAlignment.BOTTOM_RIGHT
			case FILL_CENTER:
				return YAlignment.FILL_CENTER
			case FILL_FILL:
				return YAlignment.FILL_FILL
			case FILL_LEFT:
				return YAlignment.FILL_LEFT
			case FILL_RIGHT:
				return YAlignment.FILL_RIGHT
			case MIDDLE_CENTER:
				return YAlignment.MIDDLE_CENTER
			case MIDDLE_FILL:
				return YAlignment.MIDDLE_FILL
			case MIDDLE_LEFT:
				return YAlignment.MIDDLE_LEFT
			case MIDDLE_RIGHT:
				return YAlignment.MIDDLE_RIGHT
			case TOP_CENTER:
				return YAlignment.TOP_CENTER
			case TOP_FILL:
				return YAlignment.TOP_FILL
			case TOP_LEFT:
				return YAlignment.TOP_LEFT
			case TOP_RIGHT:
				return YAlignment.TOP_RIGHT
			case UNDEFINED:
				return YAlignment.UNDEFINED
		}
	}

	def dispatch void map(UiValidatorAssignment eObject) {

		val YField yField = eObject.field.associatedUi
		yField.push

		if (eObject.validatorAlias !== null) {
			eObject.validatorAlias.map
		} else if (eObject.validatorDef !== null) {
			eObject.validatorDef.map
		}
		pop
	}

	def dispatch void map(UiExposedAction object) {
		val YExposedAction yAction = CoreModelFactory.eINSTANCE.createYExposedAction
		if (object.actionReference !== null) {
			yAction.id = object.actionReference.name
			yAction.externalCommandId = object.actionReference.externalCommandId
			yAction.initialEnabled = !object.actionReference.initialDisabled
		} else {
			yAction.id = object.actionID
		}
		yAction.name = object.name
		yAction.label = object.name
		yAction.labelI18nKey = object.toI18nKey
		yAction.icon = object.iconName
		if (yAction.icon === null || yAction.icon.equals("")) {
			yAction.icon = object.toI18nKey + ".image"
		}
		yAction.checkDirty = object.checkDirty
		if (object.externalCommandId !== null) {
			yAction.externalCommandId = object.externalCommandId
		}

		object.associateUi(yAction)

		object.bindings.forEach [
			it.map
		]

		currentView.exposedActions += yAction
	}

	def dispatch void map(UiValidatorDef eObject) {
		eObject.validator.map
	}

	def dispatch void map(UiValidatorAlias eObject) {
		if (viewContext.length === 0) {
			return
		}

	// eObject.validator.map
	}

	def dispatch void map(UiVisibilityProcessorAssignment eObject) {

		// must be installed after all UI elements have been created
		pendingVisibilityProcessors += eObject
	}

	def dispatch void map(UiVisibilityProcessor eObject) {
		val YVisibilityProcessor yProcessor = VisibilityFactory.eINSTANCE.createYVisibilityProcessor
		yProcessor.delegate = loadClass(eObject.eResource.resourceSet, eObject.fullyQualifiedName.toString)
		yProcessor.delegateQualifiedName = eObject.fullyQualifiedName.toString
		currentView.visibilityProcessors += yProcessor

		for (trigger : eObject.changeTriggers) {
			val YValueBindingEndpoint sourceEP = (trigger.endpoint as UiBindingEndpointAssignment).
				createValueBindingEndpoint()
			val YVisibilityProcessorValueBindingEndpoint targetEP = BindingFactory.eINSTANCE.
				createYVisibilityProcessorValueBindingEndpoint
			targetEP.property = trigger.alias

			// create a new binding
			val YValueBinding binding = BindingFactory.eINSTANCE.createYValueBinding();
			binding.setTargetEndpoint(targetEP);
			binding.setModelEndpoint(sourceEP);
			binding.setModelToTargetStrategy(YBindingUpdateStrategy.UPDATE);
			binding.setTargetToModelStrategy(YBindingUpdateStrategy.NEVER);
			yProcessor.triggersOn += binding
		}

		for (dataUsed : eObject.dataUsed) {
			val YValueBindingEndpoint sourceEP = (dataUsed.endpoint as UiBindingEndpointAssignment).
				createValueBindingEndpoint()
			val YVisibilityProcessorValueBindingEndpoint targetEP = BindingFactory.eINSTANCE.
				createYVisibilityProcessorValueBindingEndpoint
			targetEP.property = dataUsed.alias

			// create a new binding
			val YValueBinding binding = BindingFactory.eINSTANCE.createYValueBinding();
			binding.setTargetEndpoint(targetEP);
			binding.setModelEndpoint(sourceEP);
			binding.setModelToTargetStrategy(YBindingUpdateStrategy.UPDATE);
			binding.setTargetToModelStrategy(YBindingUpdateStrategy.NEVER);
			yProcessor.dataUsed += binding
		}
	}

	def dispatch void map(UiMaxLengthValidator eObject) {
		val YMaxLengthValidator newValidator = factory.createMaxLengthValidator
		newValidator.maxLength = eObject.maxLength
		newValidator.errorCode = eObject.errorCode?.fullyQualifiedName?.toString
		newValidator.defaultErrorMessage = eObject.errorCode?.defaultMessage
		eObject.associateUi(newValidator)

		val YField yField = peek
		if (yField !== null) {
			yField.validators += newValidator
		}
	}

	def dispatch void map(UiMinLengthValidator eObject) {
		val YMinLengthValidator newValidator = factory.createMinLengthValidator
		newValidator.minLength = eObject.minLength
		newValidator.errorCode = eObject.errorCode?.fullyQualifiedName?.toString
		newValidator.defaultErrorMessage = eObject.errorCode?.defaultMessage

		eObject.associateUi(newValidator)

		val YField yField = peek
		if (yField !== null) {
			yField.validators += newValidator
		}
	}

	def dispatch void map(UiBeanValidationValidator eObject) {
		val YBeanValidationValidator newValidator = factory.createBeanValidationValidator
		newValidator.errorCode = eObject.errorCode?.fullyQualifiedName?.toString
		newValidator.defaultErrorMessage = eObject.errorCode?.defaultMessage
		eObject.associateUi(newValidator)

		val YField yField = peek
		if (yField !== null) {
			yField.validators += newValidator
		}
	}

	def dispatch void map(UiRegexpValidator eObject) {
		val YRegexpValidator newValidator = factory.createRegexpValidator
		newValidator.regExpression = eObject.regExpression
		newValidator.errorCode = eObject.errorCode?.fullyQualifiedName?.toString
		newValidator.defaultErrorMessage = eObject.errorCode?.defaultMessage

		eObject.associateUi(newValidator)

		val YField yField = peek
		if (yField !== null) {
			yField.validators += newValidator
		}
	}

	def dispatch void map(UiXbaseValidator eObject) {

		val jvmTypes = eObject.getJvmElements
		val JvmGenericType jvmType = if(jvmTypes.size > 0) eObject.getJvmElements.get(0) as JvmGenericType

		val YField yField = peek
		if (jvmType !== null && yField !== null) {
			val YClassDelegateValidator yValidator = factory.createClassDelegateValidator
			eObject.associateUi(yValidator)
			yValidator.className = jvmType.qualifiedName
			yField.validators += yValidator
		}
	}

	def dispatch YEmbeddable create(UiEmbeddable object) {
	}

	def dispatch YEmbeddable create(Void object) {
		return null
	}

	def dispatch YEmbeddable create(UiTextField object) {
		val YTextField textField = factory.createTextField
		textField.id = UiModelGrammarUtil.getPathId(object)
		textField.name = object.name
		textField.label = object.name
		textField.labelI18nKey = object.toI18nKey
		textField.initialEnabled = !object.readonly
		textField.cssClass = object.styles

		val dt = factory.createTextDatatype
		textField.datatype = dt
		textField.orphanDatatypes += dt

		dt.maxLength = object.maxLength
		dt.minLength = object.minLength
		dt.regExpression = object.regex
		object.associateUi(textField)

		return textField
	}

	def dispatch YEmbeddable create(UiPasswordField object) {
		val YPasswordField textField = ExtensionModelFactory.eINSTANCE.createYPasswordField
		textField.id = UiModelGrammarUtil.getPathId(object)
		textField.name = object.name
		textField.label = object.name
		textField.labelI18nKey = object.toI18nKey
		textField.initialEnabled = !object.readonly
		textField.cssClass = object.styles

		object.associateUi(textField)

		return textField
	}

	def dispatch YEmbeddable create(UiSuggestTextField object) {
		val YSuggestTextField textField = ExtensionModelFactory.eINSTANCE.createYSuggestTextField
		textField.id = UiModelGrammarUtil.getPathId(object)
		textField.name = object.name
		textField.label = object.name
		textField.labelI18nKey = object.toI18nKey
		textField.initialEnabled = !object.readonly
		textField.cssClass = object.styles
		textField.useSuggestions = true
		textField.autoHidePopup = object.autoHidePopup

		if (object.jvmType !== null) {
			textField.typeQualifiedName = object.jvmType.qualifiedName
			textField.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
		}

		if (object.itemCaptionProperty !== null) {
			textField.itemCaptionProperty = OperationExtensions.toPropertyName(object.itemCaptionProperty?.simpleName)
		} else {
			textField.itemCaptionProperty = BeanHelper.findCaptionProperty(textField.type)
		}
		textField.itemFilterProperty = OperationExtensions.toPropertyName(object.itemFilterProperty?.simpleName)
		textField.itemUUIDProperty = OperationExtensions.toPropertyName(object.itemUUIDProperty?.simpleName)

		object.associateUi(textField)

		return textField
	}

	def dispatch YEmbeddable create(UiBeanReferenceField object) {
		val YBeanReferenceField field = ExtensionModelFactory.eINSTANCE.createYBeanReferenceField
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.useBeanService = object.consumeBeanService
		field.labelI18nKey = object.toI18nKey

		if (object.jvmType !== null) {
			field.typeQualifiedName = object.jvmType.qualifiedName
			field.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
		}

		val UiNestedProperty captionProperty = object.captionProperty
		if (captionProperty !== null) {
			field.captionPropertyPath = captionProperty.toPathString
		} else {
			field.captionPropertyPath = BeanHelper.findCaptionProperty(field.type)
		}

		val UiNestedProperty imageProperty = object.imageProperty
		if (imageProperty !== null) {
			field.imagePropertyPath = imageProperty.toPathString
		}

		if (object.inMemoryBeanProvider !== null) {
			field.inMemoryBeanProviderQualifiedName = object.inMemoryBeanProvider.qualifiedName
			field.inMemoryBeanProvider = loadClass(object.eResource.resourceSet,
				object.inMemoryBeanProvider.qualifiedName)
		}

		if (object.referenceSourceJvmType !== null) {
			field.referenceSourceTypeQualifiedName = object.referenceSourceJvmType.qualifiedName
			field.referenceSourceType = loadClass(object.eResource.resourceSet,
				object.referenceSourceJvmType.qualifiedName)
			field.referenceSourceTypeProperty = object.referenceSourceField?.simpleName
		}

		object.associateUi(field)

		return field
	}

	def dispatch YEmbeddable create(UiLabel object) {
		val YLabel label = factory.createLabel
		label.id = UiModelGrammarUtil.getPathId(object)
		label.name = object.name
		label.label = object.name
		label.labelI18nKey = object.toI18nKey
		label.cssClass = object.styles

		object.associateUi(label)

		return label
	}

	def dispatch YEmbeddable create(UiDecimalField object) {
		val YDecimalField decimalField = factory.createDecimalField
		decimalField.id = UiModelGrammarUtil.getPathId(object)
		decimalField.name = object.name
		decimalField.label = object.name
		decimalField.labelI18nKey = object.toI18nKey
		decimalField.initialEnabled = !object.readonly
		decimalField.cssClass = object.styles

		val dt = factory.createDecimalDatatype
		decimalField.datatype = dt
		decimalField.orphanDatatypes += dt

		dt.grouping = !object.noGrouping
		dt.markNegative = !object.noMarkNegative
		dt.precision = object.precision

		object.associateUi(decimalField)

		return decimalField
	}

	def dispatch YEmbeddable create(UiTextArea object) {
		val YTextArea textArea = factory.createTextArea
		textArea.id = UiModelGrammarUtil.getPathId(object)
		textArea.name = object.name
		textArea.label = object.name
		textArea.labelI18nKey = object.toI18nKey
		textArea.initialEnabled = !object.readonly
		textArea.cssClass = object.styles

		object.associateUi(textArea)

		return textArea
	}

	def dispatch YEmbeddable create(UiRichTextArea object) {
		val YRichTextArea textField = YECviewFactory.eINSTANCE.createYRichTextArea
		textField.id = UiModelGrammarUtil.getPathId(object)
		textField.name = object.name
		textField.label = object.name
		textField.labelI18nKey = object.toI18nKey
		textField.initialEnabled = !object.readonly
		textField.cssClass = object.styles
		textField.useBlob = object.asBlob

		object.associateUi(textField)

		return textField
	}

	def dispatch YEmbeddable create(UiOptionsGroup object) {

		if (object.jvmType?.type instanceof JvmEnumerationType) {
			val YEnumOptionsGroup optionsGroup = ExtensionModelFactory.eINSTANCE.createYEnumOptionsGroup
			optionsGroup.id = UiModelGrammarUtil.getPathId(object)
			optionsGroup.name = object.name
			optionsGroup.label = object.name
			optionsGroup.labelI18nKey = object.toI18nKey
			optionsGroup.selectionType = object.selectionType.convert
			optionsGroup.initialEnabled = !object.readonly
			optionsGroup.cssClass = object.styles

			if (object.jvmType !== null) {
				optionsGroup.typeQualifiedName = object.jvmType.qualifiedName
				optionsGroup.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
			}

			object.associateUi(optionsGroup)

			return optionsGroup
		} else {
			val YOptionsGroup optionsGroup = factory.createOptionsGroup
			optionsGroup.id = UiModelGrammarUtil.getPathId(object)
			optionsGroup.name = object.name
			optionsGroup.label = object.name
			optionsGroup.useBeanService = object.consumeBeanService
			optionsGroup.labelI18nKey = object.toI18nKey
			optionsGroup.selectionType = object.selectionType.convert
			optionsGroup.initialEnabled = !object.readonly

			if (object.jvmType !== null) {
				optionsGroup.typeQualifiedName = object.jvmType.qualifiedName
				optionsGroup.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
			}
			if (object.itemCaptionProperty !== null) {
				optionsGroup.captionProperty = OperationExtensions.toPropertyName(
					object.itemCaptionProperty?.simpleName)
			} else {
				optionsGroup.captionProperty = BeanHelper.findCaptionProperty(optionsGroup.type)
			}
			optionsGroup.imageProperty = OperationExtensions.toPropertyName(object.itemImageProperty?.simpleName)

			object.associateUi(optionsGroup)

			return optionsGroup
		}

	}

	def dispatch YEmbeddable create(UiList object) {
		if (object.jvmType?.type instanceof JvmEnumerationType) {
			val YEnumList list = ExtensionModelFactory.eINSTANCE.createYEnumList
			list.id = UiModelGrammarUtil.getPathId(object)
			list.name = object.name
			list.label = object.name
			list.labelI18nKey = object.toI18nKey
			list.selectionType = object.selectionType.convert
			list.initialEnabled = !object.readonly
			list.cssClass = object.styles

			if (object.jvmType !== null) {
				list.typeQualifiedName = object.jvmType.qualifiedName
				list.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
			}

			object.associateUi(list)

			return list
		} else {
			val YList list = factory.createList
			list.id = UiModelGrammarUtil.getPathId(object)
			list.name = object.name
			list.label = object.name
			list.useBeanService = object.consumeBeanService
			list.labelI18nKey = object.toI18nKey
			list.selectionType = object.selectionType.convert
			list.initialEnabled = !object.readonly

			if (object.jvmType !== null) {
				list.typeQualifiedName = object.jvmType.qualifiedName
				list.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
			}
			if (object.itemCaptionProperty !== null) {
				list.captionProperty = OperationExtensions.toPropertyName(object.itemCaptionProperty?.simpleName)
			} else {
				list.captionProperty = BeanHelper.findCaptionProperty(list.type)
			}
			list.imageProperty = OperationExtensions.toPropertyName(object.itemImageProperty?.simpleName)

			object.associateUi(list)

			return list
		}
	}

	def dispatch YEmbeddable create(UiDateField object) {
		val YDateTime dateTime = factory.createDateTime
		dateTime.id = UiModelGrammarUtil.getPathId(object)
		dateTime.name = object.name
		dateTime.label = object.name
		dateTime.labelI18nKey = object.toI18nKey
		dateTime.dateFormat = object.dateFormat.toYDateTimeFormat
		dateTime.resolution = object.resolution.toYDateTimeResolution
		dateTime.initialEnabled = !object.readonly
		dateTime.cssClass = object.styles

		object.associateUi(dateTime)

		return dateTime
	}

	def dispatch YEmbeddable create(UiBrowser object) {
		val YBrowser browser = factory.createBrowser
		browser.id = UiModelGrammarUtil.getPathId(object)
		browser.name = object.name
		browser.label = object.name
		browser.labelI18nKey = object.toI18nKey
		browser.initialEnabled = !object.readonly
		browser.cssClass = object.styles

		object.associateUi(browser)

		return browser
	}

	def dispatch YEmbeddable create(UiProgressBar object) {
		val YProgressBar progressBar = factory.createProgressBar
		progressBar.id = UiModelGrammarUtil.getPathId(object)
		progressBar.name = object.name
		progressBar.label = object.name
		progressBar.labelI18nKey = object.toI18nKey
		progressBar.cssClass = object.styles

		object.associateUi(progressBar)

		return progressBar
	}

	def dispatch YEmbeddable create(UiImage object) {
		val YImage image = factory.createImage
		image.id = UiModelGrammarUtil.getPathId(object)
		image.name = object.name
		image.label = object.name
		image.labelI18nKey = object.toI18nKey
		image.cssClass = object.styles

		image.value = object.value

		object.associateUi(image)

		return image
	}

	def dispatch YEmbeddable create(UiTable object) {
		val YTable table = factory.createTable
		table.id = UiModelGrammarUtil.getPathId(object)
		table.name = object.name
		table.label = object.name
		table.useBeanService = object.consumeBeanService
		table.labelI18nKey = object.toI18nKey
		table.selectionType = object.selectionType.convert
		table.initialEnabled = !object.readonly
		table.cssClass = object.styles
		table.scrollToBottom = object.scrollToBottom
		table.pageLength = object.pageLength;

		table.itemImageProperty = OperationExtensions.toPropertyName(object.itemImageProperty?.simpleName)

		if (object.jvmType !== null) {
			table.typeQualifiedName = object.jvmType.qualifiedName
			table.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
		}

		object.associateUi(table)

		return table
	}

	def dispatch YField create(UiSearchField eObject) {
		val UiNestedProperty property = eObject.property
		if (property !== null) {
			val JvmType type = property.typeofLastSegment
			if (type === null) {
				return null
			}

			var YField newField = null
			if (typeHelper.isString(type)) {
				val temp = ExtensionModelFactory.eINSTANCE.createYTextSearchField
				temp.propertyPath = property.toPathString
				newField = temp
			} else if (typeHelper.isNumber(type)) {
				val temp = ExtensionModelFactory.eINSTANCE.createYNumericSearchField
				temp.propertyPath = property.toPathString
				temp.type = typeHelper.toNumericType(type)
				temp.typeQualifiedName = typeHelper.toNumericQualifiedName(type)
				newField = temp
			} else if (typeHelper.isBoolean(type)) {
				val temp = ExtensionModelFactory.eINSTANCE.createYBooleanSearchField
				temp.propertyPath = property.toPathString
				newField = temp
			} else {
				val temp = ExtensionModelFactory.eINSTANCE.createYReferenceSearchField
				temp.propertyPath = property.toPathString
				temp.typeQualifiedName = property.typeofLastSegment?.qualifiedName
				temp.type = loadClass(eObject.eResource.resourceSet, temp.typeQualifiedName)
				newField = temp
			}

			if (newField !== null) {
				newField.id = UiModelGrammarUtil.getPathId(eObject)
				newField.labelI18nKey = eObject.toI18nKey
				newField.initialEnabled = !eObject.readonly
				newField.cssClass = eObject.styles
			}

			return newField
		}
	}

	def YSelectionType convert(UiSelectionType type) {
		switch (type) {
			case NONE:
				return YSelectionType.SINGLE
			case SINGLE:
				return YSelectionType.SINGLE
			case MULTI:
				return YSelectionType.MULTI
		}
	}

	def dispatch YEmbeddable create(UiNumericField object) {
		val YNumericField field = factory.createNumericField
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.labelI18nKey = object.toI18nKey
		field.initialEnabled = !object.readonly
		field.cssClass = object.styles

		val dt = factory.createNumericDatatype
		field.datatype = dt
		field.orphanDatatypes += dt

		dt.grouping = !object.noGrouping
		dt.markNegative = !object.noMarkNegative
		object.associateUi(field)

		return field
	}

	def dispatch YEmbeddable create(UiCheckBox object) {
		val YCheckBox field = factory.createCheckBox
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.labelI18nKey = object.toI18nKey
		field.initialEnabled = !object.readonly
		field.cssClass = object.styles

		object.associateUi(field)

		return field
	}

	def dispatch YButton create(UiButton object) {
		val YButton field = factory.createButton
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.labelI18nKey = object.toI18nKey
		field.initialEnabled = !object.readonly
		field.cssClass = object.styles

		object.associateUi(field)

		return field
	}

	def dispatch VMNavigationBarButton create(UiMobileNavBarAction object) {
		val VMNavigationBarButton field = VaadinMobileFactory.eINSTANCE.createVMNavigationBarButton
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.labelI18nKey = object.toI18nKey
		field.initialEnabled = !object.readonly
		field.cssClass = object.styles

		object.associateUi(field)

		return field
	}

	def dispatch VMNavigationButton create(UiMobileNavigationButton object) {
		val VMNavigationButton field = VaadinMobileFactory.eINSTANCE.createVMNavigationButton
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.labelI18nKey = object.toI18nKey
		field.initialEnabled = !object.readonly
		field.cssClass = object.styles

		object.associateUi(field)

		return field
	}

	def dispatch VMNavigationPage create(UiMobileNavigationPage object) {
		var VMNavigationPage field = VaadinMobileFactory.eINSTANCE.createVMNavigationPage
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.labelI18nKey = object.toI18nKey
		field.initialEnabled = !object.readonly
		field.cssClass = object.styles

		object.associateUi(field)

		return field
	}

	def dispatch YEmbeddable create(UiComboBox object) {

		if (object.jvmType?.type instanceof JvmEnumerationType) {
			val YEnumComboBox field = ExtensionModelFactory.eINSTANCE.createYEnumComboBox

			field.id = UiModelGrammarUtil.getPathId(object)
			field.name = object.name
			field.label = object.name
			field.labelI18nKey = object.toI18nKey
			field.initialEnabled = !object.readonly
			field.cssClass = object.styles

			if (object.jvmType !== null) {
				field.typeQualifiedName = object.jvmType.qualifiedName
				field.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
			}

			object.associateUi(field)

			return field
		} else {
			val YComboBox field = factory.createComboBox
			field.id = UiModelGrammarUtil.getPathId(object)
			field.name = object.name
			field.label = object.name
			field.useBeanService = object.consumeBeanService
			field.labelI18nKey = object.toI18nKey
			field.initialEnabled = !object.readonly

			if (object.jvmType !== null) {
				field.typeQualifiedName = object.jvmType.qualifiedName
				field.type = loadClass(object.eResource.resourceSet, object.jvmType.qualifiedName)
			}

			if (object.itemCaptionProperty !== null) {
				field.captionProperty = OperationExtensions.toPropertyName(object.itemCaptionProperty?.simpleName)
			} else {
				field.captionProperty = BeanHelper.findCaptionProperty(field.type)
			}
			field.imageProperty = OperationExtensions.toPropertyName(object.itemImageProperty?.simpleName)

			object.associateUi(field)
			return field
		}

	}

	def dispatch YEmbeddable create(UiSwitch object) {
		val VMSwitch field = VaadinMobileFactory.eINSTANCE.createVMSwitch
		field.id = UiModelGrammarUtil.getPathId(object)
		field.name = object.name
		field.label = object.name
		field.labelI18nKey = object.toI18nKey
		field.initialEnabled = !object.readonly
		field.cssClass = object.styles

		object.associateUi(field)

		return field
	}

	def dispatch YGridLayout create(UiGridLayout object) {
		val YGridLayout layout = factory.createGridLayout
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.columns = object.columns
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch YFormLayout create(UiFormLayout object) {
		val YFormLayout layout = factory.createFormLayout
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch YHorizontalLayout create(UiHorizontalLayout object) {
		val YHorizontalLayout layout = factory.createHorizontalLayout
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch VMNavigationRoot create(UiMobileNavigationRoot object) {
		val VMNavigationRoot layout = VaadinMobileFactory.eINSTANCE.createVMNavigationRoot
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch YSearchPanel create(UiSearchPanel object) {
		val YSearchPanel layout = ExtensionModelFactory.eINSTANCE.createYSearchPanel
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch VMSearchPanel create(UiMobileSearchPanel object) {
		val VMSearchPanel layout = VaadinMobileFactory.eINSTANCE.createVMSearchPanel
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch YSplitPanel create(UiSplitpanel object) {
		val YSplitPanel layout = factory.createSplitPanel
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.splitPosition = object.splitPosition
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch YPanel create(UiPanel object) {
		val YPanel layout = factory.createPanel
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch YVerticalLayout create(UiVerticalLayout object) {
		val YVerticalLayout layout = factory.createVerticalLayout
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch VMHorizontalButtonGroup create(UiHorizontalButtonGroup object) {
		val VMHorizontalButtonGroup layout = VaadinMobileFactory.eINSTANCE.createVMHorizontalButtonGroup
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch VMVerticalComponentGroup create(UiVerticalComponentGroup object) {
		val VMVerticalComponentGroup layout = VaadinMobileFactory.eINSTANCE.createVMVerticalComponentGroup
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.initialEnabled = !object.readonly
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch YTabSheet create(UiTabSheet object) {
		val YTabSheet layout = factory.createTabSheet
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey
		layout.cssClass = object.styles

		object.associateUi(layout)

		return layout
	}

	def dispatch VMTabSheet create(UiMobileTabSheet object) {
		val VMTabSheet layout = VaadinMobileFactory.eINSTANCE.createVMTabSheet
		layout.id = UiModelGrammarUtil.getPathId(object)
		layout.name = object.name
		layout.label = object.name
		layout.labelI18nKey = object.toI18nKey

		object.associateUi(layout)

		return layout
	}

	def void xxaddToParent(YElement embeddable) {
		val context = peek
		if (context instanceof YLayout) {
			val YLayout layout = context as YLayout
			layout.addElement(embeddable as YEmbeddable)
		} else if (context instanceof YView) {
			val YView yView = context as YView
			yView.content = embeddable as YEmbeddable
		} else if (context instanceof YTab) {
			val YTab yTab = context as YTab
			yTab.embeddable = embeddable as YEmbeddable
		} else if (context instanceof VMTab) {
			val VMTab yTab = context as VMTab
			yTab.embeddable = embeddable as YEmbeddable
		} else if (context instanceof VMNavigationButton) {
			val VMNavigationButton yButton = context as VMNavigationButton
			yButton.page = embeddable as VMNavigationPage
		} else if (context instanceof VMNavigationCommand) {
			val VMNavigationCommand yCommand = context as VMNavigationCommand
			yCommand.targetPage = embeddable as VMNavigationPage
		} else if (context instanceof YOpenDialogCommand) {
			val YOpenDialogCommand yCommand = context as YOpenDialogCommand
			yCommand.dialog = embeddable as YDialog
		} else if (context instanceof YDialog) {
			val YDialog yDialog = context as YDialog
			yDialog.content = embeddable as YEmbeddable
		}
	}

	def dispatch void map(UiPoint object) {
	}

	def dispatch void map(UiBindingEndpointAlias object) {
	}

	def dispatch void map(UiBindingEndpointAssignment object) {
	}

	def dispatch void map(UiBinding object) {
		pendingBindings += object
	}

	def void install(UiBinding object) {
		val UiBindingEndpointAlias sourceAlias = object.sourceAlias as UiBindingEndpointAlias
		val source = object.source
		val UiBindingEndpointAlias targetAlias = object.targetAlias as UiBindingEndpointAlias
		val target = object.target

		var UiBindingEndpointAssignment sourceEndpoint = source as UiBindingEndpointAssignment
		if (sourceAlias !== null) {
			sourceEndpoint = sourceAlias.endpoint as UiBindingEndpointAssignment
		}
		var UiBindingEndpointAssignment targetEndpoint = target as UiBindingEndpointAssignment
		if (targetAlias !== null) {
			targetEndpoint = targetAlias.endpoint as UiBindingEndpointAssignment
		}

		if (!object.listBinding) {
			val sourceResult = sourceEndpoint.createValueBindingEndpoint
			val targetResult = targetEndpoint.createValueBindingEndpoint

			var YBindingUpdateStrategy sourceToTargetStrategy = YBindingUpdateStrategy::UPDATE;
			if (!object.sourceToTarget) {
				sourceToTargetStrategy = YBindingUpdateStrategy::ON_REQUEST
			}

			var YBindingUpdateStrategy targetToSourceStrategy = YBindingUpdateStrategy::UPDATE;
			if (!object.targetToSource) {
				targetToSourceStrategy = YBindingUpdateStrategy::ON_REQUEST
			}

			currentView.orCreateBindingSet.addBinding(targetResult, sourceResult, targetToSourceStrategy,
				sourceToTargetStrategy)

			finishValidator(sourceEndpoint, sourceResult, targetEndpoint, targetResult)

		} else {
			val sourceResult = sourceEndpoint.createListBindingEndpoint
			val targetResult = targetEndpoint.createListBindingEndpoint

			var YBindingUpdateStrategy sourceToTargetStrategy = YBindingUpdateStrategy::UPDATE;
			if (!object.sourceToTarget) {
				sourceToTargetStrategy = YBindingUpdateStrategy::ON_REQUEST
			}

			var YBindingUpdateStrategy targetToSourceStrategy = YBindingUpdateStrategy::UPDATE;
			if (!object.targetToSource) {
				targetToSourceStrategy = YBindingUpdateStrategy::ON_REQUEST
			}

			currentView.orCreateBindingSet.addBinding(targetResult, sourceResult, targetToSourceStrategy,
				sourceToTargetStrategy)
		}
	}

	def finishValidator(UiBindingEndpointAssignment sourceAssignment, YValueBindingEndpoint sourceEndpoint,
		UiBindingEndpointAssignment targetAssignment, YValueBindingEndpoint targetEndpoint) {
		val BindingInfoHelper.BindingInfo sourceInfo = new BindingInfoHelper.BindingInfo
		bindingInfoHelper.collectBindingInfo(sourceAssignment, sourceInfo);

		val BindingInfoHelper.BindingInfo targetInfo = new BindingInfoHelper.BindingInfo
		bindingInfoHelper.collectBindingInfo(targetAssignment, targetInfo);

		var JvmType type = null
		var String property = null
		var YField field = null

		if (sourceInfo.bindingRoot instanceof UiField) {
			field = associatedUi(sourceInfo.bindingRoot) as YField;
		} else if (targetInfo.bindingRoot instanceof UiField) {
			field = associatedUi(targetInfo.bindingRoot) as YField;
		}

		if (field !== null) {
			if (sourceInfo.deepestJvmField !== null) {
				val jvmField = sourceInfo.deepestJvmField
				if (jvmField !== null) {
					type = jvmField.declaringType
					property = OperationExtensions.toPropertyName(jvmField.simpleName)
				}
			} else if (targetInfo.deepestJvmField !== null) {
				val jvmField = sourceInfo.deepestJvmField
				if (jvmField !== null) {
					type = jvmField.declaringType
					property = OperationExtensions.toPropertyName(jvmField.simpleName)
				}
			}
		}

		if (type !== null && property !== null && field !== null) {
			for (yValidator : field.validators) {
				yValidator.type = loadClass(sourceAssignment.eResource.resourceSet, type.qualifiedName)

				if (yValidator instanceof YBeanValidationValidator) {
					yValidator.bvalClass = yValidator.type
					yValidator.bvalClassFullyQualifiedName = type.qualifiedName
					yValidator.bvalProperty = property
				}
			}
		}
	}

	def YValueBindingEndpoint createValueBindingEndpoint(UiBindingEndpointAssignment epDef) {
		if (epDef === null) {
			return null
		}
		var YValueBindingEndpoint result = null;
		val BindingInfoHelper.BindingInfo info = new BindingInfoHelper.BindingInfo
		bindingInfoHelper.collectBindingInfo(epDef, info);

		if (info.bindingRoot instanceof UiBeanSlot) {
			val uiBeanSlot = info.bindingRoot as UiBeanSlot

			val YBeanSlot yBeanSlot = uiBeanSlot.associatedUi
			val YBeanSlotValueBindingEndpoint ep = factory.createBeanSlotValueBindingEndpoint
			ep.beanSlot = yBeanSlot
			ep.attributePath = info.path.toString
			if (ep.attributePath === null || ep.attributePath.equals("")) {

				// bind the value in the slot
				ep.attributePath = "value"
			}
			result = ep
		} else if (info.bindingRoot instanceof UiEmbeddable) {
			val YElement yElement = info.bindingRoot.associatedUi
			val YECViewModelValueBindingEndpoint ep = factory.createECViewModelValueBindingEndpoint
			ep.element = yElement
			ep.propertyPath = info.path.toString
			if (info.typeForBinding !== null) {
				ep.typeQualifiedName = info.typeForBinding.qualifiedName
				ep.type = loadClass(epDef.eResource.resourceSet, ep.typeQualifiedName)
			}
			if (ep.type !== null && typeof(EObject).isAssignableFrom(ep.type)) {
				val classifier = findEClassifierFor(epDef.eResource.resourceSet, ep.type.simpleName)
				ep.emfNsURI = if(classifier !== null) classifier.EPackage.nsURI else null
			}

			// calculate default I18nKey
			epDef.eContainer

			result = ep
		} else if (info.bindingRoot instanceof UiMobileNavigationCommand) {
			val UiMobileNavigationCommand command = info.bindingRoot as UiMobileNavigationCommand

			// Create the command and register it at the current view
			val VMNavigationCommand yCommand = VaadinMobileFactory.eINSTANCE.createVMNavigationCommand

			currentView.commandSet.addCommand(yCommand)

			// create the target page and add it to the command
			yCommand.push

			command.targetPage.create
			command.targetPage.map

			yCommand.targetPage = command.targetPage.associatedUi

			// since navHandler is parent, it must be created yet
			val UiMobileNavigationHandler navHandler = epDef.findNavHandler
			yCommand.navigationHandler = (navHandler as EObject).associatedUi

			pop

			result = yCommand.createNavigationValueEndpoint
		} else if (info.bindingRoot instanceof UiOpenDialogCommand) {
			val UiOpenDialogCommand command = info.bindingRoot as UiOpenDialogCommand

			// Create the command and register it at the current view
			val YOpenDialogCommand yCommand = CoreModelFactory.eINSTANCE.createYOpenDialogCommand
			currentView.commandSet.addCommand(yCommand)

			// create the target page and add it to the command
			yCommand.push
			command.dialog.map

			pop

			result = yCommand.createTriggerDialogEndpoint
		} else if (info.bindingRoot instanceof UiSearchWithDialogCommand) {
			val UiSearchWithDialogCommand command = info.bindingRoot as UiSearchWithDialogCommand

			// Create the command and register it at the current view
			val YOpenDialogCommand yCommand = CoreModelFactory.eINSTANCE.createYOpenDialogCommand
			currentView.commandSet.addCommand(yCommand)

			// create the target page and add it to the command
			yCommand.push
			command.dialog.map

			pop

			result = yCommand.createTriggerDialogEndpoint
		} else if (info.bindingRoot instanceof UiAddToTableCommand) {
			val UiAddToTableCommand command = info.bindingRoot as UiAddToTableCommand

			// Create the command and register it at the current view
			val YAddToTableCommand yCommand = ExtensionModelFactory.eINSTANCE.createYAddToTableCommand
			currentView.commandSet.addCommand(yCommand)

			pendingMappings += [
				yCommand.table = command.table.associatedUi
			] as Runnable

			result = yCommand.createTriggerEndpoint
		} else if (info.bindingRoot instanceof UiRemoveFromTableCommand) {
			val UiRemoveFromTableCommand command = info.bindingRoot as UiRemoveFromTableCommand

			// Create the command and register it at the current view
			val YRemoveFromTableCommand yCommand = ExtensionModelFactory.eINSTANCE.createYRemoveFromTableCommand
			currentView.commandSet.addCommand(yCommand)

			pendingMappings += [
				yCommand.table = command.table.associatedUi
			] as Runnable

			result = yCommand.createTriggerEndpoint
		} else if (info.bindingRoot instanceof UiSendEventCommand) {
			val UiSendEventCommand command = info.bindingRoot as UiSendEventCommand

			// Create the command and register it at the current view
			val YSendEventCommand yCommand = CoreModelFactory.eINSTANCE.createYSendEventCommand
			yCommand.autoTrigger = !command.noAutoTrigger
			yCommand.eventTopic = command.eventTopic

			currentView.commandSet.addCommand(yCommand)

			result = yCommand.createMessageEndpoint
		} else if (info.bindingRoot instanceof UiSetNewInstanceCommand) {
			val UiSetNewInstanceCommand command = info.bindingRoot as UiSetNewInstanceCommand

			// Create the command and register it at the current view
			val YSetNewBeanInstanceCommand yCommand = ExtensionModelFactory.eINSTANCE.createYSetNewBeanInstanceCommand
			currentView.commandSet.addCommand(yCommand)

			val targetEP = command.target as UiBindingEndpointAssignment

			yCommand.target = targetEP.createValueBindingEndpoint
			if (command.jvmType !== null) {

				yCommand.typeQualifiedName = command.jvmType.qualifiedName
				yCommand.type = loadClass(command.eResource.resourceSet, command.jvmType.qualifiedName)
			} else {
				val BindingInfoHelper.BindingInfo targetInfo = new BindingInfoHelper.BindingInfo
				bindingInfoHelper.collectBindingInfo(targetEP, targetInfo);

				if (targetInfo.typeOfBoundProperty !== null) {

					// if there is a property path
					yCommand.typeQualifiedName = targetInfo.typeOfBoundProperty.qualifiedName
					yCommand.type = loadClass(epDef.eResource.resourceSet, yCommand.typeQualifiedName)
				} else if (targetInfo.typeForBinding !== null) {

					// use the root object
					yCommand.typeQualifiedName = targetInfo.typeForBinding.qualifiedName
					yCommand.type = loadClass(epDef.eResource.resourceSet, yCommand.typeQualifiedName)
				}
				if (yCommand.type !== null && yCommand.type.isAssignableFrom(typeof(EObject))) {
					// TODO later for EObjects
				}
			}

			result = yCommand.createTriggerEndpoint
		}

		return result
	}

	/**
	 * Attention: If EClasses not named uniquely, this method may return the wrong.<br>
	 * The nsURI from the classifier is required for databinding to find the proper EClass and EFeature for ep.type.
	 */
	def findEClassifierFor(ResourceSet resourceSet, String eClassName) {
		val Set<EClassifier> matches = newHashSet()
		for (String nsUri : new HashSet(EPackage.Registry.INSTANCE.keySet())) {
			try {
				val pkg = EPackage.Registry.INSTANCE.getEPackage(nsUri)
				val classifier = pkg.getEClassifier(eClassName)
				if (classifier !== null) {
					matches += classifier
				}
			} catch (Exception ex) {
				// nothing to do - smooks throws exception if no classifier found	
			}
		}
		if (matches.empty) {
			LOGGER.error("Could not find classifier for name %s", eClassName)
		} else if (matches.size > 1) {
			LOGGER.error("Found %s classifiers for name %s", Integer.toString(matches.size), eClassName)
		}
		return if(matches.isEmpty) return null else matches.iterator.next
	}

	def UiMobileNavigationHandler findNavHandler(UiBindingEndpointAssignment assignment) {
		var EObject temp = assignment;
		while (temp.eContainer !== null) {
			temp = temp.eContainer
			if (temp instanceof UiMobileNavigationHandler) {
				return temp as UiMobileNavigationHandler
			}
		}
		return null
	}

	def YListBindingEndpoint createListBindingEndpoint(UiBindingEndpointAssignment epDef) {
		if (epDef === null) {
			return null
		}

		var YListBindingEndpoint result = null;
		val BindingInfoHelper.BindingInfo info = new BindingInfoHelper.BindingInfo()
		bindingInfoHelper.collectBindingInfo(epDef, info);

		if (info.bindingRoot instanceof UiBeanSlot) {
			val uiBeanSlot = info.bindingRoot as UiBeanSlot

			val YBeanSlot yBeanSlot = uiBeanSlot.associatedUi
			val YBeanSlotListBindingEndpoint ep = factory.createBeanSlotListBindingEndpoint
			ep.beanSlot = yBeanSlot
			ep.attributePath = info.path.toString
			result = ep
		} else if (info.bindingRoot instanceof UiEmbeddable) {
			val YEmbeddable yElement = info.bindingRoot.associatedUi
			val YECViewModelListBindingEndpoint ep = factory.createECViewModelListBindingEndpoint
			ep.element = yElement
			ep.propertyPath = info.path.toString
			if (info.typeForBinding !== null) {
				ep.typeQualifiedName = info.typeForBinding.qualifiedName
				ep.type = loadClass(epDef.eResource.resourceSet, ep.typeQualifiedName)
			}
			if (yElement !== null) {
				ep.emfNsURI = yElement.eClass.EPackage.nsURI
			}
			result = ep
		}

		return result
	}

	def resolve(UiBindingEndpointAlias alias) {
		val temp = alias.endpoint;
		if (temp instanceof UiBindingEndpointAssignment) {
			val UiBindingEndpointAssignment assign = temp as UiBindingEndpointAssignment
			if (assign.typedBindableAlias !== null && assign.typedBindableAlias instanceof UiBindingEndpointAlias) {
				resolve(assign.typedBindableAlias as UiBindingEndpointAlias)
			}
		}
	}

	def Class<?> loadClass(ResourceSet resourceSet, String qualifiedName) {
		return typeLoader.findTypeByName(qualifiedName)
	}

	def dispatch void map(UiPathSegment object) {
	}

	def dispatch void map(UiBeanSlot object) {
		val yBeanSlot = factory.createBeanSlot
		yBeanSlot.name = object.name
		yBeanSlot.valueTypeQualifiedName = object.jvmType?.qualifiedName
		yBeanSlot.valueType = loadClass(object.eResource.resourceSet, yBeanSlot.valueTypeQualifiedName)
		yBeanSlot.eventTopic = object.eventTopic

		object.associateUi(yBeanSlot)

		val EObject lastElement = viewContext.peek
		if (lastElement instanceof YView) {
			(lastElement as YView).beanSlots += yBeanSlot
		} else if (lastElement instanceof YViewSet) {
			(lastElement as YViewSet).beanSlots += yBeanSlot
		}

	}

	def dispatch void map(EObject object) {
	}

	override void discardDerivedState(DerivedStateAwareResource resource) {
		super.discardDerivedState(resource)

		if (resource.contents.size > 1) {
			for (var i = 1; i < resource.contents.size; i++) {
				resource.contents.remove(1)
			}
		}
	}
}
