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

Andrew MacGaffey updated ARIES-1989:
------------------------------------
    Description: 
Initializing a property with a "ref" element fails with complex generics
{code:java}
public interface EndpointHandler {} {code}
{code:java}
public interface EndpointServer <H extends EndpointHandler>{}{code}
{code:java}
public interface HandlerFactory <S> {}
{code}
{code:java}
public abstract class AbstractFactory <H extends EndpointHandler, S extends 
EndpointServer<H>>{
 HandlerFactory<S> handlerFactory = null;
 public HandlerFactory<S> getHandlerFactory() {
  return handlerFactory;
 }
 public void setHandlerFactory(HandlerFactory<S> handlerFactory) {
  this.handlerFactory = handlerFactory;
 }
}{code}
{code:java}
public class ConcreteFactory extends AbstractFactory<MyHandler, 
MyServer<MyHandler>> { }{code}
{code:java}
public class ConcreteHandlerFactory implements 
HandlerFactory<MyServer<MyHandler>> {}
{code}
{code:java}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
 xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0";>
 
 <bean id="concreteHandlerFactory" class="bugtest.ConcreteHandlerFactory" />
 <bean id="concreteFactory" class="bugtest.ConcreteFactory">
 <property name="handlerFactory" ref="concreteHandlerFactory" />
 </bean>
 
</blueprint>

{code}
The problem manifests in
{code:java}
if (from.equals(to)) {
 return true;
 }
 if (from.getRawClass() == to.getRawClass()) {
 if (to.size() == 0) {
 return true;
 }
 if (from.size() == to.size()) {
 boolean ok = true;
 for (int i = 0; i < from.size(); i++) {
 ReifiedType tf = from.getActualTypeArgument(i);
 ReifiedType tt = to.getActualTypeArgument(i);
 if (!isWildcardCompatible(tf, tt)) {         <<================= HERE
 ok = false;
 break;
 }
 }
 if (ok) {
 return true;
 }
 }
 } else {
 ReifiedType t = getExactSuperType(from, to.getRawClass());
 if (t != null) {
 return isTypeAssignable(t, to);
 }
 }
 return false;
 }{code}
ReifiedType tt has the correct generic class EndpointServer but has 0 
parameters. So the assignment fails.

Hacking this with a property of type"Object" and a cast works. The type 
structure and assignment also work in rather ancient spring-dm

 

 

  was:
Initializing a property with a "ref" element fails with complex generics

 
{code:java}
public interface EndpointHandler {}{code}
{{}}

 

 
{code:java}
public interface EndpointServer <H extends EndpointHandler>{}{code}
{{}}

 

 
{code:java}
public interface HandlerFactory <S> {}
{code}
 

 
{code:java}
public abstract class AbstractFactory <H extends EndpointHandler, S extends 
EndpointServer<H>>{
 HandlerFactory<S> handlerFactory = null;
 public HandlerFactory<S> getHandlerFactory() {
  return handlerFactory;
 }
 public void setHandlerFactory(HandlerFactory<S> handlerFactory) {
  this.handlerFactory = handlerFactory;
 }
}{code}
{{}}

 

 
{code:java}
public class ConcreteFactory extends AbstractFactory<MyHandler, 
MyServer<MyHandler>> { }{code}
 

 
{code:java}
public class ConcreteHandlerFactory implements 
HandlerFactory<MyServer<MyHandler>> {}
{code}
 

 
{code:java}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
 xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0";>
 
 <bean id="concreteHandlerFactory" class="bugtest.ConcreteHandlerFactory" />
 <bean id="concreteFactory" class="bugtest.ConcreteFactory">
 <property name="handlerFactory" ref="concreteHandlerFactory" />
 </bean>
 
</blueprint>

{code}
The problem manifests in 
{code:java}
if (from.equals(to)) {
 return true;
 }
 if (from.getRawClass() == to.getRawClass()) {
 if (to.size() == 0) {
 return true;
 }
 if (from.size() == to.size()) {
 boolean ok = true;
 for (int i = 0; i < from.size(); i++) {
 ReifiedType tf = from.getActualTypeArgument(i);
 ReifiedType tt = to.getActualTypeArgument(i);
 if (!isWildcardCompatible(tf, tt)) {         <<================= HERE
 ok = false;
 break;
 }
 }
 if (ok) {
 return true;
 }
 }
 } else {
 ReifiedType t = getExactSuperType(from, to.getRawClass());
 if (t != null) {
 return isTypeAssignable(t, to);
 }
 }
 return false;
 }{code}
ReifiedType tt has the correct generic class EndpointServer but has 0 
parameters. So the assignment fails.

Hacking this with a property of type"Object" and a cast works. The type 
structure and assignment also work in rather ancient spring-dm

 

 


> Blueprint not able to assign complex generics
> ---------------------------------------------
>
>                 Key: ARIES-1989
>                 URL: https://issues.apache.org/jira/browse/ARIES-1989
>             Project: Aries
>          Issue Type: Bug
>          Components: Blueprint
>    Affects Versions: 1.0
>            Reporter: Andrew MacGaffey
>            Priority: Major
>         Attachments: BugTestPlugin.zip, target_platform_blueprint.zip
>
>
> Initializing a property with a "ref" element fails with complex generics
> {code:java}
> public interface EndpointHandler {} {code}
> {code:java}
> public interface EndpointServer <H extends EndpointHandler>{}{code}
> {code:java}
> public interface HandlerFactory <S> {}
> {code}
> {code:java}
> public abstract class AbstractFactory <H extends EndpointHandler, S extends 
> EndpointServer<H>>{
>  HandlerFactory<S> handlerFactory = null;
>  public HandlerFactory<S> getHandlerFactory() {
>   return handlerFactory;
>  }
>  public void setHandlerFactory(HandlerFactory<S> handlerFactory) {
>   this.handlerFactory = handlerFactory;
>  }
> }{code}
> {code:java}
> public class ConcreteFactory extends AbstractFactory<MyHandler, 
> MyServer<MyHandler>> { }{code}
> {code:java}
> public class ConcreteHandlerFactory implements 
> HandlerFactory<MyServer<MyHandler>> {}
> {code}
> {code:java}
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
>  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0";>
>  
>  <bean id="concreteHandlerFactory" class="bugtest.ConcreteHandlerFactory" />
>  <bean id="concreteFactory" class="bugtest.ConcreteFactory">
>  <property name="handlerFactory" ref="concreteHandlerFactory" />
>  </bean>
>  
> </blueprint>
> {code}
> The problem manifests in
> {code:java}
> if (from.equals(to)) {
>  return true;
>  }
>  if (from.getRawClass() == to.getRawClass()) {
>  if (to.size() == 0) {
>  return true;
>  }
>  if (from.size() == to.size()) {
>  boolean ok = true;
>  for (int i = 0; i < from.size(); i++) {
>  ReifiedType tf = from.getActualTypeArgument(i);
>  ReifiedType tt = to.getActualTypeArgument(i);
>  if (!isWildcardCompatible(tf, tt)) {         <<================= HERE
>  ok = false;
>  break;
>  }
>  }
>  if (ok) {
>  return true;
>  }
>  }
>  } else {
>  ReifiedType t = getExactSuperType(from, to.getRawClass());
>  if (t != null) {
>  return isTypeAssignable(t, to);
>  }
>  }
>  return false;
>  }{code}
> ReifiedType tt has the correct generic class EndpointServer but has 0 
> parameters. So the assignment fails.
> Hacking this with a property of type"Object" and a cast works. The type 
> structure and assignment also work in rather ancient spring-dm
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to