1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.filters;
35
36 import info.magnolia.channel.ChannelConfiguration;
37 import info.magnolia.channel.ChannelManager;
38 import info.magnolia.channel.ChannelResolver;
39 import info.magnolia.cms.core.AggregationState;
40 import info.magnolia.cms.core.Channel;
41 import info.magnolia.context.MgnlContext;
42
43 import java.io.IOException;
44 import java.util.Iterator;
45
46 import javax.inject.Inject;
47 import javax.servlet.FilterChain;
48 import javax.servlet.ServletException;
49 import javax.servlet.http.HttpServletRequest;
50 import javax.servlet.http.HttpServletResponse;
51
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57
58
59
60
61 public class MultiChannelFilter extends OncePerRequestAbstractMgnlFilter {
62 private static final Logger log = LoggerFactory.getLogger(MultiChannelFilter.class);
63
64 public static String ENFORCE_CHANNEL_PARAMETER = "mgnlChannel";
65
66 private ChannelManager channelManager;
67
68 @Inject
69 public MultiChannelFilter(ChannelManager channelManager) {
70 this.channelManager = channelManager;
71 }
72
73 @Override
74 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
75
76 AggregationState aggregationState = MgnlContext.getAggregationState();
77
78 final Channel channel = new Channel();
79 channel.setName(resolveChannel(request));
80
81 aggregationState.setChannel(channel);
82
83 chain.doFilter(request, response);
84 }
85
86 protected String resolveChannel(HttpServletRequest request) {
87 String channelName;
88 final String channelParameterValue = MgnlContext.getAttribute(ENFORCE_CHANNEL_PARAMETER);
89 if (channelParameterValue != null) {
90 channelName = channelParameterValue;
91 } else {
92 channelName = ChannelResolver.UNRESOLVED;
93 final Iterator<ChannelConfiguration> channelConfigIterator =
94 channelManager.getChannels().values().iterator();
95
96 ChannelConfiguration currentChannelConfig;
97 ChannelResolver resolver;
98
99 while (channelConfigIterator.hasNext() && channelName == ChannelResolver.UNRESOLVED) {
100 currentChannelConfig = channelConfigIterator.next();
101 resolver = currentChannelConfig.getResolver();
102
103 if (resolver != null) {
104 channelName = resolver.resolveChannel(request);
105 log.debug("Type {} resolved channel to '{}'", resolver.getClass().getName(), channelName);
106 }
107 }
108 }
109
110 return channelName == ChannelResolver.UNRESOLVED ? ChannelResolver.ALL : channelName;
111 }
112 }