コード監査アナライザについて

コード監査フレームワークは、コードのオブジェクト・モデルを構成および走査することによってコードを分析します。 このオブジェクト・モデルは、基本的には各プロジェクト、ファイル、クラス、メソッド、フィールド、文、名前などの構成メンバー(オブジェクト表現)で構成される解析ツリーです。 コード監査規則プロジェクトでは、Analyzerサブクラスによって、visitorデザイン・パターンのenterメソッドとexitメソッドが定義されます。 visitorメソッドは、コード監査フレームワークがオブジェクト・モデルを走査するときに起動されます。 visitorメソッドは構成メンバーをテストし、Analyzerベース・クラスによって提供されるreportingメソッドを使用して違反と測定結果をレポートします。

visitorメソッドの可変値は、Java Object Model(JOT)クラスのインスタンスによって表される特定の構成メンバー・タイプに対して適用されます。 構成メンバーの走査が開始されると、その構成メンバーと一致するシグネチャを持つ、様々なアナライザに定義されているenterメソッドがすべて起動されます。 構成メンバーの走査が終了すると、その構成メンバーと一致するシグネチャを持つexitメソッドがすべて起動されます。 走査では、enterメソッドが深さ優先(depth-first)、先行順(pre-order)にコールされ、exitメソッドが深さ優先(depth-first)、後行順(post-order)にコールされます。深さ優先(depth-first)とは、ノードの子がその兄弟ノードより先にアクセスされること、先行順(pre-order)とは、親がその子より先にアクセスされること、後行順(post-order)とは、子がその親より先にアクセスされることです。 たとえば、ノードAがクラスを表し、その子BとCがクラス内のメソッドを表す場合、走査順は、enter A、enter B、exit B、enter C、exit C、exit Aとなります。

アナライザ・クラスは、カテゴリと1つ以上の規則を定義します。 カテゴリは、「コード監査プロファイル」ダイアログで規則の編成に使用されるコンテナです。 Ruleインスタンスは、規則のテキスト文字列とその他の静的属性を結合します。規則のロジックは、アナライザ・サブクラスのenterメソッドとexitメソッドによって提供されます。 次の例では、カテゴリと規則がアナライザ・サブクラスに対して定義されます。




private final static Localizer LOCALIZER = Localizer.instance("custom.rules.audit"); private final Category VARIABLE_NAMES_CATEGORY = new Category("variables-name-category", LOCALIZER); private final Rule NAME_VERIFICATION = new Rule("name-verification", VARIABLE_NAMES_CATEGORY, Severity.CONVENTION, LOCALIZER);

違反に対して修正オプションが提供される場合は、アナライザでその名前を提供する必要があります。




private final static String ADD_UNDERSCORE = "add-underscore";

「コード監査」ダイアログとレポートに表示されるテキスト文字列のラベル、説明およびメッセージは、アナライザと同じパッケージ内のリソース・バンドル(この例ではaudit.properties)から提供される必要があります。


category.variables-name-category.label=Variable Names category.variables-name-category.tip=Variable Names category.variables-name-category.description=Rules which verify adherence to custom naming conventions. rule.name-verification.label=Unconventional Variable Name rule.name-verification.tip=Unconventional Variable Name rule.name-verification.description=Private variables should begin with and underbar. rule.name-verification.message=Private variable {0} should begin with an underbar. transform.add-underscore.label=Add Underscore transform.add-underscore.tip=Prefix name with an underscore

一般的なアナライザは、そのenterメソッドで情報を収集し、exitメソッドで違反を通知します。 収集した情報は、アナライザ・サブクラスで宣言されたインスタンス・フィールドを介して、またはベース・クラスで提供されるgetValueメソッドとsetValueメソッドを介して、複数のvisitorメソッド間で共有できます。 少なくとも、enterまたはexitのいずれかが提供される必要があります。 次のexitメソッドの例は、フィールド宣言を表す構成メンバーが走査されるときに必ずコールされます。 フィールドがプライベート変数で、その名前が"_"で始まっていない場合は、規則違反がレポートされます。 違反に対して1つ以上の修正オプションが提供されている場合、このメソッドは修正用のTransformオブジェクトを作成し、違反レポートに追加する必要があります。 exitメソッドは違反を返さないことに注意してください。 違反はreportメソッド自身によって登録されます。




public void exit(AuditContext ctx, JotField obj) { if (NAME_VERIFICATION.isEnabled()) { boolean ruleIsBroken = false; Transform fix = null; if ((obj.getModifiers() & Modifier.PRIVATE) == Modifier.PRIVATE && (obj.getModifiers() & Modifier.STATIC) == 0 && (obj.getModifiers() & Modifier.FINAL) == 0) { // Starts with _ if (!obj.getName().startsWith("_")) ruleIsBroken = true; fix = new UnderscoreFix(ADD_UNDERSCORE, LOCALIZER); } if (ruleIsBroken) { String vName = obj.getName(); ViolationReport report = ctx.report(NAME_VERIFICATION); report.addParameter("name", vName); report.addFix(fix); report.setRecommendedFix(fix); } } }

getRulesメソッドは、アナライザ・サブクラスで定義された規則の配列を返す必要があります。 このメソッドは、「コード監査設定」ダイアログに表示するための規則セットのアセンブル時にフレームワークによってコールされます。




public Rule[] getRules() { return new Rule[] { NAME_VERIFICATION }; }

カスタム・コード監査規則の追加
コード監査変換について
AbstractAuditAddinについて
コード監査規則プロジェクトの作成、ビルドおよびデプロイ

関連API

oracle.jdeveloper.audit.analyzer package
oracle.jdeveloper.jot package

 

Copyright © 1997, 2004, Oracle. All rights reserved.