CAY-2338 Support comments in cgen and default templates
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
index ed607be..aee42bd 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/singleclass.vm
@@ -50,6 +50,12 @@
 #end
 ${importUtils.generate()}
 
+#set ( $comment = ${metadataUtils.getComment($object)} )
+#if ( $comment )
+/**
+ * $comment
+ */
+#end
 public#if("true" == "${object.isAbstract()}") abstract#end class ${subClassName} extends ${baseClassName} {
 
     private static final long serialVersionUID = 1L;
diff --git a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
index a269bbb..49c0ff9 100644
--- a/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v4_1/superclass.vm
@@ -57,6 +57,12 @@
  * It is probably a good idea to avoid changing this class manually,
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
+#set ( $comment = ${metadataUtils.getComment($object)} )
+#if ( $comment )
+ *
+ * $comment
+ *
+#end
  */
 public abstract class ${superClassName} extends ${baseClassName} {
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
index fa1545d..8474a22 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/testmap/auto/_Artist.java
@@ -21,6 +21,9 @@
  * It is probably a good idea to avoid changing this class manually,
  * since it may be overwritten next time code is regenerated.
  * If you need to make any customizations, please use subclass.
+ *
+ * Example of a comment
+ *
  */
 public abstract class _Artist extends BaseDataObject {
 
diff --git a/cayenne-server/src/test/resources/testmap.map.xml b/cayenne-server/src/test/resources/testmap.map.xml
index 5ec09e0..e7727c8 100644
--- a/cayenne-server/src/test/resources/testmap.map.xml
+++ b/cayenne-server/src/test/resources/testmap.map.xml
@@ -87,6 +87,7 @@
 	<obj-entity name="Artist" className="org.apache.cayenne.testdo.testmap.Artist" dbEntityName="ARTIST">
 		<obj-attribute name="artistName" type="java.lang.String" db-attribute-path="ARTIST_NAME"/>
 		<obj-attribute name="dateOfBirth" type="java.util.Date" db-attribute-path="DATE_OF_BIRTH"/>
+		<info:property xmlns:info="http://cayenne.apache.org/schema/10/info" name="comment" value="Example of a comment"/>
 	</obj-entity>
 	<obj-entity name="ArtistCallback" className="org.apache.cayenne.testdo.testmap.ArtistCallback" dbEntityName="ARTIST_CT">
 		<obj-attribute name="artistName" type="java.lang.String"/>
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
index 1c863f0..88bfaa2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
@@ -35,7 +35,10 @@
 
 import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.configuration.event.DataMapListener;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.ModuleLoader;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
@@ -182,9 +185,12 @@
 
     public void generateAction() {
         CgenConfiguration cgenConfiguration = createConfiguration();
+        List<Module> modules = new ModuleLoader()
+                .load(CayenneToolsModuleProvider.class);
+        modules.add(binder -> binder.bind(DataChannelMetaData.class)
+                .toInstance(projectController.getApplication().getMetaData()));
         ClassGenerationAction generator = DIBootstrap
-                .createInjector(new ModuleLoader()
-                        .load(CayenneToolsModuleProvider.class))
+                .createInjector(modules)
                 .getInstance(ClassGenerationActionFactory.class)
                 .createAction(cgenConfiguration);