Uploaded image for project: 'Felix'
  1. Felix
  2. FELIX-4294

Dependency Manager Shell improvements

    XMLWordPrintableJSON

Details

    Description

      This issue proposes two enhancements regarding the dependency manager shell.

      1) display component names more consistently
      =====================================

      • some components are sometimes displayed with a "class " prefix, while others are not:

      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,bundle.id=18) registered

      For readability, the "class " could be just removed.

      • When a component does not contain any service properties, an empty "()" is displayed after the component name

      pierre.multitenant.both.Both() registered
      org.amdatu.multitenant.TenantLifeCycleListener(org.amdatu.tenant.binding=3) registered

      As in previous case and for readability, it makes sense to not append an empty "()" after the component name, if it has no properties.

      2) add "filter" and "nofilters" options for filter displayed components
      =====================================================

      By default, the "dm" shell command dumps all components. But sometimes, it is desirable to display a subset of all components,
      using a regular expression on the component name or on the component service properties.
      We can of course do this using gogo shell "grep", but the problem is that we may miss some important informations, like the component bundle id, or the component dependencies.

      As an example, let's assume we are using the AMDATU mutli-tenancy framework. With AMDATU MT, many internal AMDATU components are instantiated behind the scene for a given tenant bundle.
      In the following example, we have three tenant bundles, and if we type "dm", then we are getting a long list of components, including:

      • application tenant components: pierre.multitenant.*
      • some internal amdatu mt components (org.amdatu.multitenant.*):

      g! dm
      [2] org.amdatu.multitenant.conf
      org.osgi.service.cm.ManagedServiceFactory(service.pid=org.amdatu.tenant.factory) registered
      org.amdatu.multitenant.TenantFactoryConfiguration service required available
      org.osgi.service.log.LogService service optional available
      [3] org.amdatu.multitenant.factory
      org.amdatu.multitenant.TenantFactoryConfiguration() registered
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.TenantLifeCycleListener service optional available
      org.amdatu.multitenant.Tenant(service.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee,org.amdatu.tenant.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee,service.factoryPid=org.amdatu.tenant.factory,org.amdatu.tenant.name=bar2,felix.fileinstall.filename=file:/home/nxuser/work/osgi/amdatu/felix-framework-4.2.1/load/org.amdatu.tenant.factory-2.cfg,foo=bar) registered
      org.amdatu.multitenant.Tenant(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,org.amdatu.tenant.name=Platform Tenant) registered
      org.amdatu.multitenant.Tenant(service.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c,org.amdatu.tenant.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c,service.factoryPid=org.amdatu.tenant.factory,felix.fileinstall.filename=file:/home/nxuser/work/osgi/amdatu/felix-framework-4.2.1/load/org.amdatu.tenant.factory-1.cfg,foo=bar2) registered
      [5] org.amdatu.multitenant.org.apache.felix.dependencymanager.runtime
      class org.apache.felix.dm.runtime.DependencyManagerRuntime registered
      org.osgi.service.log.LogService service optional unavailable
      active (DependencyManager-Component=*) bundle optional unavailable
      org.amdatu.multitenant.TenantLifeCycleListener(org.amdatu.tenant.binding=3) registered
      Adapter for interface org.amdatu.multitenant.Tenant registered
      org.amdatu.multitenant.Tenant service optional available
      org.osgi.service.log.LogService service optional available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=32)(org.apache.felix.dependencymanager.aspect=32)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee)(bundle.id=5)) service required available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=33)(org.apache.felix.dependencymanager.aspect=33)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM)(bundle.id=5)) service required available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=34)(org.apache.felix.dependencymanager.aspect=34)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c)(bundle.id=5)) service required available
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee,bundle.id=5) registered
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,bundle.id=5) registered
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c,bundle.id=5) registered
      class org.apache.felix.dm.runtime.DependencyManagerRuntime registered
      org.osgi.service.log.LogService service optional unavailable
      active (DependencyManager-Component=*) bundle optional unavailable
      class org.apache.felix.dm.runtime.DependencyManagerRuntime registered
      org.osgi.service.log.LogService service optional unavailable
      active (DependencyManager-Component=*) bundle optional unavailable
      [16] pierre.multitenant.tenant
      pierre.multitenant.tenant.Tenant2() registered
      class pierre.multitenant.tenant.Tenant1 registered
      pierre.multitenant.tenant.Tenant2 service required available
      org.osgi.service.log.LogService service required available
      pierre.multitenant.both.Both service required available
      pierre.multitenant.platform.Platform service required available
      pierre.multitenant.tenant.Tenant2() registered
      class pierre.multitenant.tenant.Tenant1 registered
      pierre.multitenant.tenant.Tenant2 service required available
      org.osgi.service.log.LogService service required available
      pierre.multitenant.both.Both service required available
      pierre.multitenant.platform.Platform service required available
      org.amdatu.multitenant.TenantLifeCycleListener(org.amdatu.tenant.binding=2) registered
      Adapter for interface org.amdatu.multitenant.Tenant with filter (!(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM)) registered
      org.amdatu.multitenant.Tenant (!(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM)) service optional available
      org.osgi.service.log.LogService service optional available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=32)(org.apache.felix.dependencymanager.aspect=32)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee)(bundle.id=16)) service required available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=34)(org.apache.felix.dependencymanager.aspect=34)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c)(bundle.id=16)) service required available
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee,bundle.id=16) registered
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c,bundle.id=16) registered
      [17] pierre.multitenant.platform
      org.amdatu.multitenant.TenantLifeCycleListener(org.amdatu.tenant.binding=1) registered
      Adapter for interface org.amdatu.multitenant.Tenant with filter (org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM) registered
      org.amdatu.multitenant.Tenant (org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM) service optional available
      org.osgi.service.log.LogService service optional available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=33)(org.apache.felix.dependencymanager.aspect=33)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM)(bundle.id=17)) service required available
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,bundle.id=17) registered
      pierre.multitenant.platform.Platform() registered
      org.osgi.service.log.LogService service required available
      pierre.multitenant.both.Both service required available
      [18] pierre.multitenant.both
      pierre.multitenant.both.Both() registered
      org.amdatu.multitenant.TenantLifeCycleListener(org.amdatu.tenant.binding=3) registered
      Adapter for interface org.amdatu.multitenant.Tenant registered
      org.amdatu.multitenant.Tenant service optional available
      org.osgi.service.log.LogService service optional available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=32)(org.apache.felix.dependencymanager.aspect=32)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee)(bundle.id=18)) service required available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=33)(org.apache.felix.dependencymanager.aspect=33)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM)(bundle.id=18)) service required available
      class org.amdatu.multitenant.adapter.TenantAdapter registered
      org.amdatu.multitenant.Tenant (|(service.id=34)(org.apache.felix.dependencymanager.aspect=34)) service required available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore (&(org.amdatu.tenant.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c)(bundle.id=18)) service required available
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.factory.91a788f0-da4f-405d-a643-b220f4b2bcee,bundle.id=18) registered
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,bundle.id=18) registered
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.factory.f4d53487-5a51-480c-9f67-ba64d657986c,bundle.id=18) registered
      pierre.multitenant.both.Both() registered
      pierre.multitenant.both.Both() registered

      So, what we would like to do is to be able to filter the displayed components with a new filter option.
      For example: To display only the application components matching "pierre.multitenant.*:

      g! dm filter pierre.multitenant.*
      Current component filters:[pierre.multitenant.*]

      g! dm
      [16] pierre.multitenant.tenant
      pierre.multitenant.tenant.Tenant2() registered
      pierre.multitenant.tenant.Tenant2() registered
      [17] pierre.multitenant.platform
      pierre.multitenant.platform.Platform() registered
      org.osgi.service.log.LogService service required available
      pierre.multitenant.both.Both service required available
      [18] pierre.multitenant.both
      pierre.multitenant.both.Both() registered
      pierre.multitenant.both.Both() registered
      pierre.multitenant.both.Both() registered

      To display all PLATFORM tenants:

      g! dm nofilters
      g! dm filter .pid=org.amdatu.tenant.PLATFORM.
      g! dm
      [3] org.amdatu.multitenant.factory
      org.amdatu.multitenant.Tenant(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,org.amdatu.tenant.name=Platform Tenant) registered
      [5] org.amdatu.multitenant.org.apache.felix.dependencymanager.runtime
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,bundle.id=5) registered
      [16] pierre.multitenant.tenant
      Adapter for interface org.amdatu.multitenant.Tenant with filter (!(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM)) registered
      org.amdatu.multitenant.Tenant (!(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM)) service optional available
      org.osgi.service.log.LogService service optional available
      [17] pierre.multitenant.platform
      Adapter for interface org.amdatu.multitenant.Tenant with filter (org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM) registered
      org.amdatu.multitenant.Tenant (org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM) service optional available
      org.osgi.service.log.LogService service optional available
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,bundle.id=17) registered
      [18] pierre.multitenant.both
      org.amdatu.multitenant.adapter.BundleDataStore(org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM,bundle.id=18) registered

      To display every components except any components having the service property "org.amdatu.tenant.name=bar2":

      g! dm nofilters
      g! dm filter !.org.amdatu.tenant.name=bar2.

      • Filters are cumulative: you can call "dm filter XXX" multiple times and each filter can have multiple regex (space separated).
      • Components are displayed only if their name or their service properties are matching at least one of the the specified filter.
      • Filters can be negated, using the special "!" prefix.
      • "dm filter" without any arguments just displays the current filters.
      • "dm nofilters" disable every previously added filter.

      Attachments

        1. FELIX-4294.patch
          53 kB
          Pierre De Rop

        Activity

          People

            pderop Pierre De Rop
            pderop Pierre De Rop
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: