/* * Copyright (c) 2017 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.magma; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.NoSuchElementException; import java.util.Set; import javax.annotation.Nullable; import javax.validation.constraints.NotNull; import org.obiba.magma.type.AnyToTextValueConverter; import org.obiba.magma.type.BinaryType; import org.obiba.magma.type.BooleanType; import org.obiba.magma.type.DateTimeType; import org.obiba.magma.type.DateType; import org.obiba.magma.type.DatetimeValueConverter; import org.obiba.magma.type.DecimalType; import org.obiba.magma.type.IdentityValueConverter; import org.obiba.magma.type.IntegerType; import org.obiba.magma.type.LineStringType; import org.obiba.magma.type.LocaleType; import org.obiba.magma.type.NumericValueConverter; import org.obiba.magma.type.PointType; import org.obiba.magma.type.PolygonType; import org.obiba.magma.type.TextToAnyTypeValueConverter; import org.obiba.magma.type.TextToNumericTypeValueConverter; import org.obiba.magma.type.TextType; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; class ValueTypeFactory { private final Set<ValueType> types = new HashSet<>(); private final Collection<ValueConverter> converters = new LinkedHashSet<>(); ValueTypeFactory() { registerBuiltInTypes(); } ValueType forClass(final Class<?> javaClass) { try { return Iterables.find(types, new Predicate<ValueType>() { @Override public boolean apply(ValueType input) { return input.acceptsJavaClass(javaClass); } }); } catch(NoSuchElementException e) { throw new IllegalArgumentException("No ValueType for Java type " + javaClass.getName()); } } ValueType forName(@Nullable final String name) { try { return Iterables.find(types, new Predicate<ValueType>() { @Override public boolean apply(ValueType input) { return input.getName().equalsIgnoreCase(name); } }); } catch(NoSuchElementException e) { throw new IllegalArgumentException("No ValueType named " + name); } } Set<ValueType> getValueTypes() { return Collections.unmodifiableSet(types); } @NotNull ValueConverter converterFor(final ValueType from, final ValueType to) { try { return Iterables.find(converters, new Predicate<ValueConverter>() { @Override public boolean apply(ValueConverter input) { return input.converts(from, to); } }); } catch(NoSuchElementException e) { throw new IllegalArgumentException("No ValueConverter for " + from.getName() + "->" + to.getName()); } } private void registerBuiltInTypes() { types.add(TextType.get()); types.add(LocaleType.get()); types.add(DecimalType.get()); types.add(IntegerType.get()); types.add(BooleanType.get()); types.add(BinaryType.get()); types.add(DateTimeType.get()); types.add(DateType.get()); types.add(PointType.get()); types.add(LineStringType.get()); types.add(PolygonType.get()); converters.add(new IdentityValueConverter()); converters.add(new TextToNumericTypeValueConverter()); converters.add(new DatetimeValueConverter()); converters.add(new NumericValueConverter()); converters.add(new AnyToTextValueConverter()); converters.add(new TextToAnyTypeValueConverter()); } }