blob: 1cf3de5c51e9c8fd03a138bd4ab6e68e64235ddb [file] [log] [blame]
package ds.annotations.test1;
import java.util.AbstractMap;
import java.util.Comparator;
import java.util.EventListener;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ConfigurationPolicy;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.component.annotations.ReferencePolicyOption;
import org.osgi.service.component.annotations.ServiceScope;
@Component(
configurationPid = { "test.configurationPid", "$" },
configurationPolicy = ConfigurationPolicy.REQUIRE,
enabled = false,
factory = "test.componentFactory",
immediate = false,
name = "test.fullComponent",
properties = {
"/fullComponent1.properties",
"/fullComponent2.properties",
},
property = {
"implicitStringProperty=implicitStringValue",
"explicitStringProperty:String=explicitStringValue",
"integerProperty:Integer=1",
"longProperty:Long=2",
"shortProperty:Short=3",
"byteProperty:Byte=4",
"characterProperty:Character=5",
"floatProperty:Float=6.7",
"doubleProperty:Double=8.9",
"implicitStringArrayProperty=implicitStringArrayValue1",
"implicitStringArrayProperty=implicitStringArrayValue2",
"explicitStringArrayProperty:String=explicitStringArrayValue1",
"explicitStringArrayProperty:String=explicitStringArrayValue2",
"explicitStringArrayProperty:String=explicitStringArrayValue3",
},
reference = @Reference(
name = "comparator",
service = Comparator.class,
cardinality = ReferenceCardinality.OPTIONAL,
policy = ReferencePolicy.DYNAMIC,
field = "comparator"),
service = Map.class,
scope = ServiceScope.SINGLETON)
public class FullComponent extends AbstractMap<String, Object> {
@interface Config {
String stringProperty() default "stringValue";
int integerProperty() default -1;
String nonDefaultProperty();
}
private volatile Comparator<String> comparator;
@Reference
private volatile List<EventListener> listeners;
private volatile Set<Map.Entry<String, Object>> entrySet = new HashSet<>();
@Override
@Activate
@Modified
public void putAll(Map<? extends String, ? extends Object> m) {
super.putAll(m);
}
@Deactivate
public void clear(Config config) {
clear();
}
@Override
public Set<Map.Entry<String, Object>> entrySet() {
return entrySet;
}
@Reference(
cardinality = ReferenceCardinality.OPTIONAL,
name = "Entries",
policy = ReferencePolicy.DYNAMIC,
policyOption = ReferencePolicyOption.GREEDY,
target = "(!(component.name=test.fullComponent))",
updated = "updateEntrySet",
unbind = "unassignEntrySet")
public void assignEntrySet(Set<Map.Entry<String, Object>> entrySet) {
this.entrySet = entrySet;
}
public void updateEntrySet(ServiceReference<Set<Map.Entry<String, Object>>> ref) {
// do nothing
}
public void unassignEntrySet(Set<Map.Entry<String, Object>> entrySet) {
if (this.entrySet == entrySet) {
this.entrySet = new HashSet<>();
}
}
@Reference(
cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC,
service = Map.Entry.class)
public void addEntry(Object entry) {
if (entry instanceof Map.Entry) {
Map.Entry<?, ?> actualEntry = (Map.Entry<?, ?>) entry;
put(actualEntry.getKey() == null ? null : actualEntry.getKey().toString(), actualEntry.getValue());
}
}
public void removeEntry(Object entry) {
if (entry instanceof Map.Entry) {
Map.Entry<?, ?> actualEntry = (Map.Entry<?, ?>) entry;
remove(actualEntry.getKey() == null ? null : actualEntry.getKey().toString(), actualEntry.getValue());
}
}
}