7 Replies Latest reply on Jan 19, 2009 2:16 PM by uiterlix

    JBoss Portal WSRP <-> Sharepoint interoperability

    uiterlix

      Hi,

      Currently I'm trying to expose a JSR-168 portlet hosted in JBoss Portal 2.6.7 to a Sharepoint 2007 portal. I've made the portlet remotable and configured a WSRP web part in sharepoint. I also disabled the strict mode on the JBoss WSRP producer mbean. Everything seems fine when opening the sharepoint page since it correctly displays my portlet. But, things go wrong when I try to perform an action on the portlet. Sharepoint gives a "Page not found".
      The strange thing is when looking at the page source, the form post url does not seem to have been rewritten, and points to wsrp_rewrite....etc. This makes it quite understandable why sharepoint returns a 404 on a portlet action.

      I also configured the portlet as a remote portlet in another JBoss portal server instance, and enverything works fine there. JBoss portal server correctly rewrites the form post url, so I assume something is wrong on the sharepoint side.

      Does anyone know what I'm doing wrong ? Has anyone created a similar setup and encountered this problem as well ?


        • 1. Re: JBoss Portal WSRP <-> Sharepoint interoperability
          claprun

          Is there a way that you can post the SOAP messages relevant to the particular interaction?
          Any reason you are using 2.6.7 instead of 2.7?

          • 2. Re: JBoss Portal WSRP <-> Sharepoint interoperability
            uiterlix

            There's no specific reason for using 2.6.7, so I could give 2.7 a try.
            I can't post the SOAP messages since the action I'm trying to perform doesn't result in a SOAP call from sharepoint to jboss portal.

            Let me elaborate:

            Sharepoint renders my portlet correctly. On this portlet there's a button that should result in a processAction call (which actually works when running this portlet over wsrp in another jboss portal). The HTML rendered in sharepoint for this button looks as follows:



            The strange this is when looking at the same HTML fragment for the same portlet but then installed as a WSRP portlet in a JBoss portal, the form action url looks different since jboss actually rewrites the URL to something meaningful to itself, but sharepoint doesn't seem to since this URL is exactly the same as the actionurl as obtained from the renderresponse.

            Any ideas? It seems like a sharepoint problem, but I can't find any resolution on the internet, although it seems a pretty common integration scenario to me.

            • 3. Re: JBoss Portal WSRP <-> Sharepoint interoperability
              uiterlix

              I seems I can't edit my previous message, so here's the html form fragment I mention there:

              <Form method="post" action="wsrp_rewrite?wsrp-urlType=blockingAction&wsrp-interactionState=JBPNS_" id="componentform" Target="_self" >
              


              • 4. Re: JBoss Portal WSRP <-> Sharepoint interoperability
                claprun

                I'd like to see the SOAP interaction leading to the page that is causing you problems. Specifically I'm looking for any issues in the getMarkup call which would result in Sharepoint not rewriting the URL.

                • 5. Re: JBoss Portal WSRP <-> Sharepoint interoperability
                  uiterlix

                  I must have been running my application with old settings during my last sharepoint test, since I notice it actually rewriting the url now. I think it's because of the "/wsrp_rewrite" I added to the form action url later.

                  Although sharepoint rewrites the URL now, pressing the submit button in the portlet results in the portlet's render() method being called instead of processAction().

                  Here's the getMarkup request and response

                  Request:

                  POST /portal-wsrp/MarkupService HTTP/1.1
                  User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3053)
                  Content-Type: text/xml; charset=utf-8
                  SOAPAction: "urn:oasis:names:tc:wsrp:v1:getMarkup"
                  Host: 192.168.55.100:8081
                  Cookie: JSESSIONID=A7A0DCA4FAE2C685A68CB767D94A817C
                  Content-Length: 4211
                  Expect: 100-continue
                  
                  <?xml version="1.0" encoding="utf-8"?>
                  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                   <soap:Body>
                   <getMarkup xmlns="urn:oasis:names:tc:wsrp:v1:types">
                   <registrationContext>
                   <registrationHandle>11</registrationHandle>
                   </registrationContext>
                   <portletContext>
                   <portletHandle>/Application.InboxPortlet</portletHandle>
                   </portletContext>
                   <runtimeContext>
                   <userAuthentication>wsrp:password</userAuthentication>
                   <templates>
                   <defaultTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</defaultTemplate>
                   <blockingActionTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</blockingActionTemplate>
                   <renderTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</renderTemplate>
                   <resourceTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</resourceTemplate>
                   <secureDefaultTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</secureDefaultTemplate>
                   <secureBlockingActionTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</secureBlockingActionTemplate>
                   <secureRenderTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</secureRenderTemplate>
                   <secureResourceTemplate>wsrp_rewrite?wsrp-urlType={wsrp-urlType}&wsrp-url={wsrp-url}&wsrp-requiresRewrite={wsrp-requiresRewrite}&wsrp-navigationalState={wsrp-navigationalState}&wsrp-interactionState={wsrp-interactionState}&wsrp-mode={wsrp-mode}&wsrp-windowState={wsrp-windowState}&wsrp-fragmentID={wsrp-fragmentID}&wsrp-secureURL={wsrp-secureURL}/wsrp_rewrite</secureResourceTemplate>
                   </templates>
                   </runtimeContext>
                   <userContext>
                   <userContextKey>XANDER-685C0BE7\Administrator</userContextKey>
                   </userContext>
                   <markupParams>
                   <secureClientCommunication>false</secureClientCommunication>
                   <locales>en-us</locales>
                   <mimeTypes>text/html</mimeTypes>
                   <mimeTypes>text/xml</mimeTypes>
                   <mode>wsrp:view</mode>
                   <windowState>wsrp:normal</windowState>
                   </markupParams>
                   </getMarkup>
                   </soap:Body>
                  </soap:Envelope>
                  


                  Response
                  HTTP/1.1 100 Continue
                  
                  HTTP/1.1 200 OK
                  Server: Apache-Coyote/1.1
                  X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181417)/JBossWeb-2.0
                  Content-Type: text/xml;charset=UTF-8
                  Transfer-Encoding: chunked
                  Date: Wed, 14 Jan 2009 17:05:49 GMT
                  
                  <?xml version="1.0"?>
                  <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
                   <env:Header/>
                   <env:Body>
                   <ns1:getMarkupResponse xmlns:ns1="urn:oasis:names:tc:wsrp:v1:types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                   <ns1:markupContext>
                   <ns1:useCachedMarkup xmlns:ns1="urn:oasis:names:tc:wsrp:v1:types">false
                  </ns1:useCachedMarkup>
                   <ns1:mimeType xmlns:ns1="urn:oasis:names:tc:wsrp:v1:types">text/html
                  </ns1:mimeType>
                   <ns1:markupString xmlns:ns1="urn:oasis:names:tc:wsrp:v1:types">
                   <!DOCTYPE div PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                  <div xmlns="http://www.w3.org/1999/xhtml" id="bi-container" class="bi"><div id="bi-main"><div class="content"><div class="content" id="bi-main-content">
                  <form method="POST" action="wsrp_rewrite?wsrp-urlType=blockingAction&amp;amp;wsrp-interactionState=JBPNS_/wsrp_rewrite" id="componentform"><div>
                  <table class="master" cellspacing="0"><thead><tr><th class="first"><input onclick="allChecked(this);" value="select_all" name="cmd" type="checkbox" />
                  </th><th>Onderwerp</th><th>Bericht</th><th>Type</th><th class="last">Datum</th></tr></thead><tbody>
                  <tr class="even"><td><input value="22" name="delete-record" type="checkbox" onclick="&#10;&#9; &#9;&#9;&#9;&#9; unCheckMasterCheckBox(this);
                  &#10;&#9; &#9;&#9;&#9;&#9;" /></td><td><a href="http://intern.appserver.nl:81/Application/information_request/requeststab/inboxview?cmd=edit&
                  amp;record-id=22">Nieuws op de website</a></td><td>Nieuw verzoek</td><td>Vraag</td><td class="last">17-09-2008</td>
                  </tr></tbody></table><input onclick="handleSingleSubmit(this);" value="Verwijderen" name="remove" type="submit" class="delete-control btn" />
                  <input onclick="handleSingleSubmit(this);" value="Markeer als gelezen" name="mark-as-read" type="submit" class="mark-as-read-control btn" />
                  <pre>Action url: wsrp_rewrite?wsrp-urlType=blockingAction&amp;amp;wsrp-interactionState=JBPNS_</pre></div></form></div>
                  </div></div></div>
                  </ns1:markupString>
                   <ns1:locale xmlns:ns1="urn:oasis:names:tc:wsrp:v1:types">en
                  </ns1:locale>
                   <ns1:requiresUrlRewriting xmlns:ns1="urn:oasis:names:tc:wsrp:v1:types">true
                  </ns1:requiresUrlRewriting>
                   <ns1:preferredTitle xmlns:ns1="urn:oasis:names:tc:wsrp:v1:types">inbox portlet
                  </ns1:preferredTitle>
                   </ns1:markupContext>
                   </ns1:getMarkupResponse>
                   </env:Body>
                  </env:Envelope>
                  


                  • 6. Re: JBoss Portal WSRP <-> Sharepoint interoperability
                    uiterlix

                    I forgot to mention in my previous post:

                    Sharepoint rewrites the action url now to:

                    ?WSRPProducer=Application WSRP producer&WSRPPortletHandle=/Application.InboxPortlet&WSRPPortletState=&WSRPRegistrationHandle=11&WSRPRegistrationState=&WSRPMode=wsrp:view&WSRPWindowState=wsrp:normal&WSRPQualifiedName=g_9bcea8ab_df1d_4ced_b0f1_453faf9f2c10&WSRPIsAnonymous=False&WSRPAction=wsrp%5Frewrite%3Fwsrp%2DurlType%3DblockingAction%26amp%3Bwsrp%2DinteractionState%3DJBPNS%5F%2Fwsrp%5Frewrite
                    


                    • 7. Re: JBoss Portal WSRP <-> Sharepoint interoperability
                      uiterlix

                      We finally found the error.

                      If you look at the following URL, you'll find it contains a small mistake:

                      ?WSRPProducer=Application WSRP producer&WSRPPortletHandle=/Application.InboxPortlet&WSRPPortletState=&WSRPRegistrationHandle=11&WSRPRegistrationState=&WSRPMode=wsrp:view&WSRPWindowState=wsrp:normal&WSRPQualifiedName=g_9bcea8ab_df1d_4ced_b0f1_453faf9f2c10&WSRPIsAnonymous=False&WSRPAction=wsrp%5Frewrite%3Fwsrp%2DurlType%3DblockingAction%26amp%3Bwsrp%2DinteractionState%3DJBPNS%
                      5F%2Fwsrp%5Frewrite
                      


                      It contains "%26amp%3B" which is an encoded "&". This happend because when you obtain the render/action url from the PortletResponse, JBoss returns:

                      wsrp_rewrite?wsrp-urlType=blockingAction&wsrp-interactionState=JBPNS_
                      


                      I don't quite understand why the url obtained from the PortletResponse contains an URL that has already escaped the "&", but undoing this escaping by replacing the "&" with just "&" solves the problem.