Pierre De Rop created FELIX-5996:
------------------------------------

             Summary: 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


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}



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

Reply via email to