View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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 }