Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

Code Block
java
titleAnnotations
java
@Component(name="my-type")
public class Implementation {
  // ...
}
Div
classborderedTable
Center

Attribute name

Required

Default value

 

classname

yes

 

indicates the implementation class (automatic when using annotations).

name

no

implementation class name

specifies the component type name.

public
(public_factory for annotations)

no

true

specifies if the component type is accessible from others bundle or is private.

factory-method
(factory_method for annotations)

no

 

specifies a static method to call instead of the 'regular' constructor to create POJO objects.

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | classname | yes | | indicates the implementation class (automatic when using annotations). | | name | no | implementation class name | specifies the component type name. | | public \\ (public_factory for annotations) | no | true | specifies if the component type is accessible from others bundle or is private.| | factory-method \\ (factory_method for annotations) | no | | specifies a static method to call instead of the 'regular' constructor to create POJO objects.| {center} {div}

...

Code Block
xml
titleXML
xml
<instance component="my-type"/>
<instance component="my.Implementation"/>
<instance component="my-type" name="my-instance"/>
<instance component="my-type" name="my-instance">
    <property name="property1" value="value1"/>
</instance>
Div
classborderedTable
Center

Attribute name

Required

Default value

 

component

yes

 

specifies the component type (either by using the name or the class name)

name

no

generated

specifies the instance name.

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | component | yes | | specifies the component type (either by using the name or the class name) | | name | no | generated | specifies the instance name. | {center} {div}

  • Instances can contains a configuration given under the key-value form. Properties can also by complex type.
  • How-to use iPOJO factories

