| | |
| | | import kr.wisestone.owl.constant.*; |
| | | import kr.wisestone.owl.data.CheckIssueData; |
| | | import kr.wisestone.owl.domain.*; |
| | | import kr.wisestone.owl.domain.enumType.CustomFieldType; |
| | | import kr.wisestone.owl.domain.enumType.EmailType; |
| | | import kr.wisestone.owl.domain.enumType.IssueHistoryType; |
| | | import kr.wisestone.owl.domain.enumType.IssueStatusType; |
| | |
| | | import java.io.IOException; |
| | | import java.text.ParseException; |
| | | import java.util.*; |
| | | import java.util.regex.Pattern; |
| | | |
| | | import static kr.wisestone.owl.domain.enumType.CustomFieldType.*; |
| | | import static kr.wisestone.owl.web.condition.CompanyFieldCondition.IP_DEFAULT; |
| | | |
| | | @Service |
| | | public class IssueServiceImpl extends AbstractServiceImpl<Issue, Long, JpaRepository<Issue, Long>> implements IssueService { |
| | |
| | | } |
| | | |
| | | // 중복된 상위 이슈검색 |
| | | List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps, user.getId()); |
| | | List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps); |
| | | int size = issues.size(); |
| | | if (size > 0) { |
| | | Issue targetIssue = issues.get(0); |
| | |
| | | |
| | | /** |
| | | * 도메인이 동일한 업체 찾기 |
| | | * |
| | | * @param issueForm IssueForm |
| | | * @return IssueForm |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 입력한 ip가 기존 업체 중에 속해있는지 체크 |
| | | * |
| | | * @param ip IP |
| | | * @param startIps 업체 테이블에 존재하는 start_ip(정수로 변환한 값) |
| | | * @param endIps 업체 테이블에 존재하는 end_ip(정수로 변환한 값) |
| | | * @return IP가 속해 있는지 결과 값 |
| | | */ |
| | | boolean containsIP(Long ip, List<Long> startIps, List<Long> endIps) { |
| | | if (startIps != null && startIps.size() > 0 && endIps != null && endIps.size() > 0) { |
| | | for (int i = 0; i < startIps.size(); i++) { |
| | | if (startIps.get(i) <= ip && endIps.get(i) >= ip) { |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 조건에 맞는 파트너 정보 찾기 |
| | | * |
| | | * @param condition CompanyFieldCondition |
| | | * @param issueCompanyFields List<Map<String, Object>> |
| | | * @param issueIspFields List<Map<String, Object>> |
| | | * @param issueHostingFields List<Map<String, Object>> |
| | | */ |
| | | private void findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields |
| | | private CompanyFieldVo findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields |
| | | , List<Map<String, Object>> issueIspFields, List<Map<String, Object>> issueHostingFields) { |
| | | |
| | | List<Map<String, Object>> companyFields = this.companyFieldService.find(condition); |
| | | Long ip = condition.getIp(); |
| | | List<Map<String, Object>> companyFieldList = Lists.newArrayList(); |
| | | |
| | | if (ip > IP_DEFAULT) { |
| | | List<CompanyField> companyFields = this.companyFieldService.findAll(); |
| | | if(companyFields != null && companyFields.size() > 0) { |
| | | for (Map<String, Object> companyField : companyFields) { |
| | | CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class); |
| | | for (CompanyField companyField : companyFields) { |
| | | if (companyField.getIpStart() != null && companyField.getIpEnd() != null) { |
| | | List<Long> startIps = ConvertUtil.ipToLongs(companyField.getIpStart()); |
| | | List<Long> endIps = ConvertUtil.ipToLongs(companyField.getIpEnd()); |
| | | |
| | | if (containsIP(ip, startIps, endIps)) { |
| | | companyFieldList.add(ConvertUtil.convertObjectToMap(companyField)); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | // api 사용자정의필드 값에 IP,URL 둘 다 입력 했을 경우 |
| | | if (!StringUtils.isEmpty(condition.getUrl()) && companyFieldList.size() > 0) { |
| | | for (Map<String, Object> companyFieldMap : companyFieldList) { |
| | | CompanyField companyField = ConvertUtil.convertMapToClass(companyFieldMap, CompanyField.class); |
| | | if (companyField != null && !StringUtils.isEmpty(companyField.getUrl())) { |
| | | if (!companyField.getUrl().contains(condition.getUrl())) { |
| | | companyFieldList.clear(); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } else { |
| | | companyFieldList = this.companyFieldService.find(condition); |
| | | } |
| | | |
| | | CompanyFieldVo companyFieldVo = null; |
| | | if (companyFieldList != null && companyFieldList.size() > 0) { |
| | | for (Map<String, Object> companyField : companyFieldList) { |
| | | companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class); |
| | | companyField.put("companyId", companyField.get("id")); |
| | | issueCompanyFields.add(companyField); |
| | | if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) { |
| | |
| | | } |
| | | } |
| | | } |
| | | return companyFieldVo; |
| | | } |
| | | |
| | | private User convertToUser(String token) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * url 정규식 표현 |
| | | * @param url String |
| | | * 사용자정의 필드 검사 |
| | | * 도메인 or IP 일 경우만 처리하기 위함 |
| | | * |
| | | * @param issueCustomFieldValueForms 사용자 정의 필드 값 배열 |
| | | * @return 업체 검색 조건 |
| | | */ |
| | | private boolean verifyUrl(String url) { |
| | | boolean urlChk = false; |
| | | if (!StringUtils.isEmpty(url)) { |
| | | String reg = "^((http|https)://)?(www.)?([a-zA-Z0-9]+)\\.[a-z]+([a-zA-z0-9.?#]+)?"; |
| | | if(Pattern.matches(reg, url)) { |
| | | urlChk = true; |
| | | } |
| | | } |
| | | return urlChk; |
| | | } |
| | | |
| | | /** |
| | | * ip 정규식 표현 |
| | | * @param ip String |
| | | * @return boolean |
| | | */ |
| | | private boolean verifyIp(String ip) { |
| | | boolean ipChk = false; |
| | | if (!StringUtils.isEmpty(ip)) { |
| | | if (Pattern.matches("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\" + |
| | | ".(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", ip)) { |
| | | ipChk = true; |
| | | } |
| | | } |
| | | |
| | | return ipChk; |
| | | } |
| | | |
| | | // 중복된 상위 이슈 검색 |
| | | private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) { |
| | | List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); |
| | | List<Issue> resultIssueVos = Lists.newArrayList(); |
| | | String comma = ","; |
| | | private CompanyFieldCondition validIssueCustomFieldValue(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) { |
| | | CompanyFieldCondition condition = new CompanyFieldCondition(); |
| | | |
| | | if (issueCustomFieldValueForms.size() > 0) { |
| | | String concatUseValue = ""; |
| | | String customFieldType = ""; |
| | | int useIdx = 0; |
| | | int cntIp = 0; |
| | | int cntSite = 0; |
| | | |
| | | IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator(); |
| | | Collections.sort(issueCustomFieldValueForms, comp); |
| | | |
| | | List<String> userValues = Lists.newArrayList(); |
| | | CompanyFieldCondition condition = new CompanyFieldCondition(); |
| | | List<Map<String, Object>> issueCompanyFields = Lists.newArrayList(); |
| | | List<Map<String, Object>> issueIspFields = Lists.newArrayList(); |
| | | List<Map<String, Object>> issueHostingFields = Lists.newArrayList(); |
| | | for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { |
| | | |
| | | for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { |
| | | if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) { |
| | | String useValue = issueCustomFieldValueForm.getUseValue(); |
| | | if (CommonUtil.verifyIp(useValue)) { |
| | | long ip = ConvertUtil.ipToLong(useValue); |
| | | if (condition.getIp() <= IP_DEFAULT) { |
| | | condition.setIp(ip); |
| | | } else { |
| | | throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_IP_ERROR)); |
| | | } |
| | | } else if (CommonUtil.verifyUrl(useValue)) { |
| | | if (StringUtils.isEmpty(condition.getUrl())) { |
| | | condition.setUrl(useValue); |
| | | } else { |
| | | throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_URL_ERROR)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return condition; |
| | | } |
| | | |
| | | String ConvertToString(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) { |
| | | String concatUseValue = ""; |
| | | int useIdx = 0; |
| | | |
| | | for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { |
| | | userValues.add(issueCustomFieldValueForm.getUseValue()); |
| | | |
| | | for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { |
| | | if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) { |
| | | |
| | | String useValue = issueCustomFieldValueForm.getUseValue(); |
| | | if (useValue.contains(" ")) { |
| | | useValue = useValue.replace(" ",""); |
| | | } |
| | | |
| | | if (this.verifyIp(useValue)) { |
| | | long ip = ConvertUtil.ipToLong(useValue); |
| | | customFieldType = IP_ADDRESS.toString(); |
| | | if (cntIp == 0){ |
| | | condition.setIp(ip); |
| | | } |
| | | cntIp ++; |
| | | } |
| | | |
| | | if (this.verifyUrl(useValue)) { |
| | | customFieldType = SITE.toString(); |
| | | if (cntSite == 0) { |
| | | condition.setUrl(useValue); |
| | | } |
| | | cntSite ++; |
| | | } |
| | | |
| | | /*if (customFieldApiOverlap.getCustomField().getCustomFieldType().equals(IP_ADDRESS)) { |
| | | long ip = ConvertUtil.ipToLong(useValue); |
| | | customFieldType = IP_ADDRESS.toString(); |
| | | if (cntIp == 0){ |
| | | condition.setIp(ip); |
| | | } |
| | | cntIp ++; |
| | | }*/ |
| | | |
| | | /*if(customFieldApiOverlap.getCustomField().getCustomFieldType().equals(SITE)) { |
| | | customFieldType = SITE.toString(); |
| | | String[] urlArr = null; |
| | | List<String> urls = Lists.newArrayList(); |
| | | if (useValue.contains(",")) { |
| | | urlArr = useValue.split(","); |
| | | urls.addAll(Arrays.asList(urlArr)); |
| | | } else { |
| | | urls.add(useValue); |
| | | } |
| | | if (cntSite == 0) { |
| | | condition.setUrl(urls); |
| | | } |
| | | cntSite ++; |
| | | }*/ |
| | | |
| | | if (useIdx > 0) { |
| | | concatUseValue = concatUseValue.concat(comma); |
| | | concatUseValue = concatUseValue.concat(CommonUtil.COMMA); |
| | | } |
| | | concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue()); |
| | | useIdx++; |
| | |
| | | } |
| | | } |
| | | |
| | | // 추가 할 url or ip에 포함되어있는 파트너 찾기 |
| | | if ((condition.getIp() > 0) || (condition.getUrl() != null && !condition.getUrl().equals(""))) { |
| | | this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields); |
| | | return concatUseValue; |
| | | } |
| | | |
| | | issueForm.setIssueCompanyFields(issueCompanyFields); |
| | | issueForm.setIssueIspFields(issueIspFields); |
| | | issueForm.setIssueHostingFields(issueHostingFields); |
| | | List<String> GetOverlapUseValues(List<IssueCustomFieldValueForm> issueCustomFieldValueForms) { |
| | | List<String> resultValues = Lists.newArrayList(); |
| | | for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { |
| | | resultValues.add(issueCustomFieldValueForm.getUseValue()); |
| | | } |
| | | return resultValues; |
| | | } |
| | | |
| | | // 중복된 상위 이슈 검색 |
| | | private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps) { |
| | | List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); |
| | | List<Issue> resultIssueVos = Lists.newArrayList(); |
| | | CompanyFieldVo companyFieldVo = null; |
| | | |
| | | CompanyFieldCondition condition = validIssueCustomFieldValue(issueCustomFieldValueForms, customFieldApiOverlaps); |
| | | if (condition.getIp() != null || !StringUtils.isEmpty(condition.getUrl())) { |
| | | // 추가 할 url or ip에 포함되어있는 파트너 찾기 |
| | | companyFieldVo = this.findPartner(condition, issueForm.getIssueCompanyFields(), issueForm.getIssueIspFields(), issueForm.getIssueHostingFields()); |
| | | } |
| | | |
| | | if (issueCustomFieldValueForms.size() > 0) { |
| | | String concatUseValue = ConvertToString(issueCustomFieldValueForms, customFieldApiOverlaps); |
| | | List<String> useValues = GetOverlapUseValues(issueCustomFieldValueForms); |
| | | |
| | | IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition(); |
| | | issueCustomFieldValueCondition.setUseValue(concatUseValue); |
| | | issueCustomFieldValueCondition.setUseValues(userValues); |
| | | issueCustomFieldValueCondition.setUseValues(useValues); |
| | | issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId()); |
| | | issueCustomFieldValueCondition.setCustomFieldType(customFieldType); |
| | | // issueCustomFieldValueCondition.setIssueStatusType("CLOSE"); |
| | | List<Map<String, Object>> results = Lists.newArrayList(); |
| | | if (customFieldType.equals(IP_ADDRESS.toString()) && issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) { |
| | | long ipValue = 0; |
| | | if (concatUseValue.contains(",")) { |
| | | String[] arr = concatUseValue.split(","); |
| | | for (String str : arr) { |
| | | ipValue = ConvertUtil.ipToLong(str); |
| | | } |
| | | } else { |
| | | ipValue = ConvertUtil.ipToLong(concatUseValue); |
| | | } |
| | | issueCustomFieldValueCondition.setUseValue(String.valueOf(ipValue)); |
| | | } |
| | | |
| | | if (issueCustomFieldValueCondition.getCustomFieldType() != null && !issueCustomFieldValueCondition.getCustomFieldType().equals("")) { |
| | | // 사용자정의필드 타입이 IP_ADDRESS 또는 SITE 일 경우 |
| | | results = this.issueMapper.findByCustomFieldValueByCompany(issueCustomFieldValueCondition); |
| | | if (companyFieldVo != null) { |
| | | // url or ip를 통해 업체를 찾았을 경우 |
| | | issueCustomFieldValueCondition.setUseValue(companyFieldVo.getUrl()); |
| | | results = this.issueMapper.findByCustomFieldValueBySite(issueCustomFieldValueCondition); |
| | | } else { |
| | | results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); |
| | | } |
| | |
| | | |
| | | /** |
| | | * Issue를 IssueVo로 변환(하위이슈의 파트너 정보 상속 시 필요) |
| | | * |
| | | * @param issue Issue |
| | | * @return IssueVo |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 날짜 유효성 체크 |
| | | * |
| | | * @param startDate 시작 일자(문자) |
| | | * @param completeDate 종료 일자(문자) |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 날짜 유효성 체크 |
| | | * |
| | | * @param start 시작 일자 |
| | | * @param end 종료 일자 |
| | | */ |
| | |
| | | return true; |
| | | }/*else if (MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE)){ |
| | | projects = this.projectService.findByWorkspaceIdAndIncludeProjectAll(projectStatues, condition.getProjectType()); |
| | | }*/ |
| | | else { |
| | | }*/ else { |
| | | projects = this.projectService.findByWorkspaceIdAndIncludeProject(projectStatues, condition.getProjectType()); |
| | | } |
| | | |
| | |
| | | UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class); |
| | | log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(userVo, ElasticSearchConstants.ISSUE_MODIFY)); |
| | | } |
| | | |
| | | |
| | | |
| | | private Issue saveIssue(IssueForm issueForm, CheckIssueData checkIssueData) { |
| | |
| | | |
| | | /** |
| | | * 엑셀로 입력한 파트너 정보 저장 |
| | | * |
| | | * @param issueForm IssueForm |
| | | */ |
| | | private void setIssuePartners(IssueForm issueForm, Issue issue) { |
| | |
| | | |
| | | /** |
| | | * 엑셀에 업체명을 입력하지 않았을 경우 같은 도메인 업체 찾기 |
| | | * |
| | | * @param issueForm IssueForm |
| | | */ |
| | | private void findPartnerByDomain(IssueForm issueForm) { |
| | |
| | | |
| | | /** |
| | | * cell String으로 변환 함수 |
| | | * |
| | | * @param cell Cell |
| | | * @param isNull boolean |
| | | * @return String |
| | |
| | | /** |
| | | * cell NULL 체크 함수 |
| | | * 빈 값이 아닌 cell 체크 |
| | | * |
| | | * @param cell Cell |
| | | * @return boolean |
| | | */ |
| | |
| | | issueForm.setUserIds(userIds); |
| | | } |
| | | } |
| | | |
| | | // 시작일, 종료일을 IssueForm 에 저장한다. |
| | | private void setIssueFormPeriod(String periodDate, IssueForm issueForm, Boolean checkStartDate, int rowIndex, boolean isNull) throws ParseException { |
| | | if (!isNull) { |
| | |
| | | |
| | | /** |
| | | * 상위이슈의 파트너 정보 상속받기 |
| | | * |
| | | * @param issue Issue |
| | | * @param parentIssue Issue |
| | | * @return Issue |