OWL ITS + 탐지시스템(인터넷 진흥원)
minhee
2022-02-21 95f9639088ab6a5615aa348eb206d14541782000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package kr.wisestone.owl.service.impl;
 
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import kr.wisestone.owl.constant.Constants;
import kr.wisestone.owl.domain.Issue;
import kr.wisestone.owl.domain.IssueVersion;
import kr.wisestone.owl.domain.User;
import kr.wisestone.owl.repository.IssueVersionRepository;
import kr.wisestone.owl.service.IssueService;
import kr.wisestone.owl.service.IssueVersionService;
import kr.wisestone.owl.service.UserService;
import kr.wisestone.owl.util.CommonUtil;
import kr.wisestone.owl.util.ConvertUtil;
import kr.wisestone.owl.vo.IssueVersionVo;
import kr.wisestone.owl.vo.IssueVo;
import kr.wisestone.owl.web.condition.IssueVersionCondition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Service
public class IssueVersionServiceImpl extends AbstractServiceImpl<IssueVersion, Long, JpaRepository<IssueVersion, Long>> implements IssueVersionService {
 
    private static final Logger log = LoggerFactory.getLogger(IssueVersionServiceImpl.class);
 
    @Autowired
    private IssueVersionRepository issueVersionRepository;
 
    @Autowired
    private IssueService issueService;
 
    @Autowired
    private UserService userService;
 
    @Override
    protected JpaRepository<IssueVersion, Long> getRepository() {
        return this.issueVersionRepository;
    }
 
    //  이슈 버전 생성
    @Override
    @Transactional
    public void addIssueVersion(Issue issue) {
        this.addIssueVersion(issue, this.webAppUtil.getLoginUserObject());
    }
 
    //  이슈 버전 생성
    @Override
    @Transactional
    public void addIssueVersion(Issue issue, User user) {
        IssueVo issueVo = ConvertUtil.copyProperties(issue, IssueVo.class);
 
        this.issueService.setIssueDetail(issueVo, issue, user);    //  이슈 상세 정보를 셋팅한다.
 
        List<IssueVersion> issueVersions = this.issueVersionRepository.findByIssueId(issueVo.getId());
 
        Gson gson = new Gson();
        String content = gson.toJson(issueVo);
        IssueVersion issueVersion = new IssueVersion(issue, issue.getProject(), issue.getProject().getWorkspace(), content);
 
        if (issueVersions.size() > 0) {
            IssueVersion prevIssueVersion = issueVersions.get(issueVersions.size() - 1);
            issueVersion.setVersion(prevIssueVersion.getVersion() + 1);
        }
        else {
            issueVersion.setVersion(1);
        }
 
        this.issueVersionRepository.saveAndFlush(issueVersion);
    }
 
    //  이슈 버전 정보를 만들어서 Vo 로 변환한다.
    private IssueVersionVo makeIssueVersionVo(IssueVersion issueVersion) {
        IssueVersionVo issueVersionVo = ConvertUtil.copyProperties(issueVersion, IssueVersionVo.class); //  이전 버전
        Gson gson = new Gson();
        Map<String, Object> targetIssueVersionContent = (Map<String, Object>) gson.fromJson(issueVersionVo.getContent(), Object.class);
        issueVersionVo.setContent(null);
        issueVersionVo.setVersionHistory(targetIssueVersionContent);
        User beforeModifyUser = this.userService.getUser(issueVersionVo.getModifyId());
        issueVersionVo.setModifyByName(beforeModifyUser.getName() + "(" + CommonUtil.decryptAES128(beforeModifyUser.getAccount()) + ")");
 
        return issueVersionVo;
    }
 
    //  선택한 버전과 그 다음 버전 정보를 Vo로 만들어 리턴한다.
    private void makeTargetAndNextIssueVersion(IssueVersion targetIssueVersion, IssueVersion nextIssueVersion, List<IssueVersion> issueVersions, Map<String, Object> results) {
        //  이슈 버전 정보를 만들어서 Vo 로 변환한다.
        IssueVersionVo targetIssueVersionVo = this.makeIssueVersionVo(targetIssueVersion);
        //  이슈 버전 정보를 만들어서 Vo 로 변환한다.
        IssueVersionVo nextIssueVersionVo = this.makeIssueVersionVo(nextIssueVersion);
 
        results.put("targetIssueVersionVo", targetIssueVersionVo);
        results.put("nextIssueVersionVo", nextIssueVersionVo);
 
        List<IssueVersionVo> issueVersionVos = ConvertUtil.convertObjectsToClasses(issueVersions, IssueVersionVo.class);
        issueVersionVos.remove(issueVersionVos.size() - 1);
        results.put("issueVersionList", issueVersionVos);
    }
 
 
    //  이슈 버전 정보 조회
    @Override
    @Transactional(readOnly = true)
    public void find(Map<String, Object> resJsonData, IssueVersionCondition issueVersionCondition) {
        List<IssueVersion> issueVersions = this.issueVersionRepository.findByIssueId(issueVersionCondition.getIssueId());
 
        Map<String, Object> results = new HashMap<>();
        results.put("targetIssueVersionVo", null);
        results.put("nextIssueVersionVo", null);
        results.put("issueVersionList", Lists.newArrayList());
 
        if (issueVersionCondition.getId() == null) {
            if (issueVersions.size() > 1) {
                IssueVersion targetIssueVersion = issueVersions.get(issueVersions.size() - 2);
                IssueVersion nextIssueVersion = issueVersions.get(issueVersions.size() - 1);
                //  선택한 버전과 그 다음 버전 정보를 Vo 로 만들어 리턴한다.
                this.makeTargetAndNextIssueVersion(targetIssueVersion, nextIssueVersion, issueVersions, results);
            }
        }
        else {
            IssueVersion targetIssueVersion = null; //  선택한 버전
            IssueVersion nextIssueVersion = null;   //  선택한 버전의 다음 버전
 
            for (IssueVersion issueVersion : issueVersions) {
                //  선택한 버전을 찾았으면 그 다음 버전을 찾는다.
                if (targetIssueVersion != null) {
                    nextIssueVersion = issueVersion;
                    break;
                }
 
                //  선택한 버전을 찾는다.
                if (issueVersion.getId().equals(issueVersionCondition.getId())) {
                    targetIssueVersion = issueVersion;
                }
            }
 
            //  둘다 존재할 때만 버전 비교가 가능하다.
            if (targetIssueVersion != null && nextIssueVersion != null) {
                //  선택한 버전과 그 다음 버전 정보를 Vo 로 만들어 리턴한다.
                this.makeTargetAndNextIssueVersion(targetIssueVersion, nextIssueVersion, issueVersions, results);
            }
        }
 
        resJsonData.put(Constants.RES_KEY_CONTENTS, results);
 
    }
}