ÀÛ¾÷°ø°£ ÀúÀå Âü¿©

ÀÛ¾÷°ø°£ ÀúÀå 󸮴 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) {
    }
}

ÀÛ¾÷°ø°£ ÀúÀå¿¡ Âü¿©ÇÏ·Á¸é ÀÛ¾÷°ø°£¿¡ ÀúÀå Âü¿©ÀÚ¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.  ÀϹÝÀûÀ¸·Î ÀÌ ÀÛ¾÷Àº Ç÷¯±×ÀÎ startup ¸Þ¼Òµå µ¿¾È ¼öÇàµË´Ï´Ù.  ¶ÇÇÑ Ç÷¯±×ÀÎÀÌ ¸¶Áö¸·À¸·Î Á¾·áµÇ¾úÀ» ¶§ »ç¿ëÀÚ°¡ Ãß°¡ÇÑ »óŸ¦ Àд À§Ä¡À̱⵵ ÇÕ´Ï´Ù.

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¿¡ ÀúÀåµÈ º¯°æ À̺¥Æ®¿¡ º¸°íµÇÁö ¾Ê½À´Ï´Ù. ¸¶Áö¸· »óŰ¡ ÀúÀåµÈ ÀÌÈÄ·Î ÀÓÀÇÀÇ ¶Ç´Â ¸ðµç ¸¶Ä¿°¡ º¯°æµÇ¾ú´Ù°í °¡Á¤ÇØ¾ß ÇÕ´Ï´Ù.