タイトルで説明したように、IResourceChangeEvents をバッチ処理するアプローチを使用して IMarkers を作成しようとしています。私の目標は、正しく安定した方法で IMarker を作成することです。(変更イベントをバッチ処理する目的で) IWorkspaceRunnable の使用に制限はありますか?それとも、現在のスレッドで IMarkers を作成する方が安全ですか? 同時実行性の問題など、予測可能なエラーはありますか?
これは少し自由回答の質問ですが、IWorkspaceRunnable を使用して IMarkers を作成することの長所と短所を理解したいだけです。以下は、バッチの変更がある場合とない場合のコード例です。
// Generates marker with the given attributes
public static IMarker generateMarker(final IFile file, final Map<String, Object> attributes,
final String markerType) throws CoreException, BadLocationException, IOException
{
if (!attributes.containsKey(IMarker.LINE_NUMBER))
{
// Assumes that attributes has a mapping for IMarker.CHAR_START, which is invariant when creating markers in Solstice
int line = ResourceUtility.convertToDocument(file).getLineOfOffset((int) attributes.get(IMarker.CHAR_START));
attributes.put(IMarker.LINE_NUMBER, line + 1); // lines indexed at 1, not 0
}
IWorkspaceRunnable r = new IWorkspaceRunnable()
{
public void run(@Nullable IProgressMonitor monitor) throws CoreException
{
IMarker marker = file.createMarker(markerType);
marker.setAttributes(attributes);
MarkerField.marker_ = marker; // MarkerField is just an inner class. Functions as a pointer to a pointer.
}
};
file.getWorkspace().run(r, ResourceUtility.getRuleFactory().markerRule(file), 0, null);
return MarkerField.marker_;
}
別の方法として、バッチ メカニズムを削除して、次のコードを使用することもできます。
// Generates marker with the given attributes
public static IMarker generateMarker(final IFile file, final Map<String, Object> attributes,
final String markerType) throws CoreException, BadLocationException, IOException
{
if (!attributes.containsKey(IMarker.LINE_NUMBER))
{
// Assumes that attributes has a mapping for IMarker.CHAR_START, which is invariant when creating markers in Solstice
int line = ResourceUtility.convertToDocument(file).getLineOfOffset((int) attributes.get(IMarker.CHAR_START));
attributes.put(IMarker.LINE_NUMBER, line + 1); // lines indexed at 1, not 0
}
IMarker marker = file.createMarker(markerType);
marker.setAttributes(attributes);
return marker;
}
各方法の長所/短所は何ですか?