1 /* 2 * $Id: AbstractPatternDefinitionResolver.java 1539385 2013-11-06 16:24:13Z mck $ 3 * 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 package org.apache.tiles.definition.pattern; 23 24 import java.util.ArrayList; 25 import java.util.HashMap; 26 import java.util.List; 27 import java.util.Map; 28 29 import org.apache.tiles.Definition; 30 31 /** 32 * A pattern definition resolver that stores {@link DefinitionPatternMatcher} 33 * separated by customization key. <br> 34 * Implementations should provide a way to translate a definition to a 35 * {@link DefinitionPatternMatcher}. 36 * 37 * @param <T> The type of the customization key. 38 * @version $Rev: 1539385 $ $Date: 2013-11-07 03:24:13 +1100 (Thu, 07 Nov 2013) $ 39 * @since 2.2.0 40 */ 41 public abstract class AbstractPatternDefinitionResolver<T> implements 42 PatternDefinitionResolver<T> { 43 44 /** 45 * Stores patterns depending on the locale they refer to. 46 */ 47 private Map<T, List<DefinitionPatternMatcher>> localePatternPaths = 48 new HashMap<T, List<DefinitionPatternMatcher>>(); 49 50 /** {@inheritDoc} */ 51 public Definition resolveDefinition(String name, T customizationKey) { 52 Definition retValue = null; 53 if (localePatternPaths.containsKey(customizationKey)) { 54 retValue = searchAndResolveDefinition(localePatternPaths 55 .get(customizationKey), name); 56 } 57 return retValue; 58 } 59 60 /** {@inheritDoc} */ 61 public Map<String, Definition> storeDefinitionPatterns(Map<String, Definition> localeDefsMap, 62 T customizationKey) { 63 List<DefinitionPatternMatcher> lpaths = localePatternPaths 64 .get(customizationKey); 65 if (lpaths == null) { 66 lpaths = new ArrayList<DefinitionPatternMatcher>(); 67 localePatternPaths.put(customizationKey, lpaths); 68 } 69 70 return addDefinitionsAsPatternMatchers(lpaths, localeDefsMap); 71 } 72 73 /** 74 * Adds definitions, filtering and adding them to the list of definition 75 * pattern matchers. Only a subset of definitions will be transformed into 76 * definition pattern matchers. 77 * 78 * @param matchers The list containing the currently stored definition pattern 79 * matchers. 80 * @param defsMap The definition map to parse. 81 * @return The map of the definitions not recognized as containing 82 * definition patterns. 83 * @since 2.2.1 84 */ 85 protected abstract Map<String, Definition> addDefinitionsAsPatternMatchers( 86 List<DefinitionPatternMatcher> matchers, 87 Map<String, Definition> defsMap); 88 89 /** 90 * Try to resolve a definition by iterating all pattern matchers. 91 * 92 * @param paths The list containing the currently stored paths. 93 * @param name The name of the definition to resolve. 94 * @return A definition, if found, or <code>null</code> if not. 95 */ 96 private Definition searchAndResolveDefinition( 97 List<DefinitionPatternMatcher> paths, String name) { 98 Definition d = null; 99 100 for (DefinitionPatternMatcher wm : paths) { 101 d = wm.createDefinition(name); 102 if (d != null) { 103 break; 104 } 105 } 106 107 return d; 108 } 109 110 111 /** 112 * Used to clear all entries in the localePatternPaths for a specific locale. Necessary when reloading definition 113 * files to ensure that the list is cleared first 114 * 115 * @param customizationKey 116 */ 117 @Override 118 public void clearPatternPaths(T customizationKey) { 119 if (localePatternPaths.get(customizationKey) != null) 120 localePatternPaths.get(customizationKey).clear(); 121 } 122 }