JsonAdapter<T> result = (JsonAdapter<T>) factories.get(i).create(type, annotations, this); if (result == null) continue;
JsonAdapter<T> result = (JsonAdapter<T>) factories.get(i).create(type, annotations, this); if (result == null) continue;
@Test public void factoryExpectsOnlyOneAnnotation() { // A list of fake annotations. Set<Annotation> annotations = new LinkedHashSet<Annotation>() { { add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return Test.class; } }); add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return Custom.class; } }); } }; assertThat(ElementAt.ADAPTER_FACTORY.create(String.class, annotations, moshi)).isNull(); // Emulate existing annotation (should also return null). annotations.add(new ElementAt() { @Override public Class<? extends Annotation> annotationType() { return ElementAt.class; } @Override public int index() { return 0; } }); assertThat(ElementAt.ADAPTER_FACTORY.create(String.class, annotations, moshi)).isNull(); }
@Test public void factoryExpectsOnlyOneAnnotation() throws Exception { // A list of fake annotations. Set<Annotation> annotations = new LinkedHashSet<Annotation>() { { add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return Test.class; } }); add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return Custom.class; } }); } }; assertThat(FirstElement.ADAPTER_FACTORY.create(String.class, annotations, moshi)).isNull(); // Emulate existing annotation (should also return null). annotations.add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return FirstElement.class; } }); assertThat(FirstElement.ADAPTER_FACTORY.create(String.class, annotations, moshi)).isNull(); }
@Test public void factoryExpectsOnlyOneAnnotation() throws Exception { // A list of fake annotations. Set<Annotation> annotations = new LinkedHashSet<Annotation>() { { add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return Test.class; } }); add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return Custom.class; } }); } }; assertThat(LastElement.ADAPTER_FACTORY.create(String.class, annotations, moshi)).isNull(); // Emulate existing annotation (should also return null). annotations.add(new Annotation() { @Override public Class<? extends Annotation> annotationType() { return LastElement.class; } }); assertThat(LastElement.ADAPTER_FACTORY.create(String.class, annotations, moshi)).isNull(); }
@Test public void factoryIgnoresNonPrimitiveTypes() { List<Class<?>> classes = new ArrayList<Class<?>>() { { add(Boolean.class); add(Byte.class); add(Character.class); add(Double.class); add(Float.class); add(Integer.class); add(Long.class); add(Short.class); add(String.class); add(Object.class); } }; for (Class<?> cls : classes) { assertThat(FallbackOnNull.ADAPTER_FACTORY.create(cls, ANNOTATIONS, moshi)).isNull(); } }
@CheckReturnValue @SuppressWarnings("unchecked") // Factories are required to return only matching JsonAdapters. public <T> JsonAdapter<T> nextAdapter(JsonAdapter.Factory skipPast, Type type, Set<? extends Annotation> annotations) { if (annotations == null) throw new NullPointerException("annotations == null"); type = canonicalize(type); int skipPastIndex = factories.indexOf(skipPast); if (skipPastIndex == -1) { throw new IllegalArgumentException("Unable to skip past unknown factory " + skipPast); } for (int i = skipPastIndex + 1, size = factories.size(); i < size; i++) { JsonAdapter<T> result = (JsonAdapter<T>) factories.get(i).create(type, annotations, this); if (result != null) return result; } throw new IllegalArgumentException("No next JsonAdapter for " + typeAnnotatedWithAnnotations(type, annotations)); }
@SuppressWarnings("unchecked") private <C extends Collection<T>, T> JsonAdapter<C> csAdapter(Type collectionType, Type elementType, Set<? extends Annotation> annotations) { return (JsonAdapter<C>) CsvCollectionJsonAdapter.FACTORY.create( Types.newParameterizedType(collectionType, elementType), annotations, moshi); } }
@SuppressWarnings({"unchecked", "ConstantConditions"}) private <T extends Calendar> JsonAdapter<T> calendarAdapter() { return (JsonAdapter<T>) SafeCalendarJsonAdapter.FACTORY.create( SafeCalendar.class, Collections.<Annotation>emptySet(), moshi).lenient(); } }
@SuppressWarnings("unchecked") private JsonAdapter<Phone> phoneAdapter() { return (JsonAdapter<Phone>) PhoneJsonAdapter.FACTORY.create( Phone.class, Collections.<Annotation>emptySet(), moshi).lenient(); } }
@Test public void factoryIgnoresUnsupportedTypes() throws Exception { JsonAdapter<?> adapter1 = FallbackEnum.ADAPTER_FACTORY .create(String.class, Collections.<Annotation>emptySet(), moshi); assertThat(adapter1).isNull(); JsonAdapter<?> adapter2 = FallbackEnum.ADAPTER_FACTORY .create(Roshambo.class, Collections.singleton(Wrapped.Factory.create("")), moshi); assertThat(adapter2).isNull(); }
@SuppressWarnings("unchecked") // It's the callers responsibility. private <T> JsonAdapter<T> geoCodeAdapter(Type type) { return (JsonAdapter<T>) GeoCodeJsonAdapter.FACTORY.create(type, Collections.<Annotation>emptySet(), moshi); } }
@SuppressWarnings("unchecked") // It's the callers responsibility. private <T> JsonAdapter<T> timeZoneAdapter(Type type) { return (JsonAdapter<T>) TimeZoneJsonAdapter.FACTORY.create(type, Collections.<Annotation>emptySet(), moshi); } }
@SuppressWarnings("unchecked") private <T> JsonAdapter<T> birthdayAdapter(Type type, Set<? extends Annotation> annotations) { return (JsonAdapter<T>) BirthDateJsonAdapter.FACTORY.create(type, annotations, moshi); } }
@Test public void ignoresOtherTypes() throws Exception { JsonAdapter<?> adapter1 = PhoneJsonAdapter.FACTORY.create( String.class, Collections.<Annotation>emptySet(), moshi); assertThat(adapter1).isNull(); Set<Annotation> annotations = new LinkedHashSet<>(1); annotations.add(mock(Annotation.class)); JsonAdapter<?> adapter2 = PhoneJsonAdapter.FACTORY.create( Phone.class, annotations, moshi); assertThat(adapter2).isNull(); }
@Test public void ignoresOtherTypes() throws Exception { JsonAdapter<?> adapter1 = SafeCalendarJsonAdapter.FACTORY.create( String.class, Collections.<Annotation>emptySet(), moshi); assertThat(adapter1).isNull(); Set<Annotation> annotations = new LinkedHashSet<>(1); annotations.add(mock(Annotation.class)); JsonAdapter<?> adapter2 = SafeCalendarJsonAdapter.FACTORY.create( Calendar.class, annotations, moshi); assertThat(adapter2).isNull(); }
@CheckReturnValue @SuppressWarnings("unchecked") // Factories are required to return only matching JsonAdapters. public <T> JsonAdapter<T> nextAdapter(JsonAdapter.Factory skipPast, Type type, Set<? extends Annotation> annotations) { if (annotations == null) throw new NullPointerException("annotations == null"); type = canonicalize(type); int skipPastIndex = factories.indexOf(skipPast); if (skipPastIndex == -1) { throw new IllegalArgumentException("Unable to skip past unknown factory " + skipPast); } for (int i = skipPastIndex + 1, size = factories.size(); i < size; i++) { JsonAdapter<T> result = (JsonAdapter<T>) factories.get(i).create(type, annotations, this); if (result != null) return result; } throw new IllegalArgumentException("No next JsonAdapter for " + typeAnnotatedWithAnnotations(type, annotations)); }