Andrew MacGaffey created ARIES-1989:
---------------------------------------
Summary: 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
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)