package cn.cslg.pas.service.importPatent; import cn.cslg.pas.common.core.IgnoreDTDEntityResolver; import cn.cslg.pas.common.dto.UploadPatentWebDTO; import cn.cslg.pas.common.model.importTaskModel.PatentRight; import cn.cslg.pas.common.vo.ChinaPatentZhuLu; import cn.cslg.pas.common.vo.ImportTaskAMVO; import cn.cslg.pas.common.vo.StarPatentVO; import cn.cslg.pas.domain.es.Patent; import cn.cslg.pas.domain.es.Text; import cn.cslg.pas.service.business.es.EsService; import cn.cslg.pas.service.common.PatentStarApiService; import com.alibaba.fastjson.JSON; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.SAXReader; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.context.ApplicationContext; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @Configurable public class GetRightAndFullTextFromWebThread extends Thread { private ImportTaskAMVO importTaskAMVO; private ApplicationContext applicationContext; private ImportFromWebToEsService importFromWebToEsService; private PatentStarApiService patentStarApiService; private List uploadPatentWebDTOs = new ArrayList<>(); private final Lock taskLock = new ReentrantLock(); private final Condition taskCondition = taskLock.newCondition(); private Boolean ifProductAll = false; private TaskThread taskThread; @Override public void run() { while ((!ifProductAll || uploadPatentWebDTOs.size() > 0) && importTaskAMVO.getState().equals(1)) { try { if (uploadPatentWebDTOs.size() == 0) { taskLock.lock(); taskCondition.await(); } } catch (Exception e) { } if(uploadPatentWebDTOs.size()==0){ break; } UploadPatentWebDTO uploadPatentWebDTO = uploadPatentWebDTOs.remove(0); try { StarPatentVO starPatentVO = uploadPatentWebDTO.getStarPatentVO(); if ((starPatentVO.getPublicNo() != null && starPatentVO.getPublicNo().contains("CN")) || (starPatentVO.getPublicNo() == null && starPatentVO.getPublicNo().contains("CN"))) { patentStarApiService = applicationContext.getBean(PatentStarApiService.class); String cnFullXmlStr = patentStarApiService.getCnFullXmlApi(starPatentVO.getRowApplicationNo()); this.loadClaim(uploadPatentWebDTO, cnFullXmlStr); this.loadFullText(uploadPatentWebDTO, cnFullXmlStr); } //加入es保存队列 importFromWebToEsService.loadPatentMessageDone(uploadPatentWebDTO); } catch (Exception e) { importFromWebToEsService.loadPatentMessageDone(uploadPatentWebDTO); e.printStackTrace(); } System.out.println("rightDone" + ifProductAll); } importFromWebToEsService.setPatentToEsProductAll("rightDone"); } public GetRightAndFullTextFromWebThread(TaskThread taskThread, ImportFromWebToEsService importFromWebToEsService) { this.importTaskAMVO = taskThread.getImportTaskAMVO(); this.importFromWebToEsService = importFromWebToEsService; this.applicationContext = taskThread.getApplicationContext(); this.taskThread = taskThread; } public void awakeTask(UploadPatentWebDTO uploadPatentWebDTO) { synchronized ("装载专利信息") { UploadPatentWebDTO uploadPatentWebDTO1 = new UploadPatentWebDTO(); BeanUtils.copyProperties(uploadPatentWebDTO, uploadPatentWebDTO1); uploadPatentWebDTOs.add(uploadPatentWebDTO1); if (taskLock.tryLock()) { taskCondition.signalAll(); taskLock.unlock(); } } } //装载权利要求 private void loadClaim(UploadPatentWebDTO uploadPatentWebDTO, String cnFullXmlStr) { Patent patent = uploadPatentWebDTO.getPatent(); try { if (cnFullXmlStr != null && cnFullXmlStr != "") { SAXReader reader = new SAXReader(); reader.setEntityResolver(new IgnoreDTDEntityResolver()); Reader stringReader = new StringReader(cnFullXmlStr); Document document = reader.read(stringReader); XPath xpath = document.createXPath("//claim-text"); List element = (List) xpath.selectNodes(document); if (element.size() == 0) { xpath = document.createXPath("//business:ClaimText"); element = (List) xpath.selectNodes(document); } List reClaims = new ArrayList<>(); element.forEach(item -> { String claim = item.getText(); claim = claim.replaceAll("\r\n|\r|\n|\t| ", ""); reClaims.add(claim); }); String reClaim = ""; if (reClaims.size() != 0) { reClaim = cn.cslg.pas.common.utils.StringUtils.join(reClaims, ""); } //装载权利要求原文 Text text = new Text(); text.setLanguage(patent.getAppCountry()); text.setTextContent(reClaim); text.setIfOrigin(true); patent.setClaim(Arrays.asList(text)); } } catch (Exception e) { e.printStackTrace(); } } //装载说明书文档 private void loadFullText(UploadPatentWebDTO uploadPatentWebDTO, String cnFullXmlStr) { Patent patent = uploadPatentWebDTO.getPatent(); try { //若没有取到全文文本,即取不到说明书文本,则将当前申请号或专利号和备注信息记录到问题记录表 if (cnFullXmlStr.equals("")) { return; } SAXReader reader = new SAXReader(); reader.setEntityResolver(new IgnoreDTDEntityResolver()); Reader stringReader = new StringReader(cnFullXmlStr); Document document = reader.read(stringReader); XPath xpath = document.createXPath("//description//p"); List elements = (List) xpath.selectNodes(document); if (elements.size() == 0) { xpath = document.createXPath("//business:Description//base:Paragraphs"); elements = (List) xpath.selectNodes(document); } List fullTexts = new ArrayList<>(); Integer count = 1; for (Element item : elements) { String fullText = item.getText().replaceAll("
", ""); if (!fullText.trim().equals("技术领域") && !fullText.trim().equals("发明内容") && !fullText.trim().equals("附图说明") && !fullText.trim().equals("具体实施方式") && !fullText.trim().equals("背景技术") && !fullText.trim().equals("实用新型内容")) { String formattedNum = String.format("%04d", count); fullText = "[" + formattedNum + "]" + fullText; count++; } fullText = fullText.replaceAll("\r\n|\r|\n| ", ""); fullTexts.add(fullText); } String fullText = ""; if (fullTexts.size() != 0) { fullText = cn.cslg.pas.common.utils.StringUtils.join(fullTexts, "\r"); } Text text = new Text(); text.setIfOrigin(true); text.setTextContent(fullText); text.setLanguage(patent.getAppCountry()); patent.setPublicFullText(Arrays.asList(text)); } catch (Exception e) { e.printStackTrace(); } } public void setIfProductAll(Boolean ifProductAll) { this.ifProductAll = ifProductAll; if (taskLock.tryLock()) { taskCondition.signalAll(); taskLock.unlock(); } } }