...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@Component(name="my-type") public class Implementation { // ... } |
Div | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||
| ||||||||||||||||||||||
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
<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 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
| ||||||||||||||
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 class borderedTable
{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}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) - Providing OSGi services
Publishing service properties
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@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 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||
| |||||||||||||||||||||||||
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
@Component public class Dependency { @Requires public FooService fs; @Requires public BarService[] bs; //... } |
Div | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
@Component public class Dependency { @Unbind public synchronized void unbindBaz(BazService bz) { //... } @Bind public synchronized void bindBaz(BazService bz) { // ... } @Modified public synchronized void modifiedBaz() { // ... } //... } |
Div | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 title XML xml <component classname="my.service.implementation" name="my-service-impl" immediate="true"> <provides/> </component>
Code Block java title Annotations java @Component(immediate=true) @Provides public class Implementation implements FooService { ... }
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
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
@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 | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
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 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
@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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 {{
|
- Instance configuration
- event.topics : overrides
topics
attribute - event.filter : overrides
filter
attribute
- event.topics : overrides
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 : {{
|
- Instance configuration
- event.topics : overrides
topics
attribute
- event.topics : overrides
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@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 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||
| ||||||||||||||||||||
Wiki Markup | ||||||||||||||||||||
{div:class=borderedTable}
{center}
||Attribute name || Required || Default value || ||
| extension | yes | | specifies the required extension
|
Whiteboard Pattern
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@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 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||
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} |
- White Board Pattern Handler
Include Page apache-felix-ipojo-footer apache-felix-ipojo-footer