ÀÛ¾÷°ø°£ ÀúÀå 󸮴 Workbench°¡ »ç¿ëÀÚ¿¡ ÀÇÇØ Á¾·áµÇ°Å³ª Ç÷§Æû¿¡ ÀÇÇØ ÁÖ±âÀûÀ¸·Î Á¾·áµÉ ¶§ Æ®¸®°ÅµË´Ï´Ù. Ç÷¯±×ÀÎÀº ÀÛ¾÷°ø°£ÀÇ ³ª¸ÓÁö Áö¼ÓÀû µ¥ÀÌÅͰ¡ ÀúÀåµÉ ¶§¸¶´Ù Áß¿äÇÑ Ç÷¯±×ÀÎ µ¥ÀÌÅͰ¡ µð½ºÅ©¿¡ ÀúÀåµÉ ¼ö ÀÖµµ·Ï ÀÛ¾÷°ø°£ ÀúÀå ÇÁ·Î¼¼½º¿¡ Âü¿©ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÛ¾÷°ø°£ ÀúÀå ÇÁ·Î¼¼½º¸¦ »ç¿ëÇÏ¿© Ç÷¯±×ÀΠȰ¼ºÈ °£¿¡ ¹ß»ýÇÏ´Â º¯°æ»çÇ×À» ÃßÀûÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
ÀÛ¾÷°ø°£ ÀúÀå¿¡ Âü¿©ÇÏ·Á¸é ÀÛ¾÷°ø°£¿¡ ÀúÀå Âü¿©ÀÚ¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÀÌ ÀÛ¾÷Àº Ç÷¯±×ÀÎÀÇ startup ¸Þ¼Òµå µ¿¾È ¼öÇàµË´Ï´Ù. ¶ÇÇÑ Ç÷¯±×ÀÎÀÌ ¸¶Áö¸·À¸·Î Á¾·áµÇ¾úÀ» ¶§ ¿©±â¼ »ç¿ëÀÚ°¡ ÀúÀåÇÑ »óŸ¦ ÀнÀ´Ï´Ù.
ÀúÀå ÇÁ·Î¼¼½º¸¦ ¼³¸íÇÏ´Â °£´ÜÇÑ Ç÷¯±×ÀÎÀ» »ìÆìº¸°Ú½À´Ï´Ù.
package com.example.saveparticipant; import org.eclipse.core.runtime.*; import org.eclipse.core.resources.*; import java.io.File; import java.util.*; public class MyPlugin extends Plugin { private static MyPlugin plugin; public MyPlugin(IPluginDescriptor descriptor) { super(descriptor); plugin = this; } public static MyPlugin getDefault() { return plugin; } protected void readStateFrom(File target) { } public void startup() throws CoreException { super.startup(); ISaveParticipant saveParticipant = new MyWorkspaceSaveParticipant(); ISavedState lastState = ResourcesPlugin.getWorkspace().addSaveParticipant(this, saveParticipant); if (lastState == null) return; IPath location = lastState.lookup(new Path("save")); if (location == null) return; // the plugin instance should read any important state from the file. File f = getStateLocation().append(location).toFile(); readStateFrom(f); } protected void writeImportantState(File target) { } }
ISaveparticipant´Â ÀÛ¾÷°ø°£ ÀúÀå Âü¿©ÀÚ ÇÁ·ÎÅäÄÝÀ» Á¤ÀÇÇÕ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ±¸ÇöÀº ¼·Î ´Ù¸¥ ÀúÀå ÇÁ·Î¼¼½º ´Ü°è¿¡ ´ëÇÑ ÀÛµ¿À» Á¦°øÇÕ´Ï´Ù. ´Ü°è¸¦ »ìÆì º¸°í WorkspaceSaveParticipant Ŭ·¡½º°¡ °¢ ´Ü°è¸¦ ±¸ÇöÇÏ´Â ¹æ¹ýÀ» »ìÆì º¸µµ·Ï ÇսôÙ.
public void prepareToSave(ISaveContext context) throws CoreException { }
public void saving(ISaveContext context) throws CoreException { switch (context.getKind()) { case ISaveContext.FULL_SAVE: MyPlugin myPluginInstance = MyPlugin.getDefault(); // save the plug-in state int saveNumber = context.getSaveNumber(); String saveFileName = "save-" + Integer.toString(saveNumber); File f = myPluginInstance.getStateLocation().append(saveFileName).toFile(); // if we fail to write, an exception is thrown and we do not update the path myPluginInstance.writeImportantState(f); context.map(new Path("save"), new Path(saveFileName)); context.needSaveNumber(); break; case ISaveContext.PROJECT_SAVE: // get the project related to this save operation IProject project = context.getProject(); // save its information, if necessary break; case ISaveContext.SNAPSHOT: // This operation needs to be really fast because // snapshots can be requested frequently by the // workspace. break; } }
ISaveContext´Â ÀúÀå Á¶ÀÛ¿¡ ´ëÇÑ Á¤º¸¸¦ ¼³¸íÇÕ´Ï´Ù. ÀúÀå Á¶ÀÛ¿¡´Â, FULL_SAVE, SNAPSHOT ¹× PROJECT_SAVEÀÇ ¼¼ °¡Áö°¡ ÀÖ½À´Ï´Ù. ÀúÀå Âü¿©ÀÚ´Â ¼ö½ÅÇÑ ÀúÀå À̺¥Æ® À¯Çü¿¡ ´ëÇØ ÀûÀýÇÑ Ã³¸®¸¦ ¼öÇàÇØ¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ½º³À¼¦ À̺¥Æ®°¡ ÀÚÁÖ ¹ß»ýÇÒ ¼ö Àִµ¥ ½º³À¼¦ À̺¥Æ®´Â Ç÷¯±×ÀÎÀÌ Áß¿äÇÑ »óŸ¦ ÀúÀåÇÒ ¼ö ÀÖµµ·Ï °èȹµË´Ï´Ù. °íÀåÀÌ ¹ß»ýÇÒ °æ¿ì ´Ù½Ã °è»êÇÒ ¼ö ÀÖ´Â »óŸ¦ ÀúÀåÇÏ´Â µ¥ ¿À·£ ½Ã°£ÀÌ ¼Ò¿äµÇ¸é Ç÷§ÆûÀÌ ´À·ÁÁý´Ï´Ù.
ÀúÀå ¹øÈ£´Â ¼øÂ÷ ¹øÈ£(save-1, save-2 µî)¸¦ »ç¿ëÇÏ¿© À̸§ ÁöÁ¤µÈ µ¥ÀÌÅÍ ÀúÀå ÆÄÀÏÀ» ÀÛ¼ºÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. °¢ ÆÄÀÏÀº ÀúÀå ¹øÈ£¿Í °ü°è ¾øÀÌ ³í¸® ÆÄÀÏ À̸§(save)¿¡ ¸ÊÇε˴ϴÙ. Ç÷¯±×ÀÎ µ¥ÀÌÅÍ´Â ÇØ´ç ÆÄÀÏ¿¡ ±â·ÏµÇ±â ¶§¹®¿¡ ¸¶Áö¸· ÀúÀå Á¶ÀÛ¿¡ »ç¿ëµÈ ƯÁ¤ ÀúÀå ¹øÈ£¸¦ ¸ð¸¦ °æ¿ì¿¡µµ ³ªÁß¿¡ °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù. Ç÷¯±×ÀÎÀÇ ½ÃÀÛ Äڵ忡¼ »ìÆì º» ÀÌ ±â¼úÀ» »ó±âÇϽʽÿÀ.
IPath location = lastState.lookup(new Path("save"));µ¥ÀÌÅ͸¦ ÀúÀåÇÏ°í ÆÄÀÏ À̸§À» ¸ÊÇÎÇÏ¿´´Ù¸é, ÀÛ¾÷°ø°£ ÀúÀå¿¡ Âü¿©ÇßÀ¸¸ç ÀúÀå Ȱµ¿¿¡ ¹øÈ£¸¦ ÁöÁ¤ÇÏ·Á ÇÔÀ» Ç¥½ÃÇϱâ À§ÇØ needSaveNumber¸¦ È£ÃâÇÕ´Ï´Ù. ÀúÀå ¹øÈ£¸¦ »ç¿ëÇÏ¿© À§ÀÇ µ¥ÀÌÅÍ ÆÄÀÏÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
public void doneSaving(ISaveContext context) { MyPlugin myPluginInstance = MyPlugin.getDefault(); // delete the old saved state since it is not necessary anymore int previousSaveNumber = context.getPreviousSaveNumber(); String oldFileName = "save-" + Integer.toString(previousSaveNumber); File f = myPluginInstance.getStateLocation().append(oldFileName).toFile(); f.delete(); }
¿©±â¼, ÀÌÀü ÀúÀå Á¶ÀÛÀÇ ÀúÀå Á¤º¸¸¦ Á¤¸®ÇÕ´Ï´Ù. getPreviousSaveNumber¸¦ »ç¿ëÇÏ¿© Áö±Ý ¿Ï·áÇÑ ÀúÀå Á¶ÀÛÀÌ ¾Æ´Ñ ÀÌÀü ÀúÀå Á¶ÀÛ¿¡¼ ÁöÁ¤ÇÑ ÀúÀå ¹øÈ£¸¦ °¡Á®¿É´Ï´Ù. ÀÌ ¹øÈ£¸¦ »ç¿ëÇÏ¿© »èÁ¦ÇØ¾ß ÇÏ´Â ÆÄÀÏ À̸§À» ±¸¼ºÇÕ´Ï´Ù. ÇöÀç ÀúÀå ÆÄÀÏ ¹øÈ£¸¦ ÀÌ¹Ì ¸ÊÇÎÇßÀ¸¹Ç·Î ÀúÀå »óÅÂÀÇ ³í¸® ÆÄÀÏ ¸ÊÀ» »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù.
public void rollback(ISaveContext context) { MyPlugin myPluginInstance = MyPlugin.getDefault(); // since the save operation has failed, delete the saved state we have just written int saveNumber = context.getSaveNumber(); String saveFileName = "save-" + Integer.toString(saveNumber); File f = myPluginInstance.getStateLocation().append(saveFileName).toFile(); f.delete(); }
¿©±â¼, ¹æ±Ý ÀúÀåÇÑ »óŸ¦ »èÁ¦ÇÕ´Ï´Ù. Áö±Ý ÀúÀåÇÑ ÆÄÀÏ À̸§À» ±¸¼ºÇϱâ À§ÇØ ÇöÀç ÀúÀå ¹øÈ£¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ ÆÄÀÏ À̸§À» ISaveContext¿¡ ¸ÊÇÎÇß´Ù´Â »ç½ÇÀº Áß¿äÇÏÁö ¾Ê½À´Ï´Ù. Ç÷§ÆûÀº ÀúÀå Á¶ÀÛÀÌ ½ÇÆÐÇϸé ÄÁÅØ½ºÆ®¸¦ ¹ö¸³´Ï´Ù.
Ç÷¯±×ÀÎÀÌ ÀúÀå ¶óÀÌÇÁ »çÀÌŬ µ¿¾È ¿¹¿Ü¸¦ ó¸®Çϸé, ÇöÀç ÀúÀå Á¶ÀÛ¿¡¼ Á¦¿ÜµÇ°í ³ª¸ÓÁö ¶óÀÌÇÁ »çÀÌŬ ¸Þ¼Òµå¸¦ °¡Á®¿ÀÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¾î, saving ¸Þ¼Òµå µ¿¾È ½ÇÆÐÇϸé rollback ¶Ç´Â doneSaving ¸Þ½ÃÁö°¡ ¼ö½ÅµÇÁö ¾Ê½À´Ï´Ù.
ÀÛ¾÷°ø°£¿¡ ÀúÀå Âü¿©ÀÚ¸¦ Ãß°¡ÇÒ ¶§ ISavedState ¿ÀºêÁ§Æ®°¡ ¸®ÅϵǴµ¥, ÀÌ ¿ÀºêÁ§Æ®´Â ¸¶Áö¸· ÀúÀå Á¶ÀÛ µ¿¾È Ç÷¯±×ÀÎÀÌ ÀúÀåÇÑ ³»¿ë(¶Ç´Â Ç÷¯±×ÀÎÀÌ ÀÌÀü¿¡ »óŸ¦ ÀúÀåÇÏÁö ¾ÊÀº °æ¿ì ³Î)À» ¼³¸íÇÕ´Ï´Ù. ÀÌ ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ¿© ÀÌÀü ÀúÀå ÆÄÀÏ(ÀúÀå ¹øÈ£ ¹× ÆÄÀÏ ¸Ê »ç¿ë)¿¡¼ Á¤º¸¿¡ ¾×¼¼½ºÇϰųª Ç÷¯±×ÀΠȰ¼ºÈ °£¿¡ ¹ß»ýÇÑ º¯°æ»çÇ×À» ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀúÀå ¹øÈ£¿¡ µû¶ó ³í¸®ÀûÀ¸·Î À̸§ ÁöÁ¤µÈ ÆÄÀÏ À̸§À» ÀúÀåÇϱâ À§ÇØ ÆÄÀÏ ¸ÊÀÌ »ç¿ëµÈ °æ¿ì, ÀÌ µ¿ÀÏÇÑ ¸ÊÀ» »ç¿ëÇÏ¿© ¸¶Áö¸·À¸·Î ¾Ë·ÁÁø ÀúÀå »óÅ¿¡¼ µ¥ÀÌÅ͸¦ °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù.
ISaveParticipant saveParticipant = new MyWorkspaceSaveParticipant(); ISavedState lastState = ResourcesPlugin.getWorkspace().addSaveParticipant(myPluginInstance, saveParticipant); if (lastState != null) { String saveFileName = lastState.lookup(new Path("save")).toString(); File f = myPluginInstance.getStateLocation().append(saveFileName).toFile(); // the plugin instance should read any important state from the file. myPluginInstance.readStateFrom(f); }
Ç÷¯±×ÀÎÀÌ È°¼ºÈµÇ±â Àü¿¡ ÀÛ¾÷°ø°£¿¡¼ ÀÓÀÇ ¼öÀÇ ÀÚ¿ø º¯°æ À̺¥Æ®°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. Ç÷¯±×ÀÎÀÌ ºñȰ¼ºÈµÈ ÀÌÈÄ¿¡ ¹ß»ýÇÑ º¯°æ»çÇ×À» ¾Ë·Á¸é ÀúÀå ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇÏ¸é µË´Ï´Ù(»ç½Ç, ±âŸ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ÇÊ¿ä´Â ¾øÀ½).
ÀúÀå Âü¿©ÀÚ´Â Ç÷§ÆûÀÌ Âü¿©ÀÚ ´ë½Å ÀÚ¿ø µ¨Å¸¸¦ À¯ÁöÇϵµ·Ï ¿äÃ»ÇØ¾ß ÇÕ´Ï´Ù. À̰ÍÀº ÀúÀå Á¶ÀÛÀÇ ÀϺηΠ¼öÇàµË´Ï´Ù.
public void saving(ISaveContext context) throws CoreException { // no state to be saved by the plug-in, but request a // resource delta to be used on next activation. context.needDelta(); }
Ç÷¯±×ÀÎÀÌ ½ÃÀ۵Ǵ µ¿¾È ÀÌÀü¿¡ ÀúÀåµÈ »óÅ¿¡ ¾×¼¼½ºÇÒ ¼ö ÀÖÀ¸¸ç, ¸¶Áö¸· ÀúÀå ÀÌÈÄ·Î ¹ß»ýÇÑ ¸ðµç º¯°æ»çÇ׿¡ ´ëÇØ º¯°æ À̺¥Æ®°¡ ÀÛ¼ºµË´Ï´Ù.
ISaveParticipant saveParticipant = new MyWorkspaceSaveParticipant(); ISavedState lastState = ResourcesPlugin.getWorkspace().addSaveParticipant(myPluginInstance, saveParticipant); if (lastState != null) { lastState.processResourceChangeEvents(new MyResourceChangeReporter()); }
Á¦°øµÈ Ŭ·¡½º´Â ÀÚ¿ø º¯°æ»çÇ× ÃßÀû¿¡ ¼³¸íµÈ ´ë·Î IResourceChangeListener¸¦ ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. ¸¶Áö¸· ÀúÀå ÀÌÈÄÀÇ º¯°æ»çÇ×Àº POST_AUTO_BUILD ÀÚ¿ø º¯°æ À̺¥Æ®ÀÇ ÀϺηΠº¸°íµË´Ï´Ù.
Âü°í: ¸¶Ä¿ º¯°æ»çÇ×Àº ISavedState¿¡ ÀúÀåµÈ º¯°æ À̺¥Æ®¿¡ º¸°íµÇÁö ¾Ê½À´Ï´Ù. ¸¶Áö¸· »óŰ¡ ÀúÀåµÈ ÀÌÈÄ·Î ÀÓÀÇÀÇ ¶Ç´Â ¸ðµç ¸¶Ä¿°¡ º¯°æµÇ¾ú´Ù°í °¡Á¤ÇØ¾ß ÇÕ´Ï´Ù.