added getTypes (useful?)

This commit is contained in:
Shautvast 2023-05-26 17:09:00 +02:00
parent 610ce0ce41
commit 578600c3ae
3 changed files with 95 additions and 2 deletions

View file

@ -213,7 +213,7 @@ public class ContiguousList<E> extends NotImplementedList<E> implements List<E>
* bean property values in a fixed order for all elements.
* <p>
* Because the values differ in type the output type is Object
*
* <p>
* NB the actual type (right now) is the `raw` value: all integers are of type Long, BigInteger is String
* // That is unfortunate (or must I say: annoying!), but for something like JSON not a problem (I think).
* // So maybe keep this in (say 'rawValueIterator') and also create a typesafe iterator.
@ -229,7 +229,27 @@ public class ContiguousList<E> extends NotImplementedList<E> implements List<E>
return new ValueIterator();
}
class ValueIterator implements Iterator<Object> {
/**
* Returns a list of the types that are in the data
* @return
*/
public List<Class<?>> getTypes() {
final List<Class<?>> types = new ArrayList<>();
getTypes(rootHandler, types);
return types;
}
private void getTypes(TypeHandler handler, List<Class<?>> types) {
if (handler instanceof BuiltinTypeHandler<?>) {
types.add(handler.getType());
} else {
types.add(handler.getType());
((CompoundTypeHandler) handler).getProperties()
.forEach(propertyHandler -> getTypes(propertyHandler, types));
}
}
public class ValueIterator implements Iterator<Object> {
private final int originalSize;
private final int originalPosition;

View file

@ -197,4 +197,63 @@ public class ContiguousListTest {
assertEquals(new IntBean(100), integers.get(100)); // here an instance
}
@Test
public void testGetStoredTypesWhenCompound() {
ContiguousList<NestedBean> integers = new ContiguousList<>(NestedBean.class);
Iterator<Class<?>> typeIterator = integers.getTypes().iterator();
assertTrue(typeIterator.hasNext());
assertEquals(NestedBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(StringBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(String.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(IntBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(Integer.class, typeIterator.next());
}
@Test
public void testGetStoredTypesDeepCompound() {
ContiguousList<DeepBean> beans = new ContiguousList<>(DeepBean.class);
Iterator<Class<?>> typeIterator = beans.getTypes().iterator();
assertTrue(typeIterator.hasNext());
assertEquals(DeepBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(NestedBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(StringBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(String.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(IntBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(Integer.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(Long.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(StringBean.class, typeIterator.next());
assertTrue(typeIterator.hasNext());
assertEquals(String.class, typeIterator.next());
}
@Test
public void testTypeIteratorBuiltin() {
ContiguousList<Integer> integers = new ContiguousList<>(Integer.class);
Iterator<Class<?>> typeIterator = integers.getTypes().iterator();
if (typeIterator.hasNext()) {
assertEquals(Integer.class, typeIterator.next());
}
}
}

View file

@ -0,0 +1,14 @@
package nl.sanderhautvast.contiguous;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeepBean {
private NestedBean nestedBean;
private Long ageOfMagrathea;
private StringBean stringBean;
}