1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.jetspeed.decoration;
18
19 import java.io.Serializable;
20 import java.util.ArrayList;
21 import java.util.Collection;
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.Iterator;
25 import java.util.LinkedHashSet;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29
30 import org.apache.jetspeed.om.page.ContentPage;
31 import org.apache.jetspeed.om.page.Fragment;
32 import org.apache.jetspeed.om.page.Page;
33 import org.apache.jetspeed.request.RequestContext;
34
35 /***
36 * Default implementation of <code>org.apache.jetspeed.decoration.Theme</code>
37 *
38 * @author <href a="mailto:weaver@apache.org">Scott T. Weaver</a>
39 *
40 * @see org.apache.jetspeed.decoration.Theme
41 */
42 public class PageTheme implements Theme, Serializable
43 {
44 private transient Page page;
45 private transient DecorationFactory decorationFactory;
46 private transient RequestContext requestContext;
47 private final Set styleSheets;
48 private final LayoutDecoration layoutDecoration;
49 private final Map fragmentDecorations;
50 private final Collection portletDecorationNames;
51 private boolean invalidated = false;
52
53 public PageTheme(Page page, DecorationFactory decorationFactory, RequestContext requestContext)
54 {
55 this.page = page;
56 this.decorationFactory = decorationFactory;
57 this.requestContext = requestContext;
58 this.styleSheets = new LinkedHashSet();
59 this.fragmentDecorations = new HashMap();
60
61 boolean isDesktopEnabled = decorationFactory.isDesktopEnabled( requestContext );
62 HashMap portletDecorationNames = new HashMap();
63 this.layoutDecoration = (LayoutDecoration)setupFragmentDecorations( page.getRootFragment(), true, portletDecorationNames, isDesktopEnabled );
64
65 if ( isDesktopEnabled )
66 {
67 String defaultDesktopPortletDecoration = decorationFactory.getDefaultDesktopPortletDecoration();
68 if ( defaultDesktopPortletDecoration != null && defaultDesktopPortletDecoration.length() > 0 )
69 {
70 if ( portletDecorationNames.get( defaultDesktopPortletDecoration ) == null )
71 {
72 portletDecorationNames.put( defaultDesktopPortletDecoration, defaultDesktopPortletDecoration );
73 }
74 }
75 }
76 this.portletDecorationNames = Collections.unmodifiableCollection( new ArrayList( portletDecorationNames.keySet() ) );
77 }
78
79 /***
80 * setupFragmentDecorations
81 *
82 * Setup styleSheets and fragmentDecorations from all fragments
83 * in page, including nested fragments.
84 *
85 * @param fragment page fragment
86 * @return fragment decoration
87 */
88 private Decoration setupFragmentDecorations( Fragment fragment, boolean isRootLayout, HashMap portletDecorationNames, boolean isDesktopEnabled )
89 {
90
91 Decoration decoration = decorationFactory.getDecoration( page, fragment, requestContext );
92
93 fragmentDecorations.put( fragment.getId(), decoration );
94 boolean isPortlet = ( ! isRootLayout && fragment.getType().equals( Fragment.PORTLET ) );
95
96 if ( isPortlet || isRootLayout )
97 {
98 String commonStyleSheet = decoration.getStyleSheet();
99 if ( commonStyleSheet != null )
100 {
101 styleSheets.add( commonStyleSheet );
102 }
103 if ( isDesktopEnabled )
104 {
105 String desktopStyleSheet = decoration.getStyleSheetDesktop();
106 if ( desktopStyleSheet != null )
107 {
108 styleSheets.add( desktopStyleSheet );
109 }
110 }
111 else
112 {
113 String portalStyleSheet = decoration.getStyleSheetPortal();
114 if ( portalStyleSheet != null )
115 {
116 styleSheets.add( portalStyleSheet );
117 }
118 }
119
120 if ( isPortlet )
121 {
122 portletDecorationNames.put( decoration.getName(), decoration.getName() );
123 }
124 }
125
126
127 List fragments = fragment.getFragments();
128 if ( ( fragments != null ) && ! fragments.isEmpty() )
129 {
130 Iterator fragmentsIter = fragments.iterator();
131 while ( fragmentsIter.hasNext() )
132 {
133 setupFragmentDecorations( (Fragment)fragmentsIter.next(), false, portletDecorationNames, isDesktopEnabled );
134 }
135 }
136
137
138 return decoration;
139 }
140
141 public Set getStyleSheets()
142 {
143 return styleSheets;
144 }
145
146 public Decoration getDecoration( Fragment fragment )
147 {
148 return (Decoration) fragmentDecorations.get( fragment.getId() );
149 }
150
151 public Collection getPortletDecorationNames()
152 {
153 return portletDecorationNames;
154 }
155
156 public LayoutDecoration getPageLayoutDecoration()
157 {
158 return layoutDecoration;
159 }
160
161 public void init(Page page, DecorationFactory decoration, RequestContext context)
162 {
163 this.page = page;
164 this.decorationFactory = decoration;
165 this.requestContext = context;
166 }
167
168 public Page getPage()
169 {
170 return page;
171 }
172
173 public ContentPage getContentPage()
174 {
175 return (ContentPage)page;
176 }
177
178 public boolean isInvalidated()
179 {
180 return this.invalidated;
181 }
182
183 public void setInvalidated(boolean flag)
184 {
185 this.invalidated = flag;
186 }
187 }