blob: 1fd8fd044c49c3a8dc0e0b21ba3fa561cf25a96a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package test;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Properties;
import org.apache.felix.dm.impl.index.multiproperty.MultiPropertyFilterIndex;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceReference;
public class MultiPropertyFilterIndexReferencedTest {
@SuppressWarnings("rawtypes")
@Test
public void noContext() {
MultiPropertyFilterIndex singleValueFilterIndex = new MultiPropertyFilterIndex("objectClass,!context");
TestReference ref1 = new TestReference();
ref1.addProperty("service.id", 4711);
ref1.addProperty("objectclass", "java.lang.String");
ref1.addProperty("context", "context");
TestReference ref2 = new TestReference();
ref2.addProperty("service.id", 1000);
ref2.addProperty("objectclass", "java.lang.String");
singleValueFilterIndex.addedService(ref1, new String("Service1"));
singleValueFilterIndex.addedService(ref2, new String("Service2"));
List<ServiceReference> allServiceReferencesByClass = singleValueFilterIndex.getAllServiceReferences("java.lang.String", null);
List<ServiceReference> allServiceReferencesByFilter = singleValueFilterIndex.getAllServiceReferences(null, "(objectClass=java.lang.String)");
assertTrue(allServiceReferencesByClass.size() == allServiceReferencesByFilter.size());
assertTrue(allServiceReferencesByFilter.size() == 1);
}
@SuppressWarnings("rawtypes")
@Test
public void noContextCid() {
MultiPropertyFilterIndex multiPropertyIndex_new = new MultiPropertyFilterIndex("objectClass,cid,!context");
TestReference ref1 = new TestReference();
ref1.addProperty("service.id", 4711);
ref1.addProperty("objectclass", "java.lang.String");
ref1.addProperty("context", "context");
TestReference ref2 = new TestReference();
ref2.addProperty("service.id", 1000);
ref2.addProperty("cid", "cid2");
ref2.addProperty("objectclass", "java.lang.String");
TestReference ref3 = new TestReference();
ref3.addProperty("cid", "cid2");
ref3.addProperty("rank", "1");
ref3.addProperty("service.id", 1000);
ref3.addProperty("objectclass", "java.lang.String");
multiPropertyIndex_new.addedService(ref1, new String("Service1"));
multiPropertyIndex_new.addedService(ref2, new String("Service2"));
multiPropertyIndex_new.addedService(ref3, new String("Service3"));
List<ServiceReference> result_new = multiPropertyIndex_new.getAllServiceReferences("java.lang.String", "(cid=cid2)");
assertTrue(result_new.size() == 2);
}
@SuppressWarnings("rawtypes")
@Test
public void singleKeyfilterIndex() {
MultiPropertyFilterIndex multiPropertyIndex = new MultiPropertyFilterIndex("objectClass");
TestReference ref1 = new TestReference();
ref1.addProperty("service.id", 4711);
ref1.addProperty("objectclass", "java.lang.String");
TestReference ref2 = new TestReference();
ref2.addProperty("service.id", 4711);
ref2.addProperty("objectclass", "java.lang.Object");
multiPropertyIndex.addedService(ref1, new String("Service1"));
multiPropertyIndex.addedService(ref2, new Object());
//find by classname;
assertTrue(multiPropertyIndex.isApplicable("java.lang.String", ""));
List<ServiceReference> byClazzName = multiPropertyIndex.getAllServiceReferences("java.lang.String", "");
assertTrue(byClazzName.size() == 1);
assertTrue(byClazzName.get(0).equals(ref1));
//find by filter
assertTrue(multiPropertyIndex.isApplicable(null, "(objectClass=java.lang.String)"));
byClazzName = multiPropertyIndex.getAllServiceReferences(null, "(objectClass=java.lang.String)");
assertTrue(byClazzName.size() == 1);
assertTrue(byClazzName.get(0).equals(ref1));
//Add extra service
TestReference ref3 = new TestReference();
ref3.addProperty("service.id", 4712);
ref3.addProperty("objectclass", "java.lang.String");
multiPropertyIndex.addedService(ref3, new String("Service3"));
byClazzName = multiPropertyIndex.getAllServiceReferences("java.lang.String", null);
assertTrue(byClazzName.size() == 2);
assertTrue(byClazzName.get(0).equals(ref1));
assertTrue(byClazzName.get(1).equals(ref3));
}
@SuppressWarnings("rawtypes")
@Test
public void propertyIndexWithDoubleNoPermutationKeys() {
String filterConfig = "objectClass,#related-concept-absoluteidentifier,#context-concept-absoluteidentifier,StoreClass";
MultiPropertyFilterIndex multiPropertyIndex_new = new MultiPropertyFilterIndex(filterConfig);
String[] relatedConcepts = {"rel-a", "rel-b"};
String[] contextConcepts = {"cca-a", "cca-b"};
TestReference ref1 = new TestReference();
ref1.addProperty("service.id", 4711);
ref1.addProperty("objectclass", "java.lang.String");
ref1.addProperty("related-concept-absoluteidentifier", relatedConcepts);
ref1.addProperty("context-concept-absoluteidentifier", contextConcepts);
ref1.addProperty("StoreClass", "NoteStore");
multiPropertyIndex_new.addedService(ref1, new String("Service1"));
List<ServiceReference> result_new = multiPropertyIndex_new.getAllServiceReferences("java.lang.String", "(&(context-concept-absoluteidentifier=cca-a)(related-concept-absoluteidentifier=rel-b)(storeclass=NoteStore))");
assertTrue(result_new.size() == 1);
}
@SuppressWarnings("rawtypes")
@Test
public void propertyIndexWithDoubleMultiProperty() {
String filterConfig = "objectClass,related-concept-absoluteidentifier,context-concept-absoluteidentifier,StoreClass";
MultiPropertyFilterIndex multiPropertyIndex_new = new MultiPropertyFilterIndex(filterConfig);
String[] relatedConcepts = {"rel-a", "rel-b"};
String[] contextConcepts = {"cca-a", "cca-b"};
TestReference ref1 = new TestReference();
ref1.addProperty("service.id", 4711);
ref1.addProperty("objectclass", "java.lang.String");
ref1.addProperty("related-concept-absoluteidentifier", relatedConcepts);
ref1.addProperty("context-concept-absoluteidentifier", contextConcepts);
ref1.addProperty("StoreClass", "NoteStore");
multiPropertyIndex_new.addedService(ref1, new String("Service1"));
List<ServiceReference> result_new = multiPropertyIndex_new.getAllServiceReferences("java.lang.String", "(&(context-concept-absoluteidentifier=cca-a)(related-concept-absoluteidentifier=rel-b)(storeclass=NoteStore))");
assertTrue(result_new.size() == 1);
}
@SuppressWarnings("rawtypes")
@Test
public void MultiPropertyFilterIndexTypes() {
long serviceId = 4711;
int ranking = 46;
boolean isSomeBoolean = true;
String[] interfaces = {"A", "B", "C"};
MultiPropertyFilterIndex multiPropertyIndexSingleFilter = new MultiPropertyFilterIndex("objectClass");
MultiPropertyFilterIndex multiPropertyIndexMultiple = new MultiPropertyFilterIndex("objectClass,service.id,ranking,interfaces");
TestReference newReference = new TestReference();
newReference.addProperty("service.id", serviceId);
newReference.addProperty("objectclass", "java.lang.Object");
newReference.addProperty("ranking", ranking);
newReference.addProperty("someboolvalue", isSomeBoolean);
newReference.addProperty("interfaces", interfaces);
multiPropertyIndexMultiple.addedService(newReference, new Object());
multiPropertyIndexSingleFilter.addedService(newReference, new Object());
List<ServiceReference> noFilter = multiPropertyIndexSingleFilter.getAllServiceReferences("java.lang.Object", null);
assertTrue(noFilter.size() == 1);
List<ServiceReference> noClazz = multiPropertyIndexMultiple.getAllServiceReferences(null, "(&(objectClass=java.lang.Object)(&(service.id=4711)(ranking=46)(interfaces=B)))");
assertTrue(noClazz.size() == 1);
List<ServiceReference> combi = multiPropertyIndexMultiple.getAllServiceReferences("java.lang.Object", "(&(ranking=46)(interfaces=C)(service.id=4711))");
assertTrue(combi.size() == 1);
}
@SuppressWarnings("rawtypes")
@Test
public void MultiPropertyFilterIndexKeyGen() {
String key = "(&(objectClass=org.acme.xyz.framework.internationalization.Translatable)(component-identifier=org.acme.xyz.framework.webui.engine.impl.CompoundProcessContextGroupingPanelFactory))";
long serviceId = 4711;
int ranking = 46;
MultiPropertyFilterIndex biIndex = new MultiPropertyFilterIndex("objectClass,component-identifier");
TestReference newReference = new TestReference();
newReference.addProperty("service.id", serviceId);
newReference.addProperty("ranking", ranking);
newReference.addProperty("component-identifier", "org.acme.xyz.framework.webui.engine.impl.CompoundProcessContextGroupingPanelFactory");
newReference.addProperty("objectclass", "org.acme.xyz.framework.internationalization.Translatable");
biIndex.addedService(newReference, new Object());
List<ServiceReference> noClazz = biIndex.getAllServiceReferences(null, key);
assertTrue(noClazz.size() == 1);
}
@SuppressWarnings("rawtypes")
class TestReference implements ServiceReference {
Properties props = new Properties();
TestReference() {
}
public void addProperty(String key, String value) {
/* Property keys are case-insensitive. -> see @ org.osgi.framework.ServiceReference */
props.put(key.toLowerCase(), value);
}
public void addProperty(String key, long value) {
props.put(key, value);
}
public void addProperty(String key, int value) {
props.put(key, value);
}
public void addProperty(String key, boolean value) {
props.put(key, value);
}
public void addProperty(String key, String[] multiValue) {
props.put(key, multiValue);
}
@Override
public Object getProperty(String key) {
return props.get(key);
}
@Override
public String[] getPropertyKeys() {
return props.keySet().toArray(new String[]{});
}
@Override
public Bundle getBundle() {
return null;
}
@Override
public Bundle[] getUsingBundles() {
return null;
}
@Override
public boolean isAssignableTo(Bundle bundle, String className) {
return false;
}
@Override
public int compareTo(Object reference) {
// TODO Auto-generated method stub
return 0;
}
}
}