Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
solo
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
solo
Commits
227b28b5
Commit
227b28b5
authored
Dec 27, 2015
by
Liang Ding
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix #12060
parent
51bf1e63
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
118 additions
and
22 deletions
+118
-22
src/main/java/org/b3log/solo/SoloServletListener.java
src/main/java/org/b3log/solo/SoloServletListener.java
+25
-1
src/main/java/org/b3log/solo/processor/IndexProcessor.java
src/main/java/org/b3log/solo/processor/IndexProcessor.java
+26
-6
src/main/java/org/b3log/solo/processor/console/PreferenceConsole.java
...a/org/b3log/solo/processor/console/PreferenceConsole.java
+6
-0
src/main/java/org/b3log/solo/util/Skins.java
src/main/java/org/b3log/solo/util/Skins.java
+61
-15
No files found.
src/main/java/org/b3log/solo/SoloServletListener.java
View file @
227b28b5
...
...
@@ -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
);
...
...
src/main/java/org/b3log/solo/processor/IndexProcessor.java
View file @
227b28b5
...
...
@@ -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
);
...
...
src/main/java/org/b3log/solo/processor/console/PreferenceConsole.java
View file @
227b28b5
...
...
@@ -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
)
{
...
...
src/main/java/org/b3log/solo/util/Skins.java
View file @
227b28b5
...
...
@@ -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"
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment