½ÇÇà ÇÁ·Î±×·¥¿¡¼ ÀÚ¿ø º¯°æÀ» Àϰýó¸®ÇÏ´Â ¹æ¹ý(ÀÚ¿ø º¯°æ Àϰýó¸®)À» »ìÆì º¸¾Ò½À´Ï´Ù. ÀÌÁ¦ ´Ù¸¥ ¸éÀ» »ìÆì º¸±â·Î ÇÕ´Ï´Ù. Ç÷¯±×ÀÎÀÌ ½ÇÇà ÁßÀÎ µ¿¾È ¹ß»ýÇÏ´Â ÀÛ¾÷°ø°£¿¡ ´ëÇÑ ¸ðµç º¯°æ»çÇ×À» °è¼Ó ÃßÀûÇÏ¸é ¾î¶»°Ô µÇ°Ú½À´Ï±î? IResourceChangeListener¸¦ ÀÛ¾÷°ø°£¿¡ µî·ÏÇÒ ¼ö ÀÖ½À´Ï´Ù. º¯°æ»çÇ×À» ¼³¸íÇÏ´Â IResourceChangeEvent ¿ÀºêÁ§Æ®¸¦ ÅëÇØ ¸®½º³Ê¿¡ º¯°æ»çÇ×ÀÌ ÅëÁöµË´Ï´Ù.
¸ÕÀú ÀÛ¾÷°ø°£¿¡ ÀÚ¿ø º¯°æ ¸®½º³Ê¸¦ µî·ÏÇØ¾ß ÇÕ´Ï´Ù.
IResourceChangeListener listener = new MyResourceChangeReporter();
ResourcesPlugin.getWorkspace().addResourceChangeListener(
listener, IResourceChangeEvent.POST_CHANGE);
ÀÛ¾÷°ø°£ ÀÚ¿øÀÌ ¼öÁ¤µÈ ÈÄ¿¡ ¸®½º³Ê¿¡ ÅëÁöµË´Ï´Ù. ÀÚ¿øÀ» ¼öÁ¤ÇÏ´Â ÀÚ¿ø API ¸Þ¼Òµå´Â
ÀÌ À̺¥Æ®¸¦ ¹®¼ÈµÈ ÀÛµ¿ÀÇ ÀϺηΠƮ¸®°ÅÇÕ´Ï´Ù. ÀÚ¿ø API ¸Þ¼Òµå¿¡ ´ëÇÑ ¸Þ¼Òµå ÁÖ¼®Àº
¸Þ¼Òµå°¡ ÀÚ¿ø º¯°æ À̺¥Æ®¸¦ Æ®¸®°ÅÇÏ´ÂÁö ¿©ºÎ¸¦ ¸í½ÃÀûÀ¸·Î ¼³¸íÇÕ´Ï´Ù. ¿¹¸¦ µé¾î IFile.setContents() ÁÖ¼®¿¡ ´ÙÀ½ÀÌ Æ÷ÇԵ˴ϴÙ.
ÀÌ ¸Þ¼Òµå´Â ÀÚ¿øÀ» º¯°æÇÕ´Ï´Ù. ÀÌ º¯°æ»çÇ×Àº ÀÌ ÆÄÀÏÀÇ ÄÁÅÙÃ÷°¡ º¯°æµÇ¾ú´Ù´Â Ç¥½Ã¸¦ Æ÷ÇÔÇÏ¿©
ÈÄ¼Ó ÀÚ¿ø º¯°æ À̺¥Æ®¿¡¼ º¸°íµË´Ï´Ù.
ÀÚ¿øÀ» ÀÛ¼º, »èÁ¦, º¯°æÇÏ´Â ¸Þ¼Òµå°¡ ÀϹÝÀûÀ¸·Î ÀÌ À̺¥Æ®¸¦ Æ®¸®°ÅÇÕ´Ï´Ù. ÀÚ¿øÀ» ÀÐÁö¸¸ ±â·ÏÇÏÁö´Â ¾Ê´Â ¸Þ¼Òµå´Â ÀϹÝÀûÀ¸·Î ÀÌ À̺¥Æ®¸¦ Æ®¸®°ÅÇÏÁö ¾Ê½À´Ï´Ù.
ÀÚ¿ø º¯°æ À̺¥Æ®´Â ÀÛ¾÷°ø°£¿¡¼ ¹ß»ýÇÑ º¯°æ ¼¼ºÎ»çÇ×(¶Ç´Â º¯°æ»çÇ× ¼¼Æ®)À» ¼³¸íÇÕ´Ï´Ù. À̺¥Æ®¿¡´Â º¯°æ»çÇ×ÀÇ ÃÖÁ¾ °á°ú¸¦ ¼³¸íÇÏ´Â ÀÚ¿ø µ¨Å¸°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, º¯°æ»çÇ×À» Àϰýó¸®ÇÏ´Â µ¿¾È ÀÚ¿øÀ» Ãß°¡Çß´Ù°¡ ³ªÁß¿¡ »èÁ¦Çϸé ÀÚ¿øÀÌ µ¨Å¸¿¡ Ç¥½ÃµÇÁö ¾Ê½À´Ï´Ù.
ÀÚ¿ø µ¨Å¸´Â ÀÛ¾÷°ø°£ ·çÆ®¿¡ Á¤ÂøµÈ Æ®¸®·Î ±¸¼ºµË´Ï´Ù. ÀÚ¿ø µ¨Å¸ Æ®¸®´Â ´ÙÀ½ À¯ÇüÀÇ º¯°æ»çÇ×À» ¼³¸íÇÕ´Ï´Ù.
ÀÚ¿ø µ¨Å¸ Æ®¸®¸¦ ¼øÈ¸Çϱâ À§ÇØ IResourceDeltaVisitor ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϰųª IResource.getAffectedChildrenÀ» »ç¿ëÇÏ¿© ¸í½ÃÀûÀ¸·Î Æ®¸®¸¦ ¼øÈ¸ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÚ¿ø µ¨Å¸ ¹æ¹®ÀÚ´Â Æ®¸®¿¡ °¢ º¯°æ»çÇ×À» ¿°ÅÇÒ ¶§ ÀÚ¿ø µ¨Å¸¿¡ ÀÇÇØ È£ÃâµÇ´Â visit ¸Þ¼Òµå¸¦ ±¸ÇöÇÕ´Ï´Ù.
Âü°í: ÀÚ¿ø ¼¼¼Ç Ư¼º ¶Ç´Â ÀÚ¿ø Áö¼ÓÀû Ư¼º º¯°æ»çÇ×Àº ÀÚ¿ø µ¨Å¸¿¡¼ ½Äº°µÇÁö ¾Ê½À´Ï´Ù.
ÀÚ¿ø º¯°æ À̺¥Æ®´Â ÀÛ¾÷°ø°£¿¡ º¯°æ»çÇ×(¶Ç´Â Àϰýó¸®µÈ º¯°æ»çÇ× ¼¼Æ®)ÀÌ ÀÛ¼ºµÉ ¶§¸¶´Ù Àü¼ÛµË´Ï´Ù. ¶ÇÇÑ ÀÚ¿ø º¯°æ À̺¥Æ®´Â ƯÁ¤ ÀÛ¾÷°ø°£ Á¶ÀÛÀ» À§ÇØ Àü¼ÛµË´Ï´Ù. ´ÙÀ½ Å×À̺íÀº ÀÚ¿ø º¯°æ À̺¥Æ® À¯Çü°ú ÀÚ¿ø º¯°æ À̺¥Æ®°¡ º¸°íµÇ´Â ½Ã±â¸¦ ¿ä¾àÇÑ °ÍÀÔ´Ï´Ù.
À̺¥Æ® À¯Çü |
¼³¸í |
---|---|
PRE_CLOSE |
¸®½º³Ê¿¡°Ô ÇÁ·ÎÁ§Æ®°¡ 󸮿ϷáµÉ °ÍÀÓÀ» ¾Ë¸³´Ï´Ù. ÀÌ À̺¥Æ®¸¦ »ç¿ëÇÏ¿© ÇÁ·ÎÁ§Æ®°¡ 󸮿ϷáµÇ±â Àü¿¡ ÇÁ·ÎÁ§Æ®ÀÇ ³»ºÎ ¸Þ¸ð¸® Ç¥½Ã(¿¹: ¼¼¼Ç Ư¼º)¿¡¼ ÇÊ¿äÇÑ Á¤º¸¸¦ ÃßÃâÇÏ¿© ÀúÀåÇÕ´Ï´Ù (ÇÁ·ÎÁ§Æ®°¡ 󸮿ϷáµÇ¸é, ³»ºÎ ¸Þ¸ð¸® Ç¥½Ã°¡ 󸮵Ê). ÀÌ À̺¥Æ® µ¿¾È ÀÛ¾÷°ø°£ÀÌ Àá±é´Ï´Ù. ÀÚ¿øÀ» °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ À̺¥Æ®¿¡´Â 󸮿Ϸá ÁßÀÎ ÇÁ·ÎÁ§Æ®°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. |
PRE_DELETE |
¸®½º³Ê¿¡°Ô ÇÁ·ÎÁ§Æ®°¡ »èÁ¦µÉ °ÍÀÓÀ» ¾Ë¸³´Ï´Ù. ÀÌ À̺¥Æ®¸¦ »ç¿ëÇÏ¿© Á¤¸® Á¶ÀÛ(¿¹: Ç÷¯±×ÀÎÀÇ µð·ºÅ丮¿¡¼ ÇÁ·ÎÁ§Æ®¿Í °ü·ÃµÈ ÀúÀåµÈ »óÅ Á¦°Å)À» ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ À̺¥Æ® µ¿¾È ÀÛ¾÷°ø°£ÀÌ Àá±é´Ï´Ù. ÀÚ¿øÀ» °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù.ÀÌ À̺¥Æ®¿¡´Â »èÁ¦ ÁßÀÎ ÇÁ·ÎÁ§Æ®°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. |
PRE_AUTOBUILD |
ÀÚµ¿ ºôµå°¡ ¹ß»ýÇϱâ Àü¿¡ ¸®½º³Ê¿¡°Ô ¾Ë¸³´Ï´Ù. ÀÌ À̺¥Æ®´Â ÀÚµ¿ ºôµå°¡ ½ÇÁ¦ Ȱ¼ºÈµÇ¾ú´ÂÁö¿¡ °ü°è ¾øÀÌ Ç÷§Æû¿¡¼ ÀÚµ¿ ºôµåÀÇ ¹ß»ý ¿ä±¸¸¦ °¨ÁöÇÏ¸é ºê·Îµåij½ºÆ®µË´Ï´Ù. ÀÛ¾÷°ø°£Àº ÀÌ À̺¥Æ® µ¿¾È Àá±âÁö ¾Ê½À´Ï´Ù. ÀÚ¿øÀ» °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ À̺¥Æ®¿¡´Â ¸¶Áö¸· POST_CHANGE À̺¥Æ®°¡ º¸°íµÈ ÀÌÈÄ·Î ¹ß»ýÇÑ º¯°æ»çÇ×À» ¼³¸íÇÏ´Â ÀÚ¿ø µ¨Å¸°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. |
POST_AUTOBUILD |
ÀÚµ¿ ºôµå°¡ ¹ß»ýÇÑ ÈÄ¿¡ ¸®½º³Ê¿¡°Ô ¾Ë¸³´Ï´Ù. ÀÌ À̺¥Æ®´Â ÀÚµ¿ ºôµåÀÇ ½ÇÁ¦ »ç¿ë °¡´É ¿©ºÎ¿¡ °ü°è ¾øÀÌ Ç÷§Æû¿¡¼ ÀÚµ¿ ºôµå°¡ ¼öÇàµÇ°í ³ª¸é ºê·Îµåij½ºÆ®µË´Ï´Ù. ÀÛ¾÷°ø°£Àº ÀÌ À̺¥Æ® µ¿¾È Àá±âÁö ¾Ê½À´Ï´Ù. ÀÚ¿øÀ» °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù.ÀÌ À̺¥Æ®¿¡´Â ¸¶Áö¸· POST_CHANGE À̺¥Æ®°¡ º¸°íµÈ ÀÌÈÄ·Î ¹ß»ýÇÑ º¯°æ»çÇ×À» ¼³¸íÇÏ´Â ÀÚ¿ø µ¨Å¸°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. |
POST_CHANGE |
¸¶Áö¸· POST_CHANGE À̺¥Æ®°¡ º¸°íµÈ ÀÌÈÄ·Î ÀÛ¾÷°ø°£¿¡ ¹ß»ýÇÑ º¯°æ»çÇ× ¼¼Æ®¸¦ ¼³¸íÇÕ´Ï´Ù. ÀÚ¿ø º¯°æ API°¡ °³º°ÀûÀ¸·Î »ç¿ëµÇ°Å³ª Àϰýó¸®µÈ ÀÛ¾÷°ø°£ º¯°æ»çÇ× ¼¼Æ®¿¡¼ »ç¿ëµÈ ÈÄ¿¡ Æ®¸®°ÅµË´Ï´Ù. PRE_AUTOBUILD ¶Ç´Â POST_AUTOBUILD °ø°í°¡ ¿Ï·áµÈ ÀÌÈÄ¿¡µµ Æ®¸®°ÅµË´Ï´Ù. ÀÌ À̺¥Æ®¿¡´Â ¸¶Áö¸· POST_CHANGE À̺¥Æ® ÀÌÈÄÀÇ ÃÖÁ¾ º¯°æ»çÇ×À» ¼³¸íÇÏ´Â ÀÚ¿ø µ¨Å¸°¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ÀÌ À̺¥Æ® µ¿¾È ÀÛ¾÷°ø°£ÀÌ Àá±é´Ï´Ù. ÀÚ¿øÀ» °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù. |
´ÙÀ½ ¿¹´Â ÄÜ¼Ö ±â¹ÝÀÇ ÀÚ¿ø º¯°æ ¸®½º³Ê¸¦ ±¸ÇöÇÕ´Ï´Ù. ÀÚ¿ø º¯°æ ¸®½º³Ê´Â ƯÁ¤ À̺¥Æ®
À¯Çü¿¡ µî·ÏµÇ¸ç, ÀÌ À̺¥Æ®¿¡ ´ëÇÑ Á¤º¸°¡ Äֿܼ¡ ÀμâµË´Ï´Ù.
IResourceChangeListener listener = new MyResourceChangeReporter();
ResourcesPlugin.getWorkspace().addResourceChangeListener(listener,
IResourceChangeEvent.PRE_CLOSE
| IResourceChangeEvent.PRE_DELETE
| IResourceChangeEvent.PRE_AUTO_BUILD
| IResourceChangeEvent.POST_AUTO_BUILD
| IResourceChangeEvent.POST_CHANGE);
¸®½º³Ê´Â °¢ À̺¥Æ® À¯ÇüÀ» È®ÀÎÇÏ¿© º¯°æµÈ ÀÚ¿ø ¹× ¹ß»ýÇÑ º¯°æ À¯Çü¿¡
´ëÇÑ Á¤º¸¸¦ º¸°íÇÕ´Ï´Ù.
ÀÌ ¿¹°¡ ¸ðµç ÀÚ¿ø À̺¥Æ® À¯ÇüÀ» ó¸®ÇÏ´Â ÀÏ¹Ý ¸®½º³Ê¸¦ Ç¥½ÃÇϵµ·Ï ¼³°èµÇ¾úÁö¸¸
ÀϹÝÀûÀÎ ¸®½º³Ê´Â ÇϳªÀÇ À̺¥Æ® À¯Çü¿¡¸¸ µî·ÏµË´Ï´Ù.
POST_CHANGE ¿¡ ´ëÇÑ ±¸ÇöÀº ÀÚ¿ø µ¨Å¸ÀÇ º¯°æ»çÇ×À» ¹æ¹®ÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â
¶Ç´Ù¸¥ ÀÚ¿øÀ» »ç¿ëÇÕ´Ï´Ù.
import org.eclipse.resources.*;
import org.eclipse.runtime.*;
public class MyResourceChangeReporter implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
IResource res = event.getResource();
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE:
System.out.print("Project ");
System.out.print(res.getFullPath());
System.out.println(" is about to close.");
break;
case IResourceChangeEvent.PRE_DELETE:
System.out.print("Project ");
System.out.print(res.getFullPath());
System.out.println(" is about to be deleted.");
break;
case IResourceChangeEvent.POST_CHANGE:
System.out.println("Resources have changed.");
event.getDelta().accept(new DeltaPrinter());
break;
case IResourceChangeEvent.PRE_AUTO_BUILD:
System.out.println("Auto build about to run.");
event.getDelta().accept(new DeltaPrinter());
break;
case IResourceChangeEvent.POST_AUTO_BUILD:
System.out.println("Auto build complete.");
event.getDelta().accept(new DeltaPrinter());
break;
}
}
}
DeltaPrinter Ŭ·¡½º´Â ÀÚ¿ø µ¨Å¸¸¦ ½ÉÀÇÇϱâ À§ÇØ IResourceDeltaVisitor ÀÎÅÍÆäÀ̽º¸¦
±¸ÇöÇÕ´Ï´Ù. visit() ¸Þ¼Òµå°¡ ÀÚ¿ø µ¨Å¸ÀÇ °¢ ÀÚ¿ø º¯°æ»çÇ׿¡ ´ëÇØ È£ÃâµË´Ï´Ù. ¹æ¹®ÀÚ´Â
¸®ÅϰªÀ» »ç¿ëÇÏ¿© ÇÏÀ§ ÀÚ¿øÀÇ µ¨Å¸¸¦ ¹æ¹®ÇØ¾ß ÇÏ´ÂÁö ¿©ºÎ¸¦ Ç¥½ÃÇÕ´Ï´Ù.
class DeltaPrinter implements IResourceDeltaVisitor {
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (delta.getKind()) {
case IResourceDelta.ADDED:
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" was added.");
break;
case IResourceDelta.REMOVED"
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" was removed.");
break;
case IResourceDelta.CHANGED:
System.out.print("Resource ");
System.out.print(res.getFullPath());
System.out.println(" has changed.");
break;
}
return true; // visit the children
}
}
Á¦°øµÈ ÀÚ¿ø µ¨Å¸¿¡¼ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº ÀÚ¿ø º¯°æ»çÇ×À» ÀÚ¼¼È÷
¼³¸íÇϱâ À§ÇØ IResourceDelta.CHANGED »ç·Ê¸¦ ±¸ÇöÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Ç¥½ÃÇÕ´Ï´Ù.
...
case IResourceDelta.CHANGED:
System.out.print("Resource ");
System.out.print(delta.getFullPath());
System.out.println(" has changed.");
int flags = delta.getFlags();
if ((flags & IResourceDelta.CONTENT) != 0) {
System.out.println("--> Content Change");
}
if ((flags & IResourceDelta.REPLACED) != 0) {
System.out.println("--> Content Replaced");
}
if ((flags & IResourceDelta.MARKERS) != 0) {
System.out.println("--> Marker Change");
IMarkerDelta[] markers = delta.getMarkerDeltas();
// if interested in markers, check these deltas
}
break;
...
ÀÚ¿ø µ¨Å¸, ¹æ¹®ÀÚ, ¸¶Ä¿ µ¨Å¸¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº IResourceDelta, IResourceDeltaVisitor ¹× IMarkerDelta¿¡ ´ëÇÑ API ½ºÆåÀ» ÂüÁ¶ÇϽʽÿÀ.
Âü°í: ÀÚ¿ø º¯°æ ¸®½º³Ê´Â Ç÷¯±×ÀÎÀÌ È°¼ºÈµÈ µ¿¾È ÀÚ¿ø¿¡ ¹ß»ýÇÏ´Â º¯°æ»çÇ×À» ÃßÀûÇÏ´Â µ¥ À¯¿ëÇÕ´Ï´Ù. Ç÷¯±×ÀÎÀÌ ½ÃÀÛ ÄÚµå µ¿¾È ÀÚ¿ø º¯°æ ¸®½º³Ê¸¦ µî·ÏÇϸé, Ç÷¯±×ÀÎÀÌ È°¼ºÈµÇ±â Àü¿¡ ´Ù¼öÀÇ ÀÚ¿ø º¯°æ À̺¥Æ®°¡ Æ®¸®°ÅµÇ¾úÀ» ¼ö ÀÖ½À´Ï´Ù. Ç÷¯±×Àο¡ ÀÇÇØ ¼ö½ÅµÈ ù ¹øÂ° ÀÚ¿ø º¯°æ À̺¥Æ®¿¡ Æ÷ÇÔµÈ ÀÚ¿ø µ¨Å¸¿¡´Â Ç÷¯±×ÀÎÀÌ ¸¶Áö¸·À¸·Î Ȱ¼ºÈµÈ ÀÌÈÄÀÇ ¸ðµç º¯°æ»çÇ×ÀÌ Æ÷ÇÔµÇÁö ¾Ê½À´Ï´Ù. Ç÷¯±×ÀΠȰ¼ºÈ °£¿¡ ÀÛ¼ºµÈ º¯°æ»çÇ×À» ÃßÀûÇØ¾ß ÇÏ´Â °æ¿ì, ÀÛ¾÷°ø°£ ÀúÀåÀ» À§ÇØ Á¦°øµÈ Áö¿øÀ» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ÀÌ¿¡ ´ëÇÑ ¼³¸íÀº ÀÛ¾÷°ø°£ ÀúÀå Âü¿©¸¦ ÂüÁ¶ÇϽʽÿÀ.
Âü°í: ¹è°æ ½º·¹µå¿¡¼ ¹ß»ýÇÏ´Â ÀϺΠÀÚ¿ø º¯°æ À̺¥Æ®´Â ó¸® Áß¿¡ Æ®¸®°ÅµË´Ï´Ù. ÀÚ¿ø º¯°æ ¸®½º³Ê´Â ½º·¹µå ¾ÈÀü½Ä(thread-safe)À̾î¾ß ÇÕ´Ï´Ù. UI°¡ ÀÖ´Â ½º·¹µå ¾ÈÀü¿¡ ´ëÇÑ ¼³¸íÀº ½º·¹µù ¹®Á¦¸¦ ÂüÁ¶ÇϽʽÿÀ.