[
https://issues.apache.org/jira/browse/DERBY-3405?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12568397#action_12568397
]
Dibyendu Majumdar commented on DERBY-3405:
------------------------------------------
Dan,
Thank you for the comments.
I think overall my approach will be to:
a) Keep changes that are generic (e.g. tightening module boundaries) separate
and independent of any OSGI related work. Hopefully, this will make it easier
for these changes to be absorbed quickly. I will soon submit a couple of
patches that should illustrate the type of changes I would like.
b) The OSGI related changes are more difficult. I haven't worked out yet how
best maintain compatibility of the Monitor code with OSGI. I am not sure that
we can mix the current approach with OSGI as you suggest, because OSGI has its
own class-loading rules. I have been thinking about creating a Monitor
implementation that uses OSGI underneath. This would allow me to minimize
changes to existing code.
My current approach with regards to the OSGI changes is to maintain a separate
code base, where I am importing one module at a time. This is a bottom up
approach. I am hoping that apart from the OSGI specific code, everything else
will remain in synch with the Derby mainstream.
So far I have created following OSGI bundles:
org.apache.derby.core.lib - This contains:
org.apache.derby.iapi.error
org.apache.derby.iapi.services.i18n
org.apache.derby.iapi.services.info
org.apache.derby.iapi.services.sanity
org.apache.derby.iapi.services.stream
org.apache.derby.iapi.util
org.apache.derby.impl.services.stream
org.apache.derby.shared.common.error
org.apache.derby.shared.common.i18n
org.apache.derby.shared.common.reference
org.apache.derby.shared.common.sanity
org.apache.derby.core.io.api - This contains
org.apache.derby.io
org.apache.derby.core.io.impl - This contains
org.apache.derby.impl.io
org.apache.derby.core.bytecode.api - This contains
org.apache.derby.iapi.services.compiler
org.apache.derby.iapi.services.loader
I was working on the bytecode implementation module, when I stopped and decided
to restart.
As you can see, after the first bundle, I started to split the API from the
implementation.
I will have to revisit the first bundle, as I would like to split the API from
the implementation for this as well.
You will notice that there is a new package,
org.apache.derby.shared.common.reference. This contains a new interface
containing only those constants from SQLState that are needed by the bundle. I
wasn't sure how to approach the reference data issue, hence my recent posts. I
now think that maybe it is better at least in the short term to create a common
reference data bundle that contains all the reference data (including
StoredFormatIds). I do not really like this, but it is easier for me at present
to do this way than to try and split the constants.
I have encountered some issues, which I will list here for your information -
please note that these are my short-hand notes, and may not make sense to you.
org/apache/derby/iapi/error/StandardException.java contains references to
org.apache.derby.iapi.reference.SQLState,
org.apache.derby.impl.jdbc.EmbedSQLException, org.apache.derby.impl.jdbc.Util.
SQLState is basically a long list of error codes, but the list goes across
layers.
StandardException has knowledge about EmbedSQLException.
org/apache/derby/iapi/services/i18n/MessageService.java contains reference to
org.apache.derby.iapi.services.context.ShutdownException and
org.apache.derby.iapi.services.info.JVMInfo.
ShutdownException is better placed in org.apache.derby.iapi.error.
SingleStream.java contains reference to
org.apache.derby.iapi.services.monitor.ModuleControl,
org.apache.derby.iapi.services.monitor.ModuleSupportable,
org.apache.derby.iapi.services.monitor.Monitor,
org.apache.derby.iapi.reference.Property,
org.apache.derby.iapi.services.property.PropertyUtil.
org.apache.derby.iapi.services.property mixes general property utilities with
database table based properties.
iapi.reference package contains values that go across layers.
org.apache.derby.impl.io.BaseStorageFactory contains reference to
org.apache.derby.iapi.store.raw.data.DataFactory. Looks like there is a
reference to TEMP_SEGMENT_NAME.
org.apache.derby.iapi.services.info.JVMInfo contains a reference to
org.apache.derby.iapi.reference.JDBC30Translation.SQL_TYPES_BOOLEAN.
Its purpose should be only to set JVM version. For some reason this is defined
as an abstract class.
Also, the public static final int JAVA_SQL_TYPES_BOOLEAN should probably be
defined in one of the JDBCTransaction classes and not here.
ClassInspector and ClassInfo seem out of place in
org.apache.derby.iapi.services.loader - as both are implementations that have
no dependency on the bytecode generation.
GeneratedByteCode and GeneratedClass contain reference to Context - but it
would be better if they had no knowledge of context. Perhaps context should be
just an object.
I think that above will give you a flavour of where I am heading.
The bundles I have created load up under OSGI.
I haven't found any unit tests that are defined for the packages I have been
working with. Generally speaking, this will get more difficult when I start
looking at the test cases.
Anyway, would welcome your thoughts.
> Examine the possibility of implementing Derby modules as OSGI bundles
> ---------------------------------------------------------------------
>
> Key: DERBY-3405
> URL: https://issues.apache.org/jira/browse/DERBY-3405
> Project: Derby
> Issue Type: New Feature
> Reporter: Dibyendu Majumdar
> Assignee: Dibyendu Majumdar
>
> At present, Derby as a whole is offered as an OSGI bundle.
> Internally, Derby does not use OSGI for managing modules. Modules and
> services (which are collections of modules) are managed using the Monitor
> component, which is a custom IoC container, designed specifically for Derby.
> Some of the features of the Monitor component, mirror facilities offered by
> OSGI. The obvious ones are:
> a) Loading modules based upon environment. The features offered by the
> Monitor subsystem were described by Dan like this:
> The monitor ... selects the module implementation that is suitable for the
> given environment by:
> - seeing what the current JDK level is and if a module implementation
> supports it
> - seeing what classes a module implementation requires and if they exist
> - if the module implements ModuleSupportable and if so asking the module if
> it can support the current environment.
> As an example, modules.properties today contains three JDBC implementations,
> JSR169, JDBC 3 and JDBC 4, having multiple exist is not an issue, the monitor
> selects the correct one.
> The ability to load bundles based on environment compatibility is one of OSGI
> features.
> b) Resolving module interdependencies.
> c) Managing life-cycle of services and modules.
> A migration from the Monitor component to an OSGI based packaging is not
> going to be an easy transition. At this stage, therefore, this is more of an
> experiment.
> The benefits of using OSGI are:
> a) It supports dependencies based upon versions of bundles.
> b) It will make it easier to add/remove components, specially at run-time.
> However, the use case for this needs defining.
> c) It may open up Derby to other possibilities ...
> The disadvantages are:
> a) Introduces a dependency on OSGI - whereas Derby at present has its own IoC
> implementation.
> b) Will mean a major change to how Derby is bundled and therefore potentially
> impact users.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.