package org.lognavigator.mvc; import static org.lognavigator.util.Constants.LOG_ACCESS_CONFIG_IDS_BY_DISPLAY_GROUP_KEY; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.apache.tiles.AttributeContext; import org.apache.tiles.preparer.ViewPreparer; import org.apache.tiles.request.Request; import org.lognavigator.bean.LogAccessConfig; import org.lognavigator.exception.ConfigException; import org.lognavigator.service.AuthorizationService; import org.lognavigator.service.ConfigService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; /** * Tiles ViewPreparer launched just before view display, * which loads authorized log access configs for current user and bind it as a request attribute * so that main tiles template can use it in log-access-configs combobox */ @Component public class TilesTemplateViewPreparer implements ViewPreparer { private static final Logger LOGGER = LoggerFactory.getLogger(TilesTemplateViewPreparer.class); @Autowired private ConfigService configService; @Autowired private AuthorizationService authorizationService; @Override public void execute(Request tilesContext, AttributeContext attributeContext) { try { // Get authorized log access configs for current user Authentication authorizedUser = SecurityContextHolder.getContext().getAuthentication(); Set<LogAccessConfig> allLogAccessConfigs = configService.getLogAccessConfigs(); Set<LogAccessConfig> authorizedLogAccessConfigs = authorizationService.getAuthorizedLogAccessConfigs(allLogAccessConfigs, authorizedUser); // Create map <displayGroup> -> <logAccessConfig> Map<String, Set<LogAccessConfig>> logAccessConfigsMap = new TreeMap<String, Set<LogAccessConfig>>(); for (LogAccessConfig logAccessConfig : authorizedLogAccessConfigs) { String displayGroup = logAccessConfig.getDisplayGroup() != null ? logAccessConfig.getDisplayGroup() : ""; Set<LogAccessConfig> logAccessConfigIds = logAccessConfigsMap.get(displayGroup); if (logAccessConfigIds == null) { logAccessConfigIds = new TreeSet<LogAccessConfig>(); logAccessConfigsMap.put(displayGroup, logAccessConfigIds); } logAccessConfigIds.add(logAccessConfig); } // Inject logAccessConfigIds map into request scope tilesContext.getContext(Request.REQUEST_SCOPE).put(LOG_ACCESS_CONFIG_IDS_BY_DISPLAY_GROUP_KEY, logAccessConfigsMap); } catch (ConfigException e) { LOGGER.error("Error while loading configuration", e); } } }