동기화 지원

Eclipse 3.0의 새로운 기능은 작업공간 자원과 다른 위치의 자원 간 동기화 상태를 관리하고 표시하는 API입니다. 작업공간 외부의 자원을 변형이라고 합니다. 동기화란 다른 위치의 자원 간 변경사항을 표시하고 사용자가 조치를 수행하여 동기화 상태에 선택적으로 영향을 줄 수 있는 작업을 말합니다. 동기화 API는 RepositoryProvider API에 대해 직교이며 저장소 제공자 없이 사용될 수 있습니다. 동기화 API의 목적은 자원의 동기화 상태를 표시하는 다른 방법의 구현 타스크를 쉽게 하는 것입니다. 그러므로 API는 자원의 동기화 상태를 조회하는 수단을 필요로 하는 것이지 상태에 영향을 주는 수단을 필요로 하는 것은 아닙니다. 상태에 영향을 주는 수단은 구현자에 남아 있습니다(UI가 메뉴에 제공자 특정 메뉴 항목을 추가하는 후크를 제공하는 경우 포함).

용어

동기화 API를 설명하기 전에 작업공간 동기화를 설명할 때 적용되는 용어 및 개념의 일부를 설명하는 것이 유용합니다.

자원 변형: 다른 위치에 있는 자원에 맵핑되는 로컬 자원을 해당 자원의 변형이라고 할 수 있습니다. 즉, 자원은 대개 매우 유사하지만 (로컬 자원에 대한 수정사항 또는 기타 사용자가 원격 사본에 작성한 변경사항으로 인해) 다소 다를 수 있습니다. 이에 대해 로컬 작업공간 중심 보기를 취하므로, 로컬 사본을 자원이라고 하며 원격 사본을 자원 변형이라고 합니다.

동기화: 동기화란 자원 변형 간 차이를 사용자에게 표시하는 조치를 말합니다. 동기화는 변형 상태에 영향을 주지 않지만 대신 다른 변형 세트 간 차이를 사용자가 이해하는 데 도움이 되도록 보기를 제공합니다. 그러나 사용자가 동기화 시 변형 상태(예: 체크인 또는 되돌리기 허용)에 영향을 주도록 허용하는 것이 일반적입니다.

2방향 및 3방향 동기화: 동기화 상태 판별에는 두 가지 기본 유형(2방향 및 3방향)이 있습니다. 2방향 비교는 로컬 자원 및 단일 자원 변형만 고려하며, 원격 자원 변형이라고 합니다. 이 비교 유형은 두 자원 간 차이만 표시할 수 있고, 변경사항이 서로 관련되는 방법에 대해서는 힌트를 제공할 수 없습니다. 대부분의 코드 저장소 시스템은 동기화 상태 판별에 3방향 비교를 지원합니다. 이 비교 유형에는 로컬 자원, 원격 자원 변형 및 기본 자원 변형이 포함됩니다. 기본 자원 변형은 로컬 및 원격 자원의 공통 상위를 표시합니다. 이것은 변경의 방향을 표시하는 보다 복잡한 동기화 상태에 허용됩니다.

테이블 1: 동기화 상태

2방향 3방향
변경됨
삭제됨
추가됨
전송 변경
수신 변경
전송 삭제
수신 삭제
전송 추가
수신 추가
충돌 변경
충돌 삭제
충돌 추가

기본 - SyncInfo

org.eclipse.team.core.synchronize의 클래스는 동기화 상태를 설명하는 데 사용됩니다. 가장 중요한 클래스는 SyncInfo입니다. 이유는 동기화 상태를 실제로 정의하는 클래스이기 때문입니다. 이 클래스는 다음과 같이 사용될 수 있습니다.

SyncInfo info = getSyncInfo(resource); // this is a simulated method of obtaining the sync info for a resource
int changekind = info.getKind();
if(info.getResourceComparator().isThreeWay()) {
if((changeKind & SyncInfo.DIRECTION_MASK) == SyncInfo.INCOMING) {
// do something
}
} else if(changeKind == SyncInfo.CHANGE) {
// do something else
}

SyncInfo 클래스는 2방향 및 3방향 비교 알고리즘을 모두 제공하므로, 클라이언트는 자원 및 자원을 비교할 수 있는 클래스를 제공해야 합니다(IResourceVariantComparator). 다음은 예제 변형 비교기입니다.

