Skip to content

Commit

Permalink
Fail with multiple levels of generics (#503)
Browse files Browse the repository at this point in the history
Signed-off-by: David Kral <david.k.kral@oracle.com>
  • Loading branch information
Verdent committed Oct 19, 2021
1 parent 67fb4d2 commit 3c4e2ec
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ private Type checkSubclassRuntimeInfo(TypeVariable typeVar) {

private Type searchRuntimeTypeArgument(ParameterizedType runtimeType, TypeVariable<?> typeVar) {
if (ReflectionUtils.getRawType(runtimeType) != typeVar.getGenericDeclaration()) {
return ReflectionUtils.getOptionalRawType(typeVar).filter(rawType -> !Object.class.equals(rawType)).orElse(null);
return null;
}
TypeVariable[] bounds = typeVar.getGenericDeclaration().getTypeParameters();
for (int i = 0; i < bounds.length; i++) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
Expand All @@ -12,6 +12,8 @@

package org.eclipse.yasson.defaultmapping.generics;

import org.eclipse.yasson.defaultmapping.generics.model.FinalMember;
import org.eclipse.yasson.defaultmapping.generics.model.FinalGenericWrapper;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.eclipse.yasson.Jsonbs.*;
Expand Down Expand Up @@ -428,6 +430,20 @@ public void collectionWrapperTest() {
String s = defaultJsonb.toJson(collectionWrapper);
}

@Test
public void multipleGenericLevels() {
FinalMember member = new FinalMember();
member.setName("Jason");
FinalGenericWrapper concreteContainer = new FinalGenericWrapper();
concreteContainer.setMember(member);

String expected = "{\"member\":{\"name\":\"Jason\"}}";
Jsonb jsonb = JsonbBuilder.create();
assertEquals(expected, jsonb.toJson(concreteContainer));
FinalGenericWrapper finalGenericWrapper = jsonb.fromJson(expected, FinalGenericWrapper.class);
assertEquals(concreteContainer, finalGenericWrapper);
}

public interface FunctionalInterface<T> {
T getValue();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/

package org.eclipse.yasson.defaultmapping.generics.model;

import java.util.Objects;

public abstract class AbstractGenericWrapper<T extends AbstractMember> {

T member;

public T getMember() {
return member;
}

public void setMember(T member) {
this.member = member;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
AbstractGenericWrapper<?> that = (AbstractGenericWrapper<?>) o;
return Objects.equals(member, that.member);
}

@Override
public int hashCode() {
return Objects.hash(member);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/

package org.eclipse.yasson.defaultmapping.generics.model;

public class AbstractMember {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/

package org.eclipse.yasson.defaultmapping.generics.model;

public class FinalGenericWrapper extends MiddleGenericWrapper<FinalMember> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/

package org.eclipse.yasson.defaultmapping.generics.model;

import java.util.Objects;

public class FinalMember extends AbstractMember {
String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
FinalMember that = (FinalMember) o;
return Objects.equals(name, that.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/

package org.eclipse.yasson.defaultmapping.generics.model;

public abstract class MiddleGenericWrapper<T extends AbstractMember> extends AbstractGenericWrapper<T> {

}

0 comments on commit 3c4e2ec

Please sign in to comment.