2016-05-10 1 views
0

イベントプロパティに要素がnullの可能性があるもののリストがあります。 null要素に一致するLDAP文字列を作成したいと思います。ヌル要素のLDAPイベントフィルタ

は、この実施例を考えてみましょう:私はvalue = nullを設定した場合

private final BundleContext context = FrameworkUtil.getBundle(LdapTest.class).getBundleContext(); 
private final EventAdmin eventAdmin = this.context.getService(this.context.getServiceReference(EventAdmin.class)); 

@Test 
public void test() throws Exception { 
    final String value = "test"; 

    // register a listener 

    final Dictionary<String, Object> serviceProperties = new Hashtable<>(); 
    serviceProperties.put(EventConstants.EVENT_TOPIC, new String[] { "myTopic" }); 
    serviceProperties.put(EventConstants.EVENT_FILTER, "(myProperty=" + value + ")"); 

    final boolean[] called = { false }; 
    final ServiceRegistration<EventHandler> listener = this.context. 
      registerService(EventHandler.class, e -> called[0] = true, serviceProperties); 

    // fire event 

    Assert.assertFalse(called[0]); 
    final Map<String, Object> eventProperties = new HashMap<>(); 
    eventProperties.put("myProperty", Arrays.asList(value)); 

    this.eventAdmin.sendEvent(new Event("myTopic", eventProperties)); 
    Assert.assertTrue(called[0]); 

    listener.unregister(); 
} 

は今、何EVENT_FILTERは再びテスト作業をしたいと見ているのでしょうか?

"(!myProperty=*)"と "(!(myProperty=*))"を試しましたが、動作しません。

答えて

0

LDAPフィルタ式(myProperty=*)は、プロパティが設定されている場合はtrue、それ以外の場合はfalseと評価されます。ヌル値をテストする方法はLDAPフィルタ式にありません。私はnull値を持っている場合、イベントプロパティを設定しないことをお勧めします。

+0

私はnullプロパティではありません。これはリスト内のnull要素です。リスト内の他の要素をフィルタリングすることができます。そのため、フィルタリングできません。 –

+0

LDAPフィルタ式言語には、ヌル値を表現する方法がないため、その値をテストできます。 "null"は通常の文字列であり、null値を意味する特別な値ではありません。 –

0

あなたは次のようにフィルタを使用して、いくつかの成功を持っていることがあります。

(myProperty=\00) 

「\ 00」はヌルのためにエスケープシーケンスです。 このうちのいくつかは、「null」だけが値に含まれるかどうかによって異なります。 SQLデータストアからの値がnull値になり、そのフィルタを使用できるシナリオが発生しました。

"null"が属性値(Tom < "null"> Smithなど)内にある場合、属性値をバイナリとして読み込み、「nulls」を検索する以外の方法はわかりません。

-jim

+0

'(myProperty = \ 00)'を使用すると、上のテストクラスでは動作しません。実際の使用例ではなく、 'null'値以外に他の値が存在しても問題ありません。 –

0

誰かが同様の問題がある場合、それは私が今のためにそれを固定する方法です。

私はnull値が存在する場合の情報を保持するために、第2のプロパティを追加しました:

List<String> values = //... 
eventProperties.put("myProperty", values); 
eventProperties.put("myProperty.hasNull", values.contains(null)); 

だから私はこの新しいプロパティを使用して照会できます。

serviceProperties.put(EventConstants.EVENT_FILTER, 
     value == null ? "(myProperty.hasNull=true)" : "(myProperty=" + value + ")"); 

それは完璧ではないが、それ仕事をする。

関連する問題