public class TimestampVariantComparator implements IResourceVariantComparator {	
protected boolean compare(IResourceVariant e1, IResourceVariant e2) {
if(e1.isContainer()) {
if(e2.isContainer()) {
return true;
}
return false;
}
if(e1 instanceof MyResourceVariant && e2 instanceof MyResourceVariant) {
MyResourceVariant myE1 = (MyResourceVariant)e1;
MyResourceVariant myE2 = (MyResourceVariant)e2;
return myE1.getTimestamp().equals(myE2.getTimestamp());
}
return false;
}
protected boolean compare(IResource e1, IResourceVariant e2) {

}
public boolean isThreeWay() {
return true;
}
}

SyncInfo info = new SyncInfo(resource, variant1, variant2, new TimestampComparator());
info.init(); // calculate the sync info

또한 이 패키지에는 SyncInfo를 포함하도록 특별히 설계된 콜렉션 및 SyncInfo 인스턴스에 적용될 수 있는 필터도 들어 있습니다.

동기화 상태 관리

위의 예제에서 확인한 바와 같이 SyncInfo IResourceVariantComparator 클래스는 자원의 동기화 상태에 대한 액세스를 제공합니다. 그러나 아직 다루지 않은 것은 상태를 관리하는 방법입니다. 가입자는 가입자의 속성에 따라 2방향 또는 3방향 비교를 사용하여 로컬 작업공간의 자원과 이러한 자원의 자원 변형 세트 간 동기화 상태에 대한 액세스를 제공합니다. 가입자는 다음과 같은 기능을 제공합니다.

API는 가입자를 작성하는 방법을 정의하지 않으므로, 이는 특정 구현에 남아 있습니다. 예를 들어, CVS 플러그인은 병합이 수행될 때 가입자를, 비교 시 다른 가입자를, 로컬 작업공간을 현재 분기와 동기화할 때 다른 가입자를 작성합니다.

그러므로 SyncInfo 사용에 대한 첫 번째 예제를 다시 방문한 후 가입자를 사용하여 SyncInfo에 액세스할 수 있는 방법을 살펴 보기로 합니다.

// Create a file system subscriber and specify that the
// subscriber will synchronize with the provided file system location
Subscriber subscriber = new FileSystemSubscriber("c:\temp\repo");

// Allow the subscriber to refresh its state
subscriber.refresh(subscriber.roots(), IResource.DEPTH_INFINITE, monitor);

// Collect all the synchronization states and print
IResource[] children = subscriber.roots();
for (int i = 0; i < children.length; i++) {
printSyncState(children[i]);
}

...

void printSyncState(Subscriber subscriber, IResource resource) {
System.out.println(subscriber.getSyncInfo(resource).toString());
IResource[] children = subscriber.members(resource);
for (int i = 0; i < children.length; i++) {
IResource child = children[i];
if(! child.exists()) {
System.out.println(resource.getFullPath() + " doesn't exist in the workspace");
}
printSyncState(subscriber, children[i]);
}
}

기억해야 할 중요한 점은 가입자가 작업공간에 없는 자원에 대해 알고 있다는 점과 Subscriber#members()SyncInfo#getLocal()에서 기존 자원이 아닌 자원을 리턴할 수 있다는 점입니다.

UI의 동기화 상태 표시

동기화 상태를 관리하는 방법을 설명하는 데 시간을 더 할애할 수 있지만 대신 사용자에게 표시된 상태를 실제로 얻는 방법을 확인해 보기로 합니다. ISynchronizeParticipant는 동기화 상태를 표시하고 사용자가 해당 상태에 영향을 주도록 하는 사용자 인터페이스 컴포넌트입니다. 동기화 보기는 동기화 참여자를 표시하지만 대화 상자와 마법사에 이러한 참여자를 표시할 수도 있습니다. 사용자(SyncInfo 및 가입자를 기준으로 하지 않은 경우이더라도)가 동기화 상태의 모든 유형을 사용자에게 표시하는 지원을 제공하기 위해 참여자는 매우 일반적인 컴포넌트입니다.

동기화 작성 마법사를 추가하기 위한 org.eclipse.team.ui.synchronizeWizards라는 확장점도 있습니다. 이 확장점은 사용자가 사용자의 동기화 유형을 쉽게 작성할 수 있도록 글로벌 동기화 조치 및 동기화 보기에 마법사를 둡니다.

그러나 가입자를 구현했으면 다음과 같은 기능을 제공할 SubscriberParticipant라는 살제 참여자로부터 장점을 얻을 수 있습니다.

이러한 개념을 설명하는 최선의 방법은 단순 예제의 컨텍스트에서 사용된 개념을 참조하는 것입니다. 로컬 히스토리 동기화 예제로 이동하여 이 모든 개념을 함께 사용할 수 있는 방법을 참조하십시오. 또는 고급 API를 사용하는 방법을 찾아 보려면 세부사항으로 이동하십시오.