/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.datasource.graphene; import java.util.ArrayList; import java.util.List; import org.diirt.datasource.ReadFunction; import org.diirt.vtype.ValueUtil; /** * * @author carcassi */ public class CheckedReadFunction<T> implements ReadFunction<T> { private final Class<T> clazz; private final Class<? extends T>[] classes; private final ReadFunction<?> arg; private final String argName; public CheckedReadFunction(ReadFunction<?> arg, String argName, Class<T> clazz) { if (clazz == null) { throw new NullPointerException("Class can't be null"); } this.clazz = clazz; this.classes = null; this.arg = arg; this.argName = argName; } @SafeVarargs public CheckedReadFunction(ReadFunction<?> arg, String argName, Class<? extends T>... classes) { if (classes == null) { throw new NullPointerException("Classes can't be null"); } this.clazz = null; this.classes = classes; this.arg = arg; this.argName = argName; } @Override public T readValue() { Object obj = arg.readValue(); if (obj == null) { return null; } if (clazz != null) { if (clazz.isInstance(obj)) { return clazz.cast(obj); } else { throw new RuntimeException(argName + " must be a " + clazz.getSimpleName() + " (was " + ValueUtil.typeOf(obj).getSimpleName() + ")"); } } else { for (Class<? extends T> aClass : classes) { if (aClass.isInstance(obj)) { return aClass.cast(obj); } } StringBuilder sb = new StringBuilder(); List<String> names = new ArrayList<>(); for (Class<? extends T> aClass : classes) { names.add(aClass.getSimpleName()); } throw new RuntimeException(argName + " must be one of " + names.toString() + " (was " + ValueUtil.typeOf(obj).getSimpleName() + ")"); } } }