001: /******************************************************************************
002: * JBoss, a division of Red Hat *
003: * Copyright 2006, Red Hat Middleware, LLC, and individual *
004: * contributors as indicated by the @authors tag. See the *
005: * copyright.txt in the distribution for a full listing of *
006: * individual contributors. *
007: * *
008: * This is free software; you can redistribute it and/or modify it *
009: * under the terms of the GNU Lesser General Public License as *
010: * published by the Free Software Foundation; either version 2.1 of *
011: * the License, or (at your option) any later version. *
012: * *
013: * This software is distributed in the hope that it will be useful, *
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of *
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
016: * Lesser General Public License for more details. *
017: * *
018: * You should have received a copy of the GNU Lesser General Public *
019: * License along with this software; if not, write to the Free *
020: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
021: * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
022: ******************************************************************************/package org.jboss.portal.theme.impl;
023:
024: import org.jboss.portal.common.util.ContentInfo;
025: import org.jboss.portal.theme.LayoutInfo;
026: import org.jboss.portal.theme.LayoutServiceInfo;
027: import org.jboss.portal.theme.PortalRenderSet;
028: import org.jboss.portal.theme.ThemeConstants;
029: import org.jboss.portal.theme.render.ObjectRenderer;
030: import org.jboss.portal.theme.render.ObjectRendererContext;
031: import org.jboss.portal.theme.render.RendererContext;
032: import org.jboss.portal.theme.render.RendererFactory;
033: import org.jboss.portal.theme.render.renderer.DecorationRendererContext;
034: import org.jboss.portal.theme.render.renderer.PageRenderer;
035: import org.jboss.portal.theme.render.renderer.PageRendererContext;
036: import org.jboss.portal.theme.render.renderer.PortletRendererContext;
037: import org.jboss.portal.theme.render.renderer.RegionRendererContext;
038: import org.jboss.portal.theme.render.renderer.WindowRendererContext;
039:
040: /**
041: * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
042: * @version $Revision: 8784 $
043: */
044: public class RendererFactoryImpl implements RendererFactory {
045:
046: /** . */
047: private PageRenderer pageRenderer;
048:
049: /** . */
050: private LayoutServiceInfo layoutServiceInfo;
051:
052: /** . */
053: private LayoutInfo layoutInfo;
054:
055: public RendererFactoryImpl(PageRenderer pageRenderer,
056: LayoutServiceInfo layoutServiceInfo, LayoutInfo layoutInfo) {
057: this .pageRenderer = pageRenderer;
058: this .layoutServiceInfo = layoutServiceInfo;
059: this .layoutInfo = layoutInfo;
060: }
061:
062: public ObjectRenderer getRenderer(RendererContext rendererContext,
063: ObjectRendererContext objectRendererContext) {
064: if (objectRendererContext instanceof PageRendererContext) {
065: return pageRenderer;
066: }
067: if (objectRendererContext instanceof RegionRendererContext) {
068: return getRegionRenderer(rendererContext,
069: (RegionRendererContext) objectRendererContext);
070: } else if (objectRendererContext instanceof WindowRendererContext) {
071: return getWindowRenderer(rendererContext,
072: (WindowRendererContext) objectRendererContext);
073: } else if (objectRendererContext instanceof PortletRendererContext) {
074: return getPortletRenderer(rendererContext,
075: (PortletRendererContext) objectRendererContext);
076: } else if (objectRendererContext instanceof DecorationRendererContext) {
077: return getDecorationRenderer(rendererContext,
078: (DecorationRendererContext) objectRendererContext);
079: }
080: return null;
081: }
082:
083: private ObjectRenderer getRegionRenderer(
084: RendererContext rendererContext,
085: RegionRendererContext objectRenderContext) {
086: return getRenderSet(rendererContext).getRegionRenderer();
087: }
088:
089: /**
090: * Get the window renderer for the provided window. <p>The window result can optionally contain a window property
091: * that points to a render set to use when getting the window renderer. If no window property was provided, then the
092: * default render set of this context will be used.</p>
093: *
094: * @param result the window result possibly containing the window property that specifies an alternative render set
095: * name for the window renderer to use
096: * @return a window renderer
097: */
098: public ObjectRenderer getWindowRenderer(
099: RendererContext rendererContext,
100: WindowRendererContext result) {
101: String renderSetName = null;
102: if (result != null) {
103: renderSetName = result
104: .getProperty(ThemeConstants.PORTAL_PROP_WINDOW_RENDERER);
105: }
106:
107: //
108: if (result != null && renderSetName == null) {
109: renderSetName = rendererContext
110: .getProperty(ThemeConstants.PORTAL_PROP_WINDOW_RENDERER);
111: }
112:
113: //
114: if (renderSetName != null) {
115: PortalRenderSet renderSet = layoutServiceInfo.getRenderSet(
116: renderSetName, rendererContext.getContentType());
117:
118: //
119: if (renderSet != null) {
120: return renderSet.getWindowRenderer();
121: }
122: }
123:
124: //
125: return getRenderSet(rendererContext).getWindowRenderer();
126: }
127:
128: /**
129: * Get the decoration renderer for the window that the provided window result is associated with. <p>If the window
130: * result contains a window property that points to a render set, that render set will be used to determine the
131: * decoration renderer. Otherwise, the render set that was determined for this context will be used.</p>
132: *
133: * @param result the window result possibly containing the window property that specifies an alternative render set
134: * name for the decoration renderer to use
135: * @return a decoration renderer
136: */
137: public ObjectRenderer getDecorationRenderer(
138: RendererContext rendererContext,
139: DecorationRendererContext result) {
140: String renderSetName = null;
141:
142: if (result != null) {
143: renderSetName = result
144: .getProperty(ThemeConstants.PORTAL_PROP_DECORATION_RENDERER);
145: }
146:
147: //
148: if (result != null && renderSetName == null) {
149: renderSetName = rendererContext
150: .getProperty(ThemeConstants.PORTAL_PROP_DECORATION_RENDERER);
151: }
152:
153: //
154: if (renderSetName != null) {
155: PortalRenderSet renderSet = layoutServiceInfo.getRenderSet(
156: renderSetName, rendererContext.getContentType());
157:
158: //
159: if (renderSet != null) {
160: return renderSet.getDecorationRenderer();
161: }
162: }
163:
164: //
165: return getRenderSet(rendererContext).getDecorationRenderer();
166: }
167:
168: /**
169: * Get the portlet renderer for the render set defined in the window properties that were provided. <p>If the
170: * provided window result doesn't contain any window property that defines a render set name, the default render set
171: * that was determined for this context will be used to get the portlet renderer.</p>
172: *
173: * @param result the window result containing the window properties to introspect for a render set name to get the
174: * portlet renderer from
175: * @return a portlet renderer
176: */
177: public ObjectRenderer getPortletRenderer(
178: RendererContext rendererContext,
179: PortletRendererContext result) {
180: String renderSetName = null;
181:
182: //
183: if (result != null) {
184: renderSetName = result
185: .getProperty(ThemeConstants.PORTAL_PROP_PORTLET_RENDERER);
186: }
187:
188: //
189: if (result != null && renderSetName == null) {
190: renderSetName = rendererContext
191: .getProperty(ThemeConstants.PORTAL_PROP_PORTLET_RENDERER);
192: }
193:
194: //
195: if (renderSetName != null) {
196: PortalRenderSet renderSet = layoutServiceInfo.getRenderSet(
197: renderSetName, rendererContext.getContentType());
198:
199: //
200: if (renderSet != null) {
201: return renderSet.getPortletRenderer();
202: }
203: }
204:
205: //
206: return getRenderSet(rendererContext).getPortletRenderer();
207: }
208:
209: private PortalRenderSet getRenderSet(RendererContext rendererContext) {
210: // Find the render set name
211: String renderSetName = rendererContext
212: .getProperty(ThemeConstants.PORTAL_PROP_RENDERSET);
213:
214: // if (renderSetName == null)
215: // {
216: // throw new IllegalArgumentException("No RenderSet determined");
217: // }
218:
219: ContentInfo contentInfo = rendererContext.getMarkupInfo();
220:
221: return layoutServiceInfo.getRenderSet(layoutInfo, contentInfo,
222: renderSetName);
223: // if (renderSet == null)
224: // {
225: // throw new IllegalArgumentException("No RenderSet determined for " + renderSetName);
226: // }
227: }
228: }
|