You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Pierre De Rop (JIRA)" <ji...@apache.org> on 2018/12/06 10:01:00 UTC

[jira] [Updated] (FELIX-5996) Remove generic parameter in DM Component interface

     [ https://issues.apache.org/jira/browse/FELIX-5996?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Pierre De Rop updated FELIX-5996:
---------------------------------
    Description: 
Since dm-r13, the Component interface is now taking a generic parameter so it make it easier to define extended components like adapters.

So, with this new model, it looks like the following:
{code:java}
public interface Component<T extends Component<T>> {
   T setInterface(String service, Dictionary properties)
   T setImplementation(Object ob);
   ...
}
public interface AdapterComponent extends Component<AdapterComponent> {
   AdapterComponent setAdaptee(Class<?> service, String filter);
   AdapterComponent setAdapteeCallbacks(String add, String change, String remove, String swap);
   ...
}
{code}
and you can now do something like this:
{code:java}
Component adapter = createAdapterComponent()
  .setAdaptee(Adaptee.class, "(foo=bar)")
  .setAdapteeCallbacks("setAdaptee", "changeAdaptee", null, null)
  .setImplementation(AdapterImpl.class)
  .setInterface(AdapterService.class, null)
  .add(createServiceDependency().setService(LogService.class));
{code}
now, while using the generic parameter simplify the declaration of component adapters, it has a drawback: the Component now takes a generic parameter, and old code using simple components now generates a compilation warning:
{code:java}
Component adapter = createComponent()
 .setImplementation(SimpleComponent.class)
 ...
{code}
so, the above example generates a compilation warning, and you now have to declare "?" in order to get rid of the warning:
{code:java}
Component<?> adapter = createComponent()
 .setImplementation(SimpleComponent.class)
 ...
{code}
that being said, maybe we can refactor in order to get rid of the generic parameter, by copying the top level component methods in sub interfaces, like this:
{code:java}
public interface Component {
 Component setInterface(String service, Dictionary properties);
 Component setImplementation(Object ob);
 ...
 }

public interface AdapterComponent extends Component
{
 // Component methods with specialized signatures 
AdapterComponent setInterface(String service, Dictionary properties) 
AdapterComponent setImplementation(Object ob);

// AdapterComponent methods
AdapterComponent methods AdapterComponent setAdaptee(Class<?> service, String filter); 
AdapterComponent setAdapteeCallbacks(String add, String change, String remove, String swap); 
 }
{code}

  was:
Since dm-r13, the Component interface is now taking a generic parameter so it make it easier to define extended components like adapters.

So, with this new model, it looks like the following:
{code:java}
public interface Component<T extends Component<T>> {
   T setInterface(String service, Dictionary properties)
   T setImplementation(Object ob);
   ...
}
public interface AdapterComponent extends Component<AdapterComponent> {
   AdapterComponent setAdaptee(Class<?> service, String filter);
   AdapterComponent setAdapteeCallbacks(String add, String change, String remove, String swap);
   ...
}
{code}
and you can now do something like this:
{code:java}
Component adapter = createAdapterComponent()
  .setAdaptee(Adaptee.class, "(foo=bar)")
  .setAdapteeCallbacks("setAdaptee", "changeAdaptee", null, null)
  .setImplementation(AdapterImpl.class)
  .setInterface(AdapterService.class, null)
  .add(createServiceDependency().setService(LogService.class));
{code}
now, while using the generic parameter simplify the declaration of component adapters, it has a drawback: the Component now takes a generic parameter, and old code using simple components now generates a compilation warning:
{code:java}
Component adapter = createComponent()
 .setImplementation(SimpleComponent.class)
 ...
{code}
so, the above example generates a compilation warning, and you now have to declare "?" in order to get rid of the warning:
{code:java}
Component<?> adapter = createComponent()
 .setImplementation(SimpleComponent.class)
 ...
{code}
that being said, maybe we can refactor in order to get rid of the generic parameter, by copying the top level component methods in sub interfaces, like this:
{code:java}
public interface Component {
 Component setInterface(String service, Dictionary properties);
 Component setImplementation(Object ob);
 ...
 }

public interface AdapterComponent extends Component

{ // Component methods with specialized signatures AdapterComponent setInterface(String service, Dictionary properties) AdapterComponent setImplementation(Object ob); … // AdapterComponent methods AdapterComponent setAdaptee(Class<?> service, String filter); AdapterComponent setAdapteeCallbacks(String add, String change, String remove, String swap); 

{code}


> Remove generic parameter in DM Component interface
> --------------------------------------------------
>
>                 Key: FELIX-5996
>                 URL: https://issues.apache.org/jira/browse/FELIX-5996
>             Project: Felix
>          Issue Type: Task
>          Components: Dependency Manager
>    Affects Versions: org.apache.felix.dependencymanager-r13
>            Reporter: Pierre De Rop
>            Assignee: Pierre De Rop
>            Priority: Minor
>
> Since dm-r13, the Component interface is now taking a generic parameter so it make it easier to define extended components like adapters.
> So, with this new model, it looks like the following:
> {code:java}
> public interface Component<T extends Component<T>> {
>    T setInterface(String service, Dictionary properties)
>    T setImplementation(Object ob);
>    ...
> }
> public interface AdapterComponent extends Component<AdapterComponent> {
>    AdapterComponent setAdaptee(Class<?> service, String filter);
>    AdapterComponent setAdapteeCallbacks(String add, String change, String remove, String swap);
>    ...
> }
> {code}
> and you can now do something like this:
> {code:java}
> Component adapter = createAdapterComponent()
>   .setAdaptee(Adaptee.class, "(foo=bar)")
>   .setAdapteeCallbacks("setAdaptee", "changeAdaptee", null, null)
>   .setImplementation(AdapterImpl.class)
>   .setInterface(AdapterService.class, null)
>   .add(createServiceDependency().setService(LogService.class));
> {code}
> now, while using the generic parameter simplify the declaration of component adapters, it has a drawback: the Component now takes a generic parameter, and old code using simple components now generates a compilation warning:
> {code:java}
> Component adapter = createComponent()
>  .setImplementation(SimpleComponent.class)
>  ...
> {code}
> so, the above example generates a compilation warning, and you now have to declare "?" in order to get rid of the warning:
> {code:java}
> Component<?> adapter = createComponent()
>  .setImplementation(SimpleComponent.class)
>  ...
> {code}
> that being said, maybe we can refactor in order to get rid of the generic parameter, by copying the top level component methods in sub interfaces, like this:
> {code:java}
> public interface Component {
>  Component setInterface(String service, Dictionary properties);
>  Component setImplementation(Object ob);
>  ...
>  }
> public interface AdapterComponent extends Component
> {
>  // Component methods with specialized signatures 
> AdapterComponent setInterface(String service, Dictionary properties) 
> AdapterComponent setImplementation(Object ob);
> // AdapterComponent methods
> AdapterComponent methods AdapterComponent setAdaptee(Class<?> service, String filter); 
> AdapterComponent setAdapteeCallbacks(String add, String change, String remove, String swap); 
>  }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)