...

  • Only instances provides really services, so don't forget to declare an instance.
  • Published service interfaces must be implemented by your component implementation
    Wiki Markup
    Div
    classborderedTable
    Center

    Attribute name

    Required

    Default value

     

    specifications

    no

    all implemented interfaces

    specifies the published service interfaces

    strategy

    no

    singleton

    specifies the service object creation policy among singleton, service (OSGi Service Factory), method (use the factory method), instance (an object per instance)

    {div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | specifications | no | all implemented interfaces | specifies the published service interfaces | | strategy | no | {{singleton}} | specifies the service object creation policy among {{singleton}}, {{service}} (OSGi Service Factory), {{method}} (use the factory method), {{instance}} (an object per instance) | {center} {div}

  • Providing OSGi services

Publishing service properties

...

Code Block
java
titleAnnotations
java
@Component
@Provides(specifications= {FooService.class, BarService.class},
properties= {
	@StaticServiceProperty(name="baz", type="java.lang.String")})
public class ProvidesProperties implements FooService, BarService {
    
    @ServiceProperty(name = "foo")
    public int m_foo = 0;
    
    @ServiceProperty(name="bar", mandatory=true)
    public int m_bar;
    
// ...
}
Div
classborderedTable
Center

Attribute name

Required

Default value

 

name

no

field name

specifies the published property name

mandatory

no

false

specifies if the property has to receive a value from the instance configuration

value

no

 

specifies the default property value

field

no

(automatic with annotations)

specifies the field attached to the service property

type

Only if there is no field (generated)

Type of the property

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | name | no | field name | specifies the published property name | | mandatory | no | false | specifies if the property has to receive a value from the instance configuration | | value | no | | specifies the default property value | | field | no | (automatic with annotations) | specifies the field attached to the service property | | type | Only if there is no field (generated) | Type of the property | {center} {div}

Using services with field injection

...

Code Block
java
titleAnnotations
java
@Component
public class Dependency {

    @Requires
    public FooService fs;

    @Requires
    public BarService[] bs;
    
    //...
}
Div
classborderedTable
Center

Attribute name

Required

Default value

 

id

no

field name

dependency id

field

no

automatically detected with annotations

injected field

optional

no

false

specifies if the dependency if optional

aggregate

no

false
(automatically detected with fields)

specifies if the dependency is aggregate of scalar

specification

yes/no

can be discovered from the code

specifies the required service specification. This attribute is required when the service type cannot be inferred from the code (Collection type for fields, callbacks without service objects)

filter

no

no filter

specifies the dependency LDAP filter

from

no

 

specifies a specific provider by its name

policy

no

dynamic

specifies the binding policy among dynamic, static and dynamic-priority

nullable

no

true

enables/disables nullable object injection for optional dependencies

default-implementation // defaultimplementation for annotations

no

 

specifies the default-implementation for optional dependencies

comparator

no

 

specifies the comparator class used to sort service providers

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | id | no | field name | dependency id | | field | no | automatically detected with annotations | injected field | | optional | no | false | specifies if the dependency if optional | | aggregate | no | false \\ (automatically detected with fields) | specifies if the dependency is aggregate of {{scalar}} | | specification | yes/no | can be discovered from the code | specifies the required service specification. This attribute is required when the service type cannot be inferred from the code (Collection type for fields, callbacks without service objects) | | filter | no | no filter | specifies the dependency LDAP filter | | from | no | | specifies a specific provider by its name | | policy | no | {{dynamic}} | specifies the binding policy among {{dynamic}}, {{static}} and {{dynamic-priority}} | | nullable | no | true | enables/disables nullable object injection for optional dependencies | | default-implementation // defaultimplementation for annotations | no | | specifies the default-implementation for optional dependencies | | comparator | no | | specifies the comparator class used to sort service providers | {center} {div}

...

Code Block
java
titleAnnotations
java
@Component
public class Dependency {

    @Unbind
    public synchronized void unbindBaz(BazService bz) {
        //...
    }
    
    @Bind
    public synchronized void bindBaz(BazService bz) {
        // ...
    }

    @Modified
    public synchronized void modifiedBaz() {
        // ...
    }

  //...
}
Div
classborderedTable
Center

Attribute name

Required

Default value

 

id

no

field name

dependency id

field

no

automatically detected with annotations

injected field

optional

no

false

specifies if the dependency if optional

aggregate

no

false
(automatically detected with fields)

specifies if the dependnency is aggregate of scalar

specification

yes/no

can be discovered from the code

specifies the required service specification. This attribute is required when the service type cannot be infered from the code (Collection type for fields, callbacks without service objects)

filter

no

no filter

specifies the dependency LDAP filter

from

no

 

specifies a specific provider by its name

policy

no

dynamic

specifies the binding policy among dynamic, static and dynamic-priority

nullable

no

true

enables/disables nullable object injection for optional dependencies

default-implementation // default implementation for annotations

no

 

specifies the default-implementation for optional dependencies

comparator

no

 

specifies the comparator class used to sort service providers

Sub-Element name

Required

Default value

 

callback

no

callback specifies bind and unbind method. Two attributes are required (discovered automatically with annotations). type specified if the callback is a bind or unbind method (among {bind, unbind, modified}. The method attribute specified the method to call. The modified callback is called when the service properties of a bound service are modified and the service still match the filter.

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | id | no | field name | dependency id | | field | no | automatically detected with annotations | injected field | | optional | no | false | specifies if the dependency if optional | | aggregate | no | false \\ (automatically detected with fields) | specifies if the dependnency is aggregate of {{scalar}} | | specification | yes/no | can be discovered from the code | specifies the required service specification. This attribute is required when the service type cannot be infered from the code (Collection type for fields, callbacks without service objects) | | filter | no | no filter | specifies the dependency LDAP filter | | from | no | | specifies a specific provider by its name | | policy | no | {{dynamic}} | specifies the binding policy among {{dynamic}}, {{static}} and {{dynamic-priority}} | | nullable | no | true | enables/disables nullable object injection for optional dependencies | | default-implementation // default implementation for annotations | no | | specifies the default-implementation for optional dependencies | | comparator | no | | specifies the comparator class used to sort service providers | || Sub-Element name || Required || Default value || || | callback | no | callback specifies bind and unbind method. Two attributes are required (discovered automatically with annotations). {{type}} specified if the callback is a bind or unbind method (among \{{{bind}}, {{unbind}}, {{modified}}\}. The {{method}} attribute specified the method to call. The {{modified}} callback is called when the service properties of a bound service are modified and the service still match the filter. {center} {div}

...

  • A POJO object (implementation object) is created as soons as the instance becomes valid
  • Instances that don't provide services becomes automatically immediate
    Code Block
    xml
    titleXML
    xml
    <component classname="my.service.implementation" name="my-service-impl" immediate="true">
       <provides/>
    </component>
    
    Code Block
    java
    titleAnnotations
    java
    @Component(immediate=true)
    @Provides
    public class Implementation implements FooService {
       ...
    }
    
    Div
    classborderedTable
    Center

    Attribute name

    Required

    Default value

     

    immediate

    no

    false // true for instances that don't provide a service

    specifies if the instance is immediate or not

    Wiki Markup
    {div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | immediate | no | false // true for instances that don't provide a service | specifies if the instance is immediate or not | {center} {div}

  • Lifecycle Callback Handler

...

Code Block
java
titleAnnotations
java
@Component(managedservice="MyPID", propagation=true)
public class Implementation {
    
    @Property(name="boo")
    public void setBoo(int boo) {
        //...
    }
        
    @Property(mandatory=true)
    public int m_bar;

    @Property(value="4")
    public int m_foo;
}
Div
classborderedTable
Center

Attribute name

Required

Default value

 

propagation

no

false

specifies if the properties propagation (properties are also published as service properties) is enabled or disabled

managedservice

no

instance name

specifies the PID of the published managed service. // This value can be overidden by the managed.service.pid instance property

name

no

field name or computed from the method name

specifies if the the property name

value

no

 

specifies the default property value

field

no

automatically detected with annotations

specifies the field in which the property value will be injected

method

no

automatically detected with annotations

specifies the setter method in which the property value will be injected

mandatory

no

false

specifies if the property has to receive a value from the instance configuration

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | propagation | no | false | specifies if the properties propagation (properties are also published as service properties) is enabled or disabled | | managedservice | no | instance name | specifies the PID of the published managed service. // This value can be overidden by the {{managed.service.pid}} instance property | | name | no | field name or computed from the method name | specifies if the the property name | | value | no | | specifies the default property value | | field | no | automatically detected with annotations | specifies the field in which the property value will be injected | | method | no | automatically detected with annotations | specifies the setter method in which the property value will be injected | | mandatory | no | false | specifies if the property has to receive a value from the instance configuration | {center} {div}

PostRegistration and PostUnregistration callbacks

...

Code Block
java
titleAnnotations
java
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.handler.temporal.Requires;
import org.apache.felix.ipojo.test.scenarios.annotations.service.FooService;

@Component
public class Implementation {
    
    @Requires // org.apache.felix.ipojo.handler.temporal.Requires
    private FooService mytemporal;
    
}
Div
classborderedTable
Center

Attribute name

Required

Default value

 

field

no

automatically detected with annotations

specifies the field in which the service object will be injected

timeout

no

3000 ms

specifies the timeout value (in ms). When the timeout is reached, the on timeout policy is executed

onTimeout

no

Runtime Exception

specifies the on timeout policy. Possible values are: null, nullable, empty, default-implementation (class name)

specification

only when using Collections

 

specifies the required service specification. This attribute is required when the injected field is a Collection

proxy

no

false

enables/disables proxy injection. Service injected as proxies can be given to collaborators

filter

no

no filter

Filter use to discover matching filter.

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | field | no | automatically detected with annotations | specifies the field in which the service object will be injected | | timeout | no | 3000 ms | specifies the timeout value (in ms). When the timeout is reached, the on timeout policy is executed | | onTimeout | no | Runtime Exception | specifies the on timeout policy. Possible values are: {{null}}, {{nullable}}, {{empty}}, _default-implementation_ (class name) | | specification | only when using Collections | | specifies the required service specification. This attribute is required when the injected field is a Collection | | proxy | no | false | enables/disables proxy injection. Service injected as proxies can be given to collaborators | | filter | no | no filter | Filter use to discover matching filter. | {center} {div}

...

Code Block
java
titleAnnotations
java
@Component
public class MyComponent {
    
    @Subscriber(name="s1", data_key="data")
    public void receive1(Object foo) {
        // Nothing
    }
    
    @Subscriber(name="s2", topics="foo,bar", filter="(foo=true)")
    public void receive2(Event foo) {
        // Nothing
    }
    
    
    @Subscriber(name="s3", topics="foo", data_key="data", data_type="java.lang.String")
    public void receive3(String foo) {
        // Nothing
    }
Div
classborderedTable
Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | name | yes | | specifies the name of the event subscriber, acting as a unique identifier. This name is used to configure event subscription in the instance configuration. | | callback (or method) | yes \\ automatically detected with annotations | | specifies The name of the method called each time an event is received. This method takes only one parameter, of type {{
Center

Attribute name

Required

Default value

 

name

yes

 

specifies the name of the event subscriber, acting as a unique identifier. This name is used to configure event subscription in the instance configuration.

callback (or method)

yes
automatically detected with annotations

 

specifies The name of the method called each time an event is received. This method takes only one parameter, of type

org.osgi.service.event.Event

}}

by

default,

but

this

type

can

be

overridden

by

defining

the

{{

data-key

}}

and/or

the

{{

data-type

}}

attributes.

| | topics | yes | | specifies the list

topics

yes

 

specifies the list (comma-separated-list)

of

the

topics

that

the

handler

will

listen

to.

Each

event

sent

on

a

topic

present

in

this

list

will

be

sent

to

the

specified

callback

method.

This

parameter

can

be

overridden

by

instances

| |

data-key

\\


data_key

when

using

annotations

| no | | specifies the data key used when you want to receive data events. This attribute's value is the key corresponding to the received data in the event's dictionary. If you use this attribute, the parameter passed to the callback method is the the value associated to this key, not the whole event. This attribute is generally used with the {{data-type}} attribute to specify the received object type. If an event is received and it does not contain such a key, it is ignored (with a warning message). | | data-type \\ data_type when using annotations | no | java.lang.Object | specifies the type of objects ({{java.lang.Object}} by default) that the callback expects. It is used to determine the unique callback method (in case of multiple methods with the same name) and to check type compliance at event reception. Data events that are not corresponding to the specified type will be ignored (with a warning message).| | filter | no | no filter | specifies the event LDAP filter used to filter incoming events before sending them to the callback. The syntax of this field is described in the OSGi EventAdmin Specification. If you don't specify a filter, all events sent on the listened topics will be considered. | {center} {div}

no

 

specifies the data key used when you want to receive data events. This attribute's value is the key corresponding to the received data in the event's dictionary.
If you use this attribute, the parameter passed to the callback method is the the value associated to this key, not the whole event. This attribute is generally used with the data-type attribute to specify the received object type. If an event is received and it does not contain such a key, it is ignored (with a warning message).

data-type
data_type when using annotations

no

java.lang.Object

specifies the type of objects (java.lang.Object by default) that the callback expects. It is used to determine the unique callback method (in case of multiple methods with the same name) and to check type compliance at event reception. Data events that are not corresponding to the specified type will be ignored (with a warning message).

filter

no

no filter

specifies the event LDAP filter used to filter incoming events before sending them to the callback. The syntax of this field is described in the OSGi EventAdmin Specification. If you don't specify a filter, all events sent on the listened topics will be considered.

  • Instance configuration
    • event.topics : overrides topics attribute
    • event.filter : overrides filter attribute

...

Code Block
java
titleAnnotations
java

@Component
public class MyComponent {
    // We use qualified names to avoid conflict.
    @org.apache.felix.ipojo.handlers.event.Publisher(name="p1", synchronous=true)
    org.apache.felix.ipojo.handlers.event.publisher.Publisher publisher1;
    
    @org.apache.felix.ipojo.handlers.event.Publisher(name="p2", synchronous=false, topics="foo,bar", data_key="data")
    org.apache.felix.ipojo.handlers.event.publisher.Publisher publisher2;
    
    @org.apache.felix.ipojo.handlers.event.Publisher(name="p3", synchronous=true, topics="bar")
    org.apache.felix.ipojo.handlers.event.publisher.Publisher publisher3;

    // ...

    public void doSomething() {
        Dictionary e = new Properties();
        //...
        // Fill out the event

        // Send event
        publisher1.send(e);
    }
}
Div
classborderedTable
Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | name | yes | | specifies the name of the event publisher, acting as a unique identifier. This name is used to configure event publishing in the instance configuration. | | field | yes \\ automatically detected with annotations | | specifies The name of the field used to send events. The field is initialized at component instantiation time. The type of the field must be : {{
Center

Attribute name

Required

Default value

 

name

yes

 

specifies the name of the event publisher, acting as a unique identifier. This name is used to configure event publishing in the instance configuration.

field

yes
automatically detected with annotations

 

specifies The name of the field used to send events. The field is initialized at component instantiation time. The type of the field must be :

org.apache.felix.ipojo.handlers.event.publisher.Publisher

}}. | | topics | yes | | specifies the list

.

topics

yes

 

specifies the list (comma-separated-list)

of

the

topics

on

which

events

will

be

sent.

This

parameter

can

be

overridden

by

instances

| |

data-key

\\


data_key

when

using

annotations

| no |

no

user.data

|

specifies

the

data

key

used

when

you

want

to

send

data

events.

This

attribute's

value

is

the

key,

in

the

event's

dictionary,

in

which

sent

data

are

stored.

When

you

use

the

_

sendData

_

method

of

the

Publisher,

the

given

object

is

placed

in

the

event

dictionary,

associated

with

the

specified

data-key.

| | synchronous | no | false | specifies if event sending is synchronous or not. | {center} {div}

synchronous

no

false

specifies if event sending is synchronous or not.

  • Instance configuration
    • event.topics : overrides topics attribute

...

Code Block
java
titleAnnotations
java
@Component
@org.apache.felix.ipojo.extender.Extender(extension="My-Extension", onArrival="onArrival", onDeparture="onDeparture")
public class Myextender {
    
    public void onArrival(Bundle bundle, String extension) {
        // handle matching bundle arrival
    }
    
    public void onDeparture(Bundle bundle) {
        // handler matching bundle departure
    }
}
Div
classborderedTable
Center

Attribute name

Required

Default value

 

extension

yes

 

specifies the required extension

Wiki Markup
{div:class=borderedTable} {center} ||Attribute name || Required || Default value || || | extension | yes | | specifies the required extension

(i.e.

the

required

Manifest

key)

| | onArrival | yes | | specifies the method called when a matching bundle arrives. The method receives the Bundle object and the extension value | | onDeparture | yes | | specifies the method called when a matching bundle leaves. The method receives the Bundle object | {center} {div}

onArrival

yes

 

specifies the method called when a matching bundle arrives. The method receives the Bundle object and the extension value

onDeparture

yes

 

specifies the method called when a matching bundle leaves. The method receives the Bundle object

Whiteboard Pattern

...

Code Block
java
titleAnnotations
java
@Component
@org.apache.felix.ipojo.whiteboard.Wbp(filter="(my.property=1)", 
        onArrival="onArrival", 
        onDeparture="onDeparture",
        onModification="onModification")
public class WhiteBoardWIModification {
    
    public void onArrival(ServiceReference ref) {
        // ...
    }
 
    public void onDeparture(ServiceReference ref) {
        // ...
    }
    
    public void onModification(ServiceReference ref) {
        // ...
    }

}
Center

Attribute name

Required

Default value

 

filter

yes

 

specifies LDAP filter used to detect required service providers

onArrival

yes

 

specifies the method called when a matching service provider arrives. The method receives the ServiceReference object

onDeparture

yes

 

specifies the method called when a matching service provider leaves. The method receives the ServiceReference object

omModification

no

 

specifies the method called when a matching service provider is modified and is still matching. The method receives the ServiceReference object

Wiki Markup
{center} ||Attribute name || Required || Default value || || | filter | yes | | specifies LDAP filter used to detect required service providers | | onArrival | yes | | specifies the method called when a matching service provider arrives. The method receives the ServiceReference object | | onDeparture | yes | | specifies the method called when a matching service provider leaves. The method receives the ServiceReference object | | omModification | no | | specifies the method called when a matching service provider is modified and is still matching. The method receives the ServiceReference object | {center}