A definitions DAO (loading URLs and using Locale as a customization key) that
caches definitions that have been loaded and resolves inheritances.
It can check if the URLs change, but by default this feature is turned off.
Method from org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO Detail: |
protected Map<String, Definition> copyDefinitionMap(Map<String, Definition> localeDefsMap) {
Map< String, Definition > retValue = new LinkedHashMap< String, Definition >(
localeDefsMap.size());
for (Map.Entry< String, Definition > entry : localeDefsMap.entrySet()) {
Definition definition = new Definition(entry.getValue());
retValue.put(entry.getKey(), definition);
}
return retValue;
}
Copies the definition map to be passed to a higher level of customization
key. |
protected Definition getDefinitionFromResolver(String name,
Locale customizationKey) {
Definition retValue = super.getDefinitionFromResolver(name, customizationKey);
if (retValue != null && retValue.getExtends() != null) {
Definition parent = getDefinition(retValue.getExtends(), customizationKey);
retValue.inherit(parent);
}
return retValue;
}
|
protected Map<String, Definition> loadDefinitionsFromURLs(Locale customizationKey) {
Map< String, Definition > retValue = super.loadDefinitionsFromURLs(customizationKey);
Map< String, Definition > defsMap = locale2definitionMap.get(customizationKey);
resolveInheritances(defsMap, customizationKey);
return retValue;
}
|
protected Map<String, Definition> loadParentDefinitions(Locale parentLocale) {
return loadDefinitionsFromURLs(parentLocale);
}
|
protected void postDefinitionLoadOperations(Map<String, Definition> localeDefsMap,
Locale customizationKey) {
resolveInheritances(localeDefsMap, customizationKey);
super.postDefinitionLoadOperations(localeDefsMap, customizationKey);
}
|
protected void resolveInheritance(Definition definition,
Map<String, Definition> definitions,
Locale locale,
Set<String> alreadyResolvedDefinitions) {
// Already done, or not needed ?
if (!definition.isExtending()
|| alreadyResolvedDefinitions.contains(definition.getName())) {
return;
}
if (log.isDebugEnabled()) {
log.debug("Resolve definition for child name='"
+ definition.getName()
+ "' extends='" + definition.getExtends() + "'.");
}
// Set as visited to avoid endless recurisvity.
alreadyResolvedDefinitions.add(definition.getName());
// Resolve parent before itself.
Definition parent = definitions.get(definition.getExtends());
if (parent == null) { // error
String msg = "Error while resolving definition inheritance: child '"
+ definition.getName()
+ "' can't find its ancestor '"
+ definition.getExtends()
+ "'. Please check your description file.";
// to do : find better exception
throw new NoSuchDefinitionException(msg);
}
resolveInheritance(parent, definitions, locale,
alreadyResolvedDefinitions);
definition.inherit(parent);
}
Resolve locale-specific inheritance. First, resolve parent's inheritance,
then set template to the parent's template. Also copy attributes setted
in parent, and not set in child If instance doesn't extend anything, do
nothing. |
protected void resolveInheritances(Map<String, Definition> map,
Locale locale) {
if (map != null) {
Set< String > alreadyResolvedDefinitions = new HashSet< String >();
for (Definition definition : map.values()) {
resolveInheritance(definition, map, locale,
alreadyResolvedDefinitions);
} // end loop
}
}
Resolve locale-specific extended instances. |