본문으로 건너뛰기
  1. Posts/

[Polarion Tip] 문서 베이스라인 조회시 같은 이름의 삭제된 문서에서 생성된 베이스라인까지 조회되는 문제

·2 분· loading · loading ·
Bonjoo
RedBeanSoft
작성자
RedBeanSoft
Siemens 의 PLM/ALM/CAD 분야 전문 파트너입니다.
작성자
Bonjoo Koo
The Staff of Technical Team

폴라리온을 이용한 프로젝트 진행 중
베이스라인 조회시
같은 이름의 삭제된 문서에서 생성된 베이스라인이
현재 문서에서도 같이 조회되어
의도치 않은 데이터가 노출될 때 참고하시면 좋습니다.

폴라리온 20R1 버전을 기준으로 합니다.

베이스라인 조회하기
#

// trackerService : 폴라리온에서 전역적으로 접근 가능한 서비스
// document : 베이스라인을 조회할 문서

var dataService = trackerService.getDataService();
var path = "document/" + document.getModuleLocation().getLocationPath();
var query = "baseObject:\"" + path + "\"";
var baselines = dataService.searchInstances("Baseline", query, null);

searchInstances()를 통해
prototype.nameBaselineObject
query조건에 맞게 sort하여 조회한다. (위 경우 sort = null)

문제상황
#

문서의 path를 받아 조회하는데
문서(A)가 생성되어 베이스라인이 생성된 후 문서가 삭제된다면

추후 같은 경로에 같은 이름을 가진 문서(B)를 생성하여
베이스라인을 조회하면 A의 베이스라인까지 조회된다.

생성된 베이스라인은
Repository${PROJECT_PATH}/.polarion/tracker/baselines하위에

baseline.xml

<baseline> 
    <field id="author">${author}</field> 
    <field id="baseObject">{Module}{moduleFolder}${LOCATION_PATH}</field> 
    <field id="baseRevision">${revision}</field> 
    <field id="name">${baselineName}</field> 
</baseline> 

와 같은 형태로 저장되는데
문서가 삭제될 때 해당 파일은 삭제되지 않는다.

그렇기 때문에 B에서 베이스라인을 조회하면
같은 Location을 가지고 있었던 A에서 생성된 베이스라인까지 조회가 된다.

여기서 같은 이름뿐만 아니라
경로도 동일해야 발생하는 문제임을 알 수 있다.

하지만 baseline.xml에서 얻은
baseObjectbaseRevision을 가지는 문서는 이미 삭제되었기 때문에
해당 문서를 조회하면 error가 발생한다.

해결방안
#

조회한 베이스라인이 현재 문서에서 생성되었다면
조회가 가능할 것이기 때문에

베이스라인을 조회한 후
해당 베이스라인의 문서가 조회가능한 Object인지 검증하는 로직을 추가해준다.

// object에 관련된 권한 확인
var permissions = object.can() // return IPObjectPermissions

// 조회 가능 여부 확인
var canRead = permissions.read() // return Boolean

적용
#

현재 프로젝트에서는 문서의 베이스라인이 있을 경우
가장 최근에 만들어진 베이스라인의 revision을 반환해야한다. (없으면 빈문자열)

AS-IS
#

var dataService = trackerService.getDataService();
var path = "document/" + document.getModuleLocation().getLocationPath();
var query = "baseObject:\"" + path + "\"";
var baselines = dataService.searchInstances("Baseline", query, null);

// 해당 path의 문서가 베이스라인을 가지면 
// 마지막 baseline의 revision 반환
if (baselines.length > 0) {        
    return baselines[baselines.length - 1].getBaseRevision();
} else {
    return "";
}

TO-BE
#

var dataService = trackerService.getDataService();
var path = "document/" + document.getModuleLocation().getLocationPath();
var query = "baseObject:\"" + path + "\"";
var baselines = dataService.searchInstances("Baseline", query, null);

// 해당 path의 문서가 베이스라인을 가지고,
// 마지막 baseline이 조회 가능할 경우
// 마지막 baseline의 revision 반환
if (baselines.length > 0 && baselines[baselines.length - 1].getBaseObject().can().read()) {        
    return baselines[baselines.length - 1].getBaseRevision();
} else {
    return "";
}