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!
>>
>>
>