首页>代码>Java开源博客系统框架B3log Solo源码下载>/b3log-solo-b3log-solo-0.6.8/core/src/main/java/org/b3log/solo/api/symphony/CommentReceiver.java
/* * Copyright (c) 2010-2015, 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.api.symphony; import java.net.MalformedURLException; import java.net.URL; import java.util.Date; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.time.DateFormatUtils; import org.b3log.latke.Keys; import org.b3log.latke.event.Event; import org.b3log.latke.event.EventManager; import org.b3log.latke.logging.Level; import org.b3log.latke.logging.Logger; import org.b3log.latke.repository.Transaction; import org.b3log.latke.service.ServiceException; import org.b3log.latke.servlet.HTTPRequestContext; import org.b3log.latke.servlet.HTTPRequestMethod; import org.b3log.latke.servlet.annotation.RequestProcessing; import org.b3log.latke.servlet.annotation.RequestProcessor; import org.b3log.latke.servlet.renderer.JSONRenderer; import org.b3log.latke.urlfetch.URLFetchService; import org.b3log.latke.urlfetch.URLFetchServiceFactory; import org.b3log.latke.util.Requests; import org.b3log.latke.util.Strings; import org.b3log.solo.SoloServletListener; import org.b3log.solo.event.EventTypes; import org.b3log.solo.model.Article; import org.b3log.solo.model.Comment; import org.b3log.solo.model.Preference; import org.b3log.solo.repository.ArticleRepository; import org.b3log.solo.repository.CommentRepository; import org.b3log.solo.service.ArticleMgmtService; import org.b3log.solo.service.CommentMgmtService; import org.b3log.solo.service.PreferenceQueryService; import org.b3log.solo.service.StatisticMgmtService; import org.b3log.solo.util.Comments; import org.b3log.solo.util.QueryResults; import org.json.JSONObject; /** * Comment receiver (from B3log Symphony). * * @author <a href="http://88250.b3log.org">Liang Ding</a> * @version 1.1.0.8, Jul 10, 2014 * @since 0.5.5 */ @RequestProcessor public class CommentReceiver { /** * Logger. */ private static final Logger LOGGER = Logger.getLogger(CommentReceiver.class.getName()); /** * Comment management service. */ @Inject private CommentMgmtService commentMgmtService; /** * Comment repository. */ @Inject private static CommentRepository commentRepository; /** * Preference query service. */ @Inject private PreferenceQueryService preferenceQueryService; /** * Article management service. */ @Inject private ArticleMgmtService articleMgmtService; /** * Article repository. */ @Inject private ArticleRepository articleRepository; /** * Default user thumbnail. */ private static final String DEFAULT_USER_THUMBNAIL = "default-user-thumbnail.png"; /** * URL fetch service. */ private static URLFetchService urlFetchService = URLFetchServiceFactory.getURLFetchService(); /** * Event manager. */ @Inject private static EventManager eventManager; /** * Statistic management service. */ @Inject private StatisticMgmtService statisticMgmtService; /** * Adds an article with the specified request. * * <p> * Renders the response with a json object, for example, * <pre> * { * "sc": true * } * </pre> * </p> * * @param request the specified http servlet request, for example, * <pre> * { * "comment": { * "userB3Key": "", * "oId": "", * "commentSymphonyArticleId": "", * "commentOnArticleId": "", * "commentAuthorName": "", * "commentAuthorEmail": "", * "commentAuthorURL": "", * "commentContent": "", * "commentOriginalCommentId": "" // optional, if exists this key, the comment is an reply * } * } * </pre> * * @param response the specified http servlet response * @param context the specified http request context * @throws Exception exception */ @RequestProcessing(value = "/apis/symphony/comment", method = HTTPRequestMethod.PUT) public void addComment(final HttpServletRequest request, final HttpServletResponse response, final HTTPRequestContext context) throws Exception { final JSONRenderer renderer = new JSONRenderer(); context.setRenderer(renderer); final JSONObject ret = new JSONObject(); renderer.setJSONObject(ret); final Transaction transaction = commentRepository.beginTransaction(); try { final JSONObject requestJSONObject = Requests.parseRequestJSONObject(request, response); final JSONObject symphonyCmt = requestJSONObject.optJSONObject(Comment.COMMENT); final JSONObject preference = preferenceQueryService.getPreference(); final String keyOfSolo = preference.optString(Preference.KEY_OF_SOLO); final String key = symphonyCmt.optString("userB3Key"); if (Strings.isEmptyOrNull(keyOfSolo) || !keyOfSolo.equals(key)) { ret.put(Keys.STATUS_CODE, HttpServletResponse.SC_FORBIDDEN); ret.put(Keys.MSG, "Wrong key"); return; } final String articleId = symphonyCmt.getString("commentOnArticleId"); final JSONObject article = articleRepository.get(articleId); if (null == article) { ret.put(Keys.STATUS_CODE, HttpServletResponse.SC_NOT_FOUND); ret.put(Keys.MSG, "Not found the specified article[id=" + articleId + "]"); return; } final String commentName = symphonyCmt.getString("commentAuthorName"); final String commentEmail = symphonyCmt.getString("commentAuthorEmail").trim().toLowerCase(); String commentURL = symphonyCmt.optString("commentAuthorURL"); if (!commentURL.contains("://")) { commentURL = "http://" + commentURL; } try { new URL(commentURL); } catch (final MalformedURLException e) { LOGGER.log(Level.WARN, "The comment URL is invalid [{0}]", commentURL); commentURL = ""; } final String commentId = symphonyCmt.optString(Keys.OBJECT_ID); String commentContent = symphonyCmt.getString(Comment.COMMENT_CONTENT); commentContent += "<p class='cmtFromSym'><i>该评论同步自 <a href='" + SoloServletListener.B3LOG_SYMPHONY_SERVE_PATH + "/article/" + symphonyCmt.optString("commentSymphonyArticleId") + "#" + commentId + "' target='_blank'>B3log 社区</a></i></p>"; final String originalCommentId = symphonyCmt.optString(Comment.COMMENT_ORIGINAL_COMMENT_ID); // Step 1: Add comment final JSONObject comment = new JSONObject(); JSONObject originalComment = null; comment.put(Keys.OBJECT_ID, commentId); comment.put(Comment.COMMENT_NAME, commentName); comment.put(Comment.COMMENT_EMAIL, commentEmail); comment.put(Comment.COMMENT_URL, commentURL); comment.put(Comment.COMMENT_CONTENT, commentContent); final Date date = new Date(); comment.put(Comment.COMMENT_DATE, date); ret.put(Comment.COMMENT_DATE, DateFormatUtils.format(date, "yyyy-MM-dd hh:mm:ss")); if (!Strings.isEmptyOrNull(originalCommentId)) { originalComment = commentRepository.get(originalCommentId); if (null != originalComment) { comment.put(Comment.COMMENT_ORIGINAL_COMMENT_ID, originalCommentId); final String originalCommentName = originalComment.getString(Comment.COMMENT_NAME); comment.put(Comment.COMMENT_ORIGINAL_COMMENT_NAME, originalCommentName); ret.put(Comment.COMMENT_ORIGINAL_COMMENT_NAME, originalCommentName); } else { comment.put(Comment.COMMENT_ORIGINAL_COMMENT_ID, ""); comment.put(Comment.COMMENT_ORIGINAL_COMMENT_NAME, ""); LOGGER.log(Level.WARN, "Not found orginal comment[id={0}] of reply[name={1}, content={2}]", new String[] {originalCommentId, commentName, commentContent}); } } else { comment.put(Comment.COMMENT_ORIGINAL_COMMENT_ID, ""); comment.put(Comment.COMMENT_ORIGINAL_COMMENT_NAME, ""); } CommentMgmtService.setCommentThumbnailURL(comment); ret.put(Comment.COMMENT_THUMBNAIL_URL, comment.getString(Comment.COMMENT_THUMBNAIL_URL)); // Sets comment on article.... comment.put(Comment.COMMENT_ON_ID, articleId); comment.put(Comment.COMMENT_ON_TYPE, Article.ARTICLE); final String commentSharpURL = Comments.getCommentSharpURLForArticle(article, commentId); comment.put(Comment.COMMENT_SHARP_URL, commentSharpURL); commentRepository.add(comment); // Step 2: Update article comment count articleMgmtService.incArticleCommentCount(articleId); // Step 3: Update blog statistic comment count statisticMgmtService.incBlogCommentCount(); statisticMgmtService.incPublishedBlogCommentCount(); // Step 4: Send an email to admin try { commentMgmtService.sendNotificationMail(article, comment, originalComment, preference); } catch (final Exception e) { LOGGER.log(Level.WARN, "Send mail failed", e); } // Step 5: Fire add comment event final JSONObject eventData = new JSONObject(); eventData.put(Comment.COMMENT, comment); eventData.put(Article.ARTICLE, article); eventManager.fireEventSynchronously(new Event<JSONObject>(EventTypes.ADD_COMMENT_TO_ARTICLE_FROM_SYMPHONY, eventData)); transaction.commit(); ret.put(Keys.STATUS_CODE, true); ret.put(Keys.OBJECT_ID, commentId); ret.put(Keys.OBJECT_ID, articleId); ret.put(Keys.MSG, "add a comment to an article from symphony succ"); ret.put(Keys.STATUS_CODE, true); renderer.setJSONObject(ret); } catch (final ServiceException e) { LOGGER.log(Level.ERROR, e.getMessage(), e); final JSONObject jsonObject = QueryResults.defaultResult(); renderer.setJSONObject(jsonObject); jsonObject.put(Keys.MSG, e.getMessage()); } } }
最近下载更多
微信网友_6717388559257600 LV1
2023年11月1日
cheung524071 LV8
2023年8月23日
yyyyzh LV1
2022年12月27日
疯子庭 LV8
2021年11月30日
云生123456 LV6
2021年6月8日
hehuiai1 LV2
2020年10月17日
qq2308261 LV2
2020年8月24日
庐州一生挚爱 LV3
2020年5月30日
471135409 LV1
2020年5月26日
cesare-blog LV6
2020年5月25日
最近浏览更多
davidlee2015 LV6
2023年11月19日
微信网友_6717388559257600 LV1
2023年11月1日
zhaobing_g LV3
2023年8月28日
cheung524071 LV8
2023年8月23日
wanglongfei2 LV2
2023年6月15日
不止是六位数 LV7
2023年3月21日
KevinST LV5
2023年2月6日
yyyyzh LV1
2022年12月27日
zxc131313 LV12
2022年11月21日
迷迭香 LV10
2022年9月21日