µ¿±âÈ API¸¦ ÀÌÇØÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº ½ÇÁ¦·Î ÀÛµ¿ÇÏ´Â ´Ü¼ø ¿¹Á¦¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ ¿¹Á¦¿¡¼´Â ÀÛ¾÷°ø°£ÀÇ ¸ðµç ÆÄÀÏ¿¡ ´ëÇÑ ÃֽŠ·ÎÄà È÷½ºÅ丮 »óŸ¦ Ç¥½ÃÇÒ ÆäÀÌÁö¸¦ µ¿±âÈ º¸±â¿¡ ÀÛ¼ºÇÕ´Ï´Ù. ÀÛ¾÷°ø°£À» º¯°æÇÒ ¶§ ·ÎÄà È÷½ºÅ丮 µ¿±âȰ¡ ÀÚµ¿À¸·Î °»½ÅµÇ¹Ç·Î, ºñ±³ ÆíÁý±â¸¦ ¿¾î ã¾Æº¸°í º´ÇÕÇÑ ÈÄ º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ·ÎÄà È÷½ºÅ丮 ¿ä¼ÒÀÇ ÃֽŠ½Ã°£ ¼ÒÀÎÀ» Ç¥½ÃÇÒ »ç¿ëÀÚ Á¤ÀÇ µ¥ÄÚ·¹ÀÌÅÍ ¹× ÀÛ¾÷°ø°£ ÆÄÀÏÀ» ¸¶Áö¸·À¸·Î ÀúÀåµÈ ·ÎÄà È÷½ºÅ丮 »óÅ·ΠµÇµ¹¸± Á¶Ä¡¸¦ Ãß°¡ÇÏ°Ô µË´Ï´Ù. À̰ÍÀº »ç¿ë °¡´ÉÇÑ ÀÚ¿ø º¯Çü¿¡ ´ëÇÑ ÀúÀåÀÌ ÀÌ¹Ì ÀÖ°í ÀÌ ÀúÀåÀ» °ü¸®ÇÒ Çʿ䰡 ¾ø±â ¶§¹®¿¡ ¸Å¿ì À¯¿ëÇÑ ¿¹Á¦ÀÔ´Ï´Ù.
ÀÌ ¿¹Á¦ÀÇ ³ª¸ÓÁö¿¡¼´Â ½ÇÇà ¿¹Á¦¸¦ »ç¿ëÇÕ´Ï´Ù. ÀϺθ¦ Á¦¿ÜÇÑ ´ë´Ù¼öÀÇ ¼Ò½º Äڵ尡
ÀÌ ÆäÀÌÁö¿¡ Æ÷ÇԵ˴ϴÙ. Àüü ¼Ò½º ÄÚµå´Â org.eclipse.team.examples.filesystem
Ç÷¯±×ÀÎÀÇ ·ÎÄà È÷½ºÅ丮 ÆÐŰÁö¿¡¼ ãÀ» ¼ö
ÀÖ½À´Ï´Ù. CVS ÀúÀå¼Ò¿¡¼ ÇÁ·ÎÁ§Æ®¸¦ üũ¾Æ¿ôÇÏ¿© ÀÌ ÇнÀ¼¸¦ Àд µ¿¾È
ÂüÁ¶·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸éÃ¥»çÇ×: ¿¹Á¦ Ç÷¯±×ÀÎÀÇ
¼Ò½º ÄÚµå´Â ½Ã°£ÀÌ È帣¸é¼ º¯°æµÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¿¹Á¦¿¡¼ »ç¿ëµÇ´Â
³»¿ë°ú ÀÏÄ¡ÇÏ´Â »çº»À» °¡Á®¿Ã °æ¿ì 3.0 ¹öÀü ű×(´ëºÎºÐÀÇ °æ¿ì R3_0) ¶Ç´Â
2004³â 6¿ù 28ÀÏÀÇ ³¯Â¥ ű׸¦ »ç¿ëÇÏ¿© ÇÁ·ÎÁ§Æ®¸¦ üũ¾Æ¿ôÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ ½ºÅ©¸° ¼¦Àº µ¿±âÈ º¸±âÀÇ ·ÎÄà È÷½ºÅ丮 µ¿±âȸ¦
Ç¥½ÃÇÕ´Ï´Ù. À̸¦ ÅëÇØ ·ÎÄà ÀÚ¿ø°ú È÷½ºÅ丮ÀÇ ÃֽŠ»óÅ °£ÀÇ º¯°æ»çÇ×À»
ã¾Æº¼ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡´Â ·ÎÄà È÷½ºÅ丮ÀÇ ÄÁÅÙÃ÷·Î ÆÄÀÏÀ» µÇµ¹¸®´Â
»ç¿ëÀÚ Á¤ÀÇ Á¶Ä¡ ¹× ·ÎÄà È÷½ºÅ丮 ÀԷ°ú ¿¬°üµÈ ½Ã°£ ¼ÒÀÎÀ» Ç¥½ÃÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ
µ¥ÄÚ·¹ÀÌÅͰ¡ ÀÖ½À´Ï´Ù. ¶ÇÇÑ ¹®Á¦Á¡ ¾î³ëÅ×À̼Ç, ¾ÐÃàµÈ Æú´õ ·¹À̾ƿô ¹×
°æ·Î Ž»ö ´ÜÃ߸¦ Á¦°øÇϴ ǥÁØ µ¿±âÈ º¸±â ÇÁ¸®Á¨Å×À̼ǵµ
»ç¿ëµË´Ï´Ù.
ù ¹øÂ° ´Ü°è´Â ·ÎÄà È÷½ºÅ丮ÀÇ ¿ä¼Ò¸¦ Ç¥½ÃÇÒ º¯ÇüÀ» Á¤ÀÇÇÏ´Â °ÍÀÔ´Ï´Ù. À̸¦ ¼öÇàÇÏ¸é µ¿±âÈ API°¡ ·ÎÄà È÷½ºÅ丮ÀÇ ÄÁÅÙÃ÷¿¡ ¾×¼¼½ºÇÒ ¼ö ÀÖÀ¸¹Ç·Î, À̸¦ ÇöÀç ÄÁÅÙÃ÷¿Í ºñ±³ÇÏ¿© »ç¿ëÀÚ¿¡°Ô Ç¥½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù.
public class LocalHistoryVariant implements IResourceVariant {
private final IFileState state;
public LocalHistoryVariant(IFileState state) {
this.state = state;
}
public String getName() {
return state.getName();
}
public boolean isContainer() {
return false;
}
public IStorage getStorage(IProgressMonitor monitor) throws TeamException {
return state;
}
public String getContentIdentifier() {
return Long.toString(state.getModificationTime());
}
public byte[] asBytes() {
return null;
}
}
IFileState ÀÎÅÍÆäÀ̽º°¡ ÀÌ¹Ì ·ÎÄà È÷½ºÅ丮ÀÇ ÆÄÀÏ ÄÁÅÙÃ÷(¿¹: IStorage
ÀÎÅÍÆäÀ̽º ±¸Çö)¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇϹǷΠÀ̰ÍÀº ½¬¿î °æ¿ì¿´½À´Ï´Ù.
ÀϹÝÀûÀ¸·Î º¯ÇüÀ» ÀÛ¼ºÇÒ ¶§ ÄÁÅÙÃ÷¿¡ ¾×¼¼½ºÇÏ´Â ¹æ¹ý, ÀÌ º¯ÇüÀ»
½Äº°Çϱâ À§ÇØ »ç¿ëÀÚ¿¡°Ô Ç¥½ÃÇÒ ÄÁÅÙÃ÷ ID ¹× À̸§À» Á¦°øÇؾß
ÇÕ´Ï´Ù. asBytes() ¸Þ¼Òµå´Â ¼¼¼Ç °£ º¯ÇüÀ» À¯ÁöÇÒ °æ¿ì¿¡¸¸
ÇÊ¿äÇÕ´Ï´Ù.
´ÙÀ½À¸·Î, SyncInfo °è»êÀ¸·Î ·ÎÄà ÀÚ¿øÀ» ÇØ´ç º¯Çü°ú ºñ±³ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â
º¯Çü ºñ±³±â¸¦ ÀÛ¼ºÇϱâ·Î ÇÕ´Ï´Ù. ·ÎÄà È÷½ºÅ丮 »óÅÂÀÇ ÄÁÅÙÃ÷°¡
ÆÄÀÏÀÇ ÇöÀç ÄÁÅÙÃ÷¿Í ´Ù¸§À» ·ÎÄà È÷½ºÅ丮 »óÅÂÀÇ Á¸Àç·Î ¾Ë ¼ö Àֱ⠶§¹®¿¡
ÀÌ ¿ª½Ã ½±½À´Ï´Ù. À̰ÍÀº ÆÄÀÏÀÌ º¯°æµÇÁö ¾ÊÀº °æ¿ì ·ÎÄà È÷½ºÅ丮 »óŸ¦
ÀÛ¼ºÇÏÁö ¾ÊÀ½À» ·ÎÄà È÷½ºÅ丮ÀÇ ½ºÆåÀ¸·Î ¾Ë ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.
public class LocalHistoryVariantComparator implements IResourceVariantComparator {
public boolean compare(IResource local, IResourceVariant remote) {
return false;
}
public boolean compare(IResourceVariant base, IResourceVariant remote) {
return false;
}
public boolean isThreeWay() {
return false;
}
}
·ÎÄðú ´Ù¸£´Ù´Â °ÍÀ» ·ÎÄà È÷½ºÅ丮 »óÅÂÀÇ Á¸Àç·Î ¾Ë ¼ö Àֱ⠶§¹®¿¡ ÆÄÀÏÀ» ÇØ´ç ·ÎÄà È÷½ºÅ丮 »óÅÂ¿Í ºñ±³ÇÒ ¶§ false¸¦ ½±°Ô ¸®ÅÏÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ·ÎÄà È÷½ºÅ丮¿ÍÀÇ µ¿±âÈ´Â ±âº» ÀÚ¿ø¿¡ ´ëÇÑ ¾×¼¼½º°¡ ¾ø±â ¶§¹®¿¡ 2¹æÇâ»ÓÀ̹ǷÎ, µÎ ÀÚ¿ø º¯ÇüÀ» ºñ±³ÇÏ´Â ¸Þ¼Òµå´Â »ç¿ëµÇÁö ¾Ê½À´Ï´Ù.
º¯ÇüÀÌ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì(¿¹: ³Î(null)) µ¿±âÈ °è»êÀÌ ºñ±³±âÀÇ ºñ±³ ¸Þ¼Òµå¸¦ È£ÃâÇÏÁö ¾Ê½À´Ï´Ù. µÎ ¿ä¼Ò°¡ ¸ðµÎ Á¸ÀçÇÒ °æ¿ì¿¡¸¸ È£ÃâµË´Ï´Ù. ¿¹Á¦¿¡¼ ÀÌ´Â ·ÎÄà È÷½ºÅ丮°¡ ¾ø´Â ÆÄÀÏÀÇ °æ¿ì ¹× ¸ðµç Æú´õÀÇ °æ¿ì(·ÎÄà È÷½ºÅ丮°¡ ÀüÇô ¾ø´Â) ¸ðµÎ¿¡¼ ¹ß»ýÇÕ´Ï´Ù. À̸¦ ó¸®ÇÏ·Á¸é ÀÌ·¯ÇÑ °æ¿ìÀÇ °è»êµÈ µ¿±âÈ »óŸ¦ ¼öÁ¤Çϱâ À§ÇØ SyncInfoÀÇ °íÀ¯ ¼ºêŬ·¡½º¸¦ Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù.
public class LocalHistorySyncInfo extends SyncInfo {
public LocalHistorySyncInfo(IResource local, IResourceVariant remote, IResourceVariantComparator comparator) {
super(local, null, remote, comparator);
}
protected int calculateKind() throws TeamException {
if (getRemote() == null)
return IN_SYNC;
else
return super.calculateKind();
}
}
³Î(2¹æÇâ ºñ±³¸¸ »ç¿ë ÁßÀ̹ǷÎ)ÀÎ ±âº»À» Ç×»ó Á¦°øÇϱâ À§ÇØ »ý¼ºÀÚ¸¦ ´ëüÇßÀ¸¸ç, ¿ø°ÝÀÌ ¾øÀ» °æ¿ì(·ÎÄà È÷½ºÅ丮¿¡ ·ÎÄà ÆÄÀÏ ¹× ÆÄÀÏ »óŰ¡ ÀÖ´Â °æ¿ì¿¡¸¸ °í·ÁÇϹǷÎ) IN_SYNC¸¦ ¸®ÅÏÇÏ´Â µ¿±âÈ À¯Çü °è»êÀ» ¼öÁ¤Çß½À´Ï´Ù.
ÀÌÁ¦ ·ÎÄà È÷½ºÅ丮ÀÇ ÀÚ¿ø º¯Çü¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇÒ °¡ÀÔÀÚ¸¦ ÀÛ¼ºÇϱâ·Î ÇÕ´Ï´Ù. ÀÛ¾÷°ø°£ÀÇ ¸ðµç ÆÄÀÏ¿¡ ·ÎÄà È÷½ºÅ丮¸¦ ÀúÀåÇÒ ¼ö ÀÖÀ¸¹Ç·Î ·ÎÄà È÷½ºÅ丮 °¡ÀÔÀÚ´Â ¸ðµç ÀÚ¿øÀ» °ü¸®Çϸç, ·çÆ® ¼¼Æ®°¡ ÀÛ¾÷°ø°£ÀÇ ¸ðµç ÇÁ·ÎÁ§Æ®°¡ µË´Ï´Ù. ¶ÇÇÑ ·ÎÄà ÆÄÀÏÀÇ ÄÁÅÙÃ÷°¡ º¯°æµÉ ¶§¿¡¸¸ ·ÎÄà È÷½ºÅ丮°¡ º¯°æµÇ¹Ç·Î °¡ÀÔÀÚ¸¦ »õ·Î °íÄ¡´Â ±â´ÉÀ» Á¦°øÇÒ Çʿ䰡 ¾ø½À´Ï´Ù. µû¶ó¼ ÀÚ¿ø µ¨Å¸°¡ ¹ß»ýÇÒ ¶§¸¶´Ù »óŸ¦ °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌÁ¦ ·ÎÄà È÷½ºÅ丮 °¡ÀÔÀÚ¿¡´Â µÎ °ü·Ã ¸Þ¼Òµå(SyncInfo ¾ò±â ¹× ÀÛ¾÷°ø°£ ¼øÈ¸)¸¸ ³²¾Æ ÀÖ½À´Ï´Ù.
public SyncInfo getSyncInfo(IResource resource) throws TeamException {
try {
IResourceVariant variant = null;
if(resource.getType() == IResource.FILE) {
IFile file = (IFile)resource;
IFileState[] states = file.getHistory(null);
if(states.length > 0) {
// last state only
variant = new LocalHistoryVariant(states[0]);
}
}
SyncInfo info = new LocalHistorySyncInfo(resource, variant, comparator);
info.init();
return info;
} catch (CoreException e) {
throw TeamException.asTeamException(e);
}
}
°¡ÀÔÀÚ´Â ·ÎÄà È÷½ºÅ丮ÀÇ ÃֽŠÆÄÀÏ »óŰ¡ µé¾î ÀÖ´Â »õ SyncInfo ÀνºÅϽº¸¦ ¸®ÅÏÇÕ´Ï´Ù. SyncInfo´Â ¿ø°Ý ¿ä¼ÒÀÇ ·ÎÄà È÷½ºÅ丮 º¯Çü°ú ÇÔ²² ÀÛ¼ºµË´Ï´Ù. ·ÎÄà È÷½ºÅ丮°¡ ¾ø´Â ÇÁ·ÎÁ§Æ®, Æú´õ ¹× ÆÄÀÏÀÇ °æ¿ì¿¡´Â ¿ø°Ý ÀÚ¿ø º¯ÇüÀÌ Á¦°øµÇÁö ¾Ê´Âµ¥, À̰ÍÀº LocalHistorySyncInfoÀÇ calculateKind ¸Þ¼Òµå·Î ÀÎÇØ ÀÚ¿øÀÌ µ¿±âÈ ÁßÀÎ °ÍÀ¸·Î °£ÁÖµÉ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.
·ÎÄà È÷½ºÅ丮 °¡ÀÔÀÚÀÇ ³ª¸ÓÁö ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ members ¸Þ¼Òµå¿¡ ´ëÇÑ ±¸ÇöÀÔ´Ï´Ù.
public IResource[] members(IResource resource) throws TeamException {
try {
if(resource.getType() == IResource.FILE)
return new IResource[0];
IContainer container = (IContainer)resource;
List existingChildren = new ArrayList(Arrays.asList(container.members()));
existingChildren.addAll(
Arrays.asList(container.findDeletedMembersWithHistory(IResource.DEPTH_INFINITE, null)));
return (IResource[]) existingChildren.toArray(new IResource[existingChildren.size()]);
} catch (CoreException e) {
throw TeamException.asTeamException(e);
}
}
ÀÌ ¸Þ¼Òµå¿¡ ´ëÇÑ ¼¼ºÎ»çÇ×Àº »èÁ¦µÈ ÀÚ¿ø¿¡ ·ÎÄà È÷½ºÅ丮°¡ ÀÖÀ» °æ¿ì ±âÁ¸ ÇÏÀ§°¡ ¾Æ´Ñ ÇÏÀ§¸¦ ¸®ÅÏÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ÀÌ·Î ÀÎÇØ °¡ÀÔÀÚ´Â ·ÎÄà È÷½ºÅ丮¿¡¸¸ Á¸ÀçÇϰí ÀÛ¾÷°ø°£¿¡´Â ´õ ÀÌ»ó Á¸ÀçÇÏÁö ¾Ê´Â ¿ä¼ÒÀÇ SyncInfo¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ½À´Ï´Ù.
Áö±Ý±îÁö ·ÎÄà È÷½ºÅ丮¿¡ ÀÖ´Â ¿ä¼ÒÀÇ SyncInfo¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇϴ Ŭ·¡½º¸¦ ÀÛ¼ºÇß½À´Ï´Ù. ´ÙÀ½¿¡´Â µ¿±âÈ º¸±âÀÇ ÆäÀÌÁö¿¡ ·ÎÄà È÷½ºÅ丮¿¡ ÀÖ´Â ¸ðµç ¿ä¼ÒÀÇ ¸¶Áö¸· È÷½ºÅ丮 »óŸ¦ Ç¥½ÃÇÒ ¼ö ÀÖ°Ô ÇÏ´Â UI ¿ä¼Ò¸¦ ÀÛ¼ºÇÕ´Ï´Ù. °¡ÀÔÀÚ°¡ Àֱ⠶§¹®¿¡ À̸¦ µ¿±âÈ º¸±â¿¡ Ãß°¡ÇÏ´Â °ÍÀº ½±½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ µ¿±âÈ Âü¿©ÀÚ È®ÀåÁ¡À» Ãß°¡ÇÏ¿© ½ÃÀÛÇϱâ·Î ÇÕ´Ï´Ù.
<extension point="org.eclipse.team.ui.synchronizeParticipants">
<participant
persistent="false"
icon="synced.gif"
class="org.eclipse.team.synchronize.example.LocalHistoryParticipant"
name="Latest From Local History"
id="org.eclipse.team.synchronize.example"/>
</extension>
´ÙÀ½À¸·Î´Â LocalHistoryParticipant¸¦ ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. À̰ÍÀº °¡ÀÔÀڷκÎÅÍ SyncInfo¸¦ ¼öÁýÇϰí ÀÛ¾÷°ø°£ÀÌ º¯°æµÉ ¶§ µ¿±âÈ »óŸ¦ °»½ÅÇϱâ À§ÇÑ ¸ðµç ±âº» ÀÛµ¿À» Á¦°øÇÒ SubscriberParticipant¸¦ ¼ºêŬ·¡½º·Î ºÐ·ùÇÕ´Ï´Ù. ¶ÇÇÑ ÀÛ¾÷°ø°£ ÀÚ¿øÀ» ·ÎÄà È÷½ºÅ丮ÀÇ ÃֽŠ»óÅ·ΠµÇµ¹¸®´Â Á¶Ä¡¸¦ Ãß°¡ÇÕ´Ï´Ù.
¸ÕÀú »ç¿ëÀÚ Á¤ÀÇ Á¶Ä¡°¡ Âü¿©ÀÚ¿¡ Ãß°¡µÇ´Â ¹æ¹ýÀ» »ìÆìº¸°Ú½À´Ï´Ù.
public static final String CONTEXT_MENU_CONTRIBUTION_GROUP = "context_group_1"; //$NON-NLS-1$
private class LocalHistoryActionContribution extends SynchronizePageActionGroup {
public void initialize(ISynchronizePageConfiguration configuration) {
super.initialize(configuration);
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU, CONTEXT_MENU_CONTRIBUTION_GROUP,
new SynchronizeModelAction("Revert to latest in local history", configuration) { //$NON-NLS-1$
protected SynchronizeModelOperation getSubscriberOperation(ISynchronizePageConfiguration configuration, IDiffElement[] elements) {
return new RevertAllOperation(configuration, elements);
}
});
}
}
¿©±â¿¡¼´Â ƯÁ¤ SynchronizeMoidelAction ¹× Á¶ÀÛÀ» Ãß°¡ÇÕ´Ï´Ù. ¿©±â¿¡¼ ÀÚÀ¯·Ó°Ô °¡Á®¿Ã ¼ö ÀÖ´Â ÀÛµ¿Àº ¹è°æ¿¡¼ ½ÇÇàÀ» Çϰí ÀÛ¾÷ ÁßÀÎ ³ëµåÀÇ »ç¿ë Áß »óŸ¦ Ç¥½ÃÇÏ´Â ±â´ÉÀÔ´Ï´Ù. ÀÌ Á¶Ä¡´Â ÀÛ¾÷°ø°£ÀÇ ¸ðµç ÀÚ¿øÀ» ·ÎÄà È÷½ºÅ丮ÀÇ ÃֽŠ»óÅ·ΠµÇµ¹¸³´Ï´Ù. Á¶Ä¡ Áö½Ã¹®À» Âü¿©ÀÚ ±¸¼º¿¡ Ãß°¡ÇÏ¿© ÀÌ Á¶Ä¡¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ ±¸¼ºÀº ½ÇÁ¦ µ¿±âÈ UI¸¦ Ç¥½ÃÇÒ Âü¿©ÀÚ ÆäÀÌÁö¸¦ ºôµåÇÏ´Â µ¥ »ç¿ëµÇ´Â Ư¼ºÀÇ ¼³¸í¿¡ »ç¿ëÇÕ´Ï´Ù.
Âü¿©ÀÚ´Â ·ÎÄà È÷½ºÅ丮 Á¶Ä¡ ±×·ìÀ» ÄÁÅØ½ºÆ® ¸Þ´º¿¡ Ãß°¡Çϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ±¸¼ºÀ» ÃʱâÈÇÕ´Ï´Ù.
protected void initializeConfiguration(ISynchronizePageConfiguration configuration) {
super.initializeConfiguration(configuration);
configuration.addMenuGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP);
configuration.addActionContribution(new LocalHistoryActionContribution()); configuration.addLabelDecorator(new LocalHistoryDecorator());
}
ÀÌÁ¦ »ç¿ëÀÚ Á¤ÀÇ µ¥ÄÚ·¹À̼ÇÀ» Á¦°øÇÏ´Â ¹æ¹ýÀ» »ìÆì º¸±â·Î ÇÕ´Ï´Ù. À§ ¸Þ¼ÒµåÀÇ ¸¶Áö¸· ÇàÀº ´ÙÀ½ µ¥ÄÚ·¹ÀÌÅ͸¦ ÆäÀÌÁö ±¸¼º°ú ÇÔ²² µî·ÏÇÕ´Ï´Ù.
public class LocalHistoryDecorator extends LabelProvider implements ILabelDecorator {
public String decorateText(String text, Object element) {
if(element instanceof ISynchronizeModelElement) {
ISynchronizeModelElement node = (ISynchronizeModelElement)element;
if(node instanceof IAdaptable) {
SyncInfo info = (SyncInfo)((IAdaptable)node).getAdapter(SyncInfo.class);
if(info != null) {
LocalHistoryVariant state = (LocalHistoryVariant)info.getRemote();
return text+ " ("+ state.getContentIdentifier() + ")";
}
}
}
return text;
}
public Image decorateImage(Image image, Object element) {
return null;
}
}
µ¥ÄÚ·¹ÀÌÅÍ´Â µ¿±âÈ º¸±â¿¡ Ç¥½ÃµÇ°í ·ÎÄà È÷½ºÅ丮 ÀÚ¿ø º¯ÇüÀÇ ÄÁÅÙÃ÷ ID¸¦ ÇØ´ç º¸±â¿¡ Ç¥½ÃµÇ´Â ÅØ½ºÆ® ·¹ÀÌºí¿¡ Ãß°¡ÇÏ´Â ¸ðµ¨ ¿ä¼Ò¿¡¼ ÀÚ¿øÀÇ ¾ÐÃàÀ» DZ´Ï´Ù.
¸¶Áö¸·ÀÌÀÚ ÃÖÁ¾ ´Ü°è´Â ·ÎÄà È÷½ºÅ丮 Âü¿©ÀÚ¸¦ ÀÛ¼ºÇÒ ¸¶¹ý»ç¸¦ Á¦°øÇÏ´Â °ÍÀÔ´Ï´Ù. ÆÀ µ¿±âÈ Perspective´Â »ç¿ëÀÚ°¡ ½Å¼ÓÈ÷ µ¿±âȸ¦ ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇÏ´Â ±Û·Î¹ú µ¿±âÈ Á¶Ä¡¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¶ÇÇÑ µ¿±âÈ º¸±â µµ±¸ ¸ðÀ½¿¡¼ µ¿±âȸ¦ ÀÛ¼ºÇÏ´Â ±â´ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ÃÀÛÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ synchronizeWizards È®ÀåÁ¡À» ÀÛ¼ºÇϽʽÿÀ.
<extension
point="org.eclipse.team.ui.synchronizeWizards">
<wizard
class="org.eclipse.team.synchronize.example.LocalHistorySynchronizeWizard"
icon="synced.gif"
description="Creates a synchronization against the latest local history state of all resources in the workspace"
name="Latest From Local History Synchronize"
id="ExampleSynchronizeSupport.wizard1"/>
</extension>
ÀÌ·¸°Ô ÇÏ¸é ¸¶¹ý»ç°¡ ¸ñ·Ï¿¡ Ãß°¡µÇ¸ç, ¸¶¹ý»ç finish() ¸Þ¼Òµå¿¡¼ °£´ÜÈ÷ Âü¿©ÀÚ¸¦ ÀÛ¼ºÇÏ¿© µ¿±âÈ °ü¸®ÀÚ¿¡ Ãß°¡ÇÕ´Ï´Ù.
LocalHistoryPartipant participant = new LocalHistoryPartipant();
ISynchronizeManager manager = TeamUI.getSynchronizeManager();
manager.addSynchronizeParticipants(new ISynchronizeParticipant[] {participant});
ISynchronizeView view = manager.showSynchronizeViewInActivePage();
view.display(participant);
À̰ÍÀº µ¿±âÈ API »ç¿ë¿¡ ´ëÇÑ ´Ü¼ø ¿¹Á¦À̸ç, ¿¹Á¦¸¦ ÀÌÇØÇϱ⠴õ¿í ½±°Ô
Çϱâ À§ÇØ ¼¼ºÎ»çÇ× Áß ÀϺο¡´Â ÁÖ¼®À» ´Þ¾Ò½À´Ï´Ù.
¹ÝÀÀÀÌ ºü¸£°í Á¤È®ÇÑ µ¿±âÈ Áö¿øÀ» ÀÛ¼ºÇÏ´Â °ÍÀº Áß¿äÇÑ ÀÏÀ̸ç,
°¡Àå ¾î·Á¿î ºÎºÐÀº µ¿±âÈ Á¤º¸ ¹× µ¿±âÈ »óÅ º¯°æÀÇ ¾Ë¸²À» °ü¸®ÇÏ´Â
°ÍÀÔ´Ï´Ù. SubscriberParticipants¿Í ¿¬°üµÈ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º°¡
ÀûÀýÇÒ °æ¿ì »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º´Â °¡ÀÔÀÚ ±¸ÇöÀÌ ¿ÏÀüÇϱ⸸ ÇÏ¸é ½¬¿î
ºÎºÐÀÔ´Ï´Ù. Ãß°¡ ¿¹Á¦´Â org.eclipse.team.example.filesystem Ç÷¯±×ÀÎÀ» ÂüÁ¶ÇÏ¿©
°¡ÀÔÀÚ ¹× ISynchronizeParticipantÀÇ ÀÛ¾÷°ø°£¿¡¼ ÇØ´ç ¼ºêŬ·¡½º¸¦ ã¾Æº¸½Ê½Ã¿À.
´ÙÀ½ ¼½¼Ç¿¡¼´Â Workbench ¼¼¼Ç °£ µ¿±âÈ »óŸ¦ ij½ÃÇÏ´Â ¹æ¹ýÀ» Æ÷ÇÔÇÏ¿©
óÀ½ºÎÅÍ °¡ÀÔÀÚ¸¦ ÀÛ¼ºÇÏ´Â µ¥ µµ¿òÀÌ µÉ ¼ö ÀÖ´Â ÀÎÅÍÆäÀ̽º ¹× ÀϺΠŬ·¡½º¸¦
¼³¸íÇÕ´Ï´Ù.