1 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 ; 32 import javax.servlet.http.HttpServletRequest ; 33 import javax.servlet.http.HttpServletResponse ; 34 import javax.servlet.jsp.JspException ; 35 import javax.servlet.jsp.JspWriter ; 36 import javax.servlet.jsp.PageContext ; 37 import javax.servlet.jsp.tagext.SimpleTagSupport ; 38 import java.io.IOException ; 39 import java.util.Iterator ; 40 41 54 public class PortletTagHandler extends SimpleTagSupport 55 { 56 private static Logger log = Logger.getLogger(PortletTagHandler.class); 57 private String portletInstanceRef = null; 58 59 72 public void doTag() throws JspException , IOException 73 { 74 log.info("rendering portlet " + portletInstanceRef); 75 76 JspWriter 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 app = (PageContext )getJspContext(); 88 HttpServletRequest request = (HttpServletRequest )app.getRequest(); 89 HttpServletResponse response = (HttpServletResponse )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 ("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 i = regions.getRegionNames().iterator(); i.hasNext();) 115 { 116 region = regions.getRegion((String )i.next()); 117 if (region != null) 118 { 119 for (Iterator 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 MediaType mediaType = getMediaTypeFromResponse(response); 145 146 PortalLayout layout = (PortalLayout)request.getAttribute(LayoutConstants.PARAM_LAYOUT); 147 PortalRenderSet renderSet = layoutServer.getRenderSet(layout, mediaType); 148 String renderSetName = (String )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 ("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 getInstanceRef() 180 { 181 return portletInstanceRef; 182 } 183 184 public void setInstanceRef(String portletInstanceRef) 185 { 186 log.info("setting instance ref: " + portletInstanceRef); 187 this.portletInstanceRef = portletInstanceRef; 188 } 189 190 private static MediaType getMediaTypeFromResponse(HttpServletResponse 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 e) 200 { 201 log.error(e); 202 } 203 } 204 return contentType; 205 } 206 } 207 | Popular Tags |