Commit 55a963db authored by Liang Ding's avatar Liang Ding

🎨 #12932

parent b1e6ba0d
......@@ -15,4 +15,4 @@ RUN apk add --no-cache ca-certificates tzdata
ENV TZ=Asia/Shanghai
EXPOSE 8080
ENTRYPOINT [ "java", "-cp", "WEB-INF/lib/*:WEB-INF/classes", "org.b3log.solo.Starter" ]
ENTRYPOINT [ "java", "-cp", "WEB-INF/lib/*:WEB-INF/classes", "org.b3log.solo.Server" ]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Description: Solo POM.
Version: 3.18.3.74, Oct 23, 2019
Version: 3.18.3.75, Nov 3, 2019
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>
......@@ -14,7 +14,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.b3log</groupId>
<artifactId>solo</artifactId>
<packaging>war</packaging>
<packaging>jar</packaging>
<name>Solo</name>
<version>3.6.6</version>
<description>
......@@ -73,12 +73,11 @@
</scm>
<properties>
<org.b3log.latke.version>2.5.8</org.b3log.latke.version>
<org.b3log.latke.version>2.5.9-SNAPSHOT</org.b3log.latke.version>
<slf4j.version>1.7.28</slf4j.version>
<jsoup.version>1.12.1</jsoup.version>
<flexmark.version>0.50.40</flexmark.version>
<jetty.version>9.4.12.v20180830</jetty.version>
<commons-cli.version>1.3.1</commons-cli.version>
<commons-codec.version>1.10</commons-codec.version>
<emoji-java.version>5.1.0</emoji-java.version>
......@@ -86,7 +85,6 @@
<owasp.version>1.2.2</owasp.version>
<snakeyaml.version>1.18</snakeyaml.version>
<user-agent-utils.version>1.21</user-agent-utils.version>
<servlet.version>3.1.0</servlet.version>
<license-maven-plugin.version>3.0</license-maven-plugin.version>
<maven-surefire-plugin.version>2.22.1</maven-surefire-plugin.version>
......@@ -108,12 +106,6 @@
<version>${org.b3log.latke.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
......@@ -189,12 +181,6 @@
<version>${commons-cli.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.jodd</groupId>
<artifactId>jodd-http</artifactId>
......@@ -340,22 +326,6 @@
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
<httpConnector>
<port>8080</port>
</httpConnector>
<stopKey>stop</stopKey>
<stopPort>4501</stopPort>
<webAppConfig>
<contextPath>/</contextPath>
</webAppConfig>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
......
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-present, b3log.org
*
* 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;
import org.apache.commons.cli.*;
import org.b3log.latke.Latkes;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.util.Strings;
import org.b3log.solo.util.Markdowns;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Slf4jLog;
import org.eclipse.jetty.webapp.WebAppContext;
import java.io.File;
/**
* Solo with embedded Jetty, <a href="https://github.com/b3log/solo/issues/12037">standalone mode</a>.
* <ul>
* <li>Windows: java -cp "WEB-INF/lib/*;WEB-INF/classes" org.b3log.solo.Starter</li>
* <li>Unix-like: java -cp "WEB-INF/lib/*:WEB-INF/classes" org.b3log.solo.Starter</li>
* </ul>
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.1.1.2, Sep 23, 2019
* @since 1.2.0
*/
public final class Starter {
static {
try {
Log.setLog(new Slf4jLog());
} catch (final Exception e) {
e.printStackTrace();
}
}
/**
* Main.
*
* @param args the specified arguments
* @throws java.lang.Exception if start failed
*/
public static void main(final String[] args) throws Exception {
final Logger logger = Logger.getLogger(Starter.class);
final Options options = new Options();
final Option listenPortOpt = Option.builder("lp").longOpt("listen_port").argName("LISTEN_PORT").
hasArg().desc("listen port, default is 8080").build();
options.addOption(listenPortOpt);
final Option serverSchemeOpt = Option.builder("ss").longOpt("server_scheme").argName("SERVER_SCHEME").
hasArg().desc("browser visit protocol, default is http").build();
options.addOption(serverSchemeOpt);
final Option serverHostOpt = Option.builder("sh").longOpt("server_host").argName("SERVER_HOST").
hasArg().desc("browser visit domain name, default is localhost").build();
options.addOption(serverHostOpt);
final Option serverPortOpt = Option.builder("sp").longOpt("server_port").argName("SERVER_PORT").
hasArg().desc("browser visit port, default is 8080").build();
options.addOption(serverPortOpt);
final Option staticServerSchemeOpt = Option.builder("sss").longOpt("static_server_scheme").argName("STATIC_SERVER_SCHEME").
hasArg().desc("browser visit static resource protocol, default is http").build();
options.addOption(staticServerSchemeOpt);
final Option staticServerHostOpt = Option.builder("ssh").longOpt("static_server_host").argName("STATIC_SERVER_HOST").
hasArg().desc("browser visit static resource domain name, default is localhost").build();
options.addOption(staticServerHostOpt);
final Option staticServerPortOpt = Option.builder("ssp").longOpt("static_server_port").argName("STATIC_SERVER_PORT").
hasArg().desc("browser visit static resource port, default is 8080").build();
options.addOption(staticServerPortOpt);
final Option runtimeModeOpt = Option.builder("rm").longOpt("runtime_mode").argName("RUNTIME_MODE").
hasArg().desc("runtime mode (DEVELOPMENT/PRODUCTION), default is DEVELOPMENT").build();
options.addOption(runtimeModeOpt);
final Option luteHttpOpt = Option.builder("lute").longOpt("lute_http").argName("LUTE_HTTP").
hasArg().desc("lute http URL, default is http://localhost:8249, see https://github.com/b3log/lute-http for more details").build();
options.addOption(luteHttpOpt);
options.addOption("h", "help", false, "print help for the command");
final HelpFormatter helpFormatter = new HelpFormatter();
helpFormatter.setWidth(120);
final CommandLineParser commandLineParser = new DefaultParser();
CommandLine commandLine;
final boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows");
final String cmdSyntax = isWindows ? "java -cp \"WEB-INF/lib/*;WEB-INF/classes\" org.b3log.solo.Starter"
: "java -cp \"WEB-INF/lib/*:WEB-INF/classes\" org.b3log.solo.Starter";
final String header = "\nSolo 是一款小而美的博客系统,专为程序员设计。\n\n";
final String footer = "\n提需求或报告缺陷请到项目网站: https://github.com/b3log/solo\n\n";
try {
commandLine = commandLineParser.parse(options, args);
} catch (final ParseException e) {
helpFormatter.printHelp(cmdSyntax, header, options, footer, true);
return;
}
if (commandLine.hasOption("h")) {
helpFormatter.printHelp(cmdSyntax, header, options, footer, true);
return;
}
String portArg = commandLine.getOptionValue("listen_port");
if (!Strings.isNumeric(portArg)) {
portArg = "8080";
}
try {
Latkes.init();
} catch (final Exception e) {
logger.log(Level.ERROR, "Latke init failed, please configure latke.props or run with args, visit https://hacpai.com/article/1492881378588 for more details");
System.exit(-1);
}
String serverScheme = commandLine.getOptionValue("server_scheme");
if (null != serverScheme) {
Latkes.setLatkeProperty("serverScheme", serverScheme);
}
String serverHost = commandLine.getOptionValue("server_host");
if (null != serverHost) {
Latkes.setLatkeProperty("serverHost", serverHost);
}
String serverPort = commandLine.getOptionValue("server_port");
if (null != serverPort) {
Latkes.setLatkeProperty("serverPort", serverPort);
}
String staticServerScheme = commandLine.getOptionValue("static_server_scheme");
if (null != staticServerScheme) {
Latkes.setLatkeProperty("staticServerScheme", staticServerScheme);
}
String staticServerHost = commandLine.getOptionValue("static_server_host");
if (null != staticServerHost) {
Latkes.setLatkeProperty("staticServerHost", staticServerHost);
}
String staticServerPort = commandLine.getOptionValue("static_server_port");
if (null != staticServerPort) {
Latkes.setLatkeProperty("staticServerPort", staticServerPort);
}
String runtimeMode = commandLine.getOptionValue("runtime_mode");
if (null != runtimeMode) {
Latkes.setRuntimeMode(Latkes.RuntimeMode.valueOf(runtimeMode));
}
String luteHttp = commandLine.getOptionValue("lute");
if (null != luteHttp) {
Markdowns.LUTE_ENGINE_URL = luteHttp;
Markdowns.LUTE_AVAILABLE = true;
}
String webappDirLocation = "src/main/webapp/"; // POM structure in dev env
final File file = new File(webappDirLocation);
if (!file.exists()) {
webappDirLocation = "."; // production environment
}
final int port = Integer.valueOf(portArg);
final Server server = new Server(port);
final WebAppContext root = new WebAppContext();
root.setParentLoaderPriority(true); // Use parent class loader
root.setContextPath("/");
root.setDescriptor(webappDirLocation + "/WEB-INF/web.xml");
root.setResourceBase(webappDirLocation);
server.setHandler(root);
try {
server.start();
} catch (final Exception e) {
logger.log(Level.ERROR, "Server start failed", e);
System.exit(-1);
}
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
server.stop();
} catch (final Exception e) {
logger.log(Level.ERROR, "Server stop failed", e);
System.exit(-1);
}
}));
server.join();
}
/**
* Private constructor.
*/
private Starter() {
}
}
......@@ -30,7 +30,7 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.Server;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
......@@ -117,7 +117,7 @@ public class B3ArticleSender extends AbstractEventListener<JSONObject> {
put("title", preference.getString(Option.ID_C_BLOG_TITLE)).
put("host", Latkes.getServePath()).
put("name", "Solo").
put("ver", SoloServletListener.VERSION).
put("ver", Server.VERSION).
put("userName", author.optString(User.USER_NAME)).
put("userB3Key", author.optString(UserExt.USER_B3_KEY));
final JSONObject requestJSONObject = new JSONObject().
......
......@@ -28,7 +28,7 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.Server;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Comment;
import org.b3log.solo.model.Option;
......@@ -108,7 +108,7 @@ public class B3CommentSender extends AbstractEventListener<JSONObject> {
put("title", preference.getString(Option.ID_C_BLOG_TITLE)).
put("host", Latkes.getServePath()).
put("name", "Solo").
put("ver", SoloServletListener.VERSION).
put("ver", Server.VERSION).
put("userName", articleAuthor.optString(User.USER_NAME)).
put("userB3Key", articleAuthor.optString(UserExt.USER_B3_KEY));
final JSONObject requestJSONObject = new JSONObject().
......
......@@ -21,7 +21,7 @@ import org.apache.commons.lang.StringUtils;
import org.b3log.latke.event.AbstractEventListener;
import org.b3log.latke.event.Event;
import org.b3log.latke.plugin.NotInteractivePlugin;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.http.RequestContext;
import org.b3log.solo.event.EventTypes;
import org.b3log.solo.model.Article;
import org.json.JSONObject;
......
......@@ -25,10 +25,10 @@ import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.latke.repository.Transaction;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.util.Ids;
import org.b3log.latke.util.Strings;
import org.b3log.solo.model.Article;
......
......@@ -26,12 +26,11 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
import org.b3log.latke.model.User;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.solo.SoloServletListener;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Option;
import org.b3log.solo.service.*;
......@@ -153,7 +152,7 @@ public class BlogProcessor {
jsonObject.put("tagCount", tagQueryService.getTagCount());
jsonObject.put("servePath", Latkes.getServePath());
jsonObject.put("staticServePath", Latkes.getStaticServePath());
jsonObject.put("version", SoloServletListener.VERSION);
jsonObject.put("version", Server.VERSION);
jsonObject.put("runtimeMode", Latkes.getRuntimeMode());
jsonObject.put("runtimeDatabase", Latkes.getRuntimeDatabase());
jsonObject.put("locale", Latkes.getLocale());
......
......@@ -18,18 +18,19 @@
package org.b3log.solo.processor;
import org.b3log.latke.Keys;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
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.util.Paginator;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.latke.util.URLs;
......@@ -42,8 +43,6 @@ import org.b3log.solo.util.Skins;
import org.json.JSONException;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
......@@ -113,15 +112,14 @@ public class CategoryProcessor {
public void getCategoryArticlesByPage(final RequestContext context) {
final JSONObject jsonObject = new JSONObject();
final HttpServletRequest request = context.getRequest();
final String categoryURI = context.pathVar("categoryURI");
final int currentPageNum = Paginator.getPage(request);
final int currentPageNum = Paginator.getPage(context);
Stopwatchs.start("Get Category-Articles Paged [categoryURI=" + categoryURI + ", pageNum=" + currentPageNum + ']');
try {
final JSONObject category = categoryQueryService.getByURI(categoryURI);
if (null == category) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -163,17 +161,16 @@ public class CategoryProcessor {
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "category-articles.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
final HttpServletRequest request = context.getRequest();
final HttpServletResponse response = context.getResponse();
final Response response = context.getResponse();
try {
String categoryURI = context.pathVar("categoryURI");
categoryURI = URLs.encode(categoryURI);
final int currentPageNum = Paginator.getPage(request);
final int currentPageNum = Paginator.getPage(context);
LOGGER.log(Level.DEBUG, "Category [URI={0}, currentPageNum={1}]", categoryURI, currentPageNum);
final JSONObject category = categoryQueryService.getByURI(categoryURI);
if (null == category) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -189,7 +186,7 @@ public class CategoryProcessor {
final int pageCount = result.optJSONObject(Pagination.PAGINATION).optInt(Pagination.PAGINATION_PAGE_COUNT);
if (0 == pageCount) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -209,7 +206,7 @@ public class CategoryProcessor {
} catch (final ServiceException | JSONException e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
}
}
......
......@@ -24,11 +24,11 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
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.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Comment;
import org.b3log.solo.model.Common;
......@@ -190,7 +190,7 @@ public class CommentProcessor {
* Fills commenter info if logged in.
*
* @param requestJSONObject the specified request json object
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
*/
private void fillCommenter(final JSONObject requestJSONObject, final RequestContext context) {
final JSONObject currentUser = Solos.getCurrentUser(context.getRequest(), context.getResponse());
......
......@@ -23,11 +23,11 @@ import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
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.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.solo.model.Common;
import org.b3log.solo.service.DataModelService;
......@@ -87,7 +87,7 @@ public class ErrorProcessor {
*/
@RequestProcessing(value = "/error/{statusCode}", method = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE})
public void showErrorPage(final RequestContext context) {
final HttpServletRequest request = context.getRequest();
final Request request = context.getRequest();
final String statusCode = context.pathVar("statusCode");
if (StringUtils.equals("GET", context.method())) {
final String requestURI = context.requestURI();
......@@ -109,7 +109,7 @@ public class ErrorProcessor {
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Shows error page failed", e);
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
}
Solos.addGoogleNoIndex(context);
......
......@@ -20,20 +20,20 @@ package org.b3log.solo.processor;
import com.vdurmont.emoji.EmojiParser;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.AtomRenderer;
import org.b3log.latke.http.renderer.RssRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
import org.b3log.latke.repository.*;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.AtomRenderer;
import org.b3log.latke.servlet.renderer.RssRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.Server;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.atom.Category;
......@@ -49,7 +49,6 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -130,7 +129,7 @@ public class FeedProcessor {
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Get blog article feed error", e);
context.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
context.sendError(500);
}
}
......@@ -177,7 +176,7 @@ public class FeedProcessor {
try {
final JSONObject preference = optionQueryService.getPreference();
if (null == preference) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -190,7 +189,7 @@ public class FeedProcessor {
channel.setLastBuildDate(new Date());
channel.setLink(Latkes.getServePath());
channel.setAtomLink(Latkes.getServePath() + "/rss.xml");
channel.setGenerator("Solo, v" + SoloServletListener.VERSION + ", https://solo.b3log.org");
channel.setGenerator("Solo, v" + Server.VERSION + ", https://solo.b3log.org");
final String localeString = preference.getString(Option.ID_C_LOCALE_STRING);
final String country = Locales.getCountry(localeString).toLowerCase();
final String language = Locales.getLanguage(localeString).toLowerCase();
......@@ -215,7 +214,7 @@ public class FeedProcessor {
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Get blog article rss error", e);
context.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
context.sendError(500);
}
}
......
......@@ -20,21 +20,19 @@ 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.http.*;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
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.util.Locales;
import org.b3log.latke.util.Paginator;
import org.b3log.latke.util.URLs;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.service.DataModelService;
......@@ -45,9 +43,6 @@ import org.b3log.solo.util.Skins;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
import java.util.Map;
......@@ -106,8 +101,8 @@ public class IndexProcessor {
*/
@RequestProcessing(value = {"", "/"}, method = HttpMethod.GET)
public void showIndex(final RequestContext context) {
final HttpServletRequest request = context.getRequest();
final HttpServletResponse response = context.getResponse();
final Request request = context.getRequest();
final Response response = context.getResponse();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "index.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
try {
......@@ -154,7 +149,7 @@ public class IndexProcessor {
} catch (final ServiceException e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
}
}
......@@ -178,10 +173,10 @@ public class IndexProcessor {
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "common-template/start.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
final HttpServletRequest request = context.getRequest();
final Request request = context.getRequest();
final Map<String, String> langs = langPropsService.getAll(Locales.getLocale(request));
dataModel.putAll(langs);
dataModel.put(Common.VERSION, SoloServletListener.VERSION);
dataModel.put(Common.VERSION, Server.VERSION);
dataModel.put(Common.STATIC_RESOURCE_VERSION, Latkes.getStaticResourceVersion());
dataModel.put(Common.YEAR, String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
dataModel.put(Common.REFERER, URLs.encode(referer));
......@@ -199,7 +194,7 @@ public class IndexProcessor {
*/
@RequestProcessing(value = "/logout", method = HttpMethod.GET)
public void logout(final RequestContext context) {
final HttpServletRequest httpServletRequest = context.getRequest();
final Request httpServletRequest = context.getRequest();
Solos.logout(httpServletRequest, context.getResponse());
......@@ -214,7 +209,7 @@ public class IndexProcessor {
*/
@RequestProcessing(value = "/kill-browser", method = HttpMethod.GET)
public void showKillBrowser(final RequestContext context) {
final HttpServletRequest request = context.getRequest();
final Request request = context.getRequest();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "common-template/kill-browser.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
try {
......@@ -230,7 +225,7 @@ public class IndexProcessor {
} catch (final ServiceException e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
}
}
......
......@@ -20,20 +20,18 @@ 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.http.RequestContext;
import org.b3log.latke.http.handler.Handler;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.handler.Handler;
import org.b3log.solo.service.InitService;
import javax.servlet.http.HttpServletResponse;
/**
* Checks initialization handler.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Mar 1, 2019
* @version 1.0.0.1, Nov 3, 2019
* @since 3.2.0
*/
public class InitCheckHandler implements Handler {
......@@ -56,7 +54,7 @@ public class InitCheckHandler implements Handler {
// 禁止直接获取 robots.txt https://github.com/b3log/solo/issues/12543
if (requestURI.startsWith("/robots.txt") && !isSpiderBot) {
context.sendError(HttpServletResponse.SC_FORBIDDEN);
context.sendError(403);
return;
}
......
......@@ -19,18 +19,16 @@ package org.b3log.solo.processor;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.solo.SoloServletListener;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.ServletContext;
import java.io.InputStream;
/**
......@@ -60,18 +58,17 @@ public class KanBanNiangProcessor {
try {
final String assets = "/plugins/kanbanniang/assets";
String model;
final ServletContext servletContext = SoloServletListener.getServletContext();
try (final InputStream inputStream = servletContext.getResourceAsStream(assets + "/model-list.json")) {
try (final InputStream inputStream = KanBanNiangProcessor.class.getResourceAsStream(assets + "/model-list.json")) {
final JSONArray models = new JSONArray(IOUtils.toString(inputStream, "UTF-8"));
final int i = RandomUtils.nextInt(models.length());
model = models.getString(i);
}
try (final InputStream modelResource = servletContext.getResourceAsStream(assets + "/model/" + model + "/index.json")) {
try (final InputStream modelResource = KanBanNiangProcessor.class.getResourceAsStream(assets + "/model/" + model + "/index.json")) {
final JSONObject index = new JSONObject(IOUtils.toString(modelResource, "UTF-8"));
final JSONArray textures = index.optJSONArray("textures");
if (textures.isEmpty()) {
try (final InputStream texturesRes = servletContext.getResourceAsStream(assets + "/model/" + model + "/textures.json")) {
try (final InputStream texturesRes = KanBanNiangProcessor.class.getResourceAsStream(assets + "/model/" + model + "/textures.json")) {
final JSONArray texturesArray = new JSONArray(IOUtils.toString(texturesRes, "UTF-8"));
final Object element = texturesArray.opt(RandomUtils.nextInt(texturesArray.length()));
if (element instanceof JSONArray) {
......
......@@ -29,10 +29,10 @@ 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.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.URLs;
import org.b3log.solo.model.UserExt;
......@@ -118,7 +118,7 @@ public class OAuthProcessor {
if (HttpServletResponse.SC_OK != res.statusCode()) {
LOGGER.log(Level.ERROR, "Gets oauth client id failed: " + res.toString());
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -170,8 +170,8 @@ public class OAuthProcessor {
return;
}
final HttpServletResponse response = context.getResponse();
final HttpServletRequest request = context.getRequest();
final Response response = context.getResponse();
final Request request = context.getRequest();
final String openId = userInfo.optString("openId");
final String userName = userInfo.optString(User.USER_NAME);
final String userAvatar = userInfo.optString(UserExt.USER_AVATAR);
......@@ -231,7 +231,7 @@ public class OAuthProcessor {
user = userQueryService.getUserByName(userName);
if (null == user) {
LOGGER.log(Level.WARN, "Can't get user by name [" + userName + "]");
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......
......@@ -20,14 +20,13 @@ 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.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.handler.Handler;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.RepositoryException;
import org.b3log.latke.servlet.DispatcherServlet;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.handler.Handler;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Option;
import org.b3log.solo.repository.ArticleRepository;
......@@ -37,13 +36,11 @@ import org.b3log.solo.service.PermalinkQueryService;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.http.HttpServletResponse;
/**
* Article permalink handler.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.2, May 18, 2019
* @version 1.0.0.3, Nov 3, 2019
* @since 3.2.0
*/
public class PermalinkHandler implements Handler {
......@@ -91,7 +88,7 @@ public class PermalinkHandler implements Handler {
}
} catch (final RepositoryException e) {
LOGGER.log(Level.ERROR, "Processes article permalink handler failed", e);
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -103,7 +100,7 @@ public class PermalinkHandler implements Handler {
return;
} catch (final Exception e) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -113,7 +110,7 @@ public class PermalinkHandler implements Handler {
final JSONObject preference = optionQueryService.getPreference();
final boolean allowVisitDraftViaPermalink = preference.getBoolean(Option.ID_C_ALLOW_VISIT_DRAFT_VIA_PERMALINK);
if (Article.ARTICLE_STATUS_C_PUBLISHED != article.optInt(Article.ARTICLE_STATUS) && !allowVisitDraftViaPermalink) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -127,7 +124,7 @@ public class PermalinkHandler implements Handler {
*
* @param context the specified request context
* @param article the specified article
* @see DispatcherServlet#result(RequestContext)
* @see Dispatcher#rendTODO(RequestContext)
*/
private void dispatchToArticleProcessor(final RequestContext context, final JSONObject article) {
context.attr(Article.ARTICLE, article);
......
......@@ -25,12 +25,12 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
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.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.http.renderer.TextXmlRenderer;
import org.b3log.latke.util.Paginator;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
......@@ -127,7 +127,7 @@ public class SearchProcessor {
*/
@RequestProcessing(value = "/search", method = HttpMethod.GET)
public void search(final RequestContext context) {
final HttpServletRequest request = context.getRequest();
final Request request = context.getRequest();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "common-template/search.ftl");
final Map<String, String> langs = langPropsService.getAll(Latkes.getLocale());
final Map<String, Object> dataModel = renderer.getDataModel();
......
......@@ -28,11 +28,11 @@ import org.b3log.latke.repository.FilterOperator;
import org.b3log.latke.repository.PropertyFilter;
import org.b3log.latke.repository.Query;
import org.b3log.latke.repository.SortDirection;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.RequestProcessing;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.TextXmlRenderer;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.TextXmlRenderer;
import org.b3log.latke.util.URLs;
import org.b3log.latke.util.XMLs;
import org.b3log.solo.model.ArchiveDate;
......
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-present, b3log.org
*
* 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;
import eu.bitwalker.useragentutils.BrowserType;
import eu.bitwalker.useragentutils.UserAgent;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.handler.Handler;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.solo.service.OptionQueryService;
import org.b3log.solo.service.StatisticMgmtService;
import org.b3log.solo.util.Skins;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
/**
* Skin handler.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Nov 3, 2019
* @since 3.6.7
*/
public class SkinHandler implements Handler {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(SkinHandler.class);
@Override
public void handle(final RequestContext context) {
final Request request = context.getRequest();
Requests.log(request, Level.DEBUG, LOGGER);
fillBotAttrs(request);
if (!Solos.isBot(request)) {
final StatisticMgmtService statisticMgmtService = BeanManager.getInstance().getReference(StatisticMgmtService.class);
statisticMgmtService.onlineVisitorCount(request);
}
resolveSkinDir(request);
context.handle();
}
/**
* Resolve skin (template) for the specified HTTP servlet request.
* 前台皮肤切换 https://github.com/b3log/solo/issues/12060
*
* @param request the specified HTTP request
*/
private void resolveSkinDir(final Request request) {
String skin = Skins.getSkinDirNameFromCookie(request);
if (StringUtils.isBlank(skin)) {
final BeanManager beanManager = BeanManager.getInstance();
final OptionQueryService optionQueryService = beanManager.getReference(OptionQueryService.class);
final JSONObject skinOpt = optionQueryService.getSkin();
if (Solos.isMobile(request)) {
if (null != skinOpt) {
skin = skinOpt.optString(org.b3log.solo.model.Option.ID_C_MOBILE_SKIN_DIR_NAME);
} else {
skin = org.b3log.solo.model.Option.DefaultPreference.DEFAULT_MOBILE_SKIN_DIR_NAME;
}
} else {
if (null != skinOpt) {
skin = skinOpt.optString(org.b3log.solo.model.Option.ID_C_SKIN_DIR_NAME);
} else {
skin = org.b3log.solo.model.Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME;
}
}
}
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, skin);
}
private static void fillBotAttrs(final Request request) {
final String userAgentStr = request.getHeader("User-Agent");
final UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
BrowserType browserType = userAgent.getBrowser().getBrowserType();
if (StringUtils.containsIgnoreCase(userAgentStr, "mobile")
|| StringUtils.containsIgnoreCase(userAgentStr, "MQQBrowser")
|| StringUtils.containsIgnoreCase(userAgentStr, "iphone")
|| StringUtils.containsIgnoreCase(userAgentStr, "MicroMessenger")
|| StringUtils.containsIgnoreCase(userAgentStr, "CFNetwork")
|| StringUtils.containsIgnoreCase(userAgentStr, "Android")) {
browserType = BrowserType.MOBILE_BROWSER;
} else if (StringUtils.containsIgnoreCase(userAgentStr, "Iframely")
|| StringUtils.containsIgnoreCase(userAgentStr, "Google")
|| StringUtils.containsIgnoreCase(userAgentStr, "BUbiNG")
|| StringUtils.containsIgnoreCase(userAgentStr, "ltx71")
|| StringUtils.containsIgnoreCase(userAgentStr, "py")) {
browserType = BrowserType.ROBOT;
}
request.setAttribute(Keys.HttpRequest.IS_SEARCH_ENGINE_BOT, BrowserType.ROBOT == browserType);
request.setAttribute(Keys.HttpRequest.IS_MOBILE_BOT, BrowserType.MOBILE_BROWSER == browserType);
}
}
......@@ -21,11 +21,11 @@ import freemarker.template.Template;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.solo.util.Skins;
import javax.servlet.http.HttpServletRequest;
import java.io.StringWriter;
import java.util.Map;
......@@ -77,7 +77,7 @@ public final class SkinRenderer extends AbstractFreeMarkerRenderer {
* @throws Exception exception
*/
@Override
protected String genHTML(final HttpServletRequest request, final Map<String, Object> dataModel, final Template template)
protected String genHTML(final Request request, final Map<String, Object> dataModel, final Template template)
throws Exception {
final boolean isPJAX = isPJAX(context);
dataModel.put("pjax", isPJAX);
......
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-present, b3log.org
*
* 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;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.handler.Handler;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.latke.util.Strings;
/**
* Stopwatch end handler.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Nov 3, 2019
* @since 3.6.7
*/
public class StopwatchEndHandler implements Handler {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(StopwatchEndHandler.class);
@Override
public void handle(final RequestContext context) {
Stopwatchs.end();
LOGGER.log(Level.DEBUG, "Stopwatch: {0}{1}", Strings.LINE_SEPARATOR, Stopwatchs.getTimingStat());
Stopwatchs.release();
context.handle();
}
}
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-present, b3log.org
*
* 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;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.handler.Handler;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.util.Stopwatchs;
/**
* Stopwatch start handler.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.0, Nov 3, 2019
* @since 3.6.7
*/
public class StopwatchStartHandler implements Handler {
@Override
public void handle(final RequestContext context) {
Stopwatchs.start("Request Initialized [requestURI=" + context.requestURI() + "]");
context.handle();
}
}
......@@ -18,16 +18,17 @@
package org.b3log.solo.processor;
import org.b3log.latke.Keys;
import org.b3log.latke.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
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.util.Paginator;
import org.b3log.latke.util.URLs;
import org.b3log.solo.model.Article;
......@@ -38,8 +39,6 @@ import org.b3log.solo.service.*;
import org.b3log.solo.util.Skins;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
......@@ -109,16 +108,14 @@ public class TagProcessor {
public void showTagArticles(final RequestContext context) {
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, "tag-articles.ftl");
final Map<String, Object> dataModel = renderer.getDataModel();
final HttpServletRequest request = context.getRequest();
final HttpServletResponse response = context.getResponse();
try {
String tagTitle = context.pathVar("tagTitle");
final int currentPageNum = Paginator.getPage(request);
final int currentPageNum = Paginator.getPage(context);
LOGGER.log(Level.DEBUG, "Tag [title={0}, currentPageNum={1}]", tagTitle, currentPageNum);
final JSONObject result = tagQueryService.getTagByTitle(tagTitle);
if (null == result) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -133,7 +130,7 @@ public class TagProcessor {
final int windowSize = preference.getInt(Option.ID_C_ARTICLE_LIST_PAGINATION_WINDOW_SIZE);
final JSONObject tagArticleResult = articleQueryService.getArticlesByTag(tagId, currentPageNum, pageSize);
if (null == tagArticleResult) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -150,11 +147,11 @@ public class TagProcessor {
dataModelService.fillCommon(context, dataModel, preference);
dataModelService.fillFaviconURL(dataModel, preference);
dataModelService.fillUsite(dataModel);
statisticMgmtService.incBlogViewCount(context, response);
statisticMgmtService.incBlogViewCount(context, context.getResponse());
} catch (final Exception e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
}
}
......
......@@ -23,11 +23,11 @@ import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.HttpMethod;
import org.b3log.latke.servlet.RequestContext;
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.http.HttpMethod;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.RequestProcessing;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Locales;
import org.b3log.solo.model.Option;
import org.b3log.solo.service.DataModelService;
......@@ -94,14 +94,14 @@ public class UserTemplateProcessor {
final String templateName = context.pathVar("name") + ".ftl";
LOGGER.log(Level.DEBUG, "Shows page [requestURI={0}, templateName={1}]", requestURI, templateName);
final HttpServletRequest request = context.getRequest();
final HttpServletResponse response = context.getResponse();
final Request request = context.getRequest();
final Response response = context.getResponse();
final AbstractFreeMarkerRenderer renderer = new SkinRenderer(context, templateName);
final Map<String, Object> dataModel = renderer.getDataModel();
final Template template = Skins.getSkinTemplate(context, templateName);
if (null == template) {
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
return;
}
......@@ -119,7 +119,7 @@ public class UserTemplateProcessor {
} catch (final Exception e) {
LOGGER.log(Level.ERROR, e.getMessage(), e);
context.sendError(HttpServletResponse.SC_NOT_FOUND);
context.sendError(404);
}
}
}
......@@ -25,6 +25,10 @@ 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.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
......@@ -34,12 +38,9 @@ import org.b3log.latke.model.User;
import org.b3log.latke.plugin.ViewLoadEventData;
import org.b3log.latke.repository.jdbc.util.Connections;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.util.Execs;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.Server;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.UserExt;
......@@ -51,8 +52,6 @@ import org.b3log.solo.util.Markdowns;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
......@@ -138,7 +137,7 @@ public class AdminConsole {
dataModel.put(Option.ID_C_LOCALE_STRING, preference.getString(Option.ID_C_LOCALE_STRING));
dataModel.put(Option.ID_C_BLOG_TITLE, preference.getString(Option.ID_C_BLOG_TITLE));
dataModel.put(Option.ID_C_BLOG_SUBTITLE, preference.getString(Option.ID_C_BLOG_SUBTITLE));
dataModel.put(Common.VERSION, SoloServletListener.VERSION);
dataModel.put(Common.VERSION, Server.VERSION);
dataModel.put(Common.STATIC_RESOURCE_VERSION, Latkes.getStaticResourceVersion());
dataModel.put(Common.YEAR, String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
dataModel.put(Option.ID_C_ARTICLE_LIST_DISPLAY_COUNT, preference.getInt(Option.ID_C_ARTICLE_LIST_DISPLAY_COUNT));
......@@ -232,10 +231,10 @@ public class AdminConsole {
* @param context the specified request context
*/
public void exportSQL(final RequestContext context) {
final HttpServletResponse response = context.getResponse();
final Response response = context.getResponse();
if (!Solos.isAdminLoggedIn(context)) {
context.sendError(HttpServletResponse.SC_UNAUTHORIZED);
context.sendError(401);
return;
}
......@@ -326,11 +325,7 @@ public class AdminConsole {
response.setContentType("application/zip");
final String fileName = "solo-sql-" + date + ".zip";
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
final ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(zipData);
outputStream.flush();
outputStream.close();
response.sendContent(zipData);
// 导出 SQL 包后清理临时文件 https://github.com/b3log/solo/issues/12770
localFile.delete();
......@@ -349,9 +344,9 @@ public class AdminConsole {
* @param context the specified request context
*/
public void exportJSON(final RequestContext context) {
final HttpServletResponse response = context.getResponse();
final Response response = context.getResponse();
if (!Solos.isAdminLoggedIn(context)) {
context.sendError(HttpServletResponse.SC_UNAUTHORIZED);
context.sendError(401);
return;
}
......@@ -376,14 +371,12 @@ public class AdminConsole {
IOUtils.write(data, output);
}
try (final FileInputStream inputStream = new FileInputStream(ZipUtil.zip(localFile));
final ServletOutputStream outputStream = response.getOutputStream()) {
try (final FileInputStream inputStream = new FileInputStream(ZipUtil.zip(localFile))) {
final byte[] zipData = IOUtils.toByteArray(inputStream);
response.setContentType("application/zip");
final String fileName = "solo-json-" + date + ".zip";
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
outputStream.write(zipData);
outputStream.flush();
response.sendContent(zipData);
}
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Export failed", e);
......@@ -399,9 +392,9 @@ public class AdminConsole {
* @param context the specified request context
*/
public void exportHexo(final RequestContext context) {
final HttpServletResponse response = context.getResponse();
final Response response = context.getResponse();
if (!Solos.isAdminLoggedIn(context)) {
context.sendError(HttpServletResponse.SC_UNAUTHORIZED);
context.sendError(401);
return;
}
......@@ -450,10 +443,7 @@ public class AdminConsole {
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
}
try (final ServletOutputStream outputStream = response.getOutputStream()) {
outputStream.write(zipData);
outputStream.flush();
}
response.sendContent(zipData);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Export failed", e);
context.renderJSON().renderMsg("Export failed, please check log");
......
......@@ -21,15 +21,16 @@ 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.http.Request;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.util.Strings;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
......@@ -41,7 +42,6 @@ import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.stream.Collectors;
......@@ -122,7 +122,7 @@ public class ArticleConsole {
final JSONObject result = new JSONObject();
renderer.setJSONObject(result);
result.put(Keys.STATUS_CODE, true);
final HttpServletRequest request = context.getRequest();
final Request request = context.getRequest();
String strN = context.param("n");
if (!Strings.isNumeric(strN)) {
strN = "6";
......
......@@ -21,15 +21,15 @@ 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.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.util.URLs;
import org.b3log.solo.model.Category;
import org.b3log.solo.model.Common;
......@@ -41,7 +41,6 @@ import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
......@@ -517,7 +516,6 @@ public class CategoryConsole {
context.setRenderer(renderer);
try {
final HttpServletRequest request = context.getRequest();
final String requestURI = context.requestURI();
final String path = requestURI.substring((Latkes.getContextPath() + "/console/categories/").length());
final JSONObject requestJSONObject = Solos.buildPaginationRequest(path);
......
......@@ -19,14 +19,14 @@ package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.solo.model.Comment;
import org.b3log.solo.service.CommentMgmtService;
import org.b3log.solo.service.CommentQueryService;
......
......@@ -18,15 +18,13 @@
package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.advice.ProcessAdvice;
import org.b3log.latke.http.advice.RequestProcessAdviceException;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.advice.ProcessAdvice;
import org.b3log.latke.servlet.advice.RequestProcessAdviceException;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.http.HttpServletResponse;
/**
* The common auth check before advice for admin console.
*
......@@ -42,7 +40,7 @@ public class ConsoleAdminAuthAdvice extends ProcessAdvice {
if (!Solos.isAdminLoggedIn(context)) {
final JSONObject exception401 = new JSONObject();
exception401.put(Keys.MSG, "Unauthorized to request [" + context.requestURI() + "], please signin using admin account");
exception401.put(Keys.STATUS_CODE, HttpServletResponse.SC_UNAUTHORIZED);
exception401.put(Keys.STATUS_CODE, 401);
throw new RequestProcessAdviceException(exception401);
}
......
......@@ -18,17 +18,15 @@
package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.advice.ProcessAdvice;
import org.b3log.latke.http.advice.RequestProcessAdviceException;
import org.b3log.latke.ioc.Singleton;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.advice.ProcessAdvice;
import org.b3log.latke.servlet.advice.RequestProcessAdviceException;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.http.HttpServletResponse;
/**
* The common auth check before advice for admin console.
*
......@@ -45,7 +43,7 @@ public class ConsoleAuthAdvice extends ProcessAdvice {
if (null == currentUser) {
final JSONObject exception401 = new JSONObject();
exception401.put(Keys.MSG, "Unauthorized to request [" + context.requestURI() + "], please signin");
exception401.put(Keys.STATUS_CODE, HttpServletResponse.SC_UNAUTHORIZED);
exception401.put(Keys.STATUS_CODE, 401);
throw new RequestProcessAdviceException(exception401);
}
......@@ -54,7 +52,7 @@ public class ConsoleAuthAdvice extends ProcessAdvice {
if (Role.VISITOR_ROLE.equals(userRole)) {
final JSONObject exception403 = new JSONObject();
exception403.put(Keys.MSG, "Forbidden to request [" + context.requestURI() + "]");
exception403.put(Keys.STATUS_CODE, HttpServletResponse.SC_FORBIDDEN);
exception403.put(Keys.STATUS_CODE, 403);
throw new RequestProcessAdviceException(exception403);
}
......
......@@ -18,8 +18,8 @@
package org.b3log.solo.processor.console;
import freemarker.template.Template;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.renderer.AbstractFreeMarkerRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.renderer.AbstractFreeMarkerRenderer;
import org.b3log.solo.util.Skins;
/**
......
......@@ -24,10 +24,10 @@ import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Link;
import org.b3log.solo.service.LinkMgmtService;
......
......@@ -22,10 +22,10 @@ import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.service.ArchiveDateMgmtService;
import org.b3log.solo.service.TagMgmtService;
import org.json.JSONObject;
......
......@@ -25,10 +25,10 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Page;
import org.b3log.solo.service.PageMgmtService;
......
......@@ -24,10 +24,10 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Plugin;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.service.PluginMgmtService;
import org.b3log.solo.service.PluginQueryService;
import org.b3log.solo.util.Solos;
......
......@@ -23,10 +23,10 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.model.Option;
import org.b3log.solo.model.Sign;
import org.b3log.solo.service.OptionMgmtService;
......
......@@ -20,10 +20,10 @@ package org.b3log.solo.processor.console;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.TextHtmlRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.TextHtmlRenderer;
import org.b3log.solo.model.Option;
import org.b3log.solo.repository.ArticleRepository;
import org.b3log.solo.repository.TagArticleRepository;
......
......@@ -19,15 +19,17 @@ package org.b3log.solo.processor.console;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
import org.b3log.solo.service.OptionQueryService;
......@@ -36,8 +38,6 @@ import org.b3log.solo.util.Skins;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Set;
/**
......@@ -163,7 +163,7 @@ public class SkinConsole {
skinMgmtService.updateSkin(skin);
final HttpServletResponse response = context.getResponse();
final Response response = context.getResponse();
final Cookie skinDirNameCookie = new Cookie(Common.COOKIE_NAME_SKIN, skin.getString(Option.ID_C_SKIN_DIR_NAME));
skinDirNameCookie.setMaxAge(60 * 60); // 1 hour
skinDirNameCookie.setPath("/");
......
......@@ -22,10 +22,10 @@ import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Tag;
import org.b3log.solo.service.TagMgmtService;
......
......@@ -26,10 +26,10 @@ import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.User;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.servlet.annotation.Before;
import org.b3log.latke.servlet.annotation.RequestProcessor;
import org.b3log.latke.servlet.renderer.JsonRenderer;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.annotation.Before;
import org.b3log.latke.http.annotation.RequestProcessor;
import org.b3log.latke.http.renderer.JsonRenderer;
import org.b3log.solo.service.UserMgmtService;
import org.b3log.solo.service.UserQueryService;
import org.b3log.solo.util.Solos;
......
......@@ -29,7 +29,7 @@ import org.b3log.latke.repository.*;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.latke.util.Paginator;
import org.b3log.latke.util.Stopwatchs;
......@@ -867,7 +867,7 @@ public class ArticleQueryService {
* Invoking this method dose not effect on article view count.
* </p>
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param articleId the specified article id
* @return article contents, returns {@code null} if not found
* @throws ServiceException service exception
......
......@@ -24,6 +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.http.RequestContext;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
......@@ -37,9 +38,7 @@ import org.b3log.latke.repository.*;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.util.*;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.*;
import org.b3log.solo.repository.*;
import org.b3log.solo.util.Markdowns;
......@@ -181,7 +180,7 @@ public class DataModelService {
/**
* Fills articles in index.ftl.
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param dataModel data model
* @param currentPageNum current page number
* @param preference the specified preference
......@@ -571,7 +570,7 @@ public class DataModelService {
/**
* Fills common parts (header, side and footer).
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param dataModel the specified data model
* @param preference the specified preference
* @throws ServiceException service exception
......@@ -608,7 +607,7 @@ public class DataModelService {
/**
* Fills footer.ftl.
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param dataModel data model
* @param preference the specified preference
* @throws ServiceException service exception
......@@ -621,7 +620,7 @@ public class DataModelService {
final String blogTitle = preference.getString(Option.ID_C_BLOG_TITLE);
dataModel.put(Option.ID_C_BLOG_TITLE, blogTitle);
dataModel.put("blogHost", Latkes.getServePath());
dataModel.put(Common.VERSION, SoloServletListener.VERSION);
dataModel.put(Common.VERSION, Server.VERSION);
dataModel.put(Common.STATIC_RESOURCE_VERSION, Latkes.getStaticResourceVersion());
dataModel.put(Common.YEAR, String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
String footerContent = "";
......@@ -662,7 +661,7 @@ public class DataModelService {
/**
* Fills header.ftl.
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param dataModel data model
* @param preference the specified preference
* @throws ServiceException service exception
......@@ -745,7 +744,7 @@ public class DataModelService {
/**
* Fills side.ftl.
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param dataModel data model
* @param preference the specified preference
* @throws ServiceException service exception
......@@ -797,7 +796,7 @@ public class DataModelService {
/**
* Fills the specified template.
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param template the specified template
* @param dataModel data model
* @param preference the specified preference
......@@ -900,7 +899,7 @@ public class DataModelService {
* </pre>
* </p>
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param article the specified article
* @param preference the specified preference
* @throws ServiceException service exception
......@@ -1008,7 +1007,7 @@ public class DataModelService {
* </pre>
* </p>
*
* @param context the specified HTTP servlet request context
* @param context the specified HTTP request context
* @param articles the specified articles
* @param preference the specified preference
* @throws ServiceException service exception
......
......@@ -34,7 +34,6 @@ import org.b3log.latke.model.User;
import org.b3log.latke.repository.*;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.*;
import org.b3log.solo.repository.*;
import org.b3log.solo.util.Solos;
......@@ -253,7 +252,7 @@ public class ExportService {
form("userName", userName,
"userB3Key", userB3Key,
"clientName", "Solo",
"clientVersion", SoloServletListener.VERSION,
"clientVersion", Server.VERSION,
"clientHost", Latkes.getServePath(),
"clientFavicon", preference.optString(Option.ID_C_FAVICON_URL),
"clientTitle", clientTitle,
......
......@@ -26,12 +26,10 @@ import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Article;
import org.json.JSONObject;
import org.yaml.snakeyaml.Yaml;
import javax.servlet.ServletContext;
import java.io.File;
import java.util.*;
......@@ -73,8 +71,7 @@ public class ImportService {
*/
public void importMarkdowns() {
new Thread(() -> {
final ServletContext servletContext = SoloServletListener.getServletContext();
final String markdownsPath = servletContext.getRealPath("markdowns");
final String markdownsPath = ImportService.class.getResource("markdowns").getPath();
LOGGER.debug("Import directory [" + markdownsPath + "]");
final JSONObject admin = userQueryService.getAdmin();
......
......@@ -35,7 +35,6 @@ import org.b3log.latke.repository.jdbc.util.JdbcRepositories.CreateTableResult;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.Ids;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.*;
import org.b3log.solo.model.Option.DefaultPreference;
import org.b3log.solo.repository.*;
......@@ -636,7 +635,7 @@ public class InitService {
final JSONObject versionOpt = new JSONObject();
versionOpt.put(Keys.OBJECT_ID, Option.ID_C_VERSION);
versionOpt.put(Option.OPTION_CATEGORY, Option.CATEGORY_C_PREFERENCE);
versionOpt.put(Option.OPTION_VALUE, SoloServletListener.VERSION);
versionOpt.put(Option.OPTION_VALUE, Server.VERSION);
optionRepository.add(versionOpt);
final JSONObject articleListStyleOpt = new JSONObject();
......
......@@ -17,6 +17,10 @@
*/
package org.b3log.solo.service;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
......@@ -25,7 +29,6 @@ import org.b3log.latke.repository.Transaction;
import org.b3log.latke.service.LangPropsService;
import org.b3log.latke.service.ServiceException;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.util.Requests;
import org.b3log.latke.util.URLs;
import org.b3log.solo.cache.StatisticCache;
......@@ -36,10 +39,8 @@ import org.b3log.solo.util.Solos;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
......@@ -137,22 +138,19 @@ public class StatisticMgmtService {
* @param response the specified response
* @return {@code true} if the specified request has been served, returns {@code false} otherwise
*/
public static boolean hasBeenServed(final RequestContext context, final HttpServletResponse response) {
final HttpServletRequest request = context.getRequest();
final Cookie[] cookies = request.getCookies();
if (null == cookies || 0 == cookies.length) {
public static boolean hasBeenServed(final RequestContext context, final Response response) {
final Request request = context.getRequest();
final List<Cookie> cookies = request.getCookies();
if (cookies.isEmpty()) {
return false;
}
Cookie cookie;
boolean needToCreate = true;
boolean needToAppend = true;
JSONArray cookieJSONArray = null;
try {
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
for (final Cookie cookie : cookies) {
if (!"visited".equals(cookie.getName())) {
continue;
}
......@@ -215,7 +213,7 @@ public class StatisticMgmtService {
* @param response the specified response
* @throws ServiceException service exception
*/
public void incBlogViewCount(final RequestContext context, final HttpServletResponse response) throws ServiceException {
public void incBlogViewCount(final RequestContext context, final Response response) throws ServiceException {
if (Solos.isBot(context.getRequest())) {
return;
}
......@@ -257,7 +255,7 @@ public class StatisticMgmtService {
*
* @param request the specified request
*/
public void onlineVisitorCount(final HttpServletRequest request) {
public void onlineVisitorCount(final Request request) {
if (Solos.isBot(request)) {
return;
}
......
......@@ -21,7 +21,6 @@ import org.b3log.latke.ioc.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.service.annotation.Service;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Option;
import org.b3log.solo.upgrade.*;
import org.json.JSONObject;
......@@ -58,7 +57,7 @@ public class UpgradeService {
}
final String currentVer = preference.getString(Option.ID_C_VERSION); // 数据库中的版本
if (SoloServletListener.VERSION.equals(currentVer)) {
if (Server.VERSION.equals(currentVer)) {
// 如果数据库中的版本和运行时版本一致则说明已经是最新版
return;
}
......
......@@ -40,8 +40,6 @@ import org.b3log.solo.repository.UserRepository;
import org.b3log.solo.util.Solos;
import org.json.JSONObject;
import javax.servlet.http.HttpServletResponse;
/**
* User management service.
*
......@@ -117,7 +115,7 @@ public class UserMgmtService {
final HttpResponse res = HttpRequest.post("https://hacpai.com/user/usite").trustAllCerts(true).
connectionTimeout(3000).timeout(7000).header("User-Agent", Solos.USER_AGENT).
body(requestJSON.toString()).send();
if (HttpServletResponse.SC_OK != res.statusCode()) {
if (200 != res.statusCode()) {
return;
}
res.charset("UTF-8");
......
......@@ -18,11 +18,7 @@
package org.b3log.solo.util;
import com.vdurmont.emoji.EmojiParser;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Latkes;
import org.b3log.solo.SoloServletListener;
import java.util.Set;
import java.util.regex.Pattern;
/**
......
......@@ -29,8 +29,6 @@ import org.b3log.solo.model.UserExt;
import org.json.JSONArray;
import org.json.JSONObject;
import javax.servlet.http.HttpServletResponse;
/**
* GitHub utilities.
*
......@@ -55,7 +53,7 @@ public final class GitHubs {
try {
final HttpResponse res = HttpRequest.get("https://hacpai.com/github/repos?id=" + githubUserId).trustAllCerts(true).
connectionTimeout(3000).timeout(7000).header("User-Agent", Solos.USER_AGENT).send();
if (HttpServletResponse.SC_OK != res.statusCode()) {
if (200 != res.statusCode()) {
return null;
}
res.charset("UTF-8");
......@@ -90,7 +88,7 @@ public final class GitHubs {
try {
final HttpResponse res = HttpRequest.get("https://hacpai.com/github/user?ak=" + accessToken).trustAllCerts(true).
connectionTimeout(3000).timeout(7000).header("User-Agent", Solos.USER_AGENT).send();
if (HttpServletResponse.SC_OK != res.statusCode()) {
if (200 != res.statusCode()) {
return null;
}
res.charset("UTF-8");
......
......@@ -23,26 +23,25 @@ import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.Cookie;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext;
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.ServiceException;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.util.Locales;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
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;
import java.net.URI;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Stream;
/**
* Skin utilities.
......@@ -66,8 +65,7 @@ public final class Skins {
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.setClassForTemplateLoading(Skins.class, "");
TEMPLATE_CFG.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
TEMPLATE_CFG.setLogTemplateExceptions(false);
}
......@@ -149,9 +147,7 @@ public final class Skins {
langs = new HashMap<>();
final String language = Locales.getLanguage(localeString);
final String country = Locales.getCountry(localeString);
final ServletContext servletContext = SoloServletListener.getServletContext();
final InputStream inputStream = servletContext.getResourceAsStream(
"/skins/" + currentSkinDirName + "/lang/lang_" + language + '_' + country + ".properties");
final InputStream inputStream = Skins.class.getResourceAsStream("/skins/" + currentSkinDirName + "/lang/lang_" + language + '_' + country + ".properties");
if (null != inputStream) {
LOGGER.log(Level.DEBUG, "Loading skin [dirName={0}, locale={1}]", currentSkinDirName, localeString);
final Properties props = new Properties();
......@@ -194,17 +190,27 @@ public final class Skins {
public static Set<String> getSkinDirNames() {
final Set<String> ret = new HashSet<>();
final ServletContext servletContext = SoloServletListener.getServletContext();
final Set<String> resourcePaths = servletContext.getResourcePaths("/skins");
for (final String path : resourcePaths) {
final Path p = Paths.get(path);
final Path file = p.getFileName();
final String fileName = file.toString();
if (fileName.startsWith(".") || fileName.endsWith(".md")) {
continue;
try {
final URI uri = Skins.class.getResource("/skins").toURI();
Path resourcePath;
if (uri.getScheme().equals("jar")) {
FileSystem fileSystem = FileSystems.newFileSystem(uri, Collections.<String, Object>emptyMap());
resourcePath = fileSystem.getPath("/skins");
} else {
resourcePath = Paths.get(uri);
}
final Stream<Path> walk = Files.walk(resourcePath, 1);
for (final Iterator<Path> it = walk.iterator(); it.hasNext(); ) {
final Path file = it.next().getFileName();
final String fileName = file.toString();
if (fileName.startsWith(".") || fileName.endsWith(".md")) {
continue;
}
ret.add(fileName);
ret.add(fileName);
}
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Get skin dir names failed", e);
}
return ret;
......@@ -239,12 +245,12 @@ public final class Skins {
* @param request the specified request
* @return directory name, or {@code null} if not found
*/
public static String getSkinDirNameFromCookie(final HttpServletRequest request) {
public static String getSkinDirNameFromCookie(final Request request) {
final Set<String> skinDirNames = Skins.getSkinDirNames();
boolean isMobile = Solos.isMobile(request);
String skin = null, mobileSkin = null;
final Cookie[] cookies = request.getCookies();
if (null != cookies) {
final List<Cookie> cookies = request.getCookies();
if (!cookies.isEmpty()) {
for (final Cookie cookie : cookies) {
if (Common.COOKIE_NAME_SKIN.equals(cookie.getName()) && !isMobile) {
final String s = cookie.getValue();
......
......@@ -23,29 +23,27 @@ 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.http.Cookie;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.RequestContext;
import org.b3log.latke.http.Response;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.model.Pagination;
import org.b3log.latke.model.Role;
import org.b3log.latke.model.User;
import org.b3log.latke.servlet.RequestContext;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.latke.util.Crypts;
import org.b3log.latke.util.Strings;
import org.b3log.solo.SoloServletListener;
import org.b3log.solo.Server;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.UserExt;
import org.b3log.solo.repository.UserRepository;
import org.json.JSONObject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
......@@ -71,7 +69,7 @@ public final class Solos {
/**
* Solo User-Agent.
*/
public static final String USER_AGENT = "Solo/" + SoloServletListener.VERSION + "; +https://github.com/b3log/solo";
public static final String USER_AGENT = "Solo/" + Server.VERSION + "; +https://github.com/b3log/solo";
/**
* Cookie expiry in 30 days.
......@@ -188,7 +186,7 @@ public final class Solos {
final HttpResponse res = HttpRequest.post("https://hacpai.com/apis/upload/token").trustAllCerts(true).
body(requestJSON.toString()).connectionTimeout(3000).timeout(7000).header("User-Agent", Solos.USER_AGENT).send();
uploadTokenCheckTime = now;
if (HttpServletResponse.SC_OK != res.statusCode()) {
if (200 != res.statusCode()) {
return null;
}
res.charset("UTF-8");
......@@ -249,17 +247,16 @@ public final class Solos {
* @param response the specified response
* @return the current logged-in user, returns {@code null} if not found
*/
public static JSONObject getCurrentUser(final HttpServletRequest request, final HttpServletResponse response) {
final Cookie[] cookies = request.getCookies();
if (null == cookies || 0 == cookies.length) {
public static JSONObject getCurrentUser(final Request request, final Response response) {
final List<Cookie> cookies = request.getCookies();
if (cookies.isEmpty()) {
return null;
}
final BeanManager beanManager = BeanManager.getInstance();
final UserRepository userRepository = beanManager.getReference(UserRepository.class);
try {
for (int i = 0; i < cookies.length; i++) {
final Cookie cookie = cookies[i];
for (final Cookie cookie : cookies) {
if (!COOKIE_NAME.equals(cookie.getName())) {
continue;
}
......@@ -304,7 +301,7 @@ public final class Solos {
* @param response the specified response
* @param user the specified user
*/
public static void login(final JSONObject user, final HttpServletResponse response) {
public static void login(final JSONObject user, final Response response) {
try {
final String userId = user.optString(Keys.OBJECT_ID);
final JSONObject cookieJSONObject = new JSONObject();
......@@ -330,7 +327,7 @@ public final class Solos {
* @param response the specified response
* @return {@code true} if succeed, otherwise returns {@code false}
*/
public static void logout(final HttpServletRequest request, final HttpServletResponse response) {
public static void logout(final Request request, final Response response) {
if (null != response) {
final Cookie cookie = new Cookie(COOKIE_NAME, null);
cookie.setMaxAge(0);
......@@ -386,24 +383,25 @@ public final class Solos {
return false;
}
final HttpServletRequest request = context.getRequest();
final Request request = context.getRequest();
if (null == request) {
return true;
}
final HttpSession session = request.getSession();
if (null != session) {
Map<String, String> viewPwds = (Map<String, String>) session.getAttribute(Common.ARTICLES_VIEW_PWD);
if (null == viewPwds) {
viewPwds = new HashMap<>();
}
if (articleViewPwd.equals(viewPwds.get(article.optString(Keys.OBJECT_ID)))) {
return false;
}
}
final HttpServletResponse response = context.getResponse();
// TODO: session
// final HttpSession session = request.getSession();
// if (null != session) {
// Map<String, String> viewPwds = (Map<String, String>) session.getAttribute(Common.ARTICLES_VIEW_PWD);
// if (null == viewPwds) {
// viewPwds = new HashMap<>();
// }
//
// if (articleViewPwd.equals(viewPwds.get(article.optString(Keys.OBJECT_ID)))) {
// return false;
// }
// }
final Response response = context.getResponse();
final JSONObject currentUser = getCurrentUser(request, response);
return !(null != currentUser && !Role.VISITOR_ROLE.equals(currentUser.optString(User.USER_ROLE)));
......@@ -415,7 +413,7 @@ public final class Solos {
* @param request the specified request
* @return {@code true} if it is, returns {@code false} otherwise
*/
public static boolean isMobile(final HttpServletRequest request) {
public static boolean isMobile(final Request request) {
final Object val = request.getAttribute(Keys.HttpRequest.IS_MOBILE_BOT);
if (!(val instanceof Boolean)) {
return false;
......@@ -430,7 +428,7 @@ public final class Solos {
* @param request the specified request
* @return {@code true} if it is, returns {@code false} otherwise
*/
public static boolean isBot(final HttpServletRequest request) {
public static boolean isBot(final Request request) {
final Object val = request.getAttribute(Keys.HttpRequest.IS_SEARCH_ENGINE_BOT);
if (!(val instanceof Boolean)) {
return false;
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
Solo - A small and beautiful blogging system written in Java.
Copyright (c) 2010-present, b3log.org
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/>.
-->
<!--
Description: Solo web deployment descriptor.
Version: 1.1.0.0, Mar 1, 2019
Author: Liang Ding
-->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>org.b3log.solo.SoloServletListener</listener-class>
</listener>
<session-config>
<session-timeout>
60
</session-timeout>
</session-config>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.b3log.latke.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- Error Pages -->
<error-page>
<error-code>404</error-code>
<location>/error/404</location>
</error-page>
<error-page>
<error-code>401</error-code>
<location>/error/401</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error/403</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500</location>
</error-page>
</web-app>
......@@ -17,9 +17,12 @@
*/
package org.b3log.solo;
import io.netty.handler.codec.http.*;
import org.apache.commons.lang.RandomStringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.Response;
import org.b3log.latke.ioc.BeanManager;
import org.b3log.latke.ioc.Discoverer;
import org.b3log.latke.model.User;
......@@ -39,10 +42,6 @@ import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Collection;
......@@ -134,7 +133,7 @@ public abstract class AbstractTestCase {
*
* @param request the specified request
*/
public void mockAdminLogin(final MockHttpServletRequest request) {
public void mockAdminLogin(final MockRequest request) {
final JSONObject adminUser = getUserQueryService().getAdmin();
final String userId = adminUser.optString(Keys.OBJECT_ID);
final JSONObject cookieJSONObject = new JSONObject();
......@@ -142,8 +141,7 @@ public abstract class AbstractTestCase {
final String random = RandomStringUtils.randomAlphanumeric(16);
cookieJSONObject.put(Keys.TOKEN, "pass:" + random);
final String cookieValue = Crypts.encryptByAES(cookieJSONObject.toString(), Solos.COOKIE_SECRET);
final Cookie cookie = new Cookie(Solos.COOKIE_NAME, cookieValue);
request.setCookies(new Cookie[]{cookie});
request.addCookie(Solos.COOKIE_NAME, cookieValue);
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
}
......@@ -154,10 +152,10 @@ public abstract class AbstractTestCase {
* @param response the specified response
* @return mock dispatcher servlet
*/
public MockDispatcherServlet mockDispatcherServletService(final HttpServletRequest request, final MockHttpServletResponse response) {
public MockDispatcherServlet mockDispatcherServletService(final Request request, final Response response) {
final MockDispatcherServlet ret = new MockDispatcherServlet();
ret.init();
SoloServletListener.routeConsoleProcessors();
Server.routeConsoleProcessors();
ret.service(request, response);
return ret;
......@@ -168,10 +166,9 @@ public abstract class AbstractTestCase {
*
* @return mock request
*/
public MockHttpServletRequest mockRequest() {
final MockHttpServletRequest ret = new MockHttpServletRequest();
return ret;
public MockRequest mockRequest() {
final HttpRequest req = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/a");
return new MockRequest(req);
}
/**
......@@ -179,12 +176,9 @@ public abstract class AbstractTestCase {
*
* @return mock response
*/
public MockHttpServletResponse mockResponse() {
final StringWriter stringWriter = new StringWriter();
final PrintWriter printWriter = new PrintWriter(stringWriter);
final MockHttpServletResponse response = new MockHttpServletResponse();
response.setWriter(printWriter);
response.setBodyWriter(stringWriter);
public MockResponse mockResponse() {
final HttpResponse res = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
final MockResponse response = new MockResponse(res);
return response;
}
......
/*
* Solo - A small and beautiful blogging system written in Java.
* Copyright (c) 2010-present, b3log.org
*
* 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;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.*;
/**
* Mock HTTP servlet request.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.2, May 1, 2012
* @since 2.4.34
*/
public class MockHttpServletResponse implements HttpServletResponse {
private List<Cookie> cookies = new ArrayList<>();
@Override
public void addCookie(Cookie cookie) {
cookies.add(cookie);
}
public List<Cookie> cookies() {
return cookies;
}
@Override
public boolean containsHeader(String name) {
return false;
}
@Override
public String encodeURL(String url) {
return null;
}
@Override
public String encodeRedirectURL(String url) {
return null;
}
@Override
public String encodeUrl(String url) {
return null;
}
@Override
public String encodeRedirectUrl(String url) {
return null;
}
@Override
public void sendError(int sc, String msg) {
}
@Override
public void sendError(int sc) {
}
@Override
public void sendRedirect(String location) {
}
@Override
public void setDateHeader(String name, long date) {
}
@Override
public void addDateHeader(String name, long date) {
}
private Map<String, String> headers = new HashMap<>();
@Override
public void setHeader(String name, String value) {
headers.put(name, value);
}
@Override
public String getHeader(String name) {
return headers.get(name);
}
@Override
public void addHeader(String name, String value) {
headers.put(name, value);
}
@Override
public void setIntHeader(String name, int value) {
}
@Override
public void addIntHeader(String name, int value) {
}
@Override
public void setStatus(int sc) {
}
@Override
public void setStatus(int sc, String sm) {
}
@Override
public int getStatus() {
return 0;
}
@Override
public Collection<String> getHeaders(String name) {
return null;
}
@Override
public Collection<String> getHeaderNames() {
return null;
}
@Override
public String getCharacterEncoding() {
return null;
}
@Override
public String getContentType() {
return null;
}
private long outputBytes;
public long outputBytes() {
return outputBytes;
}
@Override
public ServletOutputStream getOutputStream() {
return new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) {
outputBytes++;
}
};
}
private StringWriter bodyWriter;
private PrintWriter writer;
public void setWriter(final PrintWriter writer) {
this.writer = writer;
}
public void setBodyWriter(final StringWriter bodyWriter) {
this.bodyWriter = bodyWriter;
}
public String body() {
return bodyWriter.toString();
}
@Override
public PrintWriter getWriter() {
return writer;
}
@Override
public void setCharacterEncoding(String charset) {
}
@Override
public void setContentLength(int len) {
}
@Override
public void setContentLengthLong(long len) {
}
@Override
public void setContentType(String type) {
}
@Override
public void setBufferSize(int size) {
}
@Override
public int getBufferSize() {
return 0;
}
@Override
public void flushBuffer() {
}
@Override
public void resetBuffer() {
}
@Override
public boolean isCommitted() {
return false;
}
@Override
public void reset() {
}
@Override
public void setLocale(Locale loc) {
}
@Override
public Locale getLocale() {
return null;
}
}
/*
* Copyright (c) 2009-present, b3log.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.b3log.solo;
import io.netty.handler.codec.http.HttpRequest;
import org.b3log.latke.http.Request;
/**
* Mock HTTP request.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 2.0.0.0, Nov 2, 2019
* @since 3.6.7
*/
public class MockRequest extends Request {
public MockRequest(final HttpRequest req) {
super(null, req);
}
}
\ No newline at end of file
/*
* Copyright (c) 2009-present, b3log.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.b3log.solo;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponse;
import org.b3log.latke.http.Response;
/**
* Mock HTTP response.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 2.0.0.0, Nov 3, 2019
* @since 3.6.7
*/
public class MockResponse extends Response {
public MockResponse(final HttpResponse res) {
super(null, res);
}
}
......@@ -22,8 +22,8 @@ import org.apache.commons.lang.time.DateFormatUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.Query;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.MockRequest;
import org.b3log.solo.MockResponse;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Option;
import org.json.JSONObject;
......@@ -55,13 +55,13 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getArchivesArticlesByPage() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/articles/archives/" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy/MM"));
request.putParameter("p", "1");
final MockHttpServletResponse response = mockResponse();
request.setParameter("p", "1");
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "{\"sc\":true"));
}
......@@ -75,13 +75,13 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/get-article-content");
request.putParameter("id", articleId);
final MockHttpServletResponse response = mockResponse();
request.setParameter("id", articleId);
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "Solo 博客系统已经初始化完毕"));
}
......@@ -90,13 +90,13 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getArticlesByPage() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/articles");
request.putParameter("p", "1");
final MockHttpServletResponse response = mockResponse();
request.setParameter("p", "1");
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "{\"sc\":true"));
}
......@@ -110,13 +110,13 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
final JSONObject admin = getUserRepository().getAdmin();
final String userId = admin.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/articles/authors/" + userId);
request.putParameter("p", "1");
final MockHttpServletResponse response = mockResponse();
request.setParameter("p", "1");
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "{\"sc\":true"));
}
......@@ -125,13 +125,13 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getRandomArticles() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/articles/random");
request.setMethod("POST");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "{\"randomArticles"));
}
......@@ -145,12 +145,12 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/article/id/" + articleId + "/relevant/articles");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "{\"relevantArticles\""));
}
......@@ -159,13 +159,13 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getTagArticlesByPage() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/articles/tags/Solo");
request.putParameter("p", "1");
final MockHttpServletResponse response = mockResponse();
request.setParameter("p", "1");
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "{\"sc\":true"));
}
......@@ -174,14 +174,14 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showArchiveArticles() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/archives/" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy/MM"));
request.putParameter("p", "1");
request.setParameter("p", "1");
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "Solo 的个人博客</title>"));
}
......@@ -194,14 +194,14 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
public void showArticle() throws Exception {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/article");
request.setAttribute(Article.ARTICLE, article);
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "Solo 的个人博客</title>"));
}
......@@ -215,14 +215,14 @@ public class ArticleProcessorTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article-pwd");
request.putParameter("articleId", articleId);
request.setParameter("articleId", articleId);
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>访问密码 - Solo 的个人博客</title>"));
}
......
......@@ -19,8 +19,8 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.MockRequest;
import org.b3log.solo.MockResponse;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -49,12 +49,12 @@ public class BlogProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getBlogInfo() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/blog/info");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.startsWith(content, "{\"staticServePath\":\"http://localhost:8080\""));
}
......@@ -63,13 +63,13 @@ public class BlogProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getArticlesTags() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/blog/articles-tags");
request.putParameter("pwd", "pass");
final MockHttpServletResponse response = mockResponse();
request.setParameter("pwd", "pass");
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.startsWith(content, "{\"data\":"));
}
}
......@@ -20,8 +20,8 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.MockRequest;
import org.b3log.solo.MockResponse;
import org.b3log.solo.model.Category;
import org.b3log.solo.model.Option;
import org.json.JSONObject;
......@@ -53,12 +53,10 @@ public class CategoryProcessorTestCase extends AbstractTestCase {
/**
* showCategoryArticles.
*
* @throws Exception exception
*/
@Test(dependsOnMethods = "init")
public void showCategoryArticles() throws Exception {
MockHttpServletRequest request = mockRequest();
public void showCategoryArticles() {
MockRequest request = mockRequest();
request.setRequestURI("/console/category/");
request.setMethod("POST");
final JSONObject requestJSON = new JSONObject();
......@@ -66,12 +64,11 @@ public class CategoryProcessorTestCase extends AbstractTestCase {
requestJSON.put(Category.CATEGORY_TITLE, "分类1");
requestJSON.put(Category.CATEGORY_URI, "cate1");
final BufferedReader reader = new BufferedReader(new StringReader(requestJSON.toString()));
request.setReader(reader);
request.setJSON(requestJSON);
mockAdminLogin(request);
MockHttpServletResponse response = mockResponse();
MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
request = mockRequest();
......@@ -81,7 +78,7 @@ public class CategoryProcessorTestCase extends AbstractTestCase {
response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>分类1 - Solo 的个人博客</title>"));
}
}
......@@ -22,8 +22,6 @@ import org.b3log.latke.Keys;
import org.b3log.latke.Latkes;
import org.b3log.latke.service.ServiceException;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.model.Article;
import org.b3log.solo.model.Common;
import org.b3log.solo.model.Option;
......@@ -64,7 +62,7 @@ public class CommentProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void addArticleComment() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/article/comments");
request.setMethod("POST");
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
......@@ -81,10 +79,10 @@ public class CommentProcessorTestCase extends AbstractTestCase {
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......
......@@ -19,8 +19,8 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.MockRequest;
import org.b3log.solo.MockResponse;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -49,12 +49,12 @@ public class ErrorProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showErrorPage() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/error/403");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>403 Forbidden! - Solo 的个人博客</title>"));
}
}
......@@ -19,8 +19,6 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -50,12 +48,12 @@ public class FeedProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void blogArticlesAtom() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/atom.xml");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.startsWith(content, "<?xml version=\"1.0\""));
}
......@@ -64,12 +62,12 @@ public class FeedProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void blogArticlesRSS() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/rss.xml");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.startsWith(content, "<?xml version=\"1.0\""));
}
}
......@@ -18,14 +18,14 @@
package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.http.Cookie;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.MockRequest;
import org.b3log.solo.MockResponse;
import org.b3log.solo.util.Solos;
import org.testng.Assert;
import org.testng.annotations.Test;
import javax.servlet.http.Cookie;
import java.util.List;
/**
......@@ -43,12 +43,12 @@ public class IndexProcessorTestCase extends AbstractTestCase {
*/
@Test
public void showStart() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/start");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>欢迎使用! - Solo</title>"));
}
......@@ -67,12 +67,12 @@ public class IndexProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showIndex() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>Solo 的个人博客</title>"));
}
......@@ -81,12 +81,12 @@ public class IndexProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showKillBrowser() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/kill-browser");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>Kill IE! - Solo 的个人博客</title>"));
}
......@@ -95,12 +95,12 @@ public class IndexProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void logout() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/logout");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final List<Cookie> cookies = response.cookies();
final List<Cookie> cookies = response.getCookies();
Assert.assertEquals(cookies.size(), 1);
Assert.assertEquals(cookies.get(0).getName(), Solos.COOKIE_NAME);
Assert.assertNull(cookies.get(0).getValue());
......
......@@ -17,11 +17,11 @@
*/
package org.b3log.solo.processor;
import org.b3log.latke.servlet.DispatcherServlet;
import org.b3log.latke.servlet.handler.*;
import org.b3log.latke.http.Dispatcher;
import org.b3log.latke.http.Request;
import org.b3log.latke.http.Response;
import org.b3log.latke.http.handler.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
......@@ -46,7 +46,7 @@ public class MockDispatcherServlet {
HANDLERS.add(new AfterHandleHandler());
}
public void service(final HttpServletRequest req, final HttpServletResponse resp) {
DispatcherServlet.handle(req, resp);
public void service(final Request req, final Response resp) {
Dispatcher.handle(req, resp);
}
}
......@@ -19,8 +19,6 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -49,12 +47,12 @@ public class SearchProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showOpensearchXML() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/opensearch.xml");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"));
}
......@@ -63,14 +61,14 @@ public class SearchProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void search() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/search");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "Solo 的个人博客搜索"));
}
}
......@@ -19,8 +19,6 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -49,12 +47,12 @@ public class SitemapProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void sitemap() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/sitemap.xml");
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.startsWith(content, "<?xml version=\"1.0\""));
}
}
......@@ -20,8 +20,6 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.model.Option;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -51,13 +49,13 @@ public class TagProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showTagArticles() {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/tags/Solo");
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>Solo 标签 - Solo 的个人博客</title>"));
}
}
......@@ -20,8 +20,6 @@ package org.b3log.solo.processor;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.model.Option;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -51,13 +49,13 @@ public class UserTemplateProcessorTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showCategoryArticles() {
MockHttpServletRequest request = mockRequest();
MockRequest request = mockRequest();
request.setRequestURI("/links.html");
request.setAttribute(Keys.TEMAPLTE_DIR_NAME, Option.DefaultPreference.DEFAULT_SKIN_DIR_NAME);
MockHttpServletResponse response = mockResponse();
MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<title>友情链接 - Solo 的个人博客</title>"));
}
}
......@@ -19,8 +19,8 @@ package org.b3log.solo.processor.console;
import org.apache.commons.lang.StringUtils;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.MockRequest;
import org.b3log.solo.MockResponse;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -51,14 +51,14 @@ public class AdminConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showAdminIndex() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/admin-index.do");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "后台管理 - Solo 的个人博客"));
}
......@@ -69,14 +69,14 @@ public class AdminConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showAdminFunctions() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/admin-article.do");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<div class=\"form\">"));
}
......@@ -87,14 +87,14 @@ public class AdminConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void showAdminPreferenceFunction() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/admin-preference.do");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "信息配置"));
}
......@@ -105,14 +105,14 @@ public class AdminConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void exportSQL() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/export/sql");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final long outputBytes = response.outputBytes();
final long outputBytes = response.getContent().length;
Assert.assertTrue(0 < outputBytes);
}
......@@ -123,14 +123,14 @@ public class AdminConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void exportJSON() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/export/json");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final long outputBytes = response.outputBytes();
final long outputBytes = response.getContent().length;
Assert.assertTrue(0 < outputBytes);
}
......@@ -141,14 +141,14 @@ public class AdminConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void exportHexo() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/export/hexo");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final long outputBytes = response.outputBytes();
final long outputBytes = response.getContent().length;
Assert.assertTrue(0 < outputBytes);
}
}
......@@ -21,8 +21,6 @@ import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.latke.repository.Query;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.model.Article;
import org.json.JSONObject;
import org.testng.Assert;
......@@ -58,14 +56,14 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getArticleThumbs() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/thumbs");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -76,7 +74,7 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void markdown2HTML() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/markdown/2html");
request.setMethod("POST");
final JSONObject requestJSON = new JSONObject();
......@@ -85,11 +83,11 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
request.setReader(reader);
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "<p><strong>Solo<\\/strong><\\/p>"));
}
......@@ -103,14 +101,14 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/" + articleId);
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -121,14 +119,14 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getArticles() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/articles/status/published/1/10/20");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -142,15 +140,15 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/" + articleId);
request.setMethod("DELETE");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -164,15 +162,15 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/unpublish/" + articleId);
request.setMethod("PUT");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -186,15 +184,15 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/canceltop/" + articleId);
request.setMethod("PUT");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -208,15 +206,15 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/puttop/" + articleId);
request.setMethod("PUT");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -229,7 +227,7 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
public void updateArticle() throws Exception {
final JSONObject article = getArticleRepository().get(new Query()).optJSONArray(Keys.RESULTS).optJSONObject(0);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/");
request.setMethod("PUT");
final JSONObject requestJSON = new JSONObject();
......@@ -238,11 +236,11 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
request.setReader(reader);
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
......@@ -257,7 +255,7 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
article.put(Keys.OBJECT_ID, "");
article.put(Article.ARTICLE_PERMALINK, "");
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/");
request.setMethod("POST");
final JSONObject requestJSON = new JSONObject();
......@@ -266,11 +264,11 @@ public class ArticleConsoleTestCase extends AbstractTestCase {
request.setReader(reader);
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "\"sc\":true"));
}
}
......@@ -20,8 +20,6 @@ package org.b3log.solo.processor.console;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.b3log.solo.model.Category;
import org.b3log.solo.model.Common;
import org.json.JSONObject;
......@@ -58,7 +56,7 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void addCategory() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/category/");
request.setMethod("POST");
final JSONObject requestJSON = new JSONObject();
......@@ -70,10 +68,10 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
request.setReader(reader);
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
......@@ -86,16 +84,16 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
public void getCategory() throws Exception {
final JSONObject category = getCategoryQueryService().getByTitle("分类1");
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/category/" + category.optString(Keys.OBJECT_ID));
request.setMethod("GET");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
......@@ -106,7 +104,7 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "addCategory")
public void updateCategory() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/category/");
request.setMethod("PUT");
final JSONObject requestJSON = new JSONObject();
......@@ -119,10 +117,10 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
category = getCategoryQueryService().getByTitle("分类1");
......@@ -140,16 +138,16 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "updateCategory")
public void getCategories() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/categories/1/10/20");
request.setMethod("GET");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
......@@ -162,7 +160,7 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
public void changeOrder() throws Exception {
final JSONObject category = getCategoryQueryService().getByTitle("新的分类1");
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/category/order/");
request.setMethod("PUT");
final JSONObject requestJSON = new JSONObject();
......@@ -173,10 +171,10 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
......@@ -189,16 +187,16 @@ public class CategoryConsoleTestCase extends AbstractTestCase {
public void removeCategory() throws Exception {
final JSONObject category = getCategoryQueryService().getByTitle("新的分类1");
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/category/" + category.optString(Keys.OBJECT_ID));
request.setMethod("DELETE");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
}
......@@ -20,8 +20,6 @@ package org.b3log.solo.processor.console;
import org.apache.commons.lang.StringUtils;
import org.b3log.latke.Keys;
import org.b3log.solo.AbstractTestCase;
import org.b3log.solo.MockHttpServletRequest;
import org.b3log.solo.MockHttpServletResponse;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test;
......@@ -55,15 +53,15 @@ public class CommentConsoleTestCase extends AbstractTestCase {
*/
@Test(dependsOnMethods = "init")
public void getComments() throws Exception {
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/comments/1/10/20");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
......@@ -78,15 +76,15 @@ public class CommentConsoleTestCase extends AbstractTestCase {
final JSONObject article = recentArticles.get(0);
final String articleId = article.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/comments/article/" + articleId);
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
......@@ -101,16 +99,16 @@ public class CommentConsoleTestCase extends AbstractTestCase {
final JSONObject comment = recentComments.get(0);
final String commentId = comment.optString(Keys.OBJECT_ID);
final MockHttpServletRequest request = mockRequest();
final MockRequest request = mockRequest();
request.setRequestURI("/console/article/comment/" + commentId);
request.setMethod("DELETE");
mockAdminLogin(request);
final MockHttpServletResponse response = mockResponse();
final MockResponse response = mockResponse();
mockDispatcherServletService(request, response);
final String content = response.body();
final String content = response.getContentStr();
Assert.assertTrue(StringUtils.contains(content, "sc\":true"));
}
}
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