Commit 227b28b5 authored by Liang Ding's avatar Liang Ding

Fix #12060

parent 51bf1e63
......@@ -16,8 +16,10 @@
package org.b3log.solo;
import java.util.ResourceBundle;
import java.util.Set;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletRequestEvent;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
......@@ -35,6 +37,7 @@ import org.b3log.latke.servlet.AbstractServletListener;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.latke.util.Strings;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.event.comment.ArticleCommentReplyNotifier;
import org.b3log.solo.event.comment.PageCommentReplyNotifier;
import org.b3log.solo.event.plugin.PluginRefresher;
......@@ -56,7 +59,7 @@ import org.json.JSONObject;
* Solo Servlet listener.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.7.0.13, Dec 23, 2015
* @version 1.8.0.13, Dec 27, 2015
* @since 0.3.1
*/
public final class SoloServletListener extends AbstractServletListener {
......@@ -277,6 +280,25 @@ public final class SoloServletListener extends AbstractServletListener {
* @param httpServletRequest the specified HTTP servlet request
*/
private void resolveSkinDir(final HttpServletRequest httpServletRequest) {
// https://github.com/b3log/solo/issues/12060
final Cookie[] cookies = httpServletRequest.getCookies();
if (null != cookies) {
for (final Cookie cookie : cookies) {
if (Skin.SKIN.equals(cookie.getName())) {
final String skin = cookie.getValue();
final Set<String> skinDirNames = Skins.getSkinDirNames();
if (skinDirNames.contains(skin)) {
Templates.MAIN_CFG.setServletContextForTemplateLoading(SoloServletListener.getServletContext(),
"/skins/" + skin);
httpServletRequest.setAttribute(Keys.TEMAPLTE_DIR_NAME, skin);
return;
}
}
}
}
try {
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
final JSONObject preference = preferenceQueryService.getPreference();
......@@ -296,6 +318,8 @@ public final class SoloServletListener extends AbstractServletListener {
LOGGER.log(Level.DEBUG, "The request [URI={0}] comes frome mobile device", requestURI);
}
Templates.MAIN_CFG.setServletContextForTemplateLoading(SoloServletListener.getServletContext(),
"/skins/" + desiredView);
httpServletRequest.setAttribute(Keys.TEMAPLTE_DIR_NAME, desiredView);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Resolves skin failed", e);
......
......@@ -21,6 +21,7 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;
import javax.inject.Inject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
......@@ -39,8 +40,12 @@ import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.freemarker.FreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Strings;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Skin;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.PreferenceQueryService;
......@@ -53,7 +58,7 @@ import org.json.JSONObject;
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="mailto:385321165@qq.com">DASHU</a>
* @version 1.1.2.6, Nov 20, 2015
* @version 1.2.2.6, Dec 27, 2015
* @since 0.3.1
*/
@RequestProcessor
......@@ -98,18 +103,28 @@ public class IndexProcessor {
@RequestProcessing(value = {"/\\d*", ""}, uriPatternsMode = URIPatternMode.REGEX, method = HTTPRequestMethod.GET)
public void showIndex(final HTTPRequestContext context, final HttpServletRequest request, final HttpServletResponse response) {
final AbstractFreeMarkerRenderer renderer = new FreeMarkerRenderer();
context.setRenderer(renderer);
renderer.setTemplateName("index.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
final String requestURI = request.getRequestURI();
try {
final int currentPageNum = getCurrentPageNum(requestURI);
final JSONObject preference = preferenceQueryService.getPreference();
// https://github.com/b3log/solo/issues/12060
String specifiedSkin = Skins.getSkinDirName(request);
if (null != specifiedSkin) {
if ("default".equals(specifiedSkin)) {
specifiedSkin = preference.optString(Option.ID_C_SKIN_DIR_NAME);
}
} else {
specifiedSkin = preference.optString(Option.ID_C_SKIN_DIR_NAME);
}
Templates.MAIN_CFG.setServletContextForTemplateLoading(SoloServletListener.getServletContext(),
"/skins/" + specifiedSkin);
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, specifiedSkin);
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME), dataModel);
filler.fillIndexArticles(request, dataModel, currentPageNum, preference);
......@@ -123,12 +138,17 @@ public class IndexProcessor {
dataModel.put(Pagination.PAGINATION_PREVIOUS_PAGE_NUM, previousPageNum);
final Integer pageCount = (Integer) dataModel.get(Pagination.PAGINATION_PAGE_COUNT);
final int nextPageNum = currentPageNum+1 > pageCount ? pageCount : currentPageNum + 1;
final int nextPageNum = currentPageNum + 1 > pageCount ? pageCount : currentPageNum + 1;
dataModel.put(Pagination.PAGINATION_NEXT_PAGE_NUM, nextPageNum);
dataModel.put(Common.PATH, "");
statisticMgmtService.incBlogViewCount(request, response);
// https://github.com/b3log/solo/issues/12060
final Cookie cookie = new Cookie(Skin.SKIN, specifiedSkin);
cookie.setPath("/");
response.addCookie(cookie);
} catch (final ServiceException e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
......
......@@ -16,6 +16,7 @@
package org.b3log.solo.processor.console;
import javax.inject.Inject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
......@@ -32,6 +33,7 @@ import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.util.Requests;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Sign;
import org.b3log.solo.model.Skin;
import org.b3log.solo.service.OptionMgmtService;
import org.b3log.solo.service.OptionQueryService;
import org.b3log.solo.service.PreferenceMgmtService;
......@@ -436,6 +438,10 @@ public class PreferenceConsole {
preferenceMgmtService.updatePreference(preference);
final Cookie cookie = new Cookie(Skin.SKIN, preference.getString(Skin.SKIN_DIR_NAME));
cookie.setPath("/");
response.addCookie(cookie);
ret.put(Keys.STATUS_CODE, true);
ret.put(Keys.MSG, langPropsService.get("updateSuccLabel"));
} catch (final ServiceException e) {
......
......@@ -15,7 +15,6 @@
*/
package org.b3log.solo.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
......@@ -24,6 +23,8 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
......@@ -34,15 +35,16 @@ import org.b3log.latke.service.LangPropsServiceImpl;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.latke.util.Strings;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Skin;
/**
* Skin utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.4.7, Nov 1, 2015
* @version 1.1.4.7, Dec 27, 2015
* @since 0.3.1
*/
public final class Skins {
......@@ -60,11 +62,12 @@ public final class Skins {
/**
* Private default constructor.
*/
private Skins() {}
private Skins() {
}
/**
* Fills the specified data model with the current skink's (WebRoot/skins/${skinName}/lang/lang_xx_XX.properties) and
* core language (WebRoot/WEB-INF/classes/lang_xx_XX.properties) configurations.
* Fills the specified data model with the current skink's (WebRoot/skins/${skinName}/lang/lang_xx_XX.properties)
* and core language (WebRoot/WEB-INF/classes/lang_xx_XX.properties) configurations.
*
* @param localeString the specified locale string
* @param currentSkinDirName the specified current skin directory name
......@@ -82,7 +85,7 @@ public final class Skins {
if (null == langs) {
LANG_MAP.clear(); // Collect unused skin languages
LOGGER.log(Level.DEBUG, "Loading skin [dirName={0}, locale={1}]", new Object[] {currentSkinDirName, localeString});
LOGGER.log(Level.DEBUG, "Loading skin [dirName={0}, locale={1}]", new Object[]{currentSkinDirName, localeString});
langs = new HashMap<String, String>();
final String language = Locales.getLanguage(localeString);
......@@ -103,7 +106,7 @@ public final class Skins {
LANG_MAP.put(langName, langs);
LOGGER.log(Level.DEBUG, "Loaded skin[dirName={0}, locale={1}, keyCount={2}]",
new Object[] {currentSkinDirName, localeString, langs.size()});
new Object[]{currentSkinDirName, localeString, langs.size()});
}
dataModel.putAll(langs); // Fills the current skin's language configurations
......@@ -122,8 +125,8 @@ public final class Skins {
}
/**
* Sets the directory for template loading with the specified skin directory
* name, and sets the directory for mobile request template loading.
* Sets the directory for template loading with the specified skin directory name, and sets the directory for mobile
* request template loading.
*
* @param skinDirName the specified skin directory name
*/
......@@ -135,8 +138,8 @@ public final class Skins {
}
/**
* Gets all skin directory names. Scans the /skins/ directory,
* using the subdirectory of it as the skin directory name, for example,
* Gets all skin directory names. Scans the /skins/ directory, using the subdirectory of it as the skin directory
* name, for example,
* <pre>
* ${Web root}/skins/
* <b>default</b>/
......@@ -167,4 +170,47 @@ public final class Skins {
return ret;
}
/**
* Gets skin directory name from the specified request.
*
* @param request the specified request
* @return directory name, or {@code "default"} if not found
*/
public static String getSkinDirName(final HttpServletRequest request) {
// https://github.com/b3log/solo/issues/12060
// 1. Get skin from query
final String specifiedSkin = request.getParameter(Skin.SKIN);
if ("default".equals(specifiedSkin)) {
return "default";
}
if (!Strings.isEmptyOrNull(specifiedSkin)) {
final Set<String> skinDirNames = Skins.getSkinDirNames();
if (skinDirNames.contains(specifiedSkin)) {
return specifiedSkin;
} else {
return null;
}
}
// 2. Get skin from cookie
final Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (final Cookie cookie : cookies) {
if (Skin.SKIN.equals(cookie.getName())) {
final String skin = cookie.getValue();
final Set<String> skinDirNames = Skins.getSkinDirNames();
if (skinDirNames.contains(skin)) {
return skin;
}
}
}
}
return "default";
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment