1/*2 * $Id: PrefixedPatternDefinitionResolver.java 823662 2009-10-09 18:48:03Z apetrelli $3 *4 * Licensed to the Apache Software Foundation (ASF) under one5 * or more contributor license agreements. See the NOTICE file6 * distributed with this work for additional information7 * regarding copyright ownership. The ASF licenses this file8 * to you under the Apache License, Version 2.0 (the9 * "License"); you may not use this file except in compliance10 * with the License. You may obtain a copy of the License at11 *12 * http://www.apache.org/licenses/LICENSE-2.013 *14 * Unless required by applicable law or agreed to in writing,15 * software distributed under the License is distributed on an16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY17 * KIND, either express or implied. See the License for the18 * specific language governing permissions and limitations19 * under the License.20 */2122package org.apache.tiles.definition.pattern;
2324import java.util.HashMap;
25import java.util.LinkedHashSet;
26import java.util.List;
27import java.util.Map;
28import java.util.Set;
2930import org.apache.tiles.Definition;
31import org.apache.tiles.Expression;
32import org.slf4j.Logger;
33import org.slf4j.LoggerFactory;
3435/***36 * This resolver allows the use of multiple pattern matching languages. The37 * syntax of definition names must be <code>LANGUAGENAME:expression</code>.<br>38 * The different languages must be registered through the use of39 * {@link #registerDefinitionPatternMatcherFactory(String, DefinitionPatternMatcherFactory)}40 * method before using this resolver.41 *42 * @param <T> The type of the customization key.43 * @version $Rev: 823662 $ $Date: 2009-10-09 20:48:03 +0200 (ven, 09 ott 2009) $44 * @since 2.2.045 */46publicclass PrefixedPatternDefinitionResolver<T> extends47 AbstractPatternDefinitionResolver<T> {
4849/***50 * The logging object.51 */52private Logger logger = LoggerFactory.getLogger(getClass());
5354/***55 * Matches languages names to the corresponding56 * {@link DefinitionPatternMatcherFactory}.57 */58private Map<String, DefinitionPatternMatcherFactory> language2matcherFactory;
5960/***61 * Constructor.62 *63 * @since 2.2.064 */65publicPrefixedPatternDefinitionResolver() {
66 language2matcherFactory = new HashMap<String, DefinitionPatternMatcherFactory>();
67 }
6869/***70 * Registers a {@link DefinitionPatternMatcherFactory} connected to a71 * particular language.72 *73 * @param language The name of the language.74 * @param factory The pattern matcher factory to register.75 * @since 2.2.076 */77publicvoid registerDefinitionPatternMatcherFactory(String language,
78DefinitionPatternMatcherFactory factory) {
79 language2matcherFactory.put(language, factory);
80 }
8182/*** {@inheritDoc} */83 @Override
84protected Map<String, Definition> addDefinitionsAsPatternMatchers(
85 List<DefinitionPatternMatcher> matchers,
86 Map<String, Definition> defsMap) {
87 Set<String> excludedKeys = new LinkedHashSet<String>();
88for (Map.Entry<String, Definition> entry : defsMap.entrySet()) {
89 String key = entry.getKey();
90 Expression expression = Expression
91 .createExpressionFromDescribedExpression(key);
92if (expression.getLanguage() != null) {
93DefinitionPatternMatcherFactory factory = language2matcherFactory
94 .get(expression.getLanguage());
95if (factory != null) {
96DefinitionPatternMatcher matcher = factory
97 .createDefinitionPatternMatcher(expression
98 .getExpression(), new Definition(entry
99 .getValue()));
100 matchers.add(matcher);
101 } else {
102 logger.warn("Cannot find a DefinitionPatternMatcherFactory for expression '"103 + key + "'");
104 }
105 } else {
106 excludedKeys.add(key);
107 }
108 }
109return PatternUtil.createExtractedMap(defsMap, excludedKeys);
110 }
111 }