Eclipse で検証を実装しようとしています。私の仕事には、さまざまな顧客向けに製品をカスタマイズするのに役立つ多くの小さなプロジェクトがあります。多くの開発者がいるため、さまざまな標準とベスト プラクティスを適用する方法を見つけようとしています。
たとえば、検証したい XML 構成が多数あるとします。組み込みのバリデーターは、ファイルが整形式でスキーマに従っていることを保証しますが、XML で参照される Java クラスが実際にクラスパスに存在することを確認するなどの検証を追加したいと考えています。もう 1 つの例は、特定のインターフェースを実装する Java クラスがオブジェクト変数を持たないことを検証することです (つまり、コードはパラメーターのみを操作し、状態を維持する必要はありません)。
検証を追加するには 2 つの方法があるようです。1 つ目は、マーカーを追加するビルダーを使用する方法です。2 つ目は、スタンドアロンの検証によるものです。ただし、実際には何も構築していません。また、検証に関する有用なチュートリアルや例も見つかりませんでした (help.eclipse.org が現在移動中であり、利用できないことは役に立ちません)。
テスト プロジェクトを右クリックして [検証] を選択すると、検証中にエラーが発生したというメッセージが表示され、テスト メッセージが問題ビューに表示されません。ただし、Eclipse ログにエラーはありません。ホスト Eclipse はコンソールに何も表示しません。例外はどこにも記録されず、メッセージもありません。プロジェクトには、必要なカスタムの性質があります。
私はこれらの指示に従っていましたが、コードや完全に機能する例はなく、Google は空白を埋めるのに十分親切ではありませんでした. 現在ダウンしている Eclipse ヘルプ サイトと合わせて、どうすればよいか途方に暮れています。
plugin.xml:
<plugin>
<extension name="My Validator" point="org.eclipse.wst.validation.validator"
id="com.mycompany.pluginname.validator.MyValidator">
<validator>
<projectNature id="com.mycompany.pluginname.nature.MyNature"/>
<helper class="org.eclipse.wst.validation.internal.operations.WorkbenchContext"/>
<markerId markerIdValue="com.mycompany.pluginname.validator.DefaultMarker"/>
<run class="com.mycompany.pluginname.validation.validator.MyValidator"/>
<runStrategy project="true"/>
</validator>
</extension>
<extension point="org.eclipse.core.resources.markers" name="My Validator"
id="com.mycompany.pluginname.validator.DefaultMarker">
<super type="org.eclipse.core.resources.problemmarker"/>
<persistent value="true"/>
<attribute name="owner"/>
<attribute name="validationSeverity"/>
<attribute name="targetObject"/>
<attribute name="groupName"/>
<attribute name="messageId"/>
</extension>
</plugin>
検証コード:
package com.mycompany.pluginname.validation.validator;
import org.eclipse.core.resources.IProject;
import org.eclipse.wst.validation.internal.core.Message;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
import org.eclipse.wst.validation.internal.provisional.core.*;
import com.mycompany.pluginname.validation.plugin.ValidationPlugin;
@SuppressWarnings("restriction")
public class MyValidator
implements IValidator {
@Override
public void cleanup(IReporter argReporter) {
argReporter.removeAllMessages(this);
}
@Override
public void validate(IValidationContext argContext, IReporter argReporter)
throws ValidationException {
String bundle = ValidationPlugin.getDefault().getTranslationsBundleName();
IProject prj = ((IWorkbenchContext) argContext).getProject();
String[] attributes =
new String[] {"owner", "validationSeverity", "targetObject", "groupName", "messageId"};
IMessage msg = new Message(bundle, IMessage.HIGH_SEVERITY, "test", attributes, prj);
argReporter.addMessage(this, msg);
}
}
また、検証を追加するために、制限されたパッケージとインターフェースを使用する必要があることも奇妙に思います。IMessage
ではなく が必要なのも奇妙に思えIMarker
ます。
私は、使用するエディターに関係なくファイルを検証したい新しいエディターの作成に向けられているように見えるカスタム検証を備えたEclipseプラグインを見ました(実際、エディターを作成したくありません)。
編集: V2 フレームワークを使用するように更新しましたが、問題ビューに何も表示されません。私は何を間違っていますか?これがどのように機能するかを説明するチュートリアルはどこかにありますか? 私は次のことを理解できましたが、明らかに正しくありません。
public ValidationResult validate(ValidationEvent argEvent, ValidationState argState,
IProgressMonitor argMonitor) {
final IResource resource = argEvent.getResource();
final ValidationResult result = new ValidationResult();
try {
List<String> contents = Resources.readFile((IFile) resource);
for (int i = 0; i < contents.size(); ++i) {
int offset = contents.get(i).indexOf("bad_string");
if (offset >= 0) {
result.add(ValidatorMessage.create("Found bad string", resource));
result.incrementError(1);
}
}
}
catch (Exception ex) {
result.add(ValidatorMessage.create(ex.getMessage(), resource));
}
return result;
}
私はこれが暗闇の中の刺し傷であることを認めます: ドキュメントはあまり説明的ではなく、この V2 バリデータに関するチュートリアルは見つかりませんでした。ああ、私はこのバリデーターにフィルターを設定しているので、特定の XML ファイルのみを受け取ります。これが、入力の検証がない理由です。
また、私は衒学者なので、エラーのある行番号をユーザーに表示することを期待しているため、古いスタイルの for ループを使用しています。しかし明らかに、私はまだそこまで到達していません。
別の編集:これが作業コードです。唯一の問題は、オフセットが行ではなくファイルの先頭からであるため、波線が正しい行にないことです。しかし、それは機能します:
public ValidationResult validate(ValidationEvent argEvent, ValidationState argState,
IProgressMonitor argMonitor) {
final IResource resource = argEvent.getResource();
final ValidationResult result = new ValidationResult();
try {
List<String> contents = Resources.readFile((IFile) resource);
int location = 0;
for (int i = 0; i < contents.size(); ++i) {
int offset = contents.get(i).indexOf(CONSTANT);
if (offset >= 0) {
ValidatorMessage vm = ValidatorMessage.create("Message", resource);
vm.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
vm.setAttribute(IMarker.SOURCE_ID, IMarker.PROBLEM);
vm.setAttribute(IMarker.LINE_NUMBER, i + 1);
vm.setAttribute(IMarker.CHAR_START, location + offset);
vm.setAttribute(IMarker.CHAR_END, location + offset + CONSTANT.length());
result.add(vm);
}
// TODO: account for different line endings.
location += (line.length() + 2);
}
}
catch (Exception ex) {
ValidationPlugin.getDefault().warn(ex);
result.add(ValidatorMessage.create(ex.toString(), resource));
}
return result;
}
Plugin.xml:
<extension name="My Validator" point="org.eclipse.wst.validation.validatorV2"
id="com.company.plugin.validation.validator.MyValidator">
<validator class="com.company.plugin.validation.validator.MyValidator">
<include>
<rules>
<file type="file" name="FileName.xml"/>
</rules>
</include>
</validator>
</extension>
私は実際に、私が見つけたものを裏付けるこれらの行に沿って別の SO の質問を見つけました: IMarker 注釈の IMarker.CHAR_START および IMarker.CHAR_END 属性の設定