Alasdair

On 3 Apr 2010, at 06:51, Guillaume Nodet <[email protected]> wrote:

On Fri, Apr 2, 2010 at 23:03, Alasdair Nottingham <[email protected]> wrote:

So comments on the current SubsystemAdmin:

1. How about a getSubsystem(String symbolicName, Version version);


That sounds much better than getScope() and getSubsystem(scope) imho.


2. What is the scope of SubsystemAdmin? Is it framework, composite
bundle, subsystem scoped?


Imho, composite. However, the SubsystemAdmin if inherited from its parent composite, it needs to be able to manage the composite it has been requested from. I.e. if you retrieve the SubsystemAdmin using a given BundleContext, the returned service will manage the composite from this BundleContext.


So a given Subsystem admin manages the current subsystem and any child subsystems?


3. What is the cancel method for?


Given installation and updates of subsystems will possibly download a lot of
things,
the goal of this method is to be able to cancel an ongoing operation.
We could always use Future instead or define another mechanism, but i'd
think it's a usefull
feature.


The API currently doesn't look like any of the methods might be asyncronous, so this is odd. Also if they are async what happens if you have multiple running at once. Which operation is canceled? I think this needs work.


4. uninstallForced seems ugly is it needed?


Yeah, that one is probably not needed if we ensure that uninstall (Subsystem)
will always uninstall
work, which sounds reasonable I suppose.


Thanks
Alasdair

On 2 April 2010 21:52, Alasdair Nottingham <[email protected]> wrote:
Hi,

Some comments. I'm sure I'll have more once I've had a chance to catch
up.

Alasdair

On 1 April 2010 00:42, Guillaume Nodet <[email protected]> wrote:
Renaming the subject of this thread.

5. Subsystem.getState(). I wonder if we should reinvent here. Is there any reason why we don't make the return type of int, and just delegate this to the compositeBundle.getState(). Also, what if the composite bundle and constituents have different states. Does this method only work when the states are consistent among these bundles?


My original idea was also to map closely to the composite state, so I
don't
have any problem
using an int instead of an enum, though I think the state of composite
is
an int because a composite
*is* a bundle and enums did not exist at the time the bundle interface
has
been created.
However, Subsystem do not inherit the Bundle or CompositeBundle
interface,
so we could decide to
use an enum (because the state is semantically an enum).

I think we should stick with an enum. If the Bundle API had had enum's
available
when it was originally written it would have used enums. Let's not
stick in the past.


That being said, the question you raise about the constituents state is
important.  We need to choose
whether we want to represent the state of the subsystem as an aggregate
of
the constituents state or not.
That would surely be interesting, because you would know the real state
of
your subsystem much more
easily. The problem is i'm not sure what would happen if one of the
bundle can't start or is manually
stopped by the user. Would this leave the subsystem in the STARTING
state
until the start or stop
method is called ?


I do not see how it can represent the aggregate state. If we have 10
bundles in a subsystem where
half are started and half stopped what would the aggregate state be?
In fact is this even a problem? Perhaps
this is the normal state. I think that the first thing to decide is
what does it mean to start and stop a subsystem.
Once we know what that means we can decide if a relationship with the
bundles in a subsystem makes sense.


6. Subsystem.start() or stop(), I think it should throw either
BundleException or SubsystemException.


Yeah, SubsystemException would be fine.  Currently I've defined
SubsystemException as being
a RuntimeException though ...


I suspect this might be a dangerous question to ask, but why a
RuntimeException :)?


7. The return type of Subsystem.getHeaders, do we want to use
Dictionary<String, String> or Dictionary to be consistent with
Bundle.getHeaders()?  when we implement this method, we can just
delegate to compositeBundle.getHeaders.


Two things here.  First, I'm not sure we would want to return the
composite
headers.
First because composite headers can't be localized, and second because
i
was thinking
about returning the headers from the subsystem manifest as it was
installed, not of the
underlying composite (which includes computed headers for package and
service policies).
So if we return directly the composite headers, it would surely make
more
sense to use the
same type, but if we don't, i think using Map is more natural. OSGi is
really the only place
that uses Dictionary instead of Map ;-)


I would use Map. If Map had existed when the OSGi interfaces were first
created
it would have been used. I think we should stick with Map.


On Mon, Mar 29, 2010 at 6:34 PM, Guillaume Nodet <[email protected] >
wrote:
FWIW, I've slightly updated the API with some feedback here and
mostly
two
other changes:
* moved some management methods from Subsystem to SubsystemAdmin
(update
and uninstall)
* make SubsystemConstants a non instantiable class instead of an
interface


Why move away from an interface?


--
Alasdair Nottingham
[email protected]




--
Alasdair Nottingham
[email protected]




--
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to