package io.ebeaninternal.server.type; import io.ebean.text.TextException; import io.ebeaninternal.server.core.BasicTypeConverter; import io.ebeanservice.docstore.api.mapping.DocPropertyType; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; import java.sql.Types; /** * ScalarType for Boolean and boolean. * <p> * This may or may not be a native jdbc type depending on the database and jdbc driver. * </p> */ public class ScalarTypeBoolean { public static class Native extends BooleanBase { /** * Native Boolean database type. */ public Native() { super(true, Types.BOOLEAN); } @Override public String getDbFalseLiteral() { return "false"; } @Override public String getDbTrueLiteral() { return "true"; } @Override public Boolean toBeanType(Object value) { return BasicTypeConverter.toBoolean(value); } @Override public Object toJdbcType(Object value) { return BasicTypeConverter.convert(value, jdbcType); } @Override public void bind(DataBind b, Boolean value) throws SQLException { if (value == null) { b.setNull(Types.BOOLEAN); } else { b.setBoolean(value); } } @Override public Boolean read(DataReader dataReader) throws SQLException { return dataReader.getBoolean(); } } /** * The Class BitBoolean converts a JDBC type BIT to a java boolean * <p/> * <p> * Sometimes booleans may be mapped to the JDBC type BIT. To use the BitBoolean specify * type.boolean.dbtype="bit" in the ebean configuration * </p> */ static class BitBoolean extends BooleanBase { /** * Native Boolean database type. */ BitBoolean() { super(true, Types.BIT); } @Override public String getDbFalseLiteral() { return "0"; } @Override public String getDbTrueLiteral() { return "1"; } @Override public Boolean toBeanType(Object value) { return BasicTypeConverter.toBoolean(value); } @Override public Object toJdbcType(Object value) { // use JDBC driver to convert boolean to bit return BasicTypeConverter.toBoolean(value); } @Override public void bind(DataBind b, Boolean value) throws SQLException { if (value == null) { b.setNull(Types.BIT); } else { // use JDBC driver to convert boolean to bit b.setBoolean(value); } } @Override public Boolean read(DataReader dataReader) throws SQLException { return dataReader.getBoolean(); } } /** * Converted to/from an Integer in the Database. */ static class IntBoolean extends BooleanBase { private final Integer trueValue; private final Integer falseValue; IntBoolean(Integer trueValue, Integer falseValue) { super(false, Types.INTEGER); this.trueValue = trueValue; this.falseValue = falseValue; } @Override public String getDbFalseLiteral() { return falseValue.toString(); } @Override public String getDbTrueLiteral() { return trueValue.toString(); } @Override public int getLength() { return 1; } @Override public void bind(DataBind b, Boolean value) throws SQLException { if (value == null) { b.setNull(Types.INTEGER); } else { b.setInt(toInteger(value)); } } @Override public Boolean read(DataReader dataReader) throws SQLException { Integer i = dataReader.getInt(); if (i == null) { return null; } if (i.equals(trueValue)) { return Boolean.TRUE; } else { return Boolean.FALSE; } } @Override public Object toJdbcType(Object value) { return toInteger(value); } /** * Convert the Boolean value to the db value. */ Integer toInteger(Object value) { if (value == null) { return null; } Boolean b = (Boolean) value; return b ? trueValue : falseValue; } /** * Convert the db value to the Boolean value. */ @Override public Boolean toBeanType(Object value) { if (value == null) { return null; } if (value instanceof Boolean) { return (Boolean) value; } if (trueValue.equals(value)) { return Boolean.TRUE; } else { return Boolean.FALSE; } } } /** * Converted to/from an Integer in the Database. */ static class StringBoolean extends BooleanBase { private final String trueValue; private final String falseValue; StringBoolean(String trueValue, String falseValue) { super(false, Types.VARCHAR); this.trueValue = trueValue; this.falseValue = falseValue; } @Override public String getDbFalseLiteral() { return "'" + falseValue + "'"; } @Override public String getDbTrueLiteral() { return "'" + trueValue + "'"; } @Override public int getLength() { // typically this will return 1 return Math.max(trueValue.length(), falseValue.length()); } @Override public void bind(DataBind b, Boolean value) throws SQLException { if (value == null) { b.setNull(Types.VARCHAR); } else { b.setString(toString(value)); } } @Override public Boolean read(DataReader dataReader) throws SQLException { String string = dataReader.getString(); if (string == null) { return null; } if (string.equals(trueValue)) { return Boolean.TRUE; } else { return Boolean.FALSE; } } @Override public Object toJdbcType(Object value) { return toString(value); } /** * Convert the Boolean value to the db value. */ public String toString(Object value) { if (value == null) { return null; } Boolean b = (Boolean) value; return b ? trueValue : falseValue; } /** * Convert the db value to the Boolean value. */ @Override public Boolean toBeanType(Object value) { if (value == null) { return null; } if (value instanceof Boolean) { return (Boolean) value; } if (trueValue.equals(value)) { return Boolean.TRUE; } else { return Boolean.FALSE; } } } public static abstract class BooleanBase extends ScalarTypeBase<Boolean> implements ScalarTypeBool { BooleanBase(boolean jdbcNative, int jdbcType) { super(Boolean.class, jdbcNative, jdbcType); } /** * Return the DB literal value for false. */ @Override public abstract String getDbFalseLiteral(); /** * Return the DB literal value for true. */ @Override public abstract String getDbTrueLiteral(); @Override public String formatValue(Boolean t) { return t.toString(); } @Override public Boolean parse(String value) { return Boolean.valueOf(value); } @Override public Boolean convertFromMillis(long systemTimeMillis) { throw new TextException("Not Supported"); } @Override public boolean isDateTimeCapable() { return false; } @Override public Boolean readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { return null; } else { return dataInput.readBoolean(); } } @Override public void writeData(DataOutput dataOutput, Boolean val) throws IOException { if (val == null) { dataOutput.writeBoolean(false); } else { dataOutput.writeBoolean(true); dataOutput.writeBoolean(val); } } @Override public Boolean jsonRead(JsonParser parser) { return JsonToken.VALUE_TRUE == parser.getCurrentToken() ? Boolean.TRUE : Boolean.FALSE; } @Override public void jsonWrite(JsonGenerator writer, Boolean value) throws IOException { writer.writeBoolean(value); } @Override public DocPropertyType getDocType() { return DocPropertyType.BOOLEAN; } } }