In DS, for accessing a service reference, the class has to be a
Component. That means to access commonservices, such as log service, all
classes becomes Components. In the following example, to access log
service all classes in Emp bundle became Components.
/@Component
public class Emp implements EmpService {
LogService log
@Reference (cardinality = ReferenceCardinality.MANDATORY)
void setLogService(LogService log) { this.log = log; }
}
@Component
public class EmpAddress {
LogService log
@Reference (cardinality = ReferenceCardinality.MANDATORY)
void setLogService(LogService log) { this.log = log; }
}
@Component
public class EmpPayroll {
LogService log
@Reference (cardinality = ReferenceCardinality.MANDATORY)
void setLogService(LogService log) { this.log = log; }
}/
....
*Question: *Is there a way to solve this proliferation of DS Components
and References?
*Solution A*: We can factor out reference code and move them to a
RefManager Component. Also maintain a shared static variable to
LogService for all other classes.
@Component
public class RefManager {
*static *LogService log
@Reference (cardinality = ReferenceCardinality.MANDATORY)
void setLogService(LogService log) { this.log = log; }
*static* LogService getLogger() { return log;}}
@Component
public class Emp implements EmpService {
..
RefManager. getLogger.log();
}
public class EmpAddress {
..
RefManager. getLogger.log();
}
public class EmpPayroll {
..
RefManager. getLogger.log();
}
*Problem:*Now we can end up with null LogService reference even though
LogService ref is MANDATORY . E.g. if EmpService is activated before
RefManager or LogService, it gets null LogService ref.
*Question:* If we set LogService and RefManager as immediate components
(RefManager is immediate by default for being a Component), is it
guaranteed that they will be activated before EmpService?
*Solution B: *
Another solution for the above problem is to view LogService as
OPTIONAL. However, an optional reference can be null requiring a null
check. That means each use of Log Service api require the following null
check.
If (log!=null) log.log(..);
*Problem: *Considering that log apis are heavily used, this seems
tedious and error-prone. Is there a better way of using OPTIONAL reference?
--
Best,
Tanvir
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev