1 /*
2 * $Id: ComposeStackUtil.java 1305937 2012-03-27 18:15:15Z nlebas $
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.template;
23
24 import java.util.Deque;
25 import java.util.LinkedList;
26 import java.util.Map;
27
28 import org.apache.tiles.request.Request;
29
30 /**
31 * Utilities to work with compose stacks.
32 *
33 * @version $Rev: 1305937 $ $Date: 2012-03-28 05:15:15 +1100 (Wed, 28 Mar 2012) $
34 * @since 3.0.0
35 */
36 public final class ComposeStackUtil {
37
38 /**
39 * The name of the attribute that holds the compose stack.
40 */
41 public static final String COMPOSE_STACK_ATTRIBUTE_NAME = "org.apache.tiles.template.COMPOSE_STACK";
42
43 /**
44 * Private constructor to avoid instantiation.
45 */
46 private ComposeStackUtil() {
47
48 }
49
50 /**
51 * Finds the first ancestor in the stack, that is assignable to the given class.
52 *
53 * @param composeStack The compose stack to evaluate.
54 * @param clazz The class to check.
55 * @return The first ancestor that is assignable to the class, or null if not found.
56 * @since 3.0.0
57 */
58 public static Object findAncestorWithClass(Deque<Object> composeStack, Class<?> clazz) {
59 for (Object obj : composeStack) {
60 if (clazz.isAssignableFrom(obj.getClass())) {
61 return obj;
62 }
63 }
64
65 return null;
66 }
67
68 /**
69 * Returns the current compose stack, or creates a new one if not present.
70 *
71 * @param request The request.
72 * @return The compose stack.
73 * @since 3.0.0
74 */
75 @SuppressWarnings("unchecked")
76 public static Deque<Object> getComposeStack(Request request) {
77 Map<String, Object> requestScope = request.getContext("request");
78 Deque<Object> composeStack = (Deque<Object>) requestScope
79 .get(COMPOSE_STACK_ATTRIBUTE_NAME);
80 if (composeStack == null) {
81 composeStack = new LinkedList<Object>();
82 requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
83 }
84 return composeStack;
85 }
86 }