1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.context;
21
22 import org.apache.myfaces.tobago.internal.config.RendererConfig;
23 import org.apache.myfaces.tobago.internal.config.RenderersConfig;
24 import org.apache.myfaces.tobago.internal.config.RenderersConfigImpl;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import java.io.Serializable;
29 import java.util.ArrayList;
30 import java.util.Collections;
31 import java.util.List;
32
33 public class ThemeImpl implements Theme, Serializable {
34
35 private static final long serialVersionUID = 1L;
36
37 private static final Logger LOG = LoggerFactory.getLogger(ThemeImpl.class);
38
39 private String name;
40
41 private String displayName;
42
43 private String deprecatedName;
44
45 private String resourcePath;
46
47 private ThemeImpl fallback;
48
49 private String fallbackName;
50
51 private List<Theme> fallbackList;
52
53 private RenderersConfigImpl renderersConfig;
54
55 private ThemeResources productionResources;
56
57 private ThemeResources resources;
58
59 private String[] productionScripts;
60
61 private String[] productionStyles;
62
63 private String[] scripts;
64
65 private String[] styles;
66
67 private boolean versioned;
68
69 private String version;
70
71 public String getName() {
72 return name;
73 }
74
75 public void setName(String name) {
76 this.name = name;
77 }
78
79 public String getDisplayName() {
80 return displayName;
81 }
82
83 public void setDisplayName(String displayName) {
84 this.displayName = displayName;
85 }
86
87 public String getDeprecatedName() {
88 return deprecatedName;
89 }
90
91 public void setDeprecatedName(String deprecatedName) {
92 this.deprecatedName = deprecatedName;
93 }
94
95 public String getResourcePath() {
96 return resourcePath;
97 }
98
99 public void setResourcePath(String resourcePath) {
100 this.resourcePath = resourcePath;
101 }
102
103 public ThemeImpl getFallback() {
104 return fallback;
105 }
106
107 public void setFallback(ThemeImpl fallback) {
108 this.fallback = fallback;
109 }
110
111 public String getFallbackName() {
112 return fallbackName;
113 }
114
115 public void setFallbackName(String fallbackName) {
116 this.fallbackName = fallbackName;
117 }
118
119 public List<Theme> getFallbackList() {
120 return fallbackList;
121 }
122
123 public void resolveFallbacks() {
124 fallbackList = new ArrayList<Theme>();
125 ThemeImpl actual = this;
126 while (actual != null) {
127 fallbackList.add(actual);
128 actual = actual.getFallback();
129 }
130 fallbackList = Collections.unmodifiableList(fallbackList);
131 if (LOG.isDebugEnabled()) {
132 for (Theme theme : fallbackList) {
133 LOG.debug("fallbackList: {}", theme.getName());
134 }
135 }
136 }
137
138 public void resolveRendererConfig(RenderersConfig rendererConfigFromTobagoConfig) {
139 if (renderersConfig == null) {
140 renderersConfig = new RenderersConfigImpl();
141 }
142 if (!renderersConfig.isMerged()) {
143 ThemeImpl fallback = getFallback();
144 if (fallback != null) {
145 fallback.resolveRendererConfig(rendererConfigFromTobagoConfig);
146 RenderersConfigImpl fallbackRenderersConfig = fallback.getRenderersConfigImpl();
147 if (fallbackRenderersConfig != null) {
148 renderersConfig.merge(fallbackRenderersConfig, false);
149 if (LOG.isDebugEnabled()) {
150 LOG.debug("merge markupconfig from {} for {}", fallback.getName(), getName());
151 }
152 }
153 }
154 if (rendererConfigFromTobagoConfig != null) {
155 renderersConfig.merge(rendererConfigFromTobagoConfig, true);
156 }
157 renderersConfig.setMerged(true);
158 if (LOG.isDebugEnabled()) {
159 LOG.debug("{} {}", getName(), renderersConfig);
160 }
161 }
162 }
163
164 public void resolveResources() {
165 ThemeImpl fallback = getFallback();
166 if (fallback != null) {
167 fallback.resolveResources();
168 addResources(fallback.getProductionResources());
169 addResources(fallback.getResources());
170 }
171 }
172
173 public String toString() {
174 StringBuilder builder = new StringBuilder();
175 builder.append("Theme: ");
176 builder.append(name);
177 if (renderersConfig != null) {
178 builder.append("\n");
179 for (RendererConfig config : renderersConfig.getRendererConfigs()) {
180 builder.append(config);
181 builder.append("\n");
182 }
183 }
184 return builder.toString();
185 }
186
187 public void setRenderersConfig(RenderersConfigImpl renderersConfig) {
188 this.renderersConfig = renderersConfig;
189 }
190
191 public RenderersConfig getRenderersConfig() {
192 return renderersConfig;
193 }
194
195 RenderersConfigImpl getRenderersConfigImpl() {
196 return renderersConfig;
197 }
198
199 public ThemeResources getResources() {
200 return resources;
201 }
202
203 public ThemeResources getProductionResources() {
204 return productionResources;
205 }
206
207 public void addResources(ThemeResources resources) {
208 if (resources.isProduction()) {
209 if (productionResources != null) {
210 merge(productionResources, resources);
211 } else {
212 productionResources = resources.copy();
213 }
214 } else {
215 if (this.resources != null) {
216 merge(this.resources, resources);
217 } else {
218 this.resources = resources.copy();
219 }
220 }
221 }
222
223 public void init() {
224 if (productionResources != null) {
225 productionScripts = new String[productionResources.getScriptList().size()];
226 for (int i = 0; i< productionResources.getScriptList().size(); i++) {
227 productionScripts[i] = productionResources.getScriptList().get(i).getName();
228 }
229 productionStyles = new String[productionResources.getStyleList().size()];
230 for (int i = 0; i< productionResources.getStyleList().size(); i++) {
231 productionStyles[i] = productionResources.getStyleList().get(i).getName();
232 }
233 }
234
235 if (resources != null) {
236 scripts = new String[resources.getScriptList().size()];
237 for (int i = 0; i< resources.getScriptList().size(); i++) {
238 scripts[i] = resources.getScriptList().get(i).getName();
239 }
240 styles = new String[resources.getStyleList().size()];
241 for (int i = 0; i< resources.getStyleList().size(); i++) {
242 styles[i] = resources.getStyleList().get(i).getName();
243 }
244 }
245
246 }
247
248 private void merge(ThemeResources resources, ThemeResources toAddResources) {
249 if (resources == toAddResources) {
250 return;
251 }
252 for (int i = toAddResources.getScriptList().size()-1; i >= 0; i--) {
253 ThemeScript script = toAddResources.getScriptList().get(i);
254 resources.getScriptList().remove(script);
255 resources.getScriptList().add(0, script);
256 }
257 for (int i = toAddResources.getStyleList().size()-1; i >= 0; i--) {
258 ThemeStyle style = toAddResources.getStyleList().get(i);
259 resources.getStyleList().remove(style);
260 resources.getStyleList().add(0, style);
261 }
262 }
263
264 public String[] getScriptResources(boolean production) {
265 if (production) {
266 return productionScripts;
267 }
268 return scripts;
269 }
270
271 public String[] getStyleResources(boolean production) {
272 if (production) {
273 return productionStyles;
274 }
275 return styles;
276 }
277
278 public boolean isVersioned() {
279 return versioned;
280 }
281
282 public void setVersioned(boolean versioned) {
283 this.versioned = versioned;
284 }
285
286 public String getVersion() {
287 return version;
288 }
289
290 public void setVersion(String version) {
291 this.version = version;
292 }
293 }