2016-05-10 2 views
0

У меня есть список вещей в свойствах события, где элементы могут быть пустыми. Я хочу создать строку LDAP для соответствия нулевым элементам.Фильтр событий LDAP для элемента 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(); 
} 

Теперь, если я изложу value = null то, что делает EVENT_FILTER должны посмотреть, как сделать работу испытания еще раз?

Я пробовал «(!myProperty=*)» и «(!(myProperty=*))», но это не сработало.

ответ

0

Выражение фильтра LDAP (myProperty=*) будет оцениваться как true, если свойство установлено, в противном случае - false. В выражении фильтра LDAP нет способа проверить нулевое значение. Я бы предложил не устанавливать свойство события, если оно имеет нулевое значение.

+0

Я не свойство null, это нулевой элемент внутри списка. И я могу фильтровать для любого другого элемента внутри списка, так что это странно, я не могу фильтровать его. –

+0

Язык выражения фильтра LDAP не имеет возможности выразить нулевое значение, чтобы вы могли проверить его. «null» - это просто обычная строка, а не специальное значение, означающее нулевое значение. –

0

Вы можете иметь некоторый успех, используя фильтры, похожие на:

(myProperty=\00) 

«\ 00» является сбежавшей последовательностью нуля. Отчасти это зависит от того, является ли значение «null» единственным значением. Мы столкнулись с сценариями, в которых значения, поступающие из хранилищ данных SQL, будут иметь нулевые значения и могут использовать этот фильтр.

Если значение «null» находится в пределах значения атрибута (например, Tom < «null»> Smith), я не знаю другого метода, кроме как читать значения атрибутов как двоичные и анализировать символы, которые ищут «nulls».

-Джим

+0

Использование '(myProperty = \ 00)' не работает в тестовом классе выше, а не в моем фактическом прецеденте, независимо от того, есть ли другие значения, кроме значения «null». –

0

В случае, если кто-то имеет такую ​​же проблему, что как я установил его на данный момент.

я добавил второе свойство удерживать информацию, если значение null присутствует:

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 + ")"); 

Это не идеально, но это делает работу.

Смежные вопросы