Re: Use file templates inside a project template

Iñigo Huguet <[email protected]> Wed, 5 Jul 2017 10:33:39 +0200
Newsgroups gmane.comp.java.netbeans.modules.openide.devel
Message-ID <[email protected]>
Hi.

I just created a new module project following this tutorial: 
https://platform.netbeans.org/tutorials/nbm-projectsamples.html

I uploaded it to github, here: 
https://github.com/naggety/Netbeans-MyCustomProjType

This is just a custom template C/C++ project. Inside the zip file of the 
project template, there is a 'main.c' file that I need to be processed 
by freemarker when the new project is created (this way, the text 
'${user}' in the file will be replaced with the user name). I tried to 
achieve this in the way I described in my first message, but it didn't work.

As I said, there is a tutorial about file templates, but not for file 
templates inside project templates nor for processing file templates 
programmatically.

In addition, but less important for the moment, when I install the 
module from tools->plugins it says that the installation was 
unsuccessful. However, if I restart the IDE, the module is installed and 
working.


El 04/07/17 a las 11:29, geertjan wielenga escribió:
>
> 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!
>>>
>>>
>>
>
>

-- 
Pagina nueva 1

------------------------------------------------------------------------
Fanamoel S.A. 	

*P. I.  La Fuente, Nº 6*

*31250 – Oteiza (Navarra)*

*Tfno: +34 948 546 718*

*Fax: +34 948 546 735*

*Iñigo Huguet Embún *

*D**epartamento Técnico*

La información incluida en el presente correo electrónico y cualquier 
archivo adjunto al mismo están dirigidos exclusivamente a su 
destinatario. Pueden contener información confidencial o privilegiada. 
Si recibe esta comunicación sin ser el destinatario le informamos de que 
está prohibida cualquier utilización de la misma y le rogamos que nos lo 
notifique inmediatamente y la devuelva a su origen, asegurándose de que 
el mensaje original, cualquier copia relacionada con el mismo y sus 
archivos adjuntos sean eliminados de su sistema.


Asimismo, le informamos de que trataremos de forma confidencial su 
dirección de correo electrónico, así como el resto de los datos de 
carácter personal que nos facilite, y serán incluidos en un fichero del 
que FANAMOEL S.A., es titular y responsable. La finalidad del 
tratamiento será informarle y ofrecerle nuestros servicios. Vd. podrá 
ejercitar los derechos de acceso, rectificación, cancelación y oposición 
enviando un e-mail a la dirección arriba indicada.