uPortal IRC Logs-2013-03-20
[14:30:12 CDT(-0500)] <EricDalquist> drewwills: there?
[14:45:14 CDT(-0500)] <cwaymire> EricDalquist: hey got a quick question for you.
[14:45:19 CDT(-0500)] <EricDalquist> ok
[14:46:35 CDT(-0500)] <cwaymire> i've got a portlet that I added a Spring MVC controller into. I noticed that when calls come into that controller they have neither an active HttpSession nor does the request object contain a remote username.
[14:46:49 CDT(-0500)] <EricDalquist> this is a servlet controller?
[14:46:53 CDT(-0500)] <cwaymire> in this instance its important that I be able to get the user name
[14:46:59 CDT(-0500)] <cwaymire> yeah. standard spring mvc controller
[14:47:17 CDT(-0500)] <EricDalquist> so for the session to exist you need to make sure that the tomcat instance has emptySessionPath set to true
[14:47:24 CDT(-0500)] <EricDalquist> or whatever the TC7 version of that is
[14:47:31 CDT(-0500)] <EricDalquist> there will never be a remoteUser though
[14:47:33 CDT(-0500)] <cwaymire> let me double check my setting
[14:47:43 CDT(-0500)] <EricDalquist> that servlet is being directly accessed by the client
[14:47:49 CDT(-0500)] <EricDalquist> the portal has zero control over it
[14:48:00 CDT(-0500)] <EricDalquist> so none of the portal user's "state" is available
[14:48:07 CDT(-0500)] <EricDalquist> and in fact the session will only exist
[14:48:16 CDT(-0500)] <EricDalquist> if you have previously accessed a portlet in the same webapp
[14:48:19 CDT(-0500)] <EricDalquist> and that portlet created a session
[14:48:43 CDT(-0500)] <cwaymire> which is the case. are there any tricks to getting the username of the authenticated user?
[14:49:39 CDT(-0500)] <EricDalquist> the only way
[14:49:48 CDT(-0500)] <EricDalquist> is for the user to visit the portlet first
[14:49:57 CDT(-0500)] <EricDalquist> the portlet stores the username in the application scope in the portlet session
[14:50:01 CDT(-0500)] <EricDalquist> then the servlet can see that value
[14:50:10 CDT(-0500)] <EricDalquist> if the servlet is the first point of contact though
[14:50:10 CDT(-0500)] <EricDalquist> no
[14:50:12 CDT(-0500)] <EricDalquist> there is no way
[14:51:14 CDT(-0500)] <cwaymire> The portlet (Attachments) will always be there. It will basically be a hidden div on the page. An interaction in another portlet will cause a lightbox to display allowing the user to select a file to upload via a multipart POST.
[14:51:51 CDT(-0500)] <cwaymire> but I need to know who the user was that submitted the upload.
[14:52:13 CDT(-0500)] <EricDalquist> yeah they would need to visit the portlet first
[14:52:17 CDT(-0500)] <EricDalquist> why not have them upload to the porlet
[14:52:26 CDT(-0500)] <EricDalquist> portlets can deal with uploads via action and resource urls
[14:53:49 CDT(-0500)] <cwaymire> the idea was that the Attachments portlet would basically be an invisible portlet that wasnt rendered but would expose a global javascript api that would open up a lightbox div on the page allowing you to upload a file. So any portlet that wants to use attachments can simply call the global js method and give it a callback method. When the upload is done the callback method is executed with some result data.
[14:54:28 CDT(-0500)] <EricDalquist> so you are 'uploading" to the javascript?
[14:54:55 CDT(-0500)] <EricDalquist> or is the attachment stored somewhere that other portlets could potentially reference/access?
[14:55:51 CDT(-0500)] <cwaymire> the javascript makes an ajax call to submit the file to the controller which creates some database rows and will store the file on the filesystem.
[14:56:15 CDT(-0500)] <EricDalquist> ok
[14:56:16 CDT(-0500)] <cwaymire> the idea is any portlet can upload an attachment and then later reference that attachment. right now the functionality is going to be pretty limited
[14:56:26 CDT(-0500)] <EricDalquist> so why the servlet?
[14:56:34 CDT(-0500)] <EricDalquist> the portlet could do that competely within the portlet API
[14:56:46 CDT(-0500)] <EricDalquist> the attchment portlet renders in a hidden div
[14:56:55 CDT(-0500)] <EricDalquist> the JS that is written out includes a portlet resource url
[14:57:16 CDT(-0500)] <EricDalquist> the JS "upload attachment" api POSTs the file upload to the resource url
[14:57:32 CDT(-0500)] <EricDalquist> which accepts the upload, stores it, writes to the db and returns some JSON with the DB key to the new upload
[14:57:39 CDT(-0500)] <EricDalquist> which the other portlet can then use/store/etc
[14:57:57 CDT(-0500)] <cwaymire> The part I had trouble with was getting it to work on a ResourceMapping
[14:58:36 CDT(-0500)] <cwaymire> it didnt seem to send the right parameters across to the mapping
[14:59:07 CDT(-0500)] <cwaymire> i took the working code from the mvc controller and put it under a ResourceMapping and it didnt like the params.
[14:59:12 CDT(-0500)] <EricDalquist> what do you mean?
[14:59:22 CDT(-0500)] <EricDalquist> ah, do you have an example of that?
[14:59:50 CDT(-0500)] <cwaymire> yeah. i can gist it if you want
[14:59:53 CDT(-0500)] <EricDalquist> sure
[15:01:21 CDT(-0500)] <cwaymire> https://gist.github.com/anonymous/5207946
[15:01:21 CDT(-0500)] <cwaymire> https://gist.github.com/anonymous/5207952
[15:01:24 CDT(-0500)] <cwaymire> first one is the mvc controller
[15:01:28 CDT(-0500)] <cwaymire> second is a portlet resource mapping
[15:01:54 CDT(-0500)] <cwaymire> when I attempted to use the resource mapping I got an error saying org.springframework.web.portlet.bind.MissingPortletRequestParameterException: Required MultipartFile parameter 'qqfile' is not present
[15:01:55 CDT(-0500)] <EricDalquist> ok
[15:02:18 CDT(-0500)] <EricDalquist> but it works for the action request version of that?
[15:02:45 CDT(-0500)] <cwaymire> the mvc controller using a RequestMapping works
[15:03:06 CDT(-0500)] <EricDalquist> just out of curiousity
[15:03:06 CDT(-0500)] <cwaymire> at first I tried using an ActionMapping/RenderMapping pair but I need/want to return json
[15:03:12 CDT(-0500)] <EricDalquist> can you try doing this one: https://gist.github.com/anonymous/5207946
[15:03:23 CDT(-0500)] <EricDalquist> but change the ActionReq/Res to ResourceReq/Res
[15:03:35 CDT(-0500)] <EricDalquist> and use a resourceurl instead of an actionurl to call it
[15:03:41 CDT(-0500)] <EricDalquist> just to see if that makes any difference
[15:03:42 CDT(-0500)] <EricDalquist> if not
[15:03:48 CDT(-0500)] <EricDalquist> it is a bug either in spring or in uPortal
[15:04:16 CDT(-0500)] <EricDalquist> file upload is a pita, both spring an uportal have to be super extra careful to not touch the request body before the portlet wants to look at it
[15:04:24 CDT(-0500)] <EricDalquist> or it disappears as you can only read it once
[15:04:59 CDT(-0500)] <cwaymire> I had it working fine in the mvc controller. was able to see the file contents.
[15:05:03 CDT(-0500)] <cwaymire> ok. im going to recompile,d eploy and test
[15:05:31 CDT(-0500)] <EricDalquist> thanks
[15:10:37 CDT(-0500)] <cwaymire> that time I got: org.springframework.web.portlet.NoHandlerFoundException: No handler found for portlet request: mode 'view', phase 'RESOURCE_PHASE', parameters map[[empty]]
[15:10:50 CDT(-0500)] <EricDalquist> hrm
[15:10:59 CDT(-0500)] <EricDalquist> so somehow the parameters are not getting captured
[15:11:03 CDT(-0500)] <EricDalquist> is this code sharable at all?
[15:11:07 CDT(-0500)] <EricDalquist> like could you post it somewhere
[15:11:13 CDT(-0500)] <EricDalquist> and maybe tomorrow morning I could take a look at it?
[15:11:19 CDT(-0500)] <EricDalquist> I'm just worried there is a bug in uportal somwhere
[15:11:37 CDT(-0500)] <cwaymire> yeah. I can push this up to my github repo
[15:12:28 CDT(-0500)] <cwaymire> its frustrating because I had to go through several attempts to get it working properly and now the only blocker is with the MVC controller method I can't see the username.
[15:12:39 CDT(-0500)] <EricDalquist>
[15:12:43 CDT(-0500)] <EricDalquist> right
[15:12:45 CDT(-0500)] <cwaymire> it was the ajax portion that was a bit of a pita
[15:12:46 CDT(-0500)] <EricDalquist> well servlets are just servlets
[15:12:56 CDT(-0500)] <EricDalquist> and completely outside of the scope of the portal
[15:29:31 CDT(-0500)] <cwaymire> if I do it as a ResourceMapping it tells me it can't find the request parameter i'm looking for, but if I look at the http request going out I can see it defined in the request payload as form-data. not sure whats going on there.
[15:30:00 CDT(-0500)] <EricDalquist> yeah
[15:30:05 CDT(-0500)] <EricDalquist> that sounds like either a uportal or spring bug
[16:48:26 CDT(-0500)] <cwaymire> ok I think i have a temporary solution
[16:50:48 CDT(-0500)] <EricDalquist> great
[16:50:53 CDT(-0500)] <EricDalquist> I have to run and catch the bus
[16:51:01 CDT(-0500)] <cwaymire> heh. have fun.
[16:51:05 CDT(-0500)] <EricDalquist> but I'd love to hear about it tomorrow (or via reading chat logs)
[16:59:42 CDT(-0500)] <cwaymire> got it working. just had the AttachmentsPorltet inject the request.getRemoteUser() value into the session at application scope then had the mvc controller pull that value. The design was that the service methods would receive the request object and pull the remote user from there so I just created a class that extends HttpServletRequestWrapper and overrides the getRemoteUser method
[17:00:01 CDT(-0500)] <cwaymire> working great now.