Computation of Column and ValueField datatypes fixed.

Change-Id: I563e3753fe49c5d81b148b1366d31bfef2e6b023
Reviewed-on: https://git.eclipse.org/r/22404
Tested-by: Hudson CI
Reviewed-by: Matthias Villiger <mvi@bsiag.com>
IP-Clean: Matthias Villiger <mvi@bsiag.com>
diff --git a/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
index eccaa7d..a5ff6c5 100644
--- a/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
+++ b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
@@ -4,10 +4,9 @@
 package org.eclipse.scout.sdk.internal.test.util.signature;
 
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.Signature;
@@ -168,27 +167,27 @@
 
   @Test
   public void testGenericResolver01() throws Exception {
-    Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
     String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass01<" + String.class.getName() + "," + Integer.class.getName() + ">", true);
-    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector);
+    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector);
     Assert.assertEquals(Signature.createTypeSignature(String.class.getName(), true), collector.get("signature.tests.generic.IInterface01").getParameterSignature("GENERIC"));
     Assert.assertEquals(Signature.createTypeSignature(Integer.class.getName(), true), collector.get("signature.tests.generic.IInterface02").getParameterSignature("A"));
   }
 
   @Test
   public void testGenericResolver02() throws Exception {
-    Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
     String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass02<" + Integer.class.getName() + ">", true);
-    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector);
+    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector);
     Assert.assertEquals(Signature.createTypeSignature(String.class.getName(), true), collector.get("signature.tests.generic.IInterface01").getParameterSignature("GENERIC"));
     Assert.assertEquals(Signature.createTypeSignature(List.class.getName() + "<" + Integer.class.getName() + ">", true), collector.get("signature.tests.generic.IInterface02").getParameterSignature("A"));
   }
 
   @Test
   public void testGenericResolver03() throws Exception {
-    Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
     String superTypeSignature = Signature.createTypeSignature("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField<" + Integer.class.getName() + ">", true);
-    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector);
+    SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector);
     Assert.assertEquals(Signature.createTypeSignature(Integer.class.getName(), true), collector.get("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField").getParameterSignature("T"));
   }
 
