package ddth.dasp.springmvc.spring; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.AbstractCachingViewResolver; import org.springframework.web.servlet.view.RedirectView; import ddth.dasp.common.DaspGlobal; import ddth.dasp.common.osgi.IOsgiBootstrap; public class DaspViewResolver extends AbstractCachingViewResolver { private Logger LOGGER = LoggerFactory.getLogger(DaspViewResolver.class); private final static Class<ViewResolver> SERVICE_CLASS = ViewResolver.class; public final static String REDIRECT_WITH_MODELS = "redirectModels:"; @Override protected View loadView(String viewName, Locale locale) throws Exception { if (viewName == null) { return null; } String[] tokens = viewName.split(":", 2); if (tokens.length != 2) { String msg = "Invalid view name, must be in format <module_name>:<view_name>!"; LOGGER.warn(msg); return null; } String moduleName = tokens[0]; if ("redirect".equalsIgnoreCase(moduleName) || "forward".equalsIgnoreCase(moduleName) || REDIRECT_WITH_MODELS.equalsIgnoreCase(moduleName)) { boolean contextRelative = !tokens[1].startsWith("/"); boolean http10Compatible = true; boolean exposeModels = !("redirect".equalsIgnoreCase(moduleName) || "forward" .equalsIgnoreCase(moduleName)); return new RedirectView(tokens[1], contextRelative, http10Compatible, exposeModels); } if (StringUtils.isBlank(moduleName)) { moduleName = "home"; } IOsgiBootstrap osgiBootstrap = DaspGlobal.getOsgiBootstrap(); if (osgiBootstrap == null) { String msg = "Instance of [" + IOsgiBootstrap.class + " not found]!"; LOGGER.warn(msg); return null; } Map<String, String> filter = new HashMap<String, String>(); filter.put("Module", moduleName); ViewResolver viewResolver = osgiBootstrap.getService(SERVICE_CLASS, filter); if (viewResolver == null) { String msg = "No view resolver found for module [" + moduleName + "]!"; LOGGER.warn(msg); return null; } View result = viewResolver.resolveViewName(tokens[1], locale); if (LOGGER.isDebugEnabled()) { String msg = "Found [" + result + "] for module [" + moduleName + "]."; LOGGER.debug(msg); } return result; } }