Eclipseで検証を実装しようとしています。私の作品には、さまざまな顧客向けに製品をカスタマイズするための小さなプロジェクトがたくさんあります。大勢の開発者がいるので、私たちはさまざまな標準とベストプラクティスを実施する方法を見つけようとしています。例えばEclipseでバリデータを実装する
、我々は検証する多くのXML構成を有しています。ビルトインバリデーターはファイルが整形式でスキーマに従っていることを保証しますが、XMLで参照されるJavaクラスが実際にクラスパス上に存在するかどうかを確認するなどの検証を追加したいと考えています。もう1つの例は、特定のインタフェースを実装するJavaクラスがオブジェクト変数を持たないことを検証することです(つまり、コードはパラメータでのみ動作し、状態を維持する必要はありません)。
検証を追加するには2つの方法があることが表示されます。最初のものは、マーカーを追加するビルダーです。 2つ目はスタンドアロン検証によるものです。しかし、私たちは実際に何かを構築しているわけではなく、有用なチュートリアルや検証の例は見つかりませんでした(help.eclipse.orgは現在移動中で利用できません)。
私はテストプロジェクトを右クリックして、私はそこにエラーが検証中だった、と私のテストメッセージは、問題ビューに表示されない旨のメッセージが表示されます「検証」を選択します。ただし、Eclipseログにはエラーはありません。ホストEclipseはコンソールに何も表示しません。例外はどこにも記録されず、メッセージもありません。プロジェクトは必要なカスタム性を持っています。
私はthese instructionsに従っていましたが、何のコードが存在しないか、完全に例を機能、そして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);
}
}
私もそれは奇妙な検証を追加することが制限されたパッケージとのインターフェースを使用して必要になることがわかります。 IMarker
ではなく、IMessage
が欲しいと奇妙に思えます。
私はEclipse plugin with custom validationを見ましたが、新しいエディタを作成することを念頭に置いているようで、使用されているエディタ(実際にはエディタを作成したくありません)に関係なくファイルを検証したいと考えています。
編集:私は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ファイルしか受け取らないので、入力の検証はできません。私は自分自身PEDANT居ないので、私は、ユーザーにエラーのある行番号を表示することを期待するので、私はそこにループの古いスタイルを使用しています。また
、。しかし、明らかに私はまだそこにはない。
別の編集:ここに作業コードがあります。唯一の問題は、ずれが正しい行にないことです。オフセットはファイルの先頭からであり、行からではないからです。しかし、それは仕事ん:
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:Setting IMarker.CHAR_START and IMarker.CHAR_END attributes for IMarkers Annotations
私はあなたの答えに基づいて更新されたコードで質問を編集しました。私は近いと思うが、それでも動作しない。 –
新しい拡張ポイントに切り替えましたか?それをテストするために起動したときの構成をクリアしますか? – nitind
新しい拡張ポイントを使用しましたが、何もクリアしませんでした。しかし、それは私のブレークポイントを打ち、validate()メソッドを通過しています。私はPHPの例を見つけました:http://sourceforge.jp/users/atlanto/pf/eclipse/wiki/ExtendingPDT%2FValidatorそしてその例はマーカーを追加しているようですので、私はXMLの作成を見ていきます文書を作成し、マーカーを追加します。 –