On 5/31/2012 10:20 AM, Ade Lee wrote:
We appear to have come full circle. When I originally created the first drm servlets, I put them under their own package separate from the old "servlets" because they did not follow the servlet lifecycle - other than going through the RESTEasy servlets. Based on review discussions, we decided then to move them to be integrated with the existing code structure.
We need to rethink how all of this is packaged, keeping in mind some sort of continuity between the old and new interfaces so that it is easy to maintain.
So, lets go ahead and check in for now, and then rearrange as makes sense once we have carefully considered the packaging.
OK, pushed to master.
4. The getUserMessage() functions are perhaps not needed. If anything, they should be written as a single vargs method.
Changed to use varargs. This method is used to simplify the code, compare: - old: CMS.getUserMessage(getLocale(), "CMS_ADMIN_SRVLT_NULL_RS_ID") - new: getUserMessage("CMS_ADMIN_SRVLT_NULL_RS_ID")
But a better way to do this would be to specify locale the local as a protected variable in CMSResourceService.java. Then getLocale() would return this variable if it is non-null, or would find it from the headers.
You mean caching the value returned by getLocale()? That can be done, but the "locale" variable will be null until we call getLocale() at least once.
Then you can call the regular CMS.getUserMessage(locale, ....) without the getUserMessage() calls.
For this to work we'd have to set the "locale" first, so we need to call getLocale() somewhere. I'm not sure if calling it in the CMSResourceService constructor will work because the "headers" is injected, which I suppose can only happen after the object is constructed. We can call it in the beginning of each REST method, but that's not pretty. So for now I'm keeping the getUserMessage().
The problem with getUserMessage() is that you cannot call it from a non-RESTful servlet context. That is, you cannot call it from the old non-RESTful servlets. This is not important when you have implemented code that is completely independent of the old code (as in the case of the Users and Groups), but becomes a problem when you try to create modules that can be used by both the old and servlets.
Maintaining two completely independent structures of code for the old servlets and the new ones will quickly become a maintenance nightmare. And the old servlets will stay around for a long time.
Here is how I have been approaching this problem with regards to certificate issuance. 1. Create a class which contains the business logic of the process. In my case, I called it ProfileProcessor. The relevant servlet config and things like the locale are passed into the constructor of this object. 2. The object makes use of an Auditor, and maybe other classes like an Authenticator/ Authorizer. Ultimately, the Authenticator/Authorizer code will be moved into the Realm. 3. This class is instantiated by both the RESTful services and the old non-RESTful services. In both cases, we need to construct the ProfileProcessor, call the relevant function(s) and parse the results in the appropriate way.
So, while I'm all for getMessage() functions, they need to be done in a way that can be called from a common class like the ProfileProcessor. Right now, you have them in a place where only the RESTful servlets can invoke them. Maybe, like in the case of the Auditor, we need a Logger or Utility class which takes the Locale on instantiation, and provides getMessage() calls.
As discussed over IRC, the getUserMessage() is a convenience method which is specific to REST services similar to log() and audit() which we have specific implementations for CMSServlet and AdminServlet too. Common code such as UGSubsystem or the new ProfileProcessor should not rely on these methods. A better solution would be to use a different logger service that allows customization (ticket #195). -- Endi S. Dewata