Re: Use file templates inside a project template

Iñigo Huguet <[email protected]> Tue, 4 Jul 2017 08:55:28 +0200
Newsgroups gmane.comp.java.netbeans.modules.openide.devel
Message-ID <[email protected]>
There isn't a way to get a file, process it with freemarker and save it 
in another location?


El 28/06/17 a las 10:31, Iñigo Huguet escribió:
> Hi!
>
> I wan't to create a project template with some files that are also 
> template files. This template files contains some variables like 
> ${user} which must be replaced with the "user" variable value.
>
> I have followed this tutorial to create the project template: 
> https://platform.netbeans.org/tutorials/nbm-projectsamples.html
>
> However, I don't know how to get the template files to be processed 
> with freemarker template engine, despite being trying for 3 days. I 
> haven't found any information about how to do what I want (only info 
> about project templates and file templates, but no one of both together).
>
> This is what I have tried:
>
> First, I modified the 'instantiate' method of the wizard iterator to 
> process the template files:
> [code]
>     public Set/*<FileObject>*/ instantiate(/*ProgressHandle handle*/) 
> throws IOException {
>         Set<FileObject> resultSet = new LinkedHashSet<FileObject>();
>         File dirF = FileUtil.normalizeFile((File) 
> wiz.getProperty("projdir"));
>         dirF.mkdirs();
>
>         FileObject template = Templates.getTemplate(wiz);
>         FileObject dir = FileUtil.toFileObject(dirF);
>         unZipFile(template.getInputStream(), dir);
>
>         ///// ADDED CODE
>         FileObject templ = 
> FileUtil.getSystemConfigFile("ADDITIONALSAMPLE_INIGO/templates/main.c");
>         Map<String, String> attrs = new HashMap<>();
>         attrs.put("javax.script.ScriptEngine", "freemarker");
>         attrs.put("user", "myName");
>         FileBuilder.createFromTemplate(templ, dir, "main", attrs, 
> FileBuilder.Mode.FORMAT);
>         ///// END OF ADDED CODE
>
>
>         // Always open top dir as a project:
>         resultSet.add(dir);
>         // Look for nested projects to open as well:
>         Enumeration<? extends FileObject> e = dir.getFolders(true);
>         while (e.hasMoreElements()) {
>             FileObject subfolder = e.nextElement();
>             if (ProjectManager.getDefault().isProject(subfolder)) {
>                 resultSet.add(subfolder);
>             }
>         }
>
>         File parent = dirF.getParentFile();
>         if (parent != null && parent.exists()) {
>             ProjectChooser.setProjectsFolder(parent);
>         }
>
>         return resultSet;
>     }
> [/code]
>
>
> I modified the templateregistration annotation of the top of the same 
> file and let it like this:
> [code]
> @TemplateRegistrations(value = {
>     @TemplateRegistration(folder = "Project/My custom project", 
> displayName = "#customproj_displayName", description = 
> "customproj.html", iconBase = 
> "org/myplugins/additionalsample/MyCustomProject.png", content = 
> "MyCustomProject.zip", scriptEngine = "freemarker"),
>     @TemplateRegistration(folder = "Others", content = 
> "templates/main.c", scriptEngine = "freemarker")
> })
> [/code]
>
>
> And finally I created this layer.xml file:
> [code]
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" 
> "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
> <filesystem>
>     <folder name="ADDITIONALSAMPLE_INIGO">
>         <folder name="templates">
>             <file name="main.c" url="templates/main.c" />
>         </folder>
>     </folder>
> </filesystem>
> [/code]
>
> However, main.c file is copied as is, the text '${user}' in the file 
> is copied literally, not processed by freemarker.
>
> And also, the project is created in disk but it's not added to the 
> open projects.
>
> Hope anyone can help me.
>
> Thanks!
>
>