/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.core.tables.beans; import java.awt.Color; import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import com.opendoorlogistics.api.geometry.ODLGeom; import com.opendoorlogistics.api.tables.ODLColumnType; import com.opendoorlogistics.api.tables.ODLTime; import com.opendoorlogistics.core.geometry.ODLGeomImpl; import com.opendoorlogistics.core.tables.ColumnValueProcessor; import com.vividsolutions.jts.geom.Geometry; final public class BeanTypeConversion { private interface ODLTypeToExternalJavaType { Object convertOdlTypeToExternalJavaType(Object odlType); } private static class SupportedType { private final Class<?> externalType; private final ODLColumnType odlType; private final ODLTypeToExternalJavaType odlTypeToExternalJavaType; public SupportedType(Class<?> externalType, ODLColumnType odlType, ODLTypeToExternalJavaType odlTypeToExternalJavaType) { super(); this.externalType = externalType; this.odlType = odlType; this.odlTypeToExternalJavaType = odlTypeToExternalJavaType; } } private static final HashMap<Class<?>, SupportedType> supportedTypes = new HashMap<>(); static { ArrayList<SupportedType> types = new ArrayList<>(); // include the 'no conversion' supported types (i.e. converting Long to Long etc...) for(ODLColumnType col : ODLColumnType.values()){ types.add(new SupportedType(ColumnValueProcessor.getJavaClass(col), col, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return odlType; } })); } // types.add(new SupportedType(Long.class, ODLColumnType.LONG, new ODLTypeToJavaType() { // // @Override // public Object toJavaType(Object odlType) { // return odlType; // } // })); types.add(new SupportedType(Long.TYPE, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return odlType; } })); types.add(new SupportedType(Integer.class, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Long) odlType).intValue(); } })); types.add(new SupportedType(Integer.TYPE, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Long) odlType).intValue(); } })); types.add(new SupportedType(Short.class, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Long) odlType).shortValue(); } })); types.add(new SupportedType(Short.TYPE, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Long) odlType).shortValue(); } })); types.add(new SupportedType(Byte.class, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Long) odlType).byteValue(); } })); types.add(new SupportedType(Byte.TYPE, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Long) odlType).byteValue(); } })); types.add(new SupportedType(Boolean.class, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { if (odlType == null) { return null; } return ((Long) odlType) == 1; } })); types.add(new SupportedType(Boolean.TYPE, ODLColumnType.LONG, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { if (odlType == null) { return false; } return ((Long) odlType) == 1; } })); // types.add(new SupportedType(Double.class, ODLColumnType.DOUBLE, new ODLTypeToJavaType() { // // @Override // public Object toJavaType(Object odlType) { // return odlType; // } // })); types.add(new SupportedType(Double.TYPE, ODLColumnType.DOUBLE, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return odlType; } })); types.add(new SupportedType(Float.class, ODLColumnType.DOUBLE, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Double) odlType).floatValue(); } })); types.add(new SupportedType(Float.TYPE, ODLColumnType.DOUBLE, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((Double) odlType).floatValue(); } })); // types.add(new SupportedType(String.class, ODLColumnType.STRING, new ODLTypeToJavaType() { // // @Override // public Object toJavaType(Object odlType) { // return odlType; // } // })); types.add(new SupportedType(Color.class, ODLColumnType.COLOUR, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return odlType; } })); types.add(new SupportedType(Geometry.class, ODLColumnType.GEOM, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return ((ODLGeomImpl)odlType).getJTSGeometry(); } })); types.add(new SupportedType(ODLGeom.class, ODLColumnType.GEOM, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { return odlType; } })); types.add(new SupportedType(ODLTime.class, ODLColumnType.TIME, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { // no actual conversion return odlType; } })); types.add(new SupportedType(LocalDate.class, ODLColumnType.DATE, new ODLTypeToExternalJavaType() { @Override public Object convertOdlTypeToExternalJavaType(Object odlType) { // no actual conversion return odlType; } })); for (SupportedType type : types) { supportedTypes.put(type.externalType, type); } } /** * Get the java type ODL uses internally for the external java type * @param externalType * @return */ public static ODLColumnType getInternalType(Class<?> externalType){ SupportedType type = supportedTypes.get(externalType); if(type!=null){ return type.odlType; } // for jts Geometry types we have an inheritance hierarchy and // hence we also allow subtypes of Geometry if(Geometry.class.isAssignableFrom(externalType)){ return ODLColumnType.GEOM; } return null; } /** * Get the external value from an internal one. * The internal one is the type used by ODL's column values. * @param externalType * @param internalValue * @return */ public static Object getExternalValue(Class<?> externalType, Object internalValue){ if(internalValue==null){ return null; } SupportedType supportedType = supportedTypes.get(externalType); if(supportedType==null){ throw new RuntimeException("Unsupported java type"); } return supportedType.odlTypeToExternalJavaType.convertOdlTypeToExternalJavaType(internalValue); } }