/** * Copyright (c) 2011-2014, OpenIoT * * This file is part of OpenIoT. * * OpenIoT is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * OpenIoT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenIoT. If not, see <http://www.gnu.org/licenses/>. * * Contact: OpenIoT mailto: info@openiot.eu * @author Jerome Rousselot * @author rhietala * @author Ali Salehi */ package org.openiot.gsn.beans; import org.openiot.gsn.utils.GSNRuntimeException; import java.sql.Types; import java.util.Date; import java.util.regex.Pattern; import org.apache.log4j.Logger; public class DataTypes { public final static String OPTIONAL_NUMBER_PARAMETER = "\\s*(\\(\\s*\\d+\\s*\\))?"; public final static String REQUIRED_NUMBER_PARAMETER = "\\s*\\(\\s*\\d+\\s*\\)"; private final static transient Logger logger = Logger.getLogger( DataTypes.class ); // NEXT FIELD public final static String VAR_CHAR_PATTERN_STRING = "\\s*varchar" + REQUIRED_NUMBER_PARAMETER + "\\s*"; public final static byte VARCHAR = 0; public final static String VARCHAR_NAME = "Varchar"; // NEXT FIELD public final static String CHAR_PATTERN_STRING = "\\s*char" + REQUIRED_NUMBER_PARAMETER + "\\s*"; public final static byte CHAR = 1; public final static String CHAR_NAME = "Char"; // NEXT FIELD public final static String INTEGER_PATTERN_STRING = "\\s*((INTEGER)|(INT))\\s*"; public final static byte INTEGER = 2; public final static String INTEGER_NAME = "Integer"; // NEXT FIELD public final static String BIGINT_PATTERN_STRING = "\\s*BIGINT\\s*"; public final static byte BIGINT = 3; public final static String BIGINT_NAME = "BigInt"; // NEXT FIELD public final static String BINARY_PATTERN_STRING = "\\s*(BINARY|BLOB)" + OPTIONAL_NUMBER_PARAMETER + "(\\s*:.*)?"; public final static byte BINARY = 4; public final static String BINARY_NAME = "Binary"; // NEXT FIELD public final static String DOUBLE_PATTERN_STRING = "\\s*DOUBLE\\s*"; public final static byte DOUBLE = 5; public final static String DOUBLE_NAME = "Double"; // NEXT FIELD /** * Type Time is not supported at the moment. If you want to present time, please use * longint. For more information consult the GSN mailing list on the same subject. */ public final static String TIME_PATTERN_STRING = "\\s*TIME\\s*"; public final static byte TIME = 6; public final static String TIME_NAME = "Time"; // NEXT FIELD public final static String TINYINT_PATTERN_STRING = "\\s*TINYINT\\s*"; public final static byte TINYINT = 7; public final static String TINYINT_NAME = "TinyInt"; // NEXT FIELD public final static String SMALLINT_PATTERN_STRING = "\\s*SMALLINT\\s*"; public final static byte SMALLINT = 8; public final static String SMALLINT_NAME = "SmallInt"; // FINISH public final static Pattern [ ] ALL_PATTERNS = new Pattern [ ] { Pattern.compile( VAR_CHAR_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( CHAR_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( INTEGER_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( BIGINT_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( BINARY_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( DOUBLE_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( TIME_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( TINYINT_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) , Pattern.compile( SMALLINT_PATTERN_STRING , Pattern.CASE_INSENSITIVE ) }; public final static StringBuilder ERROR_MESSAGE = new StringBuilder( "Acceptable types are (TINYINT, SMALLINT, INTEGER,BIGINT,CHAR(#),BINARY[(#)],VARCHAR(#),DOUBLE,TIME)." ); public final static String [ ] TYPE_NAMES = new String [ ] { VARCHAR_NAME , CHAR_NAME , INTEGER_NAME , BIGINT_NAME , BINARY_NAME , DOUBLE_NAME , TIME_NAME , TINYINT_NAME , SMALLINT_NAME }; public final static Object [ ] TYPE_SAMPLE_VALUES = { "A chain of chars" , 'c' , new Integer( 32 ) , new Integer( 66000 ) , new Byte( ( byte ) 12 ) , new Double( 3.141592 ) , new Date( ).getTime( ) , new Integer( 1 ) , new Integer( 9 ) }; public static byte convertTypeNameToGSNTypeID ( final String type ) { if ( type == null ) throw new GSNRuntimeException( new StringBuilder( "The type *null* is not recoginzed by GSN." ).append( DataTypes.ERROR_MESSAGE ).toString( ) ); if(type.trim().equalsIgnoreCase("string")) return DataTypes.VARCHAR; for ( byte i = 0 ; i < DataTypes.ALL_PATTERNS.length ; i++ ) if ( DataTypes.ALL_PATTERNS[ i ].matcher( type ).matches( ) ){ return i; } if(type.trim().equalsIgnoreCase("numeric")) return DataTypes.DOUBLE; throw new GSNRuntimeException( new StringBuilder( "The type *" ).append( type ).append( "* is not recognized." ).append( DataTypes.ERROR_MESSAGE ).toString( ) ); } /** * throws runtime exception if the type conversion fails. * @param sqlType * @return */ public static byte SQLTypeToGSNTypeSimplified(int sqlType) { if (sqlType == Types.BIGINT || sqlType == Types.SMALLINT || sqlType == Types.DOUBLE || sqlType==Types.INTEGER || sqlType == Types.DECIMAL||sqlType == Types.REAL || sqlType == Types.FLOAT|| sqlType == Types.NUMERIC ) return DataTypes.DOUBLE; else if (sqlType == Types.VARCHAR || sqlType == Types.CHAR|| sqlType == Types.LONGNVARCHAR || sqlType == Types.LONGVARCHAR || sqlType== Types.NCHAR ) return DataTypes.VARCHAR; else if (sqlType == Types.BINARY || sqlType == Types.BLOB|| sqlType == Types.VARBINARY ) return DataTypes.BINARY; throw new RuntimeException("Can't convert SQL type id of: "+sqlType+ " to GSN type id."); } }