Re: Use file templates inside a project template

geertjan wielenga <[email protected]> Tue, 4 Jul 2017 11:29:46 +0200
Newsgroups gmane.comp.java.netbeans.modules.openide.devel
Organization Oracle Corporation
Message-ID <[email protected]>
Best is to create a small application on GitHub containing a simple 
scenario and then to say what kind of help you'd need in the context of 
that scenario.

Gj


On 4-7-2017 8:55, Iñigo Huguet wrote:
> 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!
>>
>>
>