KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > portal > core > theme > tag > PortletTagHandler


1 /*
2  * JBoss, the OpenSource J2EE webOS
3  *
4  * Distributable under LGPL license.
5  * See terms of license at gnu.org.
6  */

7
8 package org.jboss.portal.core.theme.tag;
9
10 import org.apache.log4j.Logger;
11 import org.jboss.portal.common.MediaType;
12 import org.jboss.portal.core.theme.render.RendererFactory;
13 import org.jboss.portal.server.LayoutServer;
14 import org.jboss.portal.server.PortalRequest;
15 import org.jboss.portal.server.PortalServer;
16 import org.jboss.portal.server.ServerObjectID;
17 import org.jboss.portal.server.Window;
18 import org.jboss.portal.server.WindowContext;
19 import org.jboss.portal.server.output.FragmentResult;
20 import org.jboss.portal.server.theme.Item;
21 import org.jboss.portal.server.theme.LayoutConstants;
22 import org.jboss.portal.server.theme.PageHolder;
23 import org.jboss.portal.server.theme.PortalLayout;
24 import org.jboss.portal.server.theme.PortalRenderSet;
25 import org.jboss.portal.server.theme.Region;
26 import org.jboss.portal.server.theme.RegionOrientation;
27 import org.jboss.portal.server.theme.RegionSet;
28 import org.jboss.portal.server.theme.render.RenderContext;
29 import org.jboss.portal.server.theme.render.RenderException;
30
31 import javax.activation.MimeTypeParseException JavaDoc;
32 import javax.servlet.http.HttpServletRequest JavaDoc;
33 import javax.servlet.http.HttpServletResponse JavaDoc;
34 import javax.servlet.jsp.JspException JavaDoc;
35 import javax.servlet.jsp.JspWriter JavaDoc;
36 import javax.servlet.jsp.PageContext JavaDoc;
37 import javax.servlet.jsp.tagext.SimpleTagSupport JavaDoc;
38 import java.io.IOException JavaDoc;
39 import java.util.Iterator JavaDoc;
40
41 /**
42  * Tag handler for the portlet tag.
43  * <p>This tag adds the created markup of a Portlet to a page. The portlet tag utilizes a render set to create
44  * the markup around the portlet. The render set takes care of the portlet window, hence it creates the markup for
45  * the title, and the mode and state links. This tag does not initiate the call to the portlet container, but rather
46  * is ment to assist in laying out the rendered markup, after it is generated by the portlet. (place the already rendered
47  * markup of portlet x here....)</p>
48  *
49  * @author <a HREF="mailto:mholzner@novell.com">Martin Holzner</a>.
50  * @version <tt>$Revision: 1.1 $</tt>
51  * @see RendererFactory#getRenderSet(String, String, ClassLoader, org.apache.xpath.CachedXPathAPI, org.w3c.dom.Node)
52  * @see PortalRenderSet
53  */

