You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Cristiano Gavião (JIRA)" <ji...@apache.org> on 2019/01/17 11:00:00 UTC

[jira] [Created] (FELIX-6031) Converter is not working properly when the target is an interface that extends others

Cristiano Gavião created FELIX-6031:
---------------------------------------

             Summary: Converter is not working properly when the target is an interface that extends others
                 Key: FELIX-6031
                 URL: https://issues.apache.org/jira/browse/FELIX-6031
             Project: Felix
          Issue Type: Bug
          Components: Converter
    Affects Versions: converter-1.0.2
            Reporter: Cristiano Gavião


I'm converting from a map to an interface and since that interface has any direct method
it is not being considered a "map". But one of the interfaces that it extends has the required method named with the source's map key name.

The problem is in the routine that identifies the interfaces in the method "getInterfaces0":
{code:java}
	private static boolean isMapType(Class< ? > cls, boolean asJavaBean,
			boolean asDTO) {
		if (asDTO)
			return true;

		// All interface types that are not Collections are treated as maps
		if (Map.class.isAssignableFrom(cls))
			return true;
		*else if (getInterfaces(cls).size() > 0)*
			return true;
		else if (DTOUtil.isDTOType(cls))
			return true;
		else if (asJavaBean && isWriteableJavaBean(cls))
			return true;
		else
			return Dictionary.class.isAssignableFrom(cls);
	}
{code}


{code:java}
	private static Set<Class< ? >> getInterfaces(Class< ? > cls) {
		if (NO_MAP_VIEW_TYPES.contains(cls))
			return Collections.emptySet();

		Set<Class< ? >> interfaces = getInterfaces0(cls);
		for (Iterator<Class< ? >> it = interfaces.iterator(); it.hasNext();) {
			Class< ? > intf = it.next();
			if (intf.getDeclaredMethods().length == 0)
				it.remove();
		}

		interfaces.removeAll(NO_MAP_VIEW_TYPES);

		return interfaces;
	}
{code}

{code:java}
	private static Set<Class< ? >> getInterfaces0(Class< ? > cls) {
		if (cls == null)
			return Collections.emptySet();

		Set<Class< ? >> classes = new LinkedHashSet<>();
		if (cls.isInterface()) {
			classes.add(cls);
		} else {
			classes.addAll(Arrays.asList(cls.getInterfaces()));
		}

		classes.addAll(getInterfaces(cls.getSuperclass()));

		return classes;
	}
{code}



Below is my proposed fix that recursively takes all interfaces that the target extends:
{code:java}
	private static Set<Class< ? >> getInterfaces0(Class< ? > cls) {
		if (cls == null)
			return Collections.emptySet();

		Set<Class< ? >> classes = new LinkedHashSet<>();
		if (cls.isInterface()) {
			classes.add(cls);
			if (cls.getInterfaces()!= null && cls.getInterfaces().length > 0) {
			    for (Class<?> intf : cls.getInterfaces()) {
                    classes.addAll(getInterfaces0(intf));
                }
			}
		} else {
			classes.addAll(Arrays.asList(cls.getInterfaces()));
		}

		classes.addAll(getInterfaces(cls.getSuperclass()));

		return classes;
	}
{code}




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