Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
solo-1
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-1
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