log every method call in JSF using logback - jsf

Hello guys I'm new in java and JSF, my boss asks me to auto log every events or method call in a web application made with JSF
please help

You are looking for single use case, while I was infront of handling multiple cases especially to reduce source code base on my latest project... and I found shining stuff in form of Aspect Oriented Programming -> AspectJ in Java world.
You can find very nice articles here:
http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html
You can implement the behaviour with custom annotation or simply hard-link it into your application, so you don't need to specify nothing in the code and each event will be autologed with specific behaviour (log with/without data, etc.).
Another very nice example of doing this is here:
http://www.baeldung.com/spring-performance-logging
Just to add, same as you log events, you can create AspectJ auto logging in case of error handlers.
Not only this, but you can handle in fully generic way across whole application all errors in unified way by not writing simple line of code in error/event handlers...
NOTE: do not reinvent wheel, so look here as other people collected usefull AOP to be reused in your project out of the box :-)) open source is great community:
https://github.com/jcabi/jcabi-aspects

You can use Interceptors for this purpose if your managedbeans are CDI. Check the official tutorial for Interceptor here https://docs.oracle.com/javaee/7/tutorial/cdi-adv006.htm
Interceptor can intercept every method call in CDI and you can hookup your logging code inside of the interceptor method.

Related

How to understand the flow of a JSF application from the code side?

I am trying to get into a big JSF application made by others with almost no documentation. I already got a general comprehension of the application architecture, and about what it should do from a functional point of view. But now I would like to understand what is the process in the code when I navigate in the application using my web browser.
I especially lack sequence diagrams that would show for a single story what code is called.
I tried using debug mode in eclipse and use break points to see what is called, but since a lot of code is called by the faces servlet, the step by step keeps returning into the JSF library and I am wasting a lot of time guessing what part of the code might be called next. I also look into the xhtml code to see what methods are called, but since each JSF page visible in the browser is made of a dozen of tiny xhtml fragments (using ui composition and custom components) it is quite easy to get lost.
So here is my question: Is there an easy way to associate a story from the browser point of view with the corresponding code in the backing beans?
Ok
I finally managed to get a better understanding of what was happening, thanks to all the comments on my questions, and to the facesTrace project, which was originally part of primefaces and aims to enhance the traceability of JavaServer Faces based applications. I found here how to configure it, and I adapted it a little to my project. Suprinsingly, it worked very well (the project is JSF 1.1). Then I wanted to get the logs working in FacesTrace. I found a hint there, but had to adapt a little because the package name of the Appender has changed.
I would have loved to give a few more links but Stackoverflow limits me to two links, hope those will stay alive forever.
To be fair, using a good old logger and a context listener would produce the same result, but what I appreciate is that it is well presented and I can reduce the scope of the log to the log of the request, even though I have some doubts of what would happens if several users were debugging at the same time since it uses log4J.

Differences between adfc-config.xml and faces-config.xml?

Both files seem very similar, subsequently I'm struggling to understand their purposes.
I have seen faces-config referred to as a plain JSF controller, while adfc-config is an extended ADF controller.
Some clarification would be good, as right now I can't see why you would have both in an ADF application if that is the case, so I must be missing something.
adfc-config is different from faces-config
Faces Config is the controller of your application, it's what make JSF based frameworks work effectively, and it's where you will need to define your own customization like view handlers, converters, validators, etc...
adfc-config is just the main application unbounded Task Flow, which make it a little easier for developers to define their pages and main navigation root inside of it instead of doing it the JSF way and define them in faces config, it also provide additional functionality like defining managed beans which will have much more scopes than the original JSF given the ADF Framework additions, but still at the end it's just an Unbounded Task Flow. Here is the documentation reference about adfc-config.xml
adfc-config is used by the ADF Faces framework, when task flows are in the picture.
More information at: http://docs.oracle.com/cd/E23943_01/web.1111/b31974/taskflows.htm
Yes, you are right when you say that the functionality looks similar. Things like pageFlowScope / backingBeanScope / task flows / etc. are extensions to the standard JSF framework and require a custom configuration file.
So, if you create a project based on the Fusion WebApplication template, then you will see a default adfc-config.xml file entry.
Hope that helps.

breezejs with a repository

