4 Replies Latest reply on Jan 31, 2007 12:05 PM by Antoine Herzog

    IPC Portlet calling itself?

    Jeremy Truax Newbie

      Can a portlet call itself if it is its own listener using IPC?

      I have a portlet that will pull out a content file from Alfresco but if that file has links, I want those links to send a request back to the portlet, in a sense refreshing it to display the new file being linked.

      Is this possible? If so, would I just treat windowB as the same node as windowA and it automatically work? Or is there some other setup I need to do?

        • 1. Re: IPC Portlet calling itself?
          Roy Russo Master

          What do you mean, your file has links? Do you mean links to resources like gifs/png/jpegs?

          • 2. Re: IPC Portlet calling itself?
            Jeremy Truax Newbie

            Basically I have a content display portlet that will display a file from Alfresco's CMS repository. Now if the file it displays happens to have HTML links to other files in Alfresco's repository, I want it to link back to the portlet with that file as a parameter.

            I was able to get this to work with just 1 portlet successfully....the content itself will simply have a relative link to a file in the repository and the portlet will scan for any links and superimpose a response.createActionURL() into them so that they actually send the filepath as a parameter to the portlet.

            • 3. Re: IPC Portlet calling itself?
              Jeremy Truax Newbie

              So the code that does this is below. What I'm wondering is if I even need the Listener since the portlet is just sending an action to itself? Is the Listener / service stuff only needed for other portlets to call each other? This is of course just POC/Experimenting code here.

              public class ContentDisplay extends JBossPortlet
               private String RootReferencePath = "/app:company_home";
               public void processAction(JBossActionRequest request, JBossActionResponse response) throws PortletException, PortletSecurityException, IOException
               String filename = request.getParameter("filename");
               if(filename != null)
               protected void doView(JBossRenderRequest rRequest, JBossRenderResponse rResponse) throws PortletException, PortletSecurityException, IOException
               String filename = rRequest.getParameter("filename");
               if(filename == null)
               filename = "index.html";
               AuthenticationUtils.startSession("admin", "admin");
               EngineConfiguration config = AuthenticationUtils.getEngineConfiguration();
               PrintWriter writer = rResponse.getWriter();
               Store STORE = new Store(StoreEnum.workspace, "SpacesStore"); //Root store for Alfresco
               filename = filename.replaceAll("/","/cm:");
               String refPath = RootReferencePath + "/cm:"+filename;
               Reference reference = new Reference(STORE, null,refPath);
               ContentServiceLocator contServLocator = new ContentServiceLocator(config);
               ContentServiceSoapPort contService = (ContentServiceSoapPort)contServLocator.getContentService();
               Content[] readResult = contService.read(new Predicate(new Reference[]{reference}, STORE, null), Constants.PROP_CONTENT);
               Content content = readResult[0];
               String contentUrl = content.getUrl() + "?ticket="+AuthenticationUtils.getCurrentTicket();
               StringBuilder content2Print = new StringBuilder();
               URL url = new URL(contentUrl);
               URLConnection conn = url.openConnection();
               BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
               while (br.ready())
               String finalContent = content2Print.toString();
               Pattern oldLinks = Pattern.compile("<a href=\"\$");
               finalContent = oldLinks.matcher(finalContent).replaceAll("<a href=\""+rResponse.createActionURL()+"&filename=");
               catch(Throwable e)
               Log.error(this,"Something bad happened: ",e);
               public static class Listener implements PortalNodeEventListener
               public PortalNodeEvent onEvent(PortalNodeEventBubbler bubbler, PortalNodeEvent event)
               PortalNode node = event.getNode();
               String nodeName = node.getName();
               WindowActionEvent newEvent = null;
               if(nodeName.equals("ContentDisplayPortlet") && event instanceof WindowActionEvent)
               WindowActionEvent wae = (WindowActionEvent) event;
               if(node != null)
               newEvent = new WindowActionEvent(node);
               if(newEvent != null)
               return newEvent;
               return bubbler.dispatch(event);

              • 4. Re: IPC Portlet calling itself?
                Antoine Herzog Master


                you may have find your answer by now.

                may be you can also look at the CMSObjectCommandFactory and the CMSObjectURLFactory.
                this may be a way to do what you need.
                (as for the gif, jpg, etc... sub content of a html page).

                see also how it uses the StreamContentCommand.
                and how it is used in the CMSPortlet.

                hope it helps,