package com.cn.lucky.morning.model.service.impl; import com.cn.lucky.morning.model.common.log.Logs; import com.cn.lucky.morning.model.common.mvc.MvcResult; import com.cn.lucky.morning.model.domain.BookInfo; import com.cn.lucky.morning.model.domain.BookSource; import com.cn.lucky.morning.model.service.BookAnalysisService; import com.cn.lucky.morning.model.service.BookSourceAnalysisService; import com.cn.lucky.morning.model.service.BookSourceService; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; /** * 聚合搜索服务 * @author lucky_morning */ @Service public class BookAnalysisServiceImpl implements BookAnalysisService { private static final Logger logger = Logs.get(); @Resource private BookSourceAnalysisService bookSourceAnalysisService; @Resource private BookSourceService bookSourceService; @Override public MvcResult searchByName(String name) { MvcResult result = MvcResult.create(); if (StringUtils.isEmpty(name)) { result.setSuccess(false); result.setMessage("搜索名称不能为空"); } else { List<BookInfo> list = new ArrayList<>(); List<BookSource> bookSources = bookSourceService.getAll(); if (bookSources== null || bookSources.size() == 0){ result.setSuccess(false); result.setMessage("请添加书源"); }else { List<Future<MvcResult>> futureList = new ArrayList<>(bookSources.size()); for (BookSource bookSource : bookSources){ futureList.add(bookSourceAnalysisService.searchByName(name,bookSource)); } boolean isAllError = true; StringBuffer errorMsg = new StringBuffer(); for (int index = 0; index < futureList.size(); index++){ Future<MvcResult> future = futureList.get(index); try { MvcResult searchResult = future.get(); if (searchResult.isSuccess()){ list.addAll(searchResult.getVal("list")); isAllError = false; }else { errorMsg.append("书源【"+bookSources.get(index)+"】查询出错:"); if (StringUtils.isBlank(searchResult.getMessage())){ errorMsg.append("未知原因"); }else { errorMsg.append(searchResult.getMessage()); } errorMsg.append(";\n"); } }catch (Exception e){ errorMsg.append("书源【"+bookSources.get(index)+"】加载出错:"); if (StringUtils.isBlank(e.getMessage())){ errorMsg.append("未知原因"); }else { errorMsg.append(e.getMessage()); } errorMsg.append(";\n"); } } if (isAllError){ result.setSuccess(false); result.setMessage(errorMsg.toString()); logger.error("书籍搜素出错:"+result.getMessage()); }else { result.addVal("list", list); } } } return result; } @Override public MvcResult loadBookDetail(String url) { MvcResult result = MvcResult.create(); if (StringUtils.isBlank(url)) { result.setSuccess(false); result.setMessage("解析地址不能为空"); } else { try { Future<MvcResult> future; List<BookSource> bookSources = bookSourceService.getAll(); if (bookSources== null || bookSources.size() == 0){ result.setSuccess(false); result.setMessage("请添加书源"); }else { boolean isNotFound = true; for (BookSource bookSource : bookSources){ if (url.contains(bookSource.getBaseUrl())){ isNotFound = false; future = bookSourceAnalysisService.loadBookInfo(url,bookSource); result = future.get(); break; } } if (isNotFound){ result.setSuccess(false); result.setMessage("未知解析源,请直接访问 【" + url + "】"); } } } catch (Exception e) { result.setSuccess(false); result.setMessage("解析书籍详情出错(" + e.getMessage() + "),请刷新重试,或直接访问【" + url + "】"); logger.error("解析书籍详情【" + url + "】出错", e); } } return result; } @Override public MvcResult loadBookContent(String url) { synchronized (url){ MvcResult result = MvcResult.create(); if (StringUtils.isBlank(url)) { result.setSuccess(false); result.setMessage("解析地址不能为空"); } else { try { Future<MvcResult> future; List<BookSource> bookSources = bookSourceService.getAll(); if (bookSources== null || bookSources.size() == 0){ result.setSuccess(false); result.setMessage("请添加书源"); }else { boolean isNotFound = true; for (BookSource bookSource : bookSources){ if (url.contains(bookSource.getBaseUrl())){ isNotFound = false; future = bookSourceAnalysisService.loadContent(url,bookSource); result = future.get(); break; } } if (isNotFound){ result.setSuccess(false); result.setMessage("未知解析源,请直接访问 【" + url + "】"); } } } catch (Exception e) { result.setSuccess(false); result.setMessage("解析章节内容出错(" + e.getMessage() + "),请刷新重试,或直接访问【" + url + "】"); logger.error("解析章节内容【" + url + "】出错", e); } } return result; } } }