Re: Use file templates inside a project template

geertjan wielenga <[email protected]> Wed, 5 Jul 2017 13:06:51 +0200
Newsgroups gmane.comp.java.netbeans.modules.openide.devel
Organization Oracle Corporation
Message-ID <[email protected]>
Sounds like your TemplateRegistration was wrong, somehow. Those 
annotations end up in the generated-layer.xml file.

Gj


On 5-7-2017 13:04, Iñigo Huguet wrote:
>
> OK, thanks!
>
> I will wait for you to take a look, and I will try to find it by 
> myself, as well.
>
>
> El 05/07/17 a las 12:38, geertjan wielenga escribió:
>>
>>
>> OK, so now that it works, it's not a high priority for me, right now. 
>> Will take a look at some point.
>>
>> Gj
>>
>>
>> On 5-7-2017 11:43, Iñigo Huguet wrote:
>>>
>>> I had registered it in the TemplateRegistration annotation, but not 
>>> in the layer.xml file.
>>>
>>> I just added '<attr name="javax.script.ScriptEngine" 
>>> stringvalue="freemarker"/>' in the layer.xml file and now it's working.
>>>
>>> I can continue now. However, I would like to understand why it 
>>> wasn't working, what I was doing wrong? What are the 
>>> TemplateRegistration annotations for?
>>>
>>> Note: look to the explanation in my first message, not the github 
>>> code, which is not complete
>>>
>>> Thanks
>>>
>>>
>>> El 05/07/17 a las 11:13, geertjan wielenga escribió:
>>>>
>>>>
>>>> Do you have your file template registered as FreeMarker"
>>>>
>>>>                         <attr name="javax.script.ScriptEngine" 
>>>> stringvalue="freemarker"/>
>>>>
>>>> See:
>>>>
>>>> https://blogs.oracle.com/geertjan/registering-freemarker-templates-in-netbeans-ide-71
>>>>
>>>> Thanks,
>>>>
>>>> Gj
>>>>
>>>> On 5-7-2017 10:56, geertjan wielenga wrote:
>>>>>
>>>>> Maybe take a look at this:
>>>>>
>>>>> https://blogs.oracle.com/geertjan/extension-to-extended-java-project-part-2
>>>>>
>>>>> Gj
>>>>>
>>>>>
>>>>> On 5-7-2017 10:33, Iñigo Huguet wrote:
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>
>>>>
>>>
>>> -- 
>>> 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.
>>>
>>
>
> -- 
> 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.
>