KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*****************************************
2  * *
3  * JBoss Portal: The OpenSource Portal *
4  * *
5  * Distributable under LGPL license. *
6  * See terms of license at gnu.org. *
7  * *
8  *****************************************/

9
10 package org.jboss.portal.core.theme.tag;
11
12 import org.apache.log4j.Logger;
13 import org.jboss.portal.common.MediaType;
14 import org.jboss.portal.core.theme.render.RendererFactory;
15 import org.jboss.portal.server.LayoutServer;
16 import org.jboss.portal.server.theme.LayoutConstants;
17 import org.jboss.portal.server.theme.PageHolder;
18 import org.jboss.portal.server.theme.PortalLayout;
19 import org.jboss.portal.server.theme.PortalRenderSet;
20 import org.jboss.portal.server.theme.Region;
21 import org.jboss.portal.server.theme.RegionOrientation;
22 import org.jboss.portal.server.theme.RegionSet;
23 import org.jboss.portal.server.theme.render.RenderContext;
24 import org.jboss.portal.server.theme.render.RenderException;
25
26 import javax.activation.MimeTypeParseException JavaDoc;
27 import javax.servlet.http.HttpServletRequest JavaDoc;
28 import javax.servlet.http.HttpServletResponse JavaDoc;
29 import javax.servlet.jsp.JspException JavaDoc;
30 import javax.servlet.jsp.JspWriter JavaDoc;
31 import javax.servlet.jsp.PageContext JavaDoc;
32 import javax.servlet.jsp.tagext.SimpleTagSupport JavaDoc;
33 import java.io.IOException JavaDoc;
34 import java.util.Iterator JavaDoc;
35
36 /**
37  * Tag handler for the region tag.
38  * <p>A region represents a subsection of a portal page. A region can host several portlets. The portlets can
39  * be arranged horizontally or vertically. The region tag utilizes a render set to create the markup around the
40  * individual portlets.</p>
41  *
42  * @author <a HREF="mailto:mholzner@novell.com>Martin Holzner</a>
43  * @version $LastChangedRevision$, $LastChangedDate$
44  * @see PortalRenderSet
45  * @see RendererFactory
46  */

