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