diff --git a/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java b/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java
index 3819418..2c96a9f 100644
--- a/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java
+++ b/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java
@@ -40,7 +40,7 @@
 /**
  * <h3>{@link ApiTestGenerator}</h3>
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.10.0 26.08.2013
  */
 public class ApiTestGenerator {
@@ -256,7 +256,7 @@
     try {
       for (IAnnotation a : annotatable.getAnnotations()) {
         String annotationSignature = SignatureUtility.getResolvedSignature(Signature.createTypeSignature(a.getElementName(), false), resolveContext);
-        source.append(sdkAssertRef).append(".assertAnnotation(").append(annotatableRef).append(", \"").append(SignatureUtility.getFullyQuallifiedName(annotationSignature)).append("\");").append(NL);
+        source.append(sdkAssertRef).append(".assertAnnotation(").append(annotatableRef).append(", \"").append(SignatureUtility.getFullyQualifiedName(annotationSignature)).append("\");").append(NL);
       }
     }
     catch (CoreException e) {
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java
index 084f641..f123860 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java
@@ -62,7 +62,7 @@
 /**
  * <h3>{@link JavaElementCommentBuilderService}</h3>
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.10.0 12.07.2013
  */
 @SuppressWarnings("restriction")
@@ -224,9 +224,9 @@
           seeBuilder.append(interfaceFqn).append("#").append(methodSourceBuilder.getElementName()).append("(");
           Iterator<MethodParameter> parameterIterator = methodSourceBuilder.getParameters().iterator();
           if (parameterIterator.hasNext()) {
-            seeBuilder.append(SignatureUtility.getFullyQuallifiedName(parameterIterator.next().getSignature()));
+            seeBuilder.append(SignatureUtility.getFullyQualifiedName(parameterIterator.next().getSignature()));
             while (parameterIterator.hasNext()) {
-              seeBuilder.append(", ").append(SignatureUtility.getFullyQuallifiedName(parameterIterator.next().getSignature()));
+              seeBuilder.append(", ").append(SignatureUtility.getFullyQualifiedName(parameterIterator.next().getSignature()));
             }
           }
           seeBuilder.append(")");
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java
index 40b8d8f..3963742 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java
@@ -13,26 +13,32 @@
 import java.util.Map;
 
 /**
- * <h3>{@link ITypeGenericMapping}</h3> ...
+ * <h3>{@link ITypeGenericMapping}</h3>
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.9.0 04.04.2013
  */
 public interface ITypeGenericMapping {
 
   /**
-   * @return
+   * @return The fully qualified name of the class the generic mappings belong to.
    */
-  String getFullyQuallifiedName();
+  String getFullyQualifiedName();
 
   /**
+   * Gets the signature of the generic parameter with the given name.
+   * 
    * @param paramName
-   * @return
+   *          The name of the generic parameter (e.g. "T" or "VALUE_TYPE")
+   * @return The signature of the generic type with the given name or null if the class that belongs to this instance
+   *         does not define a generic type with the given name.
    */
   String getParameterSignature(String paramName);
 
   /**
-   * @return
+   * Gets a unmodifiable map of all generic types with their corresponding signature.
+   * 
+   * @return The generic type to signature mapping.
    */
   Map<String, String> getParameters();
 
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java
index 085d034..038f140 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
@@ -26,11 +27,11 @@
 
 public final class SignatureUtility {
 
-  private final static Pattern QUALIFIED_SIG_REGEX = Pattern.compile("^([\\+\\[]*)([^\\<\\(\\;]*)(.*)$");
-  private final static Pattern SIG_REPLACEMENT_REGEX = Pattern.compile("[\\.\\$]{1}");
-  public final static Pattern DOLLAR_REPLACEMENT_REGEX = Pattern.compile("\\$");
-  private final static Pattern PARAM_SIG_REPLACEMENT_REGEX = Pattern.compile("^([^\\:]*)\\:(.*)$");
-  private final static Pattern SIG_END = Pattern.compile("(^.*)\\;$");
+  private static final Pattern QUALIFIED_SIG_REGEX = Pattern.compile("^([\\+\\[]*)([^\\<\\(\\;]*)(.*)$");
+  private static final Pattern SIG_REPLACEMENT_REGEX = Pattern.compile("[\\.\\$]{1}");
+  private static final Pattern PARAM_SIG_REPLACEMENT_REGEX = Pattern.compile("^([^\\:]*)\\:(.*)$");
+  private static final Pattern SIG_END = Pattern.compile("(^.*)\\;$");
+  public static final Pattern DOLLAR_REPLACEMENT_REGEX = Pattern.compile("\\$");
 
   /**
    * Character constant indicating an arbitrary array type in a signature.
@@ -49,6 +50,36 @@
   private SignatureUtility() {
   }
 
+  public static String unboxPrimitiveSignature(String signature) {
+    if (Signature.getTypeSignatureKind(signature) == Signature.BASE_TYPE_SIGNATURE) {
+      if (Signature.SIG_BOOLEAN.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Boolean.class.getName());
+      }
+      else if (Signature.SIG_BYTE.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Byte.class.getName());
+      }
+      else if (Signature.SIG_CHAR.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Character.class.getName());
+      }
+      else if (Signature.SIG_DOUBLE.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Double.class.getName());
+      }
+      else if (Signature.SIG_FLOAT.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Float.class.getName());
+      }
+      else if (Signature.SIG_INT.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Integer.class.getName());
+      }
+      else if (Signature.SIG_LONG.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Long.class.getName());
+      }
+      else if (Signature.SIG_SHORT.equals(signature)) {
+        signature = SignatureCache.createTypeSignature(Short.class.getName());
+      }
+    }
+    return signature;
+  }
+
   /**
    * To get the signature kind of the given signature. If a signature starts with '|' it is a arbitrary array signature
    * otherwise see {@link Signature#getTypeSignatureKind(String)}.
@@ -66,8 +97,6 @@
       return ARBITRARY_ARRAY_SIGNATURE;
     }
     else {
-      //private final static Pattern SIMPLE_NAME_REGEX = Pattern.compile("^[\\[]*([^\\<]*).*(\\;)$");
-      // signature = SIMPLE_NAME_REGEX.matcher(signature).replaceAll("$1$2");
       return Signature.getTypeSignatureKind(signature);
     }
   }
@@ -105,7 +134,7 @@
   public static String getResolvedSignature(String signature, IType signatureOwner, IType contextType) throws CoreException {
     Map<String, String> genericParameters = null;
     if (TypeUtility.exists(contextType) && TypeUtility.exists(signatureOwner)) {
-      Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>();
+      LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
       resolveGenericParametersInSuperHierarchy(contextType, new String[0], contextType.newSupertypeHierarchy(new NullProgressMonitor()), collector);
       ITypeGenericMapping mapping = collector.get(signatureOwner.getFullyQualifiedName());
       if (mapping != null) {
@@ -134,7 +163,7 @@
    * To get the simple type reference name within a context represented by the given importValidator. Every fully
    * qualified type name will be passed to the importValidator to decide if the import is already in use.
    * 
-   * @param fullyQuallifiedTypeName
+   * @param fullyQualifiedTypeName
    *          e.g. java.lang.String (not a signature).
    * @param importValidator
    *          to evaluate all fully qualified names for create an import and use simple names.
@@ -150,14 +179,6 @@
    * @throws CoreException
    * @see {@link ScoutSignature#getTypeReference(String, IType, IType, IImportValidator)}
    */
-  public static String getTypeReference(String signature) throws CoreException {
-    return getTypeReference(signature, null, null, new FullyQuallifiedValidator());
-  }
-
-  /**
-   * @throws CoreException
-   * @see {@link ScoutSignature#getTypeReference(String, IType, IType, IImportValidator)}
-   */
   public static String getTypeReference(String signature, IImportValidator importValidator) throws CoreException {
     return getTypeReference(signature, null, null, importValidator);
   }
@@ -172,9 +193,9 @@
 
   /**
    * <h4>Examples</h4> <xmp>
-   * getTypeReferenceImpl("Ljava.lang.String;", typeA, typeA, fullyQuallifiedImpValidator)
+   * getTypeReferenceImpl("Ljava.lang.String;", typeA, typeA, fullyQualifiedImpValidator)
    * -> java.lang.String
-   * getTypeReferenceImpl("QList<?QString>;", typeA, typeA, fullyQuallifiedImpValidator)
+   * getTypeReferenceImpl("QList<?QString>;", typeA, typeA, fullyQualifiedImpValidator)
    * -> java.util.List<? extends java.lang.String>
    * </xmp>
    * 
@@ -190,7 +211,7 @@
    *          an import validator to decide simple name vs. fully qualified name.
    * @return the type reference
    * @throws CoreException
-   * @see {@link FullyQuallifiedValidator}, {@link IImportValidator}, {@link SimpleImportValidator}
+   * @see {@link FullyQualifiedValidator}, {@link IImportValidator}, {@link SimpleImportValidator}
    */
   private static String getTypeReference(String signature, IType signatureOwner, IType contextType, IImportValidator validator) throws CoreException {
     StringBuilder sigBuilder = new StringBuilder();
@@ -291,7 +312,7 @@
    * @throws CoreException
    */
   public static String[] getMethodParameterSignatureResolved(IMethod jdtMethod, IType contextType) throws CoreException {
-    Map<String, ITypeGenericMapping> genericMapperCollector = new HashMap<String, ITypeGenericMapping>();
+    LinkedHashMap<String, ITypeGenericMapping> genericMapperCollector = new LinkedHashMap<String, ITypeGenericMapping>();
     resolveGenericParametersInSuperHierarchy(contextType, new String[0], contextType.newSupertypeHierarchy(new NullProgressMonitor()), genericMapperCollector);
     ITypeGenericMapping mapping = genericMapperCollector.get(jdtMethod.getDeclaringType().getFullyQualifiedName());
     Map<String, String> parameters = null;
@@ -359,12 +380,11 @@
     return returnTypeSignature;
   }
 
-  public static String ensureSourceTypeParametersAreCorrect(String signature, IType signatureOwner) throws JavaModelException {
+  private static String ensureSourceTypeParametersAreCorrect(String signature, IType signatureOwner) throws JavaModelException {
     if (!TypeUtility.exists(signatureOwner) || signatureOwner.isBinary()) {
       return signature;
     }
     else {
-
       ITypeParameter[] typeParameters = signatureOwner.getTypeParameters();
       if (typeParameters != null && typeParameters.length > 0) {
         for (ITypeParameter tp : typeParameters) {
@@ -382,38 +402,14 @@
    * 'methodname(param1Signature,param2Signature)'.
    * 
    * @param method
-   * @return an unique method identifier of the given method
-   * @throws CoreException
-   */
-  public static String getMethodIdentifier(IMethod method) throws CoreException {
-    StringBuilder methodIdBuilder = new StringBuilder(method.getElementName());
-    methodIdBuilder.append("(");
-    String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method);
-    for (int i = 0; i < resolvedParamSignatures.length; i++) {
-      methodIdBuilder.append(resolvedParamSignatures[i]);
-      if (i + 1 < resolvedParamSignatures.length) {
-        methodIdBuilder.append(",");
-      }
-    }
-    methodIdBuilder.append(")");
-    return methodIdBuilder.toString();
-  }
-
-  /**
-   * returns a unique identifier of a scout method. The identifier looks like
-   * 'methodname(param1Signature,param2Signature)'.
-   * 
-   * @param method
-   * @param contextType
-   *          the type in what context the method appears, used for generic bindings.
    * @return
    * @throws CoreException
    */
-  public static String getMethodIdentifier(IMethod method, IType contextType) throws CoreException {
+  public static String getMethodIdentifier(IMethod method) throws CoreException {
     StringBuilder methodIdBuilder = new StringBuilder();
     methodIdBuilder.append(method.getElementName());
     methodIdBuilder.append("(");
-    String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method, contextType);
+    String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method, method.getDeclaringType());
     for (int i = 0; i < resolvedParamSignatures.length; i++) {
       methodIdBuilder.append(resolvedParamSignatures[i]);
       if (i + 1 < resolvedParamSignatures.length) {
@@ -467,7 +463,6 @@
       String[] superClassParameterSignatures = Signature.getTypeArguments(superClassSignature);
       if (superClassParameterSignatures.length < parameterIndex + 1) {
         return SignatureCache.createTypeSignature(Object.class.getName());
-        // throw new IllegalArgumentException("Lost parameter '" + typeParameterSignature + "' in hierarchy at '" + hType.getFullyQualifiedName() + "'.");
       }
       else {
         // translate
@@ -478,7 +473,13 @@
     return typeParameterSignature;
   }
 
-  public static String getFullyQuallifiedName(String signature) {
+  /**
+   * Gets the fully qualified name of the given signature.
+   * 
+   * @param signature
+   * @return The fully qualified name of the given signature.
+   */
+  public static String getFullyQualifiedName(String signature) {
     signature = Signature.getTypeErasure(signature);
     int arrayCount = Signature.getArrayCount(signature);
     if (arrayCount > 0) {
@@ -488,6 +489,13 @@
     return fqn;
   }
 
+  /**
+   * Checks if the given signature contains type arguments.
+   * 
+   * @param sig
+   *          The signature to check
+   * @return true if the given signature has type arguments, false otherwise.
+   */
   public static boolean isGenericSignature(String sig) {
     String[] params = Signature.getTypeArguments(sig);
     return params != null && params.length > 0;
@@ -504,7 +512,7 @@
         String simpleSignature = m.group(2);
         String postfix = m.group(3);
         if (startsWith(simpleSignature, Signature.C_UNRESOLVED)) {
-          String simpleName = Signature.getSignatureSimpleName(simpleSignature + ";");
+          String simpleName = Signature.getSignatureSimpleName(simpleSignature + Signature.C_SEMICOLON);
           String referencedTypeSignature = getReferencedTypeSignature(jdtType, simpleName, false);
           if (referencedTypeSignature != null) {
             simpleSignature = SIG_END.matcher(referencedTypeSignature).replaceAll("$1");
@@ -524,7 +532,11 @@
     }
   }
 
-  public static void resolveGenericParametersInSuperHierarchy(String signature, String[] parameterSignatures, String superTypeSignature, String[] interfaceSignatures, Map<String/*fullyQuallifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+  public static void resolveGenericParametersInSuperHierarchy(String signature, String superTypeSignature, String[] interfaceSignatures, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+    resolveGenericParametersInSuperHierarchy(signature, new String[0], superTypeSignature, interfaceSignatures, collector);
+  }
+
+  private static void resolveGenericParametersInSuperHierarchy(String signature, String[] parameterSignatures, String superTypeSignature, String[] interfaceSignatures, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
     TypeGenericMapping typeDesc = new TypeGenericMapping(Signature.getSignatureQualifier(signature) + "." + Signature.getSignatureSimpleName(signature));
     String[] localParameterSignatures = Signature.getTypeParameters(signature);
     if (localParameterSignatures.length > 0) {
@@ -532,7 +544,7 @@
         typeDesc.addParameter(Signature.getSignatureSimpleName(localParameterSignatures[i]), parameterSignatures[i]);
       }
     }
-    collector.put(typeDesc.getFullyQuallifiedName(), typeDesc);
+    collector.put(typeDesc.getFullyQualifiedName(), typeDesc);
 
     // super type
     if (superTypeSignature != null) {
@@ -568,24 +580,51 @@
         }
       }
     }
-
   }
 
-  public static void resolveGenericParametersInSuperHierarchy(IType type, String[] parameterSignatures, ITypeHierarchy hierarchy, Map<String/*fullyQuallifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+  public static String resolveGenericParameterInSuperHierarchy(IType startType, ITypeHierarchy superHierarchy, String genericDefiningSuperTypeFqn, String paramName) throws CoreException {
+    LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>();
+    resolveGenericParametersInSuperHierarchy(startType, new String[]{}, superHierarchy, collector);
+    ITypeGenericMapping genericMapping = collector.get(genericDefiningSuperTypeFqn);
+    if (genericMapping != null) {
+      return genericMapping.getParameterSignature(paramName);
+    }
+    return null;
+  }
+
+  public static void resolveGenericParametersInSuperHierarchy(IType type, ITypeHierarchy hierarchy, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
+    resolveGenericParametersInSuperHierarchy(type, new String[]{}, hierarchy, collector);
+  }
+
+  private static void resolveGenericParametersInSuperHierarchy(IType type, String[] parameterSignatures, ITypeHierarchy hierarchy, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException {
     if (!TypeUtility.exists(type)) {
       return;
     }
     TypeGenericMapping typeDesc = new TypeGenericMapping(type.getFullyQualifiedName());
     ITypeParameter[] typeParameters = type.getTypeParameters();
+    HashMap<String, String> paramsUnresolved = new HashMap<String, String>(typeParameters.length);
+    for (ITypeParameter par : typeParameters) {
+      String[] boundsSignatures = par.getBoundsSignatures();
+      if (boundsSignatures != null && boundsSignatures.length > 0) {
+        paramsUnresolved.put(par.getElementName(), par.getBoundsSignatures()[0]);
+      }
+    }
+
     for (int i = 0; i < typeParameters.length; i++) {
       if (parameterSignatures.length > i) {
         typeDesc.addParameter(typeParameters[i].getElementName(), parameterSignatures[i]);
       }
       else {
-        typeDesc.addParameter(typeParameters[i].getElementName(), SignatureCache.createTypeSignature(Object.class.getName()));
+        String[] boundsSignatures = typeParameters[i].getBoundsSignatures();
+        if (boundsSignatures != null && boundsSignatures.length > 0) {
+          typeDesc.addParameter(typeParameters[i].getElementName(), getResolvedSignature(type, paramsUnresolved, boundsSignatures[0]));
+        }
+        else {
+          typeDesc.addParameter(typeParameters[i].getElementName(), SignatureCache.createTypeSignature(Object.class.getName()));
+        }
       }
     }
-    collector.put(typeDesc.getFullyQuallifiedName(), typeDesc);
+    collector.put(typeDesc.getFullyQualifiedName(), typeDesc);
     // super class
     if (!Flags.isInterface(type.getFlags())) {
       String superclassTypeSignature = type.getSuperclassTypeSignature();
@@ -653,10 +692,16 @@
       case Signature.TYPE_VARIABLE_SIGNATURE:
         // try to resolve type
         String sig = parameterSignatures.get(Signature.getSignatureSimpleName(unresolvedSignature));
+        if (startsWith(sig, Signature.C_UNRESOLVED) && TypeUtility.exists(contextType)) {
+          String simpleName = Signature.getSignatureSimpleName(sig);
+          String referencedTypeSignature = getReferencedTypeSignature(contextType, simpleName, false);
+          if (referencedTypeSignature != null) {
+            sig = referencedTypeSignature;
+          }
+        }
         sigBuilder.append(sig);
         break;
       case Signature.CLASS_TYPE_SIGNATURE:
-
         String[] typeArguments = Signature.getTypeArguments(unresolvedSignature);
         unresolvedSignature = Signature.getTypeErasure(unresolvedSignature);
         unresolvedSignature = SIG_REPLACEMENT_REGEX.matcher(unresolvedSignature).replaceAll(".");
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java
index cb806dd..6fa9aff 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java
@@ -11,7 +11,8 @@
 package org.eclipse.scout.sdk.util.signature.internal;
 
 import java.util.Collections;
-import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -20,22 +21,22 @@
 /**
  * <h3>{@link TypeGenericMapping}</h3> ...
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.9.0 20.03.2013
  */
 public class TypeGenericMapping implements ITypeGenericMapping {
 
-  private final String m_fullyQuallifiedName;
-  private Map<String /*parameter name*/, String /*param signature*/> m_parameters;
+  private final String m_fullyQualifiedName;
+  private final Map<String /*parameter name*/, String /*param signature*/> m_parameters;
 
   public TypeGenericMapping(String fullyQualliefiedName) {
-    m_fullyQuallifiedName = fullyQualliefiedName;
-    m_parameters = new HashMap<String, String>();
+    m_fullyQualifiedName = fullyQualliefiedName;
+    m_parameters = new LinkedHashMap<String, String>();
   }
 
   @Override
-  public String getFullyQuallifiedName() {
-    return m_fullyQuallifiedName;
+  public String getFullyQualifiedName() {
+    return m_fullyQualifiedName;
   }
 
   public void addParameter(String name, String signature) {
@@ -54,10 +55,18 @@
 
   @Override
   public String toString() {
-    StringBuilder builder = new StringBuilder(getFullyQuallifiedName());
-    for (Entry<String, String> e : m_parameters.entrySet()) {
-      builder.append("\n  ").append(e.getKey()).append(" -> ").append(e.getValue());
+    StringBuilder builder = new StringBuilder(getFullyQualifiedName());
+    builder.append('{');
+    if (!m_parameters.isEmpty()) {
+      Iterator<Entry<String, String>> iterator = m_parameters.entrySet().iterator();
+      Entry<String, String> e = iterator.next();
+      builder.append(e.getKey()).append(" -> ").append(e.getValue());
+      while (iterator.hasNext()) {
+        e = iterator.next();
+        builder.append(" | ").append(e.getKey()).append(" -> ").append(e.getValue());
+      }
     }
+    builder.append('}');
     return builder.toString();
   }
 }
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java
index d00be11..4088fc8 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java
@@ -246,7 +246,7 @@
     if (signature == null) {
       return null;
     }
-    return getType(SignatureUtility.getFullyQuallifiedName(signature));
+    return getType(SignatureUtility.getFullyQualifiedName(signature));
   }
 
   /**
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java
index 8642644..1151acb 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java
@@ -14,6 +14,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.Signature;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
 import org.eclipse.scout.sdk.util.signature.SignatureUtility;
 import org.eclipse.scout.sdk.util.type.TypeUtility;
 import org.eclipse.scout.sdk.util.typecache.ITypeHierarchy;
@@ -36,9 +37,17 @@
   }
 
   protected String getColumnSignature(IType type, ITypeHierarchy columnHierarchy) throws IllegalArgumentException, CoreException {
-    if (type == null || Object.class.getName().equals(type.getFullyQualifiedName())) {
+    if (!TypeUtility.exists(type) || Object.class.getName().equals(type.getFullyQualifiedName())) {
       return null;
     }
+
+    // try IColumn first
+    String sig = SignatureUtility.resolveGenericParameterInSuperHierarchy(type, columnHierarchy.getJdtHierarchy(), IRuntimeClasses.IColumn, "T");
+    if (sig != null) {
+      return sig;
+    }
+
+    // try other models
     IType superType = columnHierarchy.getSuperclass(type);
     if (TypeUtility.exists(superType)) {
       if (TypeUtility.isGenericType(superType)) {
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java
index 5f74cab..9ceccab 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java
@@ -99,7 +99,7 @@
     }
     // form
     if (getForm() != null) {
-      String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+      String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
       if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractWizardStep)) {
         // update generic in supertype signature
         StringBuilder superTypeSigBuilder = new StringBuilder(superTypeFqn);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java
index 4e90048..64a6193 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java
@@ -84,7 +84,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractCalendarField)) {
       // create inner type calendar
       ITypeSourceBuilder calendarBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_CALENDARFIELD_CALENDAR);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java
index 1dc22b3..87008bf 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java
@@ -74,7 +74,7 @@
     FormFieldNewOperation newOp = new FormFieldNewOperation(getTypeName(), getDeclaringType());
     newOp.setSibling(getSibling());
     newOp.setSuperTypeSignature(getSuperTypeSignature());
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractPlannerField)) {
       // super type sig
       StringBuilder superTypeSigBuilder = new StringBuilder(superTypeFqn);
@@ -134,7 +134,7 @@
     ITypeSourceBuilder activityMapBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_PLANNERFIELD_ACTIVITYMAP);
     activityMapBuilder.setFlags(Flags.AccPublic);
     String activityMapSuperTypeSig = RuntimeClasses.getSuperTypeSignature(RuntimeClasses.IActivityMap, getDeclaringType().getJavaProject());
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(activityMapSuperTypeSig);
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(activityMapSuperTypeSig);
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractActivityMap) ||
         CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractExtensibleActivityMap)) {
       // super type sig
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java
index 197c8c7..882fd7c 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java
@@ -81,7 +81,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, IRuntimeClasses.AbstractTreeBox)) {
       // create inner type calendar
       ITypeSourceBuilder treeBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_TREEBOX_TREE);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java
index 87f8366..a71cd7c 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java
@@ -84,7 +84,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     if (CompareUtility.equals(superTypeFqn, IRuntimeClasses.AbstractTreeField)) {
       // create inner type calendar
       ITypeSourceBuilder treeBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_TREEBOX_TREE);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java
index 0f8dd9c..78cd566 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java
@@ -85,7 +85,7 @@
       nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry()));
       newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
     // TODO aho check generic type table!!!
     if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractTableField)) {
       // create inner type table
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java
index 03289ac..2f65525 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java
@@ -84,7 +84,7 @@
 
   @Override
   public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException, IllegalArgumentException {
-    String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature());
+    String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature());
 
     PrimaryTypeNewOperation newOp = new PrimaryTypeNewOperation(getTypeName(), getPackageNamePage(), getPageJavaProject());
     newOp.setIcuCommentSourceBuilder(CommentSourceBuilderFactory.createPreferencesCompilationUnitCommentBuilder());
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java
index c48ac2c..376253a 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java
@@ -10,7 +10,7 @@
  ******************************************************************************/
 package org.eclipse.scout.sdk.sourcebuilder.method;
 
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -39,7 +39,7 @@
 /**
  * <h3>{@link MethodSourceBuilderFactory}</h3> ...
  * 
- *  @author Andreas Hoegger
+ * @author Andreas Hoegger
  * @since 3.10.0 07.03.2013
  */
 public final class MethodSourceBuilderFactory {
@@ -144,8 +144,8 @@
       return null;
     }
     else {
-      Map<String, ITypeGenericMapping> genericMapping = new HashMap<String, ITypeGenericMapping>();
-      SignatureUtility.resolveGenericParametersInSuperHierarchy(SignatureCache.createTypeSignature(typeSourceBuilder.getElementName()), new String[0],
+      LinkedHashMap<String, ITypeGenericMapping> genericMapping = new LinkedHashMap<String, ITypeGenericMapping>();
+      SignatureUtility.resolveGenericParametersInSuperHierarchy(SignatureCache.createTypeSignature(typeSourceBuilder.getElementName()),
           typeSourceBuilder.getSuperTypeSignature(), typeSourceBuilder.getInterfaceSignatures().toArray(new String[typeSourceBuilder.getInterfaceSignatures().size()]), genericMapping);
 
       MethodSourceBuilder builder = new MethodSourceBuilder(methodName);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
index 20b87b7..2ae6996 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
@@ -976,9 +976,17 @@
   }
 
   public static String computeFormFieldGenericType(IType type, ITypeHierarchy formFieldHierarchy) throws CoreException {
-    if (type == null || type.getFullyQualifiedName().equals(Object.class.getName())) {
+    if (!TypeUtility.exists(type) || type.getFullyQualifiedName().equals(Object.class.getName())) {
       return null;
     }
+
+    // try value fields
+    String sig = SignatureUtility.resolveGenericParameterInSuperHierarchy(type, formFieldHierarchy.getJdtHierarchy(), IRuntimeClasses.IValueField, "T");
+    if (sig != null) {
+      return sig;
+    }
+
+    // for own models
     IType superType = formFieldHierarchy.getSuperclass(type);
     if (TypeUtility.exists(superType)) {
       if (TypeUtility.isGenericType(superType)) {
@@ -1010,7 +1018,7 @@
           replacement = Matcher.quoteReplacement(replacement.substring(0, replacement.length() - 1));
           signature = signature.replaceAll("[T,L,Q]" + signatureMapping.get(i).getSuperTypeGenericParameterName(), replacement);
         }
-        return SignatureUtility.getResolvedSignature(signature, type);
+        return SignatureUtility.getResolvedSignature(signature, type, type);
       }
       else {
         return computeFormFieldGenericType(superType, formFieldHierarchy);