54 public class PortletTagHandler extends SimpleTagSupport JavaDoc
55 {
56    private static Logger log = Logger.getLogger(PortletTagHandler.class);
57    private String JavaDoc portletInstanceRef = null;
58
59    /**
60     * create the markup of this tag
61     * <p>Get a render set from the renderer factory, and call the window renderer to generate the root container for
62     * this Portlet's markup. The window renderer then delegates to the decoration renderer and the portlet renderer
63     * to create the markup for the title and the mode and state links, and to add the Portlet's markup.</p>
64     *
65     * @throws javax.servlet.jsp.JspException
66     * @throws java.io.IOException
67     * @see PortalRenderSet#getWindowRenderer
68     * @see org.jboss.portal.server.theme.render.WindowRenderer#render
69     * @see org.jboss.portal.server.theme.render.PortletRenderer#render
70     * @see org.jboss.portal.server.theme.render.DecorationRenderer#render
71     */

72    public void doTag() throws JspException JavaDoc, IOException JavaDoc
73    {
74       log.info("rendering portlet " + portletInstanceRef);
75
76       JspWriter JavaDoc out = this.getJspContext().getOut();
77
78       if (getInstanceRef() == null)
79       {
80          out.write("<p bgcolor='red'>No Portlet to render!</p>");
81          out.write("<p bgcolor='red'>The Portlet to render must be set in the tag attribute '" +
82             LayoutConstants.ATTR_PORTLET_INSTANCE_REF + "'</p>");
83          out.flush();
84          return;
85       }
86
87       PageContext JavaDoc app = (PageContext JavaDoc)getJspContext();
88       HttpServletRequest JavaDoc request = (HttpServletRequest JavaDoc)app.getRequest();
89       HttpServletResponse JavaDoc response = (HttpServletResponse JavaDoc)app.getResponse();
90
91       PageHolder requestedPage = (PageHolder)request.getAttribute(LayoutConstants.ATTR_PAGE);
92       if (requestedPage == null)
93       {
94          out.write("<p bgcolor='red'>No page to render!</p>");
95          out.write("<p bgcolor='red'>The page to render (PageHolder) must be set in the request attribute '" +
96             LayoutConstants.ATTR_PAGE + "'</p>");
97          out.flush();
98          return;
99       }
100
101       LayoutServer layoutServer = (LayoutServer)request.getAttribute(LayoutConstants.ATTR_LAYOUTSERVER);
102       if (layoutServer == null)
103       {
104          log.error("no layout server provided in this request");
105          throw new JspException JavaDoc("no layout server provided in this request");
106       }
107
108       RegionSet regions = requestedPage.getRegions();
109       Region region = null;
110       FragmentResult fragment = null;
111       PortalRequest portalRequest = (PortalRequest)request.getAttribute("REQ");
112       PortalServer container = portalRequest.getServer();
113
114       for (Iterator JavaDoc i = regions.getRegionNames().iterator(); i.hasNext();)
115       {
116          region = regions.getRegion((String JavaDoc)i.next());
117          if (region != null)
118          {
119             for (Iterator JavaDoc r = region.items(); r.hasNext();)
120             {
121                Item item = (Item)r.next();
122                FragmentResult fragmentResult = item.getFragment();
123                WindowContext windowContext = fragmentResult.getProducer();
124                Window window = (Window)container.getObject(windowContext.getID());
125                ServerObjectID instanceRef = ServerObjectID.createWindowID(window.getPortal().getName(), portletInstanceRef);
126                if (instanceRef.equals(windowContext.getID()))
127                {
128                   fragment = fragmentResult;
129                   break;
130                }
131             }
132          }
133       }
134
135       if (fragment == null)
136       {
137          out.write("<p bgcolor='red'>Required Portlet is not on this page!</p>");
138          out.write("<p bgcolor='red'>The Portlet " + getInstanceRef() + " is not on the requested page</p>");
139          out.flush();
140          return;
141       }
142
143       // the content type should be dynamically determined (set by interceptor)
144
MediaType mediaType = getMediaTypeFromResponse(response);
145
146       PortalLayout layout = (PortalLayout)request.getAttribute(LayoutConstants.PARAM_LAYOUT);
147       PortalRenderSet renderSet = layoutServer.getRenderSet(layout, mediaType);
148       String JavaDoc renderSetName = (String JavaDoc)request.getAttribute(LayoutConstants.ATTR_RENDERSET);
149
150       if (renderSet == null && renderSetName != null)
151       {
152          renderSet = layoutServer.getRenderSet(renderSetName, mediaType);
153       }
154
155       if (renderSet == null)
156       {
157          log.error("render set cannot be determined : " + renderSetName);
158          throw new JspException JavaDoc("render set cannot be determined : " + renderSetName);
159       }
160
161       try
162       {
163          RenderContext renderContext =
164             RendererFactory.getRenderContext(renderSet, mediaType, RegionOrientation.HORIZONTAL, request);
165          renderContext.getWindowRenderer().render(renderContext, fragment);
166          out.write(renderContext.getMarkupFragment().toString());
167          out.flush();
168       }
169       catch (RenderException e)
170       {
171          log.error(e);
172          out.write("<p bgcolor='red'>Error during rendering the Portlet</p>");
173          out.write("<p bgcolor='red'>" + e.getMessage() + "</p>");
174          out.flush();
175          return;
176       }
177    }
178
179    public String JavaDoc getInstanceRef()
180    {
181       return portletInstanceRef;
182    }
183
184    public void setInstanceRef(String JavaDoc portletInstanceRef)
185    {
186       log.info("setting instance ref: " + portletInstanceRef);
187       this.portletInstanceRef = portletInstanceRef;
188    }
189
190    private static MediaType getMediaTypeFromResponse(HttpServletResponse JavaDoc response)
191    {
192       MediaType contentType = MediaType.HTML;
193       if (response.getContentType() != null)
194       {
195          try
196          {
197             contentType = MediaType.parseMimeType(response.getContentType());
198          }
199          catch (MimeTypeParseException JavaDoc e)
200          {
201             log.error(e);
202          }
203       }
204       return contentType;
205    }
206 }
207
Popular Tags