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 public class MultiChannelFilter extends OncePerRequestAbstractMgnlFilter {
59 private static final Logger log = LoggerFactory.getLogger(MultiChannelFilter.class);
60
61 public static final String ENFORCE_CHANNEL_PARAMETER = "mgnlChannel";
62 public static final String MGNL_PREVIEW_ATTRIBUTE = "mgnlPreview";
63
64 private ChannelManager channelManager;
65
66 @Inject
67 public MultiChannelFilter(ChannelManager channelManager) {
68 this.channelManager = channelManager;
69 }
70
71 @Override
72 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
73 final boolean isPreview = resolvePreviewMode();
74 final AggregationState aggregationState = MgnlContext.getAggregationState();
75 aggregationState.setPreviewMode(isPreview);
76
77 final Channel channel = new Channel();
78 channel.setName(isPreview ? resolveChannel(request) : ChannelResolver.ALL);
79
80 aggregationState.setChannel(channel);
81
82 chain.doFilter(request, response);
83 }
84
85 protected String resolveChannel(HttpServletRequest request) {
86 String channelName;
87 final String channelParameterValue = MgnlContext.getAttribute(ENFORCE_CHANNEL_PARAMETER);
88 if (channelParameterValue != null) {
89 channelName = channelParameterValue;
90 } else {
91 channelName = ChannelResolver.UNRESOLVED;
92 final Iterator<ChannelConfiguration> channelConfigIterator = channelManager.getChannels().values().iterator();
93
94 ChannelConfiguration currentChannelConfig;
95 ChannelResolver resolver;
96
97 while (channelConfigIterator.hasNext() && ChannelResolver.UNRESOLVED.equals(channelName)) {
98 currentChannelConfig = channelConfigIterator.next();
99 resolver = currentChannelConfig.getResolver();
100
101 if (resolver != null) {
102 channelName = resolver.resolveChannel(request);
103 log.debug("Type {} resolved channel to '{}'", resolver.getClass().getName(), channelName);
104 }
105 }
106 }
107
108 return ChannelResolver.UNRESOLVED.equals(channelName) ? ChannelResolver.ALL : channelName;
109 }
110
111 protected boolean resolvePreviewMode() {
112 if (MgnlContext.getParameter(MGNL_PREVIEW_ATTRIBUTE) != null) {
113 return Boolean.parseBoolean(MgnlContext.getParameter(MGNL_PREVIEW_ATTRIBUTE));
114 }
115 return true;
116 }
117 }