Commit da0f217d authored by Van's avatar Van

Merge remote-tracking branch 'origin/2.9.5-dev' into 2.9.5-dev

parents 9f15c6ad b70b43e0
<?xml version="1.0" encoding="UTF-8"?>
<!--
Description: Solo POM.
Version: 3.18.3.23, Sep 25, 2018
Version: 3.18.3.25, Sep 30, 2018
Author: <a href="http://88250.b3log.org">Liang Ding</a>
Author: <a href="http://www.annpeter.cn">Ann Peter</a>
Author: <a href="http://vanessa.b3log.org">Vanessa</a>
......@@ -75,7 +75,7 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<org.b3log.latke.version>2.4.16</org.b3log.latke.version>
<org.b3log.latke.version>2.4.18</org.b3log.latke.version>
<servlet.version>3.1.0</servlet.version>
<slf4j.version>1.7.5</slf4j.version>
......
......@@ -20,8 +20,7 @@ package org.b3log.solo;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.event.EventManager;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.plugin.PluginManager;
......@@ -32,7 +31,6 @@ 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.*;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Skin;
......@@ -50,14 +48,12 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Solo Servlet listener.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.9.3.39, Sep 25, 2018
* @version 1.9.3.41, Sep 27, 2018
* @since 0.3.1
*/
public final class SoloServletListener extends AbstractServletListener {
......@@ -75,12 +71,7 @@ public final class SoloServletListener extends AbstractServletListener {
/**
* Bean manager.
*/
private LatkeBeanManager beanManager;
/**
* Request lock.
*/
private Lock requestLock = new ReentrantLock();
private BeanManager beanManager;
@Override
public void contextInitialized(final ServletContextEvent servletContextEvent) {
......@@ -89,7 +80,7 @@ public final class SoloServletListener extends AbstractServletListener {
super.contextInitialized(servletContextEvent);
Stopwatchs.start("Context Initialized");
beanManager = Lifecycle.getBeanManager();
beanManager = BeanManager.getInstance();
// Upgrade check https://github.com/b3log/solo/issues/12040
final UpgradeService upgradeService = beanManager.getReference(UpgradeService.class);
......@@ -101,9 +92,6 @@ public final class SoloServletListener extends AbstractServletListener {
JdbcRepository.dispose();
// Set default skin, loads from preference later
Skins.setDirectoryForTemplateLoading(Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
final OptionRepository optionRepository = beanManager.getReference(OptionRepositoryImpl.class);
final Transaction transaction = optionRepository.beginTransaction();
try {
......@@ -147,8 +135,6 @@ public final class SoloServletListener extends AbstractServletListener {
@Override
public void requestInitialized(final ServletRequestEvent servletRequestEvent) {
requestLock.lock();
final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequestEvent.getServletRequest();
Requests.log(httpServletRequest, Level.DEBUG, LOGGER);
......@@ -158,14 +144,12 @@ public final class SoloServletListener extends AbstractServletListener {
LOGGER.log(Level.DEBUG, "Request made from a search engine [User-Agent={0}]", httpServletRequest.getHeader("User-Agent"));
httpServletRequest.setAttribute(Keys.HttpRequest.IS_SEARCH_ENGINE_BOT, true);
} else {
// Gets the session of this request
final HttpSession session = httpServletRequest.getSession();
LOGGER.log(Level.DEBUG, "Gets a session [id={0}, remoteAddr={1}, User-Agent={2}, isNew={3}]", session.getId(),
httpServletRequest.getRemoteAddr(), httpServletRequest.getHeader("User-Agent"), session.isNew());
// Online visitor count
final StatisticMgmtService statisticMgmtService = beanManager.getReference(StatisticMgmtService.class);
statisticMgmtService.onlineVisitorCount(httpServletRequest);
}
......@@ -174,16 +158,12 @@ public final class SoloServletListener extends AbstractServletListener {
@Override
public void requestDestroyed(final ServletRequestEvent servletRequestEvent) {
try {
Stopwatchs.end();
Stopwatchs.end();
LOGGER.log(Level.DEBUG, "Stopwatch: {0}{1}", Strings.LINE_SEPARATOR, Stopwatchs.getTimingStat());
Stopwatchs.release();
LOGGER.log(Level.DEBUG, "Stopwatch: {0}{1}", Strings.LINE_SEPARATOR, Stopwatchs.getTimingStat());
Stopwatchs.release();
super.requestDestroyed(servletRequestEvent);
} finally {
requestLock.unlock();
}
super.requestDestroyed(servletRequestEvent);
}
/**
......@@ -200,7 +180,6 @@ public final class SoloServletListener extends AbstractServletListener {
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
JSONObject preference;
try {
preference = preferenceQueryService.getPreference();
if (null == preference) {
......@@ -211,7 +190,6 @@ public final class SoloServletListener extends AbstractServletListener {
}
final PreferenceMgmtService preferenceMgmtService = beanManager.getReference(PreferenceMgmtService.class);
preferenceMgmtService.loadSkins(preference);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
......@@ -260,16 +238,14 @@ public final class SoloServletListener extends AbstractServletListener {
*/
private void resolveSkinDir(final HttpServletRequest httpServletRequest) {
// https://github.com/b3log/solo/issues/12060
httpServletRequest.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
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;
......@@ -281,13 +257,11 @@ public final class SoloServletListener extends AbstractServletListener {
try {
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
final JSONObject preference = preferenceQueryService.getPreference();
if (null == preference) { // Did not initialize yet
if (null == preference) { // Not initialize yet
return;
}
final String requestURI = httpServletRequest.getRequestURI();
String desiredView = Requests.mobileSwitchToggle(httpServletRequest);
if (desiredView == null && !Requests.mobileRequest(httpServletRequest) || desiredView != null && desiredView.equals("normal")) {
desiredView = preference.getString(Skin.SKIN_DIR_NAME);
......@@ -296,7 +270,6 @@ public final class SoloServletListener extends AbstractServletListener {
LOGGER.log(Level.DEBUG, "The request [URI={0}] via 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);
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.api;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.ServiceException;
......
......@@ -22,7 +22,7 @@ import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventManager;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.Transaction;
......
......@@ -24,7 +24,7 @@ import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
......
......@@ -18,10 +18,9 @@
package org.b3log.solo.cache;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.Singleton;
import org.b3log.solo.model.Article;
import org.b3log.solo.util.JSONs;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import java.util.Map;
......@@ -34,7 +33,6 @@ import java.util.concurrent.ConcurrentHashMap;
* @version 1.2.0.1, Sep 25, 2018
* @since 2.3.0
*/
@Named
@Singleton
public class ArticleCache {
......@@ -60,7 +58,7 @@ public class ArticleCache {
return null;
}
return JSONs.clone(article);
return Solos.clone(article);
}
/**
......@@ -75,7 +73,7 @@ public class ArticleCache {
return null;
}
return JSONs.clone(article);
return Solos.clone(article);
}
/**
......@@ -84,8 +82,8 @@ public class ArticleCache {
* @param article the specified article
*/
public void putArticle(final JSONObject article) {
idCache.put(article.optString(Keys.OBJECT_ID), JSONs.clone(article));
permalinkCache.put(article.optString(Article.ARTICLE_PERMALINK), JSONs.clone(article));
idCache.put(article.optString(Keys.OBJECT_ID), Solos.clone(article));
permalinkCache.put(article.optString(Article.ARTICLE_PERMALINK), Solos.clone(article));
}
/**
......
......@@ -18,9 +18,8 @@
package org.b3log.solo.cache;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.solo.util.JSONs;
import org.b3log.latke.ioc.Singleton;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import java.util.Map;
......@@ -33,7 +32,6 @@ import java.util.concurrent.ConcurrentHashMap;
* @version 1.1.0.1, Sep 25, 2018
* @since 2.3.0
*/
@Named
@Singleton
public class CommentCache {
......@@ -54,7 +52,7 @@ public class CommentCache {
return null;
}
return JSONs.clone(comment);
return Solos.clone(comment);
}
/**
......@@ -63,7 +61,7 @@ public class CommentCache {
* @param comment the specified comment
*/
public void putComment(final JSONObject comment) {
cache.put(comment.optString(Keys.OBJECT_ID), JSONs.clone(comment));
cache.put(comment.optString(Keys.OBJECT_ID), Solos.clone(comment));
}
/**
......
......@@ -18,10 +18,9 @@
package org.b3log.solo.cache;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.Singleton;
import org.b3log.solo.model.Option;
import org.b3log.solo.util.JSONs;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import java.util.Map;
......@@ -34,7 +33,6 @@ import java.util.concurrent.ConcurrentHashMap;
* @version 1.1.0.1, Sep 25, 2018
* @since 2.3.0
*/
@Named
@Singleton
public class OptionCache {
......@@ -69,7 +67,7 @@ public class OptionCache {
return null;
}
return JSONs.clone(ret);
return Solos.clone(ret);
}
/**
......@@ -94,7 +92,7 @@ public class OptionCache {
return null;
}
return JSONs.clone(option);
return Solos.clone(option);
}
/**
......@@ -103,7 +101,7 @@ public class OptionCache {
* @param option the specified option
*/
public void putOption(final JSONObject option) {
cache.put(option.optString(Keys.OBJECT_ID), JSONs.clone(option));
cache.put(option.optString(Keys.OBJECT_ID), Solos.clone(option));
final String category = option.optString(Option.OPTION_CATEGORY);
removeCategory(category);
......
......@@ -18,9 +18,8 @@
package org.b3log.solo.cache;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.solo.util.JSONs;
import org.b3log.latke.ioc.Singleton;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import java.util.Map;
......@@ -33,7 +32,6 @@ import java.util.concurrent.ConcurrentHashMap;
* @version 1.0.0.1, Sep 25, 2018
* @since 2.3.0
*/
@Named
@Singleton
public class PageCache {
......@@ -54,7 +52,7 @@ public class PageCache {
return null;
}
return JSONs.clone(page);
return Solos.clone(page);
}
/**
......@@ -65,7 +63,7 @@ public class PageCache {
public void putPage(final JSONObject page) {
final String pageId = page.optString(Keys.OBJECT_ID);
cache.put(pageId, JSONs.clone(page));
cache.put(pageId, Solos.clone(page));
}
/**
......
......@@ -17,8 +17,7 @@
*/
package org.b3log.solo.cache;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.Singleton;
import org.b3log.solo.model.Option;
import org.json.JSONObject;
......@@ -32,7 +31,6 @@ import java.util.concurrent.ConcurrentHashMap;
* @version 1.0.0.1, Sep 25, 2018
* @since 2.4.0
*/
@Named
@Singleton
public class StatisticCache {
......
......@@ -18,11 +18,10 @@
package org.b3log.solo.cache;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.solo.util.JSONs;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import java.util.Map;
......@@ -35,7 +34,6 @@ import java.util.concurrent.ConcurrentHashMap;
* @version 1.1.0.1, Sep 25, 2018
* @since 2.3.0
*/
@Named
@Singleton
public class UserCache {
......@@ -84,7 +82,7 @@ public class UserCache {
return null;
}
return JSONs.clone(user);
return Solos.clone(user);
}
/**
......@@ -99,7 +97,7 @@ public class UserCache {
return null;
}
return JSONs.clone(user);
return Solos.clone(user);
}
/**
......@@ -108,8 +106,8 @@ public class UserCache {
* @param user the specified user
*/
public void putUser(final JSONObject user) {
idCache.put(user.optString(Keys.OBJECT_ID), JSONs.clone(user));
emailCache.put(user.optString(User.USER_EMAIL), JSONs.clone(user));
idCache.put(user.optString(Keys.OBJECT_ID), Solos.clone(user));
emailCache.put(user.optString(User.USER_EMAIL), Solos.clone(user));
}
/**
......
......@@ -22,10 +22,8 @@ import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.event.AbstractEventListener;
import org.b3log.latke.event.Event;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.mail.MailService;
......@@ -38,7 +36,7 @@ import org.b3log.solo.model.Option;
import org.b3log.solo.repository.CommentRepository;
import org.b3log.solo.repository.impl.CommentRepositoryImpl;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.util.Mails;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
/**
......@@ -49,7 +47,6 @@ import org.json.JSONObject;
* @version 1.2.2.11, Sep 25, 2018
* @since 0.3.1
*/
@Named
@Singleton
public class ArticleCommentReplyNotifier extends AbstractEventListener<JSONObject> {
......@@ -84,11 +81,11 @@ public class ArticleCommentReplyNotifier extends AbstractEventListener<JSONObjec
return;
}
if (!Mails.isConfigured()) {
if (!Solos.isConfigured()) {
return;
}
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
final CommentRepository commentRepository = beanManager.getReference(CommentRepositoryImpl.class);
......
......@@ -24,10 +24,8 @@ import org.b3log.latke.Latkes;
import org.b3log.latke.event.AbstractEventListener;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
......@@ -52,7 +50,6 @@ import org.json.JSONObject;
* @version 1.0.2.15, Sep 25, 2018
* @since 0.3.1
*/
@Named
@Singleton
public class B3ArticleSender extends AbstractEventListener<JSONObject> {
......@@ -80,7 +77,7 @@ public class B3ArticleSender extends AbstractEventListener<JSONObject> {
return;
}
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
final ArticleQueryService articleQueryService = beanManager.getReference(ArticleQueryService.class);
......
......@@ -24,10 +24,8 @@ import org.b3log.latke.Latkes;
import org.b3log.latke.event.AbstractEventListener;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
......@@ -51,7 +49,6 @@ import org.json.JSONObject;
* @version 1.0.1.5, Sep 25, 2018
* @since 0.6.0
*/
@Named
@Singleton
public class B3ArticleUpdater extends AbstractEventListener<JSONObject> {
......@@ -78,7 +75,7 @@ public class B3ArticleUpdater extends AbstractEventListener<JSONObject> {
return;
}
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
final ArticleQueryService articleQueryService = beanManager.getReference(ArticleQueryService.class);
......
......@@ -23,10 +23,8 @@ import org.b3log.latke.Latkes;
import org.b3log.latke.event.AbstractEventListener;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.util.Strings;
......@@ -44,7 +42,6 @@ import org.json.JSONObject;
* @version 1.0.1.3, Sep 25, 2018
* @since 0.5.5
*/
@Named
@Singleton
public class B3CommentSender extends AbstractEventListener<JSONObject> {
......@@ -67,7 +64,7 @@ public class B3CommentSender extends AbstractEventListener<JSONObject> {
try {
final JSONObject originalComment = data.getJSONObject(Comment.COMMENT);
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
final JSONObject preference = preferenceQueryService.getPreference();
......
......@@ -23,10 +23,8 @@ import org.b3log.latke.Latkes;
import org.b3log.latke.event.AbstractEventListener;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.mail.MailService;
......@@ -39,7 +37,7 @@ import org.b3log.solo.model.Page;
import org.b3log.solo.repository.CommentRepository;
import org.b3log.solo.repository.impl.CommentRepositoryImpl;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.util.Mails;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
/**
......@@ -49,7 +47,6 @@ import org.json.JSONObject;
* @version 1.0.2.6, Sep 25, 2018
* @since 0.3.1
*/
@Named
@Singleton
public class PageCommentReplyNotifier extends AbstractEventListener<JSONObject> {
......@@ -78,11 +75,11 @@ public class PageCommentReplyNotifier extends AbstractEventListener<JSONObject>
return;
}
if (!Mails.isConfigured()) {
if (!Solos.isConfigured()) {
return;
}
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final PreferenceQueryService preferenceQueryService = beanManager.getReference(PreferenceQueryService.class);
final CommentRepository commentRepository = beanManager.getReference(CommentRepositoryImpl.class);
......
......@@ -19,10 +19,8 @@ package org.b3log.solo.event;
import org.b3log.latke.event.AbstractEventListener;
import org.b3log.latke.event.Event;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.plugin.AbstractPlugin;
......@@ -41,7 +39,6 @@ import java.util.List;
* @version 1.0.0.2, Sep 25, 2018
* @since 0.3.1
*/
@Named
@Singleton
public class PluginRefresher extends AbstractEventListener<List<AbstractPlugin>> {
......@@ -57,7 +54,7 @@ public class PluginRefresher extends AbstractEventListener<List<AbstractPlugin>>
LOGGER.log(Level.DEBUG, "Processing an event[type={0}, data={1}] in listener[className={2}]",
event.getType(), plugins, PluginRefresher.class.getName());
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final PluginRepository pluginRepository = beanManager.getReference(PluginRepositoryImpl.class);
final Transaction transaction = pluginRepository.beginTransaction();
......
......@@ -20,8 +20,7 @@ package org.b3log.solo.filter;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.DispatcherServlet;
......@@ -82,7 +81,7 @@ public final class InitCheckFilter implements Filter {
return;
}
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final InitService initService = beanManager.getReference(InitService.class);
if (initService.isInited()) {
chain.doFilter(request, response);
......
......@@ -20,8 +20,7 @@ package org.b3log.solo.filter;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......@@ -96,7 +95,7 @@ public final class PermalinkFilter implements Filter {
JSONObject article;
JSONObject page = null;
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
try {
final ArticleRepository articleRepository = beanManager.getReference(ArticleRepositoryImpl.class);
......
......@@ -24,7 +24,7 @@ import org.b3log.latke.Latkes;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException;
import org.b3log.latke.event.EventManager;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......@@ -36,19 +36,18 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.URIPatternMode;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.servlet.renderer.TextHTMLRenderer;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.*;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.event.EventTypes;
import org.b3log.solo.model.*;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.processor.console.ConsoleRenderer;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.*;
import org.b3log.solo.util.Skins;
import org.b3log.solo.util.Thumbnails;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import org.jsoup.Jsoup;
......@@ -94,10 +93,10 @@ public class ArticleProcessor {
private CommentQueryService commentQueryService;
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Language service.
......@@ -189,7 +188,7 @@ public class ArticleProcessor {
dataModel.put(Common.YEAR, String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
Keys.fillRuntime(dataModel);
filler.fillMinified(dataModel);
dataModelService.fillMinified(dataModel);
}
/**
......@@ -379,7 +378,7 @@ public class ArticleProcessor {
requestJSONObject.put(Option.ID_C_ENABLE_ARTICLE_UPDATE_HINT, preference.optBoolean(Option.ID_C_ENABLE_ARTICLE_UPDATE_HINT));
final JSONObject result = articleQueryService.getArticles(requestJSONObject);
final List<JSONObject> articles = org.b3log.latke.util.CollectionUtils.jsonArrayToList(result.getJSONArray(Article.ARTICLES));
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
jsonObject.put(Keys.RESULTS, result);
} catch (final Exception e) {
......@@ -414,7 +413,7 @@ public class ArticleProcessor {
final int currentPageNum = getTagArticlesPagedCurrentPageNum(request.getRequestURI());
Stopwatchs.start("Get Tag-Articles Paged[tagTitle=" + tagTitle + ", pageNum=" + currentPageNum + ']');
Stopwatchs.start("Get Tag-Articles Paged [tagTitle=" + tagTitle + ", pageNum=" + currentPageNum + ']');
try {
jsonObject.put(Keys.STATUS_CODE, true);
......@@ -432,7 +431,7 @@ public class ArticleProcessor {
final int tagArticleCount = tag.getInt(Tag.TAG_PUBLISHED_REFERENCE_COUNT);
final int pageCount = (int) Math.ceil((double) tagArticleCount / (double) pageSize);
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
final JSONObject result = new JSONObject();
final JSONObject pagination = new JSONObject();
......@@ -484,7 +483,7 @@ public class ArticleProcessor {
final int pageCount = (int) Math.ceil((double) articleCount / (double) pageSize);
final List<JSONObject> articles = articleQueryService.getArticlesByArchiveDate(archiveDateId, currentPageNum, pageSize);
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
final JSONObject result = new JSONObject();
final JSONObject pagination = new JSONObject();
......@@ -535,7 +534,7 @@ public class ArticleProcessor {
final JSONObject author = authorRet.getJSONObject(User.USER);
final List<JSONObject> articles = articleQueryService.getArticlesByAuthorId(authorId, currentPageNum, pageSize);
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
final int articleCount = author.getInt(UserExt.USER_PUBLISHED_ARTICLE_COUNT);
final int pageCount = (int) Math.ceil((double) articleCount / (double) pageSize);
......@@ -617,7 +616,7 @@ public class ArticleProcessor {
return;
}
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
final int articleCount = author.getInt(UserExt.USER_PUBLISHED_ARTICLE_COUNT);
final int pageCount = (int) Math.ceil((double) articleCount / (double) pageSize);
......@@ -625,7 +624,7 @@ public class ArticleProcessor {
final Map<String, Object> dataModel = renderer.getDataModel();
prepareShowAuthorArticles(pageNums, dataModel, pageCount, currentPageNum, articles, author);
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME), dataModel);
statisticMgmtService.incBlogViewCount(request, response);
......@@ -691,12 +690,12 @@ public class ArticleProcessor {
return;
}
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
final Map<String, Object> dataModel = renderer.getDataModel();
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME), dataModel);
prepareShowArchiveArticles(preference, dataModel, articles, currentPageNum, pageCount, archiveDateString, archiveDate);
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
statisticMgmtService.incBlogViewCount(request, response);
} catch (final Exception e) {
......@@ -769,7 +768,7 @@ public class ArticleProcessor {
if (StringUtils.isNotBlank(userAvatar)) {
article.put(Common.AUTHOR_THUMBNAIL_URL, userAvatar);
} else {
final String thumbnailURL = Thumbnails.getGravatarURL(author.optString(User.USER_EMAIL), "128");
final String thumbnailURL = Solos.getGravatarURL(author.optString(User.USER_EMAIL), "128");
article.put(Common.AUTHOR_THUMBNAIL_URL, thumbnailURL);
}
......@@ -777,7 +776,7 @@ public class ArticleProcessor {
prepareShowArticle(preference, dataModel, article);
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME), dataModel);
if (!StatisticMgmtService.hasBeenServed(request, response)) {
......@@ -865,7 +864,7 @@ public class ArticleProcessor {
if (StringUtils.isNotBlank(userAvatar)) {
dataModel.put(Common.AUTHOR_THUMBNAIL_URL, userAvatar);
} else {
final String thumbnailURL = Thumbnails.getGravatarURL(author.optString(User.USER_EMAIL), "128");
final String thumbnailURL = Solos.getGravatarURL(author.optString(User.USER_EMAIL), "128");
dataModel.put(Common.AUTHOR_THUMBNAIL_URL, thumbnailURL);
}
......
......@@ -22,7 +22,7 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
import org.b3log.latke.model.User;
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......@@ -30,14 +30,13 @@ import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Requests;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Category;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.*;
import org.b3log.solo.util.Skins;
import org.json.JSONException;
......@@ -45,7 +44,6 @@ import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
......@@ -66,10 +64,10 @@ public class CategoryProcessor {
private static final Logger LOGGER = Logger.getLogger(CategoryProcessor.class);
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Language service.
......@@ -195,13 +193,13 @@ public class CategoryProcessor {
}
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME), dataModel);
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
final List<Integer> pageNums = (List) result.optJSONObject(Pagination.PAGINATION).opt(Pagination.PAGINATION_PAGE_NUMS);
fillPagination(dataModel, pageCount, currentPageNum, articles, pageNums);
dataModel.put(Common.PATH, "/category/" + URLEncoder.encode(categoryURI, "UTF-8"));
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
statisticMgmtService.incBlogViewCount(request, response);
} catch (final ServiceException | JSONException e) {
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.processor;
import freemarker.template.Template;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
......@@ -29,7 +29,6 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.model.*;
import org.b3log.solo.service.CommentMgmtService;
import org.b3log.solo.service.PreferenceQueryService;
......@@ -160,7 +159,7 @@ public class CommentProcessor {
// https://github.com/b3log/solo/issues/12246
try {
final String skinDirName = (String) httpServletRequest.getAttribute(Keys.TEMAPLTE_DIR_NAME);
final Template template = Templates.MAIN_CFG.getTemplate("common-comment.ftl");
final Template template = Skins.getSkinTemplate(httpServletRequest, "common-comment.ftl");
final JSONObject preference = preferenceQueryService.getPreference();
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), skinDirName, dataModel);
Keys.fillServer(dataModel);
......@@ -255,7 +254,7 @@ public class CommentProcessor {
// https://github.com/b3log/solo/issues/12246
try {
final String skinDirName = (String) httpServletRequest.getAttribute(Keys.TEMAPLTE_DIR_NAME);
final Template template = Templates.MAIN_CFG.getTemplate("common-comment.ftl");
final Template template = Skins.getSkinTemplate(httpServletRequest, "common-comment.ftl");
final JSONObject preference = preferenceQueryService.getPreference();
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), skinDirName, dataModel);
Keys.fillServer(dataModel);
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......@@ -28,8 +28,8 @@ import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.util.Locales;
import org.b3log.solo.model.Common;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.processor.console.ConsoleRenderer;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.UserQueryService;
import org.json.JSONObject;
......@@ -54,10 +54,10 @@ public class ErrorProcessor {
private static final Logger LOGGER = Logger.getLogger(ArticleProcessor.class);
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Preference query service.
......@@ -103,7 +103,7 @@ public class ErrorProcessor {
final Map<String, String> langs = langPropsService.getAll(Locales.getLocale(request));
dataModel.putAll(langs);
final JSONObject preference = preferenceQueryService.getPreference();
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
dataModel.put(Common.LOGIN_URL, userQueryService.getLoginURL(Common.ADMIN_INDEX_URI));
} catch (final Exception e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.processor;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
......
......@@ -31,8 +31,7 @@ import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.HTTPRequestContext;
......@@ -165,7 +164,7 @@ public class FileUploadProcessor {
final String date = DateFormatUtils.format(System.currentTimeMillis(), "yyyy/MM");
if (QN_ENABLED) {
try {
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final OptionQueryService optionQueryService = beanManager.getReference(OptionQueryService.class);
qiniu = optionQueryService.getOptions(Option.CATEGORY_C_QINIU);
if (null == qiniu) {
......
......@@ -17,11 +17,10 @@
*/
package org.b3log.solo.processor;
import freemarker.template.Template;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......@@ -32,18 +31,15 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.URIPatternMode;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.DoNothingRenderer;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Requests;
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.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.processor.console.ConsoleRenderer;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.StatisticMgmtService;
import org.b3log.solo.util.Skins;
......@@ -52,18 +48,14 @@ import org.json.JSONObject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;
import java.util.Set;
/**
* Index processor.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="mailto:385321165@qq.com">DASHU</a>
* @version 1.2.4.7, Jun 22, 2018
* @version 1.2.4.8, Sep 26, 2018
* @since 0.3.1
*/
@RequestProcessor
......@@ -75,10 +67,10 @@ public class IndexProcessor {
private static final Logger LOGGER = Logger.getLogger(IndexProcessor.class);
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Preference query service.
......@@ -134,17 +126,10 @@ public class IndexProcessor {
specifiedSkin = preference.optString(Option.ID_C_SKIN_DIR_NAME);
}
final Set<String> skinDirNames = Skins.getSkinDirNames();
if (skinDirNames.contains(specifiedSkin)) {
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);
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillIndexArticles(request, dataModel, currentPageNum, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
dataModel.put(Pagination.PAGINATION_CURRENT_PAGE_NUM, currentPageNum);
final int previousPageNum = currentPageNum > 1 ? currentPageNum - 1 : 0;
......@@ -183,19 +168,19 @@ public class IndexProcessor {
@RequestProcessing(value = "/kill-browser", method = HTTPRequestMethod.GET)
public void showKillBrowser(final HTTPRequestContext context, final HttpServletRequest request, final HttpServletResponse response)
throws Exception {
final AbstractFreeMarkerRenderer renderer = new KillBrowserRenderer();
final AbstractFreeMarkerRenderer renderer = new ConsoleRenderer();
context.setRenderer(renderer);
renderer.setTemplateName("kill-browser.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
try {
final Map<String, String> langs = langPropsService.getAll(Locales.getLocale(request));
dataModel.putAll(langs);
final JSONObject preference = preferenceQueryService.getPreference();
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
Keys.fillServer(dataModel);
Keys.fillRuntime(dataModel);
filler.fillMinified(dataModel);
dataModelService.fillMinified(dataModel);
} catch (final ServiceException e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
......@@ -223,8 +208,8 @@ public class IndexProcessor {
final Map<String, String> langs = langPropsService.getAll(Latkes.getLocale());
dataModel.putAll(langs);
final JSONObject preference = preferenceQueryService.getPreference();
filler.fillCommon(request, response, dataModel, preference);
filler.fillMinified(dataModel);
dataModelService.fillCommon(request, response, dataModel, preference);
dataModelService.fillMinified(dataModel);
} catch (final ServiceException e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
......@@ -255,55 +240,4 @@ public class IndexProcessor {
return Requests.getCurrentPageNum(pageNumString);
}
/**
* Kill browser (kill-browser.ftl) HTTP response renderer.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Sep 18, 2011
* @since 0.3.1
*/
private static final class KillBrowserRenderer extends AbstractFreeMarkerRenderer {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(KillBrowserRenderer.class);
@Override
public void render(final HTTPRequestContext context) {
final HttpServletResponse response = context.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
try {
final Template template = ConsoleRenderer.TEMPLATE_CFG.getTemplate("kill-browser.ftl");
final PrintWriter writer = response.getWriter();
final StringWriter stringWriter = new StringWriter();
template.setOutputEncoding("UTF-8");
template.process(getDataModel(), stringWriter);
final String pageContent = stringWriter.toString();
writer.write(pageContent);
writer.flush();
writer.close();
} catch (final Exception e) {
try {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
} catch (final IOException ex) {
LOGGER.log(Level.ERROR, "Can not send error 500!", ex);
}
}
}
@Override
protected void afterRender(final HTTPRequestContext context) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
protected void beforeRender(final HTTPRequestContext context) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
......@@ -30,18 +30,18 @@ import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Sessions;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.UserExt;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.processor.console.ConsoleRenderer;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.InitService;
import org.b3log.solo.util.Thumbnails;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
......@@ -72,10 +72,10 @@ public class InitProcessor {
private InitService initService;
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Language service.
......@@ -110,7 +110,7 @@ public class InitProcessor {
dataModel.put(Common.STATIC_RESOURCE_VERSION, Latkes.getStaticResourceVersion());
dataModel.put(Common.YEAR, String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
Keys.fillRuntime(dataModel);
filler.fillMinified(dataModel);
dataModelService.fillMinified(dataModel);
}
/**
......@@ -172,7 +172,7 @@ public class InitProcessor {
admin.put(User.USER_PASSWORD, userPassword);
String avatar = requestJSONObject.optString(UserExt.USER_AVATAR);
if (StringUtils.isBlank(avatar)) {
avatar = Thumbnails.getGravatarURL(userEmail, "128");
avatar = Solos.getGravatarURL(userEmail, "128");
}
admin.put(UserExt.USER_AVATAR, avatar);
......
......@@ -22,7 +22,7 @@ import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.mail.MailService;
......@@ -37,18 +37,17 @@ import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Sessions;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.processor.console.ConsoleRenderer;
import org.b3log.solo.repository.OptionRepository;
import org.b3log.solo.service.*;
import org.b3log.solo.util.Mails;
import org.b3log.solo.util.Solos;
import org.json.JSONException;
import org.json.JSONObject;
......@@ -100,10 +99,10 @@ public class LoginProcessor {
private LangPropsService langPropsService;
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Preference query service.
......@@ -402,7 +401,7 @@ public class LoginProcessor {
message.setSubject(mailSubject);
message.setHtmlBody(mailBody);
if (Mails.isConfigured()) {
if (Solos.isConfigured()) {
mailService.send(message);
} else {
LOGGER.log(Level.INFO, "Do not send mail caused by not configure mail.properties");
......@@ -428,7 +427,6 @@ public class LoginProcessor {
private void renderPage(final HTTPRequestContext context, final String pageTemplate, final String destinationURL,
final HttpServletRequest request) throws JSONException, ServiceException {
final AbstractFreeMarkerRenderer renderer = new ConsoleRenderer();
renderer.setTemplateName(pageTemplate);
context.setRenderer(renderer);
......@@ -468,7 +466,7 @@ public class LoginProcessor {
}
Keys.fillRuntime(dataModel);
filler.fillMinified(dataModel);
dataModelService.fillMinified(dataModel);
}
/**
......
......@@ -23,7 +23,7 @@ import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.processor;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......@@ -26,13 +26,12 @@ import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Page;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.CommentQueryService;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.StatisticMgmtService;
......@@ -68,10 +67,10 @@ public class PageProcessor {
private LangPropsService langPropsService;
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Preference query service.
......@@ -143,7 +142,7 @@ public class PageProcessor {
Stopwatchs.end();
}
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
statisticMgmtService.incBlogViewCount(request, response);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
......
......@@ -18,8 +18,8 @@
package org.b3log.solo.processor;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.mail.MailService;
......@@ -44,7 +44,7 @@ import org.b3log.solo.service.PreferenceMgmtService;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.StatisticMgmtService;
import org.b3log.solo.service.StatisticQueryService;
import org.b3log.solo.util.Mails;
import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONObject;
......@@ -75,7 +75,7 @@ public class RepairProcessor {
* Bean manager.
*/
@Inject
private LatkeBeanManager beanManager;
private BeanManager beanManager;
/**
* Preference query service.
......@@ -139,7 +139,7 @@ public class RepairProcessor {
renderer.setContent("Restores signs succeeded.");
// Sends the sample signs to developer
if (!Mails.isConfigured()) {
if (!Solos.isConfigured()) {
return;
}
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......@@ -29,14 +29,14 @@ import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.TextXMLRenderer;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Strings;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.processor.console.ConsoleRenderer;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.ArticleQueryService;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.UserQueryService;
......@@ -91,10 +91,10 @@ public class SearchProcessor {
private LangPropsService langPropsService;
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Shows opensearch.xml.
......@@ -155,8 +155,8 @@ public class SearchProcessor {
try {
final JSONObject preference = preferenceQueryService.getPreference();
filler.fillCommon(request, context.getResponse(), dataModel, preference);
filler.setArticlesExProperties(request, articles, preference);
dataModelService.fillCommon(request, context.getResponse(), dataModel, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
dataModel.put(Article.ARTICLES, articles);
final JSONObject pagination = result.optJSONObject(Pagination.PAGINATION);
......
......@@ -21,7 +21,7 @@ import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.FilterOperator;
......@@ -55,7 +55,7 @@ import java.net.URLEncoder;
* Sitemap processor.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.2.3, Sep 20, 2018
* @version 1.0.2.4, Sep 26, 2018
* @since 0.3.1
*/
@RequestProcessor
......@@ -122,7 +122,7 @@ public class SitemapProcessor {
LOGGER.log(Level.INFO, "Generated sitemap");
renderer.setContent(content);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Get blog article feed error", e);
LOGGER.log(Level.ERROR, "Generates sitemap failed", e);
context.getResponse().sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
}
......
......@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.processor.renderer;
package org.b3log.solo.processor;
import freemarker.template.Template;
import org.apache.commons.lang.StringUtils;
......@@ -23,7 +23,8 @@ import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.solo.util.Skins;
import javax.servlet.http.HttpServletRequest;
import java.io.StringWriter;
......@@ -57,6 +58,11 @@ public final class SkinRenderer extends AbstractFreeMarkerRenderer {
this.request = request;
}
@Override
protected Template getTemplate() {
return Skins.getSkinTemplate(request, getTemplateName());
}
/**
* Processes the specified FreeMarker template with the specified request, data model, pjax hacking.
*
......@@ -66,6 +72,7 @@ public final class SkinRenderer extends AbstractFreeMarkerRenderer {
* @return generated HTML
* @throws Exception exception
*/
@Override
protected String genHTML(final HttpServletRequest request, final Map<String, Object> dataModel, final Template template)
throws Exception {
final boolean isPJAX = isPJAX(request);
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......@@ -29,15 +29,14 @@ import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Paginator;
import org.b3log.latke.util.Requests;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Tag;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.*;
import org.b3log.solo.util.Skins;
import org.json.JSONObject;
......@@ -65,10 +64,10 @@ public class TagProcessor {
private static final Logger LOGGER = Logger.getLogger(TagProcessor.class);
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Language service.
......@@ -160,19 +159,19 @@ public class TagProcessor {
return;
}
filler.setArticlesExProperties(request, articles, preference);
dataModelService.setArticlesExProperties(request, articles, preference);
final int tagArticleCount = tag.getInt(Tag.TAG_PUBLISHED_REFERENCE_COUNT);
final int pageCount = (int) Math.ceil((double) tagArticleCount / (double) pageSize);
LOGGER.log(Level.TRACE, "Paginate tag-articles[currentPageNum={0}, pageSize={1}, pageCount={2}, windowSize={3}]",
LOGGER.log(Level.TRACE, "Paginate tag-articles [currentPageNum={0}, pageSize={1}, pageCount={2}, windowSize={3}]",
currentPageNum, pageSize, pageCount, windowSize);
final List<Integer> pageNums = Paginator.paginate(currentPageNum, pageSize, pageCount, windowSize);
LOGGER.log(Level.TRACE, "tag-articles[pageNums={0}]", pageNums);
LOGGER.log(Level.TRACE, "tag-articles [pageNums={0}]", pageNums);
fillPagination(dataModel, pageCount, currentPageNum, articles, pageNums);
dataModel.put(Common.PATH, "/tags/" + URLEncoder.encode(tagTitle, "UTF-8"));
dataModel.put(Keys.OBJECT_ID, tagId);
dataModel.put(Tag.TAG, tag);
filler.fillCommon(request, response, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
statisticMgmtService.incBlogViewCount(request, response);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor;
import freemarker.template.Template;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......@@ -28,12 +28,10 @@ import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.model.Option;
import org.b3log.solo.processor.renderer.SkinRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.StatisticMgmtService;
import org.b3log.solo.util.Skins;
......@@ -63,10 +61,10 @@ public class UserTemplateProcessor {
private static final Logger LOGGER = Logger.getLogger(ArticleProcessor.class);
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Preference query service.
......@@ -108,7 +106,7 @@ public class UserTemplateProcessor {
renderer.setTemplateName(templateName);
final Map<String, Object> dataModel = renderer.getDataModel();
final Template template = Templates.getTemplate((String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME), templateName);
final Template template = Skins.getSkinTemplate(request, templateName);
if (null == template) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
......@@ -119,8 +117,8 @@ public class UserTemplateProcessor {
final Map<String, String> langs = langPropsService.getAll(Locales.getLocale(request));
dataModel.putAll(langs);
final JSONObject preference = preferenceQueryService.getPreference();
filler.fillCommon(request, response, dataModel, preference);
filler.fillUserTemplate(request, template, dataModel, preference);
dataModelService.fillCommon(request, response, dataModel, preference);
dataModelService.fillUserTemplate(request, template, dataModel, preference);
Skins.fillLangs(preference.optString(Option.ID_C_LOCALE_STRING), (String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME), dataModel);
statisticMgmtService.incBlogViewCount(request, response);
} catch (final Exception e) {
......
......@@ -27,7 +27,7 @@ import org.b3log.latke.Latkes;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException;
import org.b3log.latke.event.EventManager;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Plugin;
......@@ -41,7 +41,7 @@ import org.b3log.latke.servlet.HTTPRequestMethod;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Execs;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
......@@ -49,13 +49,12 @@ import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Skin;
import org.b3log.solo.model.UserExt;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.processor.util.Filler;
import org.b3log.solo.service.DataModelService;
import org.b3log.solo.service.ExportService;
import org.b3log.solo.service.OptionQueryService;
import org.b3log.solo.service.PreferenceQueryService;
import org.b3log.solo.service.UserQueryService;
import org.b3log.solo.util.Thumbnails;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.ServletOutputStream;
......@@ -117,10 +116,10 @@ public class AdminConsole {
private ExportService exportService;
/**
* Filler.
* DataModelService.
*/
@Inject
private Filler filler;
private DataModelService dataModelService;
/**
* Event manager.
......@@ -159,7 +158,7 @@ public class AdminConsole {
if (StringUtils.isNotBlank(userAvatar)) {
dataModel.put(Common.GRAVATAR, userAvatar);
} else {
final String gravatar = Thumbnails.getGravatarURL(email, "128");
final String gravatar = Solos.getGravatarURL(email, "128");
dataModel.put(Common.GRAVATAR, gravatar);
}
......@@ -177,7 +176,7 @@ public class AdminConsole {
dataModel.put(Option.ID_C_EDITOR_TYPE, preference.getString(Option.ID_C_EDITOR_TYPE));
dataModel.put(Skin.SKIN_DIR_NAME, preference.getString(Skin.SKIN_DIR_NAME));
Keys.fillRuntime(dataModel);
filler.fillMinified(dataModel);
dataModelService.fillMinified(dataModel);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Admin index render failed", e);
}
......
......@@ -21,7 +21,7 @@ import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......
......@@ -21,7 +21,7 @@ import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......
......@@ -18,10 +18,8 @@
package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.advice.BeforeRequestProcessAdvice;
......@@ -40,7 +38,6 @@ import java.util.Map;
* @version 1.0.1.1, Sep 25, 2018
* @since 2.9.5
*/
@Named
@Singleton
public class ConsoleAdminAuthAdvice extends BeforeRequestProcessAdvice {
......@@ -51,7 +48,7 @@ public class ConsoleAdminAuthAdvice extends BeforeRequestProcessAdvice {
@Override
public void doAdvice(final HTTPRequestContext context, final Map<String, Object> args) throws RequestProcessAdviceException {
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final BeanManager beanManager = BeanManager.getInstance();
final UserQueryService userQueryService = beanManager.getReference(UserQueryService.class);
final HttpServletRequest request = context.getRequest();
......
......@@ -18,9 +18,8 @@
package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.inject.Named;
import org.b3log.latke.ioc.inject.Singleton;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
......@@ -41,7 +40,6 @@ import java.util.Map;
* @version 1.0.1.1, Sep 25, 2018
* @since 2.9.5
*/
@Named
@Singleton
public class ConsoleAuthAdvice extends BeforeRequestProcessAdvice {
......
......@@ -15,64 +15,38 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.processor.renderer;
package org.b3log.solo.processor.console;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.latke.servlet.renderer.freemarker.AbstractFreeMarkerRenderer;
import org.b3log.solo.SoloServletListener;
import javax.servlet.ServletContext;
import java.io.IOException;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.solo.util.Skins;
/**
* <a href="http://freemarker.org">FreeMarker</a> HTTP response renderer for administrator console and initialization
* rendering.
* <a href="http://freemarker.org">FreeMarker</a> HTTP response renderer for administrator console and initialization rendering.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.1.4, May 14, 2018
* @version 1.0.1.5, Sep 26, 2018
* @since 0.4.1
*/
public final class ConsoleRenderer extends AbstractFreeMarkerRenderer {
/**
* FreeMarker configuration.
*/
public static final Configuration TEMPLATE_CFG;
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(ConsoleRenderer.class);
static {
TEMPLATE_CFG = new Configuration(Configuration.VERSION_2_3_28);
TEMPLATE_CFG.setDefaultEncoding("UTF-8");
final ServletContext servletContext = SoloServletListener.getServletContext();
TEMPLATE_CFG.setServletContextForTemplateLoading(servletContext, "");
TEMPLATE_CFG.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
TEMPLATE_CFG.setLogTemplateExceptions(false);
}
@Override
protected Template getTemplate(final String templateDirName, final String templateName) {
try {
return TEMPLATE_CFG.getTemplate(templateName);
} catch (final IOException e) {
return null;
}
protected Template getTemplate() {
return Skins.getTemplate(getTemplateName());
}
@Override
protected void beforeRender(final HTTPRequestContext context) throws Exception {
protected void beforeRender(final HTTPRequestContext context) {
}
@Override
protected void afterRender(final HTTPRequestContext context) throws Exception {
protected void afterRender(final HTTPRequestContext context) {
}
}
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor.console;
import org.apache.commons.lang.StringEscapeUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......
......@@ -20,7 +20,8 @@ package org.b3log.solo.processor.console;
import org.apache.commons.lang.StringEscapeUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Plugin;
......@@ -31,7 +31,6 @@ import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JSONRenderer;
import org.b3log.latke.util.Requests;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.service.PluginMgmtService;
import org.b3log.solo.service.PluginQueryService;
import org.json.JSONObject;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.processor.console;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor.console;
import org.apache.commons.lang.StringEscapeUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
......
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-2018, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.processor.util;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.annotation.Service;
import org.b3log.solo.model.Tag;
import org.b3log.solo.service.ArticleQueryService;
import org.b3log.solo.service.TagQueryService;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
* Fill tag articles.
*
* @author <a href="mailto:385321165@qq.com">DASHU</a>
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.2, Apr 12, 2017
* @since 0.6.1
*/
@Service
public class FillTagArticles implements TemplateMethodModelEx {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(FillTagArticles.class);
/**
* Arg size.
*/
private static final int ARG_SIZE = 3;
/**
* Tag query service.
*/
@Inject
private TagQueryService tagQueryService;
/**
* Article query service.
*/
@Inject
private ArticleQueryService articleQueryService;
@Override
public Object exec(final List arguments) throws TemplateModelException {
if (arguments.size() != ARG_SIZE) {
LOGGER.debug("FillTagArticles with wrong arguments!");
throw new TemplateModelException("Wrong arguments!");
}
final String tagTitle = (String) arguments.get(0);
final int currentPageNum = Integer.parseInt((String) arguments.get(1));
final int pageSize = Integer.parseInt((String) arguments.get(2));
try {
final JSONObject result = tagQueryService.getTagByTitle(tagTitle);
if (null == result) {
return new ArrayList<JSONObject>();
}
final JSONObject tag = result.getJSONObject(Tag.TAG);
final String tagId = tag.getString(Keys.OBJECT_ID);
final List<JSONObject> ret = articleQueryService.getArticlesByTag(tagId, currentPageNum, pageSize);
return ret;
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Fill tag articles failed", e);
}
return null;
}
}
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-2018, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.processor.util;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.solo.model.Common;
import org.b3log.solo.processor.renderer.ConsoleRenderer;
import org.b3log.solo.service.StatisticQueryService;
import org.b3log.solo.service.UserMgmtService;
import org.b3log.solo.service.UserQueryService;
import org.json.JSONException;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
/**
* Top bar utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @author <a href="mailto:dongxu.wang@acm.org">Dongxu Wang</a>
* @version 1.0.1.6, Aug 2, 2018
* @since 0.3.5
*/
@Service
public class TopBars {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(TopBars.class);
/**
* User query service.
*/
@Inject
private UserQueryService userQueryService;
/**
* Language service.
*/
@Inject
private LangPropsService langPropsService;
/**
* User management service.
*/
@Inject
private UserMgmtService userMgmtService;
/**
* Statistic query service.
*/
@Inject
private StatisticQueryService statisticQueryService;
/**
* Generates top bar HTML.
*
* @param request the specified request
* @param response the specified response
* @return top bar HTML
* @throws ServiceException service exception
*/
public String getTopBarHTML(final HttpServletRequest request, final HttpServletResponse response)
throws ServiceException {
Stopwatchs.start("Gens Top Bar HTML");
try {
final Template topBarTemplate = ConsoleRenderer.TEMPLATE_CFG.getTemplate("top-bar.ftl");
final StringWriter stringWriter = new StringWriter();
final Map<String, Object> topBarModel = new HashMap<String, Object>();
userMgmtService.tryLogInWithCookie(request, response);
final JSONObject currentUser = userQueryService.getCurrentUser(request);
Keys.fillServer(topBarModel);
topBarModel.put(Common.IS_LOGGED_IN, false);
topBarModel.put(Common.IS_MOBILE_REQUEST, Requests.mobileRequest(request));
topBarModel.put("mobileLabel", langPropsService.get("mobileLabel"));
topBarModel.put("onlineVisitor1Label", langPropsService.get("onlineVisitor1Label"));
topBarModel.put(Common.ONLINE_VISITOR_CNT, StatisticQueryService.getOnlineVisitorCount());
if (null == currentUser) {
topBarModel.put(Common.LOGIN_URL, userQueryService.getLoginURL(Common.ADMIN_INDEX_URI));
topBarModel.put("loginLabel", langPropsService.get("loginLabel"));
topBarModel.put("registerLabel", langPropsService.get("registerLabel"));
topBarTemplate.process(topBarModel, stringWriter);
return stringWriter.toString();
}
topBarModel.put(Common.IS_LOGGED_IN, true);
topBarModel.put(Common.LOGOUT_URL, userQueryService.getLogoutURL());
topBarModel.put(Common.IS_ADMIN, Role.ADMIN_ROLE.equals(currentUser.getString(User.USER_ROLE)));
topBarModel.put(Common.IS_VISITOR, Role.VISITOR_ROLE.equals(currentUser.getString(User.USER_ROLE)));
topBarModel.put("adminLabel", langPropsService.get("adminLabel"));
topBarModel.put("logoutLabel", langPropsService.get("logoutLabel"));
final String userName = currentUser.getString(User.USER_NAME);
topBarModel.put(User.USER_NAME, userName);
topBarTemplate.process(topBarModel, stringWriter);
return stringWriter.toString();
} catch (final JSONException e) {
LOGGER.log(Level.ERROR, "Gens top bar HTML failed", e);
throw new ServiceException(e);
} catch (final IOException e) {
LOGGER.log(Level.ERROR, "Gens top bar HTML failed", e);
throw new ServiceException(e);
} catch (final TemplateException e) {
LOGGER.log(Level.ERROR, "Gens top bar HTML failed", e);
throw new ServiceException(e);
} finally {
Stopwatchs.end();
}
}
}
......@@ -18,7 +18,7 @@
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.*;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.*;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.repository.*;
import org.b3log.latke.repository.annotation.Repository;
import org.b3log.solo.cache.OptionCache;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.repository.*;
import org.b3log.latke.repository.annotation.Repository;
import org.b3log.solo.cache.PageCache;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.repository.*;
import org.b3log.latke.repository.annotation.Repository;
import org.b3log.solo.model.Tag;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.repository.impl;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.latke.repository.*;
......
......@@ -17,7 +17,7 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......
......@@ -24,7 +24,7 @@ import org.b3log.latke.Keys;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventException;
import org.b3log.latke.event.EventManager;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.service;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.*;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.service;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......
......@@ -24,7 +24,7 @@ import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.event.Event;
import org.b3log.latke.event.EventManager;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.mail.MailService;
......@@ -171,7 +171,7 @@ public class CommentMgmtService {
final JSONObject comment,
final JSONObject originalComment,
final JSONObject preference) throws Exception {
if (!Mails.isConfigured()) {
if (!Solos.isConfigured()) {
return;
}
......@@ -777,7 +777,7 @@ public class CommentMgmtService {
}
// 2. Gravatar
String thumbnailURL = Thumbnails.getGravatarURL(commentEmail.toLowerCase(), "128");
String thumbnailURL = Solos.getGravatarURL(commentEmail.toLowerCase(), "128");
final URL gravatarURL = new URL(thumbnailURL);
int statusCode = HttpServletResponse.SC_OK;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......@@ -37,7 +37,7 @@ import org.b3log.solo.repository.CommentRepository;
import org.b3log.solo.repository.PageRepository;
import org.b3log.solo.util.Emotions;
import org.b3log.solo.util.Markdowns;
import org.b3log.solo.util.Thumbnails;
import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
......@@ -246,7 +246,7 @@ public class CommentQueryService {
final String thumbnailURL = comment.optString(Comment.COMMENT_THUMBNAIL_URL);
if (StringUtils.isBlank(thumbnailURL)) {
comment.put(Comment.COMMENT_THUMBNAIL_URL, Thumbnails.getGravatarURL(email, "128"));
comment.put(Comment.COMMENT_THUMBNAIL_URL, Solos.getGravatarURL(email, "128"));
}
if (StringUtils.isNotBlank(comment.optString(Comment.COMMENT_ORIGINAL_COMMENT_ID))) {
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Plugin;
......
......@@ -21,7 +21,7 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
......
......@@ -24,7 +24,7 @@ import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
......@@ -38,17 +38,17 @@ import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.Ids;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.*;
import org.b3log.solo.model.Option.DefaultPreference;
import org.b3log.solo.repository.*;
import org.b3log.solo.util.*;
import org.b3log.solo.util.Images;
import org.b3log.solo.util.Skins;
import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import javax.servlet.ServletContext;
import java.text.ParseException;
import java.util.List;
import java.util.Set;
......@@ -478,7 +478,7 @@ public class InitService {
admin.put(UserExt.USER_PUBLISHED_ARTICLE_COUNT, 0);
String avatar = requestJSONObject.optString(UserExt.USER_AVATAR);
if (StringUtils.isBlank(avatar)) {
avatar = Thumbnails.getGravatarURL(requestJSONObject.getString(User.USER_EMAIL), "128");
avatar = Solos.getGravatarURL(requestJSONObject.getString(User.USER_EMAIL), "128");
}
admin.put(UserExt.USER_AVATAR, avatar);
......@@ -800,12 +800,6 @@ public class InitService {
skinsOpt.put(Option.OPTION_VALUE, skinArray.toString());
optionRepository.add(skinsOpt);
final ServletContext servletContext = SoloServletListener.getServletContext();
Templates.MAIN_CFG.setServletContextForTemplateLoading(servletContext, "/skins/" + skinDirName);
TimeZones.setTimeZone(INIT_TIME_ZONE_ID);
LOGGER.debug("Initialized preference");
}
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.service;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.Transaction;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.service;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.repository.Transaction;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
......
......@@ -17,7 +17,7 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.service;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Plugin;
......
......@@ -17,7 +17,7 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.service;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.Transaction;
......@@ -27,30 +27,25 @@ import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Skin;
import org.b3log.solo.repository.OptionRepository;
import org.b3log.solo.util.Skins;
import org.b3log.solo.util.TimeZones;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.ServletContext;
import java.util.Iterator;
import java.util.Locale;
import java.util.Set;
import static org.b3log.solo.model.Skin.*;
import static org.b3log.solo.util.Skins.getSkinDirNames;
import static org.b3log.solo.util.Skins.setDirectoryForTemplateLoading;
/**
* Preference management service.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.3.2.15, Sep 17, 2018
* @version 1.3.2.16, Sep 26, 2018
* @since 0.4.0
*/
@Service
......@@ -140,13 +135,6 @@ public class PreferenceMgmtService {
updatePreference(preference);
}
setDirectoryForTemplateLoading(preference.getString(SKIN_DIR_NAME));
final String localeString = preference.getString(Option.ID_C_LOCALE_STRING);
if ("zh_CN".equals(localeString)) {
TimeZones.setTimeZone("Asia/Shanghai");
}
LOGGER.debug("Loaded skins....");
Stopwatchs.end();
......@@ -218,9 +206,6 @@ public class PreferenceMgmtService {
preference.put(Skin.SKINS, skinArray.toString());
final String timeZoneId = preference.getString(Option.ID_C_TIME_ZONE_ID);
TimeZones.setTimeZone(timeZoneId);
preference.put(Option.ID_C_SIGNS, preference.get(Option.ID_C_SIGNS).toString());
final JSONObject oldPreference = preferenceQueryService.getPreference();
......@@ -373,10 +358,6 @@ public class PreferenceMgmtService {
optionRepository.update(Option.ID_C_VERSION, versionOpt);
transaction.commit();
final ServletContext servletContext = SoloServletListener.getServletContext();
Templates.MAIN_CFG.setServletContextForTemplateLoading(servletContext, "/skins/" + skinDirName);
} catch (final Exception e) {
if (transaction.isActive()) {
transaction.rollback();
......
......@@ -17,7 +17,7 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......
......@@ -17,7 +17,7 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......
......@@ -17,7 +17,7 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
import org.b3log.solo.model.Option;
......
......@@ -18,7 +18,7 @@
package org.b3log.solo.service;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
......
......@@ -17,7 +17,7 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.Query;
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.service;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.mail.MailService;
......@@ -43,8 +43,7 @@ import org.b3log.solo.repository.ArticleRepository;
import org.b3log.solo.repository.CommentRepository;
import org.b3log.solo.repository.OptionRepository;
import org.b3log.solo.repository.UserRepository;
import org.b3log.solo.util.Mails;
import org.b3log.solo.util.Thumbnails;
import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONObject;
......@@ -263,7 +262,7 @@ public class UpgradeService {
for (int i = 0; i < users.length(); i++) {
final JSONObject user = users.getJSONObject(i);
final String email = user.optString(User.USER_EMAIL);
user.put(UserExt.USER_AVATAR, Thumbnails.getGravatarURL(email, "128"));
user.put(UserExt.USER_AVATAR, Solos.getGravatarURL(email, "128"));
userRepository.update(user.optString(Keys.OBJECT_ID), user);
LOGGER.log(Level.INFO, "Updated user[email={0}]", email);
......@@ -387,7 +386,7 @@ public class UpgradeService {
* @throws Exception exception
*/
private void notifyUserByEmail() throws Exception {
if (!Mails.isConfigured()) {
if (!Solos.isConfigured()) {
return;
}
......
......@@ -21,9 +21,7 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
......@@ -40,7 +38,7 @@ import org.b3log.latke.util.Strings;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.UserExt;
import org.b3log.solo.repository.UserRepository;
import org.b3log.solo.util.Thumbnails;
import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONObject;
......@@ -95,6 +93,12 @@ public class UserMgmtService {
@Inject
private OptionMgmtService optionMgmtService;
/**
* User query service.
*/
@Inject
private UserQueryService userQueryService;
/**
* Tries to login with cookie.
*
......@@ -122,9 +126,6 @@ public class UserMgmtService {
break;
}
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final UserQueryService userQueryService = beanManager.getReference(UserQueryService.class);
final JSONObject userResult = userQueryService.getUser(userId);
if (null == userResult) {
break;
......@@ -344,7 +345,7 @@ public class UserMgmtService {
String userAvatar = requestJSONObject.optString(UserExt.USER_AVATAR);
if (StringUtils.isBlank(userAvatar)) {
userAvatar = Thumbnails.getGravatarURL(userEmail, "128");
userAvatar = Solos.getGravatarURL(userEmail, "128");
}
user.put(UserExt.USER_AVATAR, userAvatar);
......
......@@ -19,7 +19,7 @@ package org.b3log.solo.service;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
......
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-2018, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.util;
import org.b3log.latke.util.CollectionUtils;
import org.json.JSONObject;
/**
* JSON utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Jul 16, 2017
* @since 2.3.0
*/
public final class JSONs {
/**
* Private constructor.
*/
private JSONs() {
}
/**
* Clones a JSON object from the specified source object.
*
* @param src the specified source object
* @return cloned object
*/
public static JSONObject clone(final JSONObject src) {
return new JSONObject(src, CollectionUtils.jsonArrayToArray(src.names(), String[].class));
}
}
\ No newline at end of file
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-2018, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.util;
import org.apache.commons.lang.StringUtils;
import java.util.ResourceBundle;
/**
* Mail utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Jul 20, 2017
* @since 2.3.0
*/
public final class Mails {
/**
* Mail configuration (mail.properties).
*/
private static final ResourceBundle mailConf = ResourceBundle.getBundle("mail");
/**
* Private constructor.
*/
private Mails() {
}
/**
* Whether user configures the mail.properties.
*
* @return {@code true} if user configured, returns {@code false} otherwise
*/
public static boolean isConfigured() {
try {
return StringUtils.isNotBlank(mailConf.getString("mail.user")) &&
StringUtils.isNotBlank(mailConf.getString("mail.password")) &&
StringUtils.isNotBlank(mailConf.getString("mail.smtp.host")) &&
StringUtils.isNotBlank(mailConf.getString("mail.smtp.port"));
} catch (final Exception e) {
return false;
}
}
}
......@@ -25,11 +25,10 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManagerImpl;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.LangPropsServiceImpl;
import org.b3log.latke.util.Callstacks;
import org.b3log.latke.util.Stopwatchs;
import org.json.JSONObject;
......@@ -62,11 +61,6 @@ public final class Markdowns {
*/
private static final Logger LOGGER = Logger.getLogger(Markdowns.class);
/**
* Language service.
*/
private static final LangPropsService LANG_PROPS_SERVICE = LatkeBeanManagerImpl.getInstance().getReference(LangPropsServiceImpl.class);
/**
* Markdown cache.
*/
......@@ -159,13 +153,15 @@ public final class Markdowns {
return cachedHTML;
}
final LangPropsService langPropsService = BeanManager.getInstance().getReference(LangPropsService.class);
final ExecutorService pool = Executors.newSingleThreadExecutor();
final long[] threadId = new long[1];
final Callable<String> call = () -> {
threadId[0] = Thread.currentThread().getId();
String html = LANG_PROPS_SERVICE.get("contentRenderFailedLabel");
String html = langPropsService.get("contentRenderFailedLabel");
if (MARKED_AVAILABLE) {
html = toHtmlByMarked(markdownText);
......@@ -223,7 +219,7 @@ public final class Markdowns {
Stopwatchs.end();
}
return LANG_PROPS_SERVICE.get("contentRenderFailedLabel");
return langPropsService.get("contentRenderFailedLabel");
}
private static String toHtmlByMarked(final String markdownText) throws Exception {
......
......@@ -17,27 +17,28 @@
*/
package org.b3log.solo.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.LangPropsServiceImpl;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.latke.util.freemarker.Templates;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Skin;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
......@@ -47,7 +48,7 @@ import java.util.*;
* Skin utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.1.6.0, Sep 23, 2018
* @version 1.1.6.1, Sep 26, 2018
* @since 0.3.1
*/
public final class Skins {
......@@ -57,6 +58,20 @@ public final class Skins {
*/
private static final Logger LOGGER = Logger.getLogger(Skins.class);
/**
* FreeMarker configuration.
*/
public static final Configuration TEMPLATE_CFG;
static {
TEMPLATE_CFG = new Configuration(Configuration.VERSION_2_3_28);
TEMPLATE_CFG.setDefaultEncoding("UTF-8");
final ServletContext servletContext = SoloServletListener.getServletContext();
TEMPLATE_CFG.setServletContextForTemplateLoading(servletContext, "");
TEMPLATE_CFG.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
TEMPLATE_CFG.setLogTemplateExceptions(false);
}
/**
* Properties map.
*/
......@@ -68,6 +83,42 @@ public final class Skins {
private Skins() {
}
/**
* Gets a template with the specified template name.
*
* @param templateName the specified template name
* @return template, returns {@code null} if not found
*/
public static Template getTemplate(final String templateName) {
try {
return Skins.TEMPLATE_CFG.getTemplate(templateName);
} catch (final IOException e) {
LOGGER.log(Level.ERROR, "Gets console template [" + templateName + "] failed", e);
return null;
}
}
/**
* Gets a skins template with the specified request and template name.
*
* @param request the specified request
* @param templateName the specified template name
* @return template, returns {@code null} if not found
*/
public static Template getSkinTemplate(final HttpServletRequest request, final String templateName) {
String templateDirName = (String) request.getAttribute(Keys.TEMAPLTE_DIR_NAME);
if (StringUtils.isBlank(templateDirName)) {
templateDirName = Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME;
}
try {
return Skins.TEMPLATE_CFG.getTemplate("skins/" + templateDirName + "/" + templateName);
} catch (final IOException e) {
return null;
}
}
/**
* 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.
......@@ -84,12 +135,11 @@ public final class Skins {
try {
final String langName = currentSkinDirName + "." + localeString;
Map<String, String> langs = LANG_MAP.get(langName);
if (null == langs) {
LANG_MAP.clear(); // Collect unused skin languages
LOGGER.log(Level.DEBUG, "Loading skin [dirName={0}, locale={1}]", currentSkinDirName, localeString);
langs = new HashMap<String, String>();
langs = new HashMap<>();
final String language = Locales.getLanguage(localeString);
final String country = Locales.getCountry(localeString);
......@@ -99,24 +149,21 @@ public final class Skins {
"/skins/" + currentSkinDirName + "/lang/lang_" + language + '_' + country + ".properties");
final Properties props = new Properties();
props.load(inputStream);
final Set<Object> keys = props.keySet();
for (final Object key : keys) {
langs.put((String) key, props.getProperty((String) key));
}
LANG_MAP.put(langName, langs);
LOGGER.log(Level.DEBUG, "Loaded skin[dirName={0}, locale={1}, keyCount={2}]",
currentSkinDirName, localeString, langs.size());
LOGGER.log(Level.DEBUG, "Loaded skin[dirName={0}, locale={1}, keyCount={2}]", currentSkinDirName, localeString, langs.size());
}
dataModel.putAll(langs); // Fills the current skin's language configurations
// Fills the core language configurations
final LatkeBeanManager beanManager = Lifecycle.getBeanManager();
final LangPropsService langPropsService = beanManager.getReference(LangPropsServiceImpl.class);
final BeanManager beanManager = BeanManager.getInstance();
final LangPropsService langPropsService = beanManager.getReference(LangPropsService.class);
dataModel.putAll(langPropsService.getAll(Latkes.getLocale()));
} catch (final Exception e) {
......@@ -128,24 +175,6 @@ 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.
*
* @param skinDirName the specified skin directory name
*/
public static void setDirectoryForTemplateLoading(final String skinDirName) {
final ServletContext servletContext = SoloServletListener.getServletContext();
Templates.MAIN_CFG.setServletContextForTemplateLoading(servletContext, "/skins/" + skinDirName);
Templates.MAIN_CFG.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Templates.MAIN_CFG.setLogTemplateExceptions(false);
Templates.MOBILE_CFG.setServletContextForTemplateLoading(servletContext, "/skins/" + Solos.MOBILE_SKIN);
Templates.MOBILE_CFG.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Templates.MOBILE_CFG.setLogTemplateExceptions(false);
}
/**
* Gets all skin directory names. Scans the /skins/ directory, using the subdirectory of it as the skin directory
* name, for example,
......
......@@ -17,8 +17,13 @@
*/
package org.b3log.solo.util;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.solo.SoloServletListener;
import org.json.JSONObject;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
......@@ -27,11 +32,21 @@ import java.util.ResourceBundle;
* Solo utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.2.0.0, Sep 17, 2018
* @version 1.3.0.0, Sep 28, 2018
* @since 2.8.0
*/
public final class Solos {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(Solos.class);
/**
* Mail configuration (mail.properties).
*/
private static final ResourceBundle mailConf = ResourceBundle.getBundle("mail");
/**
* B3log Rhythm address.
*/
......@@ -67,6 +82,7 @@ public final class Solos {
*/
public static final String USER_AGENT = "Solo/" + SoloServletListener.VERSION + "; +https://github.com/b3log/solo";
static {
ResourceBundle solo;
try {
......@@ -85,15 +101,52 @@ public final class Solos {
}
UPLOAD_DIR_PATH = dir;
String mobileSkin = "mobile";
String mobileSkin = "Medium";
try {
mobileSkin = solo.getString("mobile.skin");
} catch (final Exception e) {
// ignored
LOGGER.log(Level.WARN, "Loads [mobile.skin] in solo.props failed [" + e.getMessage() + "], using [" + mobileSkin + "] as the default mobile skin");
}
MOBILE_SKIN = mobileSkin;
}
/**
* Whether user configures the mail.properties.
*
* @return {@code true} if user configured, returns {@code false} otherwise
*/
public static boolean isConfigured() {
try {
return StringUtils.isNotBlank(mailConf.getString("mail.user")) &&
StringUtils.isNotBlank(mailConf.getString("mail.password")) &&
StringUtils.isNotBlank(mailConf.getString("mail.smtp.host")) &&
StringUtils.isNotBlank(mailConf.getString("mail.smtp.port"));
} catch (final Exception e) {
return false;
}
}
/**
* Gets the Gravatar URL for the specified email with the specified size.
*
* @param email the specified email
* @param size the specified size
* @return the Gravatar URL
*/
public static String getGravatarURL(final String email, final String size) {
return GRAVATAR + DigestUtils.md5Hex(email) + "?s=" + size;
}
/**
* Clones a JSON object from the specified source object.
*
* @param src the specified source object
* @return cloned object
*/
public static JSONObject clone(final JSONObject src) {
return new JSONObject(src, CollectionUtils.jsonArrayToArray(src.names(), String[].class));
}
/**
* Private constructor.
*/
......
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-2018, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.util;
import org.apache.commons.codec.digest.DigestUtils;
/**
* Thumbnail utilities.
* <p>
* By using <a href="http://gravatar.com">Gravatar</a> for user thumbnail.
* </p>
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.1.0.2, Aug 2, 2018
* @since 0.6.1
*/
public final class Thumbnails {
/**
* Gets the Gravatar URL for the specified email with the specified size.
*
* @param email the specified email
* @param size the specified size
* @return the Gravatar URL
*/
public static String getGravatarURL(final String email, final String size) {
return Solos.GRAVATAR + DigestUtils.md5Hex(email) + "?s=" + size;
}
/**
* Private constructor.
*/
private Thumbnails() {
}
}
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-2018, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.b3log.solo.util;
import org.b3log.latke.util.freemarker.Templates;
import java.util.TimeZone;
/**
* Time zone utilities.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.6, Jan 5, 2014
*/
public final class TimeZones {
/**
* Sets time zone by the specified time zone id.
*
* @param timeZoneId the specified time zone id
*/
public static void setTimeZone(final String timeZoneId) {
final TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
Templates.MAIN_CFG.setTimeZone(timeZone);
Templates.MOBILE_CFG.setTimeZone(timeZone);
}
/**
* Private constructor.
*/
private TimeZones() {
}
}
......@@ -35,5 +35,5 @@ cookieName=solo
cookieSecret=Beyond
#### Runtime Mode ####
#runtimeMode=DEVELOPMENT
runtimeMode=PRODUCTION
runtimeMode=DEVELOPMENT
#runtimeMode=PRODUCTION
......@@ -75,6 +75,9 @@ var Util = {
storage: true,
titleSuffix: '',
filter: function(href){
if (href === latkeConfig.servePath + '/rss.xml') {
return true
}
if (href.indexOf(latkeConfig.servePath) > -1) {
return false
}
......
This diff is collapsed.
......@@ -18,9 +18,8 @@
package org.b3log.solo;
import org.b3log.latke.Latkes;
import org.b3log.latke.ioc.LatkeBeanManager;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.config.Discoverer;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Discoverer;
import org.b3log.latke.repository.jdbc.util.Connections;
import org.b3log.latke.repository.jdbc.util.JdbcRepositories;
import org.b3log.solo.api.MetaWeblogAPI;
......@@ -46,7 +45,7 @@ public abstract class AbstractTestCase {
/**
* Bean manager.
*/
private LatkeBeanManager beanManager;
private BeanManager beanManager;
/**
* Before class.
......@@ -63,8 +62,8 @@ public abstract class AbstractTestCase {
Latkes.setLocale(Locale.SIMPLIFIED_CHINESE);
final Collection<Class<?>> classes = Discoverer.discover("org.b3log.solo");
Lifecycle.startApplication(classes);
beanManager = Lifecycle.getBeanManager();
BeanManager.start(classes);
beanManager = BeanManager.getInstance();
final Connection connection = Connections.getConnection();
connection.createStatement().execute("DROP ALL OBJECTS");
......
......@@ -20,7 +20,7 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.model.User;
import org.b3log.latke.repository.Query;
import org.b3log.latke.servlet.HTTPRequestContext;
......@@ -344,7 +344,7 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
httpRequestContext.setRequest(request);
httpRequestContext.setResponse(response);
final ArticleProcessor articleProcessor = Lifecycle.getBeanManager().getReference(ArticleProcessor.class);
final ArticleProcessor articleProcessor = BeanManager.getInstance().getReference(ArticleProcessor.class);
articleProcessor.showArticle(httpRequestContext, request, response);
final Map<String, Object> dataModel = httpRequestContext.getRenderer().getRenderDataModel();
......
......@@ -17,15 +17,9 @@
*/
package org.b3log.solo.processor;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.Lifecycle;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.model.User;
import org.b3log.latke.servlet.HTTPRequestContext;
import org.b3log.solo.AbstractTestCase;
......@@ -36,10 +30,19 @@ import org.b3log.solo.service.InitService;
import org.b3log.solo.service.PageMgmtService;
import org.b3log.solo.service.UserQueryService;
import org.json.JSONObject;
import static org.mockito.Mockito.*;
import org.testng.Assert;
import org.testng.annotations.Test;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Map;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* {@link PageProcessor} test case.
*
......@@ -97,7 +100,7 @@ public class PageProcessorTestCase extends AbstractTestCase {
httpRequestContext.setRequest(request);
httpRequestContext.setResponse(response);
final PageProcessor pageProcessor = Lifecycle.getBeanManager().getReference(PageProcessor.class);
final PageProcessor pageProcessor = BeanManager.getInstance().getReference(PageProcessor.class);
pageProcessor.showPage(httpRequestContext);
final Map<String, Object> dataModel = httpRequestContext.getRenderer().getRenderDataModel();
......
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