We have been looking closely at SPAs using Breezejs for providing the data context between the client and the server. The features look great on the client, but we want to use the Repository pattern on the server and get good separation of concerns without having to inherit from EFContextProvider which would cause problems with IoC and possibly unit testing/mocking. We have been following John Papa's Code Camper sample on Pluralsight which initially set out using a Respository/UoW pattern without Breeze which then led us to look at the Hot Towel template which does include Breeze.
Does anyone know how Breeze can be abstracted to a Repository which keeps the DbContext cleanly (if using Entity Framework) encapsulated. Also, what happens if you are not using Entity Framework and prefer to use another ORM such as nHibernate.
Thanks for posting here as I am sure others will ask this :)
If you don't use EF then you won;t get the automatic metadata creation that Breeze provides. You can certainly abstract the EF context into a Repo however, and still get the benefits.
The Breeze/Knockout ASP.NET SPA template shows the repository broken out. I believe there is a sample for the UoW somewhere - tho it escapes me where. I have asked the Breeze folks to point to an answer for that.
If you use nHibernate there is no automatic metadata - however that is a great feature request I could see for Breeze.

Securing JSF applications

I've been asked by a freelancer friend of mine to join him on a JSF 2.0 project, and I'm slowly picking up speed and putting the pieces together. Coming from a Windows Forms .NET world, I have a lot to learn to say the least.
My major concern is with the lack of apparent consensus on how to protect a JSF application.
Some methods have been proposed here on SO, including using Spring security, Seam security, custom phase listeners, or simply using the rendered="#{...}" attribute to show/hide components based on user authentication.
I have tried to implement some of these methods, for example Spring security, only to find out that it gets easily defeated by the JSF navigation mechanism that forwards to views instead of redirecting. In other words, Spring security will work fine if the user types in the url of a secured page directly, but not if a h:commandButton's action takes him there.
In view of this, some have suggested to force a redirect by using "faces-redirect=true", but we feel that this could become a performance issue as this causes 2 requests from the browser each time.
On the other hand, I gave up trying to implement Seam security after getting so many missing dependencies errors.
The best solution I have found so far is a custom phase listener from Duncan Mills - Effective Page Authorization In JavaServer Faces, but I'm not 100% convinced this should be used on public facing JSF applications.
So finally, what does this leave us with ? I know this is a pretty wide open ended question, but I honestly have no clue where to go next. I'm pretty sure I have followed the different tutorials to the letter, for example Spring tutorials, but I'm still not satisfied with the way it works.
Could anyone at least confirm/infirm the fact that Spring security is supposed to work across JSF forwards, as I've seen many posts by others having the same issue ? That would at least give me a direction to keep going.
Thank you.
Combination of servlet filter for page validation (applied to the faces servlet), identity session bean (storing user attributes e.g. Role, login id) and a few methods for entitlement checks (e.g. isAdmin(), canViewRecord(recordID)) well ised throughout your page.
You see, when it comes to security I opt for not leaving it in anybody else's hand. also, I validate in several places (hiding a component won't keep folks from forging the right POST request to trigger specific bean methods so watch out).
When I work with JSF I use spring-security.
About the behavior that you comment that spring security allows redirections done with commands button, is weird you must have a wrong configuration because it seams working fine in my project (I just tested).
In any case you can also use the spring security tags to render or not components according to the user's role.
This is a project that can help you to implement the tags.
http://www.dominikdorn.com/facelets/
Hope this helps..

Are JSF/Seam/Spring suited for non-enterprise work? (website, not "web application")

I'm starting work on a new website (sort of an e-commerce product comparison thing) and I'm trying to choose what technologies to build it on. I've ruled out PHP and I don't think I want to use Python or Ruby. I really like Java and Hibernate so I started looking into Java-based web technologies.
My problem is that all of the documentation and examples I've read can't seem to stop repeating the words "enterprise" and "web applications." I'm afraid of ending up with giant XML configuration files and business-oriented components while losing the ability to actually design the website. From what I've read of JSF, I like the idea of reusable components, but I still want the ability to customize individual pages. So my question is, are JSF/Seam/Spring well-suited for non-enterprise development? If not, what Java technologies are?
I have just started looking into JSF/Seam so please forgive me if this is an uninformed quesiton. Thanks in advance. :)
No problem. The JSF/Seam stack gives you all the customization you want, and it has very few XML files. In fact, it uses a lot of annotations to define entities and components, so you don't have to worry about writing tou much XML (it is one of the reason why Seam was invented).
JSF's standard components are rendered as simple HTML tags, while if you want to go AJAX and use Richfaces it will be a little harder to customize it, but nothing dramatic. I can assure you that for the view part, you can write whatever you want in your webpages.
Here's a nice reference of how the JSF tags are rendered.
For the model and DB part, the JPA framework gives you the ability to work with simple Java Objects, and sometimes using it in an "enterprise" context with legacy schema is even more difficult, so don't worry.
For a simple website you may safely skip the EJB part, this will help you writing a more cleaner project structure. You can package all your website in a simple .WAR file.
As for the "enterprise" word, I think it is more related to the fact that the Java EE framework gives you the feature you may need in an enterprise context, (i.e. EJBs), but you can avoid them.
They don't bite.

Resources