How to rebuild thymeleaf output with Spring Roo after editing .ftl files? - thymeleaf

In the Spring Roo reference documentation, we see that
web mvc templates
setup Includes view generation templates on current
project. Will allow developers to customize view generation by
modifying the templates from [PROJECT-ROOT]/.roo/templates/…​
Once I modify the templates in .roo/templates/, how do I get those change reflected to the built out .html files that result from executing the command
web mvc controller --entity ~.model.MyObject --responseType THYMELEAF
? (EDIT 4 - I can't just run the above again as roo says ...'already exists')
I have tried
mvn clean package
and rerunning
mvn spring-boot:run
but the changes made in the .ftl files after they are generated never seem to be pushed into the output found in src\main\resources\templates. I assume there is a Roo Console command to run but the reference documentation seems to omit fully explaining this process.
EDIT
I've also tried adding the property
spring.thymeleaf.cache=false
but this didn't seem to help.
EDIT 2
I'm using the Roo CLI, not STS.
I am using a .roo file and the commands execute in the following order for this part of the process:
web mvc setup
web mvc view setup --type THYMELEAF
web mvc templates setup --type THYMELEAF
I am testing whether the order may be wrong here. (Update - nope, that's the correct order. view setup creates the output in the src directory, templates setup puts the .ftl files in the .roo directory. Just need to know how to trigger an update to the .html after editing the .ftl).
EDIT 3
I noticed in the freemarker documentation, which thymeleaf uses, that the config class is responsible for identifying the template loading functionality. When I looked in my generated code, I noticed the .aj files for the WebMvcConfiguration.java were not pushed in. I moved my .roo script push-in --all command to the end of my file and that took care of the errant .aj files. This doesn't seem to include a setDirectoryForTemplateLoading method or anything similar. It does create the following, which I plan to investigate further.
public TemplateEngine getTemplateEngine() {
return templateEngine;
}
#Bean
public ThymeleafViewResolver javascriptThymeleafViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(getTemplateEngine());
resolver.setCharacterEncoding("UTF-8");
resolver.setContentType("application/javascript");
resolver.setViewNames(new String[] { "*.js" });
resolver.setCache(getThymeleafProperties().isCache());
return resolver;
}
After these were added to the configuration I tried some edits to the .ftl files and both restarted the spring boot app and recompiled it. Neither resulted in the .ftl being processed to update the generated .html.
Still no resolution at the moment.
EDIT 5 (EDIT 4 is up above inline)
Playing around with the roo console now to see if I can figure this out. I learned that web mvc templates setup --type THYMELEAF overwrites any changes made to the .ftl files.

Related

Web API Help Pages not loading documentation XML

I'm trying to set up the ASP.NET Help Pages to run in an existing MVC project, though pointing towards the documentation file from a Web API project in the same solution. Convention has the Help Pages running inside the Web API that it's documenting but in this case I want it in a sibling MVC project.
The Web API project outputs its documentation XML file in a folder within the MVC project.
I've installed the Microsoft.AspNet.WebApi.HelpPage NuGet package in the MVC project. This creates a class \Areas\HelpPage\App_Start\HelpPageConfig.cs, and within this class's Register method I've passed the XmlDocumentationProvider the path to the Web API's documentation file.
But when I load the page, it's empty, aside from a title and a placeholder description.
Upon debugging the HelpController.Index method, I can see in the returned IApiExplorer that the _apiDescriptions are empty.
However, if I install the Help Pages directly into the Web API project and debug the same method, I can see that the _apiDescriptions are now present.
Can anyone explain what the Web API project is doing or has configured which the MVC project isn't doing or hasn't configured?
Just set this up myself, and I think I ran into a similar issue, if i'm reading what you're saying correctly.
Try the following:
Go to Areas\HelpPage\App_Start\HelpPageConfig.cs. Around line 36, you'll want to make sure you uncommented the line as below:
//// Uncomment the following to use the documentation from XML documentation file.
config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/ApiDocumentation.xml")));
And make sure the path is correct. I happened to put my xml file in the App_Data directory.
Go to Project=>Properties=>Build. Under Output, make sure the "XML documentation file" box is checked, and point it to App_Data\ApiDocumentation.XML (assuming you put it in the same place i did above.
If i remember correctly, i had to make sure i added the .xml file to the project- i had some problems when i tried publishing it to our test server at work and it said the file couldn't be found. After you build, simply go to App_Data, right click on the folder, and add existing item. navigate to App_Data in your file system and select the xml file.
This will hopefully fix your problem!
I'm not sure if this will help anyone else that stumbles across this, I had started with a blank template from VS and added the help files via the Nuget package.
Because it was a blank template and I had no areas set up, it was missing the following from the global.asax
AreaRegistration.RegisterAllAreas();
This prevented the HelpPageConfig.Register from being called and thus, the Xml Documentation provider was never set.

ASP MVC & MEF with plugin config files

Currently I have a web service, which loads up any plugins located within its /plugins folder. Now the problem is that each plugin has its own set of configuration data, currently hardcoded and isolated into a single class, but I want to move this out into a myplugin.config file.
Normally the web service loads up its own web.config file, but I am not sure if I can get the plugins to use their own ones. As if you imagine the main web service uses NHibernate and does CRUD stuff with some arbitrary data, but one of the plugins adds a caching layer using MongoDB and has its own connection string details. So the MVC web service shouldn't really care about these settings, it should just be the MyPlugin which would need to read them.
Is there any way to do this? As I just want to get away from having the connection string ingrained within the code.
I have sorted this problem now, I was able to do it without much work really once I found out how config files could be loaded in.
I made sure my config file was named after the assembly loaded via MEF, so if my assembly was:
some-custom-plugin.dll
You would make a config file named:
some-custom-plugin.dll.config
then you would call:
var config = ConfigurationManager.OpenExeConfiguration("some-custom-plugin.dll");
var someValue = config.AppSettings["some-app-setting"];
So hope this helps someone as it took me a while to find this simple thing out.

How to access the project documentation pages created using Gdoc in grails

I followed the tutorial on the grails documentation was successfully able to create project specific documentation pages by running the following command
grails doc
I was able to view the HTML pages from my desktop and I found them on the following directory:
..\target\docs\index.html
I was wondering how to access these generated HTML pages from the server. What is the URL to view them from the server?
I tried the following URL but did not work?
http://localhost:8080//docs/index.html
Also, the grails documentation states that the command will output an docs/manual/index.html
page. Rather I found the index.html page on the following directory:
..\target\docs\index.html
Can anyone help me in this?
Thanks
They're not built to be viewed from the running application, so they're not automatically exposed as a url. But you can move them to the web-app folder and they'll be accessible.
You can also configure the build location to be under web-app. Add this line to grails-app/conf/BuildConfig.groovy:
grails.project.docs.output.dir = 'web-app/docs'

Grails - Plugin view pages issue

I have a plugin with domain, controller and view pages. (Using grails 1.3.6)
I run the plugin as standalone, the views work fine. URL: http://localhost:8080/sample-plugin/gp/list. I am able to view the list page.
I installed the plugin into a main application i.e. plugin-test. Start as run-app within STS and browse to http://localhost:8080/plugin-test/gp/list. I am able to view the list page.
I bundle the application as war i.e. plugin-test.war and deploy to tomcat. When I browse to http://localhost:8181/plugin-test/gp/list I get a 404 error! I am not sure what I am doing wrong.
I have been trying to resolve it for quite sometime now and still no luck. The same main application works fine in STS but not in tomcat.
HTTP Status 404 - /plugin-test/WEB-INF/grails-app/views/gp/list.jsp
type Status report
message /plugin-test/WEB-INF/grails-app/views/gp/list.jsp
description The requested resource (/plugin-test/WEB-INF/grails-app/views/gp/list.jsp) is not available.
Please help.
Thank you.
Jay Chandran.
This sounds worryingly familiar, as I spent a while figuring out this (or a very similar) issue. I ended up raising this Grails bug report:
Plugin layout not found in war when installed from BuildConfig.groovy
Have you installed the plugin as using the new BuidConfig dependency technique? The JIRA documents my workaround.
Sharing some of my lessons learned after experiencing the same exact issue (1.3.7):
Double check your HTML source to make sure that your template really isn't being included. Mine was being included, but my CSS/image URLs were wrong (only while running as a war)...so I wrongly assumed that my template wasn't there.
Don't use the ui performance tags for referencing your static content...doesn't appear to work, even if the plugin attribute is specified.
Don't name your layout main.gsp. You're guaranteed to have conflicts.
Don't use absolute=true on your g:resource tags. This doesn't appear to append the pluginContextPath to the absolute url, even if you specify dir="${pluginContextPath}"
Don't use pluginContextPath, as it's no longer required: http://grails.org/doc/latest/guide/single.html#6.3%20Tag%20Libraries (search "Plugin Paths")
In your g:resource tags in your plugin layout, make sure you specify the plugin attribute. Set it to the name of your plugin.
Move your static images/css from your plugin to a web server. If each application using your plugin has its own copy, your users aren't going to benefit from caching when bouncing between apps.
Note that all of the above applies to the layout gsp in your plugin project, not your consuming application.

Is it possible to add Grails MVC classes at deployment time?

I'm writing a Grails app which I'd like 3rd parties to augment at runtime. Ideally they would be able to add a JAR/WAR to the webapp directory which contains new domain, controller and service classes, new views, and other content.
Is there a simple way to do this within grails? Would it be simplest to create a startup script which copies the new classes etc. into the relevant directories and then updates grails.xml and web.xml?
You will be able to do this in version 2 of grails in which plugins will be also OSGI plugins http://jira.codehaus.org/browse/GRAILS/fixforversion/15421
It seems that the Grails plugins will actually fit quite well for this: http://www.grails.org/Understanding+Plugins
A plugin can do just about anything... One thing a plugin cannot do though is modify the web-app/WEB-INF/web.xml or web-app/WEB-INF/applicationContext.xml files. A plugin can participate in web.xml generation, but not modify the file or provide a replacement. A plugin can NEVER change the applicationContext.xml file, but can provide runtime bean definitions

Resources