47 public class RegionTagHandler
48    extends SimpleTagSupport JavaDoc
49 {
50    private static Logger log = Logger.getLogger(RegionTagHandler.class);
51    //default to vertical
52
private RegionOrientation orientation = RegionOrientation.VERTICAL;
53    private String JavaDoc regionName = null;
54
55    /**
56     * create the markup of this tag
57     *
58     * @throws JspException
59     * @throws IOException
60     */

61    public void doTag() throws JspException JavaDoc, IOException JavaDoc
62    {
63       log.debug("rendering " + regionName + " [" + orientation + "]");
64
65       // get page and region
66
PageContext JavaDoc app = (PageContext JavaDoc)getJspContext();
67       HttpServletRequest JavaDoc request = (HttpServletRequest JavaDoc)app.getRequest();
68       HttpServletResponse JavaDoc response = (HttpServletResponse JavaDoc)app.getResponse();
69
70       PageHolder requestedPage = (PageHolder)request.getAttribute(LayoutConstants.ATTR_PAGE);
71       JspWriter JavaDoc out = this.getJspContext().getOut();
72       if (requestedPage == null)
73       {
74          out.write("<p bgcolor='red'>No page to render!</p>");
75          out.write("<p bgcolor='red'>The page to render (PageHolder) must be set in the request attribute '" +
76             LayoutConstants.ATTR_PAGE + "'</p>");
77          out.flush();
78          return;
79       }
80
81       RegionSet regions = requestedPage.getRegions();
82
83       Region region = null;
84
85       if (regionName != null)
86       {
87          if (regions.getRegion(regionName) == null)
88          {
89             log.warn("requested page has no region [" + regionName + "]");
90             return;
91          }
92       }
93
94       // now try to make sense of it , and make it pretty ;)
95
try
96       {
97          LayoutServer layoutServer = (LayoutServer)request.getAttribute(LayoutConstants.ATTR_LAYOUTSERVER);
98          if (layoutServer == null)
99          {
100             log.error("no layout server provided in this request");
101             throw new JspException JavaDoc("no layout server provided in this request");
102          }
103
104          // the content type should be dynamically determined (set by interceptor)
105
MediaType mediaType = getMediaTypeFromResponse(response);
106
107          // get the layout and the renderSet name (if any was specified for the current portal)
108
PortalLayout layout = (PortalLayout)request.getAttribute(LayoutConstants.PARAM_LAYOUT);
109          PortalRenderSet renderSet = layoutServer.getRenderSet(layout, mediaType);
110          String JavaDoc renderSetName = (String JavaDoc)request.getAttribute(LayoutConstants.ATTR_RENDERSET);
111
112          if (renderSet == null && renderSetName != null)
113          {
114             renderSet = layoutServer.getRenderSet(renderSetName, mediaType);
115          }
116
117          if (renderSet == null)
118          {
119             log.error("render set cannot be determined : " + renderSetName);
120             throw new JspException JavaDoc("render set cannot be determined : " + renderSetName);
121          }
122
123          // if a region was specified, render that region
124
if (regionName != null)
125          {
126             if (regions.getRegion(regionName) != null)
127             {
128                region = regions.getRegion(regionName);
129                renderRegion(renderSet, mediaType, request, region, out);
130             }
131          }
132          else
133          {
134             // otherwise render all regions
135
//TODO: this is a hack to be able to have a 'maximized' region and have maximized portlets rendered there,
136
// even though the page definition has not such region
137
// This can be fixed, once the page data allows the layout strategy to move portlets into another
138
// region for the scope of a request
139
for (Iterator JavaDoc i = regions.getRegionNames().iterator(); i.hasNext();)
140             {
141                region = regions.getRegion((String JavaDoc)i.next());
142                renderRegion(renderSet, mediaType, request, region, out);
143             }
144          }
145
146       }
147       catch (RenderException e)
148       {
149          log.error(e);
150          out.write("<p>" + e.getMessage() + "</p>");
151          out.flush();
152       }
153
154       log.debug("done rendering page region [" + regionName + "]");
155    }
156
157    private void renderRegion(PortalRenderSet renderSet, MediaType mediaType, HttpServletRequest JavaDoc request, Region region, JspWriter JavaDoc out)
158       throws RenderException, IOException JavaDoc
159    {
160       RenderContext renderContext =
161          RendererFactory.getRenderContext(renderSet, mediaType, orientation, request);
162
163       renderSet.getRegionRenderer().render(renderContext, region);
164       out.write(renderContext.getMarkupFragment().toString());
165       out.flush();
166    }
167
168    private static MediaType getMediaTypeFromResponse(HttpServletResponse JavaDoc response)
169    {
170       MediaType contentType = MediaType.HTML;
171       if (response.getContentType() != null)
172       {
173          try
174          {
175             contentType = MediaType.parseMimeType(response.getContentType());
176          }
177          catch (MimeTypeParseException JavaDoc e)
178          {
179             log.error(e);
180          }
181       }
182       return contentType;
183    }
184
185
186    // ------ attribute handlers
187

188    /**
189     * Attribute handler for the orientation attribute of this tag
190     *
191     * @param orientation the orientation attribute value set in the hosting jsp
192     */

193    public void setOrientation(String JavaDoc orientation)
194    {
195       if (orientation == null)
196       {
197          log.error("no null value allowed");
198       }
199
200       try
201       {
202          this.orientation = RegionOrientation.parseOrientation(orientation);
203       }
204       catch (IllegalArgumentException JavaDoc e)
205       {
206          log.error(e);
207       }
208    }
209
210    /**
211     * Attribute handler for the region name attribute of this tag
212     *
213     * @param regionName the name of the region this tag should render the markup for
214     */

215    public void setRegionName(String JavaDoc regionName)
216    {
217       this.regionName = regionName;
218    }
219 }
220
Popular Tags