/*
* Symphony - A modern community (forum/SNS/blog) platform written in Java.
* Copyright (C) 2012-2017, b3log.org & hacpai.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.b3log.symphony.service;
import org.b3log.latke.Keys;
import org.b3log.latke.ioc.inject.Inject;
import org.b3log.latke.logging.Level;
import org.b3log.latke.logging.Logger;
import org.b3log.latke.repository.*;
import org.b3log.latke.service.annotation.Service;
import org.b3log.latke.util.CollectionUtils;
import org.b3log.latke.util.Stopwatchs;
import org.b3log.symphony.model.Article;
import org.b3log.symphony.model.Comment;
import org.b3log.symphony.model.Revision;
import org.b3log.symphony.repository.RevisionRepository;
import org.b3log.symphony.util.Markdowns;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Collections;
import java.util.List;
/**
* Revision query service.
*
* @author <a href="http://88250.b3log.org">Liang Ding</a>
* @version 1.0.0.1, May 12, 2017
* @since 2.1.0
*/
@Service
public class RevisionQueryService {
/**
* Logger.
*/
private static final Logger LOGGER = Logger.getLogger(RevisionQueryService.class);
/**
* Revision repository.
*/
@Inject
private RevisionRepository revisionRepository;
/**
* Gets a comment's revisions.
*
* @param commentId the specified comment id
* @return comment revisions, returns an empty list if not found
*/
public List<JSONObject> getCommentRevisions(final String commentId) {
final Query query = new Query().setFilter(CompositeFilterOperator.and(
new PropertyFilter(Revision.REVISION_DATA_ID, FilterOperator.EQUAL, commentId),
new PropertyFilter(Revision.REVISION_DATA_TYPE, FilterOperator.EQUAL, Revision.DATA_TYPE_C_COMMENT)
)).addSort(Keys.OBJECT_ID, SortDirection.ASCENDING);
try {
final List<JSONObject> ret = CollectionUtils.jsonArrayToList(revisionRepository.get(query).optJSONArray(Keys.RESULTS));
for (final JSONObject rev : ret) {
final JSONObject data = new JSONObject(rev.optString(Revision.REVISION_DATA));
String commentContent = data.optString(Comment.COMMENT_CONTENT);
commentContent = commentContent.replace("\n", "_esc_br_");
commentContent = Markdowns.clean(commentContent, "");
commentContent = commentContent.replace("_esc_br_", "\n");
data.put(Comment.COMMENT_CONTENT, commentContent);
rev.put(Revision.REVISION_DATA, data);
}
return ret;
} catch (final RepositoryException | JSONException e) {
LOGGER.log(Level.ERROR, "Gets comment revisions failed", e);
return Collections.emptyList();
}
}
/**
* Gets an article's revisions.
*
* @param articleId the specified article id
* @return article revisions, returns an empty list if not found
*/
public List<JSONObject> getArticleRevisions(final String articleId) {
final Query query = new Query().setFilter(CompositeFilterOperator.and(
new PropertyFilter(Revision.REVISION_DATA_ID, FilterOperator.EQUAL, articleId),
new PropertyFilter(Revision.REVISION_DATA_TYPE, FilterOperator.EQUAL, Revision.DATA_TYPE_C_ARTICLE)
)).addSort(Keys.OBJECT_ID, SortDirection.ASCENDING);
try {
final List<JSONObject> ret = CollectionUtils.jsonArrayToList(revisionRepository.get(query).optJSONArray(Keys.RESULTS));
for (final JSONObject rev : ret) {
final JSONObject data = new JSONObject(rev.optString(Revision.REVISION_DATA));
String articleTitle = data.optString(Article.ARTICLE_TITLE);
articleTitle = articleTitle.replace("<", "<").replace(">", ">");
articleTitle = Markdowns.clean(articleTitle, "");
data.put(Article.ARTICLE_TITLE, articleTitle);
String articleContent = data.optString(Article.ARTICLE_CONTENT);
// articleContent = Markdowns.toHTML(articleContent); https://hacpai.com/article/1490233597586
articleContent = articleContent.replace("\n", "_esc_br_");
articleContent = Markdowns.clean(articleContent, "");
articleContent = articleContent.replace("_esc_br_", "\n");
data.put(Article.ARTICLE_CONTENT, articleContent);
rev.put(Revision.REVISION_DATA, data);
}
return ret;
} catch (final RepositoryException | JSONException e) {
LOGGER.log(Level.ERROR, "Gets article revisions failed", e);
return Collections.emptyList();
}
}
/**
* Counts revision specified by the given data id and data type.
*
* @param dataId the given data id
* @param dataType the given data type
* @return count result
*/
public int count(final String dataId, final int dataType) {
final Query query = new Query().setFilter(CompositeFilterOperator.and(
new PropertyFilter(Revision.REVISION_DATA_ID, FilterOperator.EQUAL, dataId),
new PropertyFilter(Revision.REVISION_DATA_TYPE, FilterOperator.EQUAL, dataType)
));
Stopwatchs.start("Revision count");
try {
return (int) revisionRepository.count(query);
} catch (final Exception e) {
LOGGER.log(Level.ERROR, "Counts revisions failed", e);
return 0;
} finally {
Stopwatchs.end();
}
}
}