public String fullyQualifiedTypeName(String subPath, String filePrefix) {
        requireNonNull(filePrefix);
        
        // subPath is nullable
        if (subPath == null || subPath.isEmpty()) {
            return basePackageName() + "." + ucfirst(filePrefix) + typeName(HasAlias.of(document));
        } else {
            return basePackageName() + "." + subPath + "." + ucfirst(filePrefix) + typeName(HasAlias.of(document));
        }
    }
Returns the fully qualified type name of the current document. The 
specified sub-path will be added after the base package name and before 
the type name of the node. The sub-path should not contain either leading 
nor trailing dots.
<p>
Example:
<ul>
     <li>{@code com.speedment.example.employeesschema.EmployeesSchema}
     <li>{@code com.speedment.example.usertable.UserTable}
     <li>{@code com.speedment.example.usertable.firstname.Firstname}
</ul>
<p>
Note that this method is only meant to work with nodes at {@code Table} 
or higher level in the hierarchy. It will return a result for all 
documents located in a valid hierarchy, but the result might not be as 
intended.

@param subPath     a prefix that will be added to the "class"-part of the
                   type name
@param filePrefix  a sub-path to be added at the end of the 
                   'package'-part of the qualified type name. This value 
                   can be {@code null} and in that case an ordinary 
                   {@code fullyQualifiedTypeName} will be returned.
@return            the fully qualified type name of the current document
@see
<a href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.5.5.2">
     Concerning fully qualified type names
</a>
generator-parent/generator-translator/src/main/java/com/speedment/generator/translator/TranslatorSupport.java