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