Hatena::ブログ(Diary)

NetPenguinの日記 このページをアンテナに追加 RSSフィード

'アニヲタ' 兼 Perfume ファン 兼 'Scala, C/C++, Java プログラマ'
日々の愚痴をつづる日記です。
FTPソフトの NetPenguin とは何の関係もありません。

2005-04-12

[]Eclipse プラグイン - リソースの変更に失敗する場合 03:52 Eclipse プラグイン - リソースの変更に失敗する場合を含むブックマーク Eclipse プラグイン - リソースの変更に失敗する場合のブックマークコメント

プラグインによってリソースが変更されている最中は、そのリソースロックされているため他のプラグインが変更することは出来ません。

ロックされているリソースに対して変更を行なおうとした場合、「リソース・ツリーは修正中のため、ロックされています。」といったメッセージをもった CoreException が送出されることになります。

特にリソース変更リスナにおいて POST_CHANGED イベントの処理中はワークスペース全体がロックされているため、いかなるリソースの変更も失敗することになります。

これを回避するには WorkspaceJob クラスを利用してリソース変更処理を非同期処理として実行する必要があります。WorkspaceJob クラスを利用することで、リソースロックが解除されたあとにリソース変更処理を行なうことが可能になります。

WorkspaceJob job = new WorkspaceJob("ジョブ名") {
    public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {

        // リソースに対する変更処理等を記述
       
       return Status.OK_STATUS;
    }
};

job.schedule(); // ジョブの登録

[]Eclipse プラグイン - リソース変更デルタフラグ 03:52 Eclipse プラグイン - リソース変更デルタのフラグを含むブックマーク Eclipse プラグイン - リソース変更デルタのフラグのブックマークコメント

リソース変更デルタには、その変更がどのようなものであるのかといった情報をもったフラグも保持されています。

たとえば以下のコードにより、リソースの内容そのものに変更があったのかどうかを調べることができます。

if (ResourceInfo.isSet(resourceDelta.getFlags(), IResourceDelta.CONTENT)) {
 ...
}

リソース変更イベントをトリガーとしてマーカーを設定する場合等は、無限ループを防ぐために上記のようなコードによってマーカーが設定されたことによるリソースの変更を除外する必要があります。

トラックバック - http://d.hatena.ne.jp/NetPenguin/20050412
2004 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2008 | 01 | 03 | 04 | 06 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 04 | 11 | 12 |
2011 | 01 | 02 | 03 | 10 |
2012 | 06 |
2013 | 09 | 12 |
2014 | 01 |
2015 | 02 |
2016 | 07 |
PV:499806