En el post anterior de esta serie, agregué mucho código para manejar la generación de proyectos y soluciones .NET. Esos archivos son complicados. En contraste, generar algo similar para Java, no estan complejo, porque solo necesitamos generar las estructuras de directorios, y algun archivo para Ant o para Maven. Pero en .NET, tenemos que armar los archivos de proyectos (que no son simples) así como los de las soluciones.
El código de este post pueden bajarlo de AppExampleStep06.zip. Necesitan los binarios de AjGenesisTrunkBinaries.zip. Como siempre el project AjGenesis, incluyendo los ejemplos de esta serie de posts, puede ser bajado desde http://ajgenesis.codeplex.com.
Una de las partes complicadas, en el anterior post, fue agregar los archivos .cs y .vb al archivo del proyecto. Escribí entonces:
for each Entity in Project.Model.Entities TransformerManager.Transform("Templates/CSharp/EntityClass.tpl", "${Project.BuildDirectory}/${Project.Name}.Entities/${Entity.Name}.cs", Environment) PrjEntities.Includes.Add(CreateFileCs("${Entity.Name}")) end forLa list Includes dentro del objeto PrjEntities mantiene la información de los archivos a agregar en la generación del archivo de proyecto. En vez de agregar los archivos de esta forma, ahora, en este post, agrego los archivos que están en los directorios. Es decir, podemos ahora tener archivos manuales, escritos por nosotros, dentro del directorio resultado de la generación, y también serán reconocidos dentro de los archivos de proyecto C# y Visual Basic. De esta manera, podemos ir extendiendo los proyectos generados con nuestros propios archivos, que serán conservados en los proyectos despues de la generación de los archivos automáticos. En nuevo código está dentro de Utilities/DotNetUtilities.ajg:
Sub AddVbFilesToProject(project) di = new System.IO.DirectoryInfo(project.Directory) prefix = "" AddVbFiles(project, name, di) End Sub Sub AddVbFiles(project, prefix, di) for each fi in di.GetFiles("*.vb") name = fi.Name.Substring(0, fi.Name.Length - 3) project.Includes.Add(CreateFileVb(prefix & name)) end for sdirs = di.GetDirectories() for each sdir in sdirs AddVbFiles(project, prefix & sdir.Name & "\", sdir) end for End Sub Sub AddCsFilesToProject(project) di = new System.IO.DirectoryInfo(project.Directory) prefix = "" AddCsFiles(project, name, di) End Sub Sub AddCsFiles(project, prefix, di) for each fi in di.GetFiles("*.cs") name = fi.Name.Substring(0, fi.Name.Length - 3) project.Includes.Add(CreateFileCs(prefix & name)) end for sdirs = di.GetDirectories() for each sdir in sdirs AddCsFiles(project, prefix & sdir.Name & "\", sdir) end for End SubOtra “feature” que agregué en este paso: en el anterior post, cada vez que corríamos la generación de código, creaba y pisaba los archivos generados, aunque el contenido fuera al fin igual. Ahora, uso una rutina en Utilities/TransformUtilities.ajg:
Sub TransformFile(tpl, target, tm, env) if System.IO.File.Exists(target) then target2 = target & ".tmp" tm.Transform(tpl, target2, env) content1 = System.IO.File.ReadAllText(target) content2 = System.IO.File.ReadAllText(target2) if content1 <> content2 then System.IO.File.Copy(target2, target, true) end if System.IO.File.Delete(target2) else tm.Transform(tpl, target, env) end if End SubQue sólo pisa el archivo final si es distinto del anterior. Entonces, en vez de invocar directamente al objeto predefinido TransformerManager:
TransformerManager.Transform("Templates/CSharp/EntityClass.tpl", "${Project.BuildDirectory}/${Project.Name}.Entities/${Entity.Name}.cs", Environment)las tareas invocak a la nueva rutina, comparando el archivo anterior con el nuevo, para ver si reemplaza o no el archivo destino:
TransformFile("Templates/CSharp/EntityClass.tpl", "${Project.BuildDirectory}/${Project.Name}.Entities/${Entity.Name}.cs", TransformerManager, Environment)Próximos pasos, para los siguientes posts: incluir identidad en las entidades del modelo, generar una base de datos desde el modelo, generar código de DAOs, y hasta volver a generar Java, quizás con Ant.
Nos leemos
Angel “Java” Lopez
http://www.ajlopez.com