BinaryPoemType.java

  1. /*
  2.  * $Source$
  3.  * $Revision$
  4.  *
  5.  * Copyright (C) 2000 William Chesters
  6.  *
  7.  * Part of Melati (http://melati.org), a framework for the rapid
  8.  * development of clean, maintainable web applications.
  9.  *
  10.  * Melati is free software; Permission is granted to copy, distribute
  11.  * and/or modify this software under the terms either:
  12.  *
  13.  * a) the GNU General Public License as published by the Free Software
  14.  *    Foundation; either version 2 of the License, or (at your option)
  15.  *    any later version,
  16.  *
  17.  *    or
  18.  *
  19.  * b) any version of the Melati Software License, as published
  20.  *    at http://melati.org
  21.  *
  22.  * You should have received a copy of the GNU General Public License and
  23.  * the Melati Software License along with this program;
  24.  * if not, write to the Free Software Foundation, Inc.,
  25.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA to obtain the
  26.  * GNU General Public License and visit http://melati.org to obtain the
  27.  * Melati Software License.
  28.  *
  29.  * Feel free to contact the Developers of Melati (http://melati.org),
  30.  * if you would like to work out a different arrangement than the options
  31.  * outlined here.  It is our intention to allow Melati to be used by as
  32.  * wide an audience as possible.
  33.  *
  34.  * This program is distributed in the hope that it will be useful,
  35.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  36.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  37.  * GNU General Public License for more details.
  38.  *
  39.  * Contact details for copyright holder:
  40.  *
  41.  *     William Chesters <williamc At paneris.org>
  42.  *     http://paneris.org/~williamc
  43.  *     Obrechtstraat 114, 2517VX Den Haag, The Netherlands
  44.  */

  45. package org.melati.poem;

  46. import java.sql.PreparedStatement;
  47. import java.sql.ResultSet;
  48. import java.sql.SQLException;
  49. import java.sql.Types;

  50. import org.apache.commons.codec.binary.Base64;
  51. import org.melati.poem.dbms.Dbms;
  52. import org.melati.poem.util.StringUtils;

  53. /**
  54.  * A <tt>Blob</tt> {@link Field} type.
  55.  */
  56. public class BinaryPoemType extends SizedAtomPoemType<byte[]> {
  57.  
  58.   /**
  59.    * Constructor.
  60.    * @param nullable whether nullable
  61.    * @param size how big
  62.    */
  63.   public BinaryPoemType(boolean nullable, int size) {
  64.     super(Types.VARBINARY, "VARBINARY", nullable, size);
  65.   }

  66.   protected void _assertValidRaw(Object raw)
  67.       throws ValidationPoemException {
  68.     if (raw != null) {
  69.       if (!(raw instanceof byte[]))
  70.         throw new TypeMismatchPoemException(raw, this);
  71.       if (!sizeGreaterEqual(getSize(), ((byte[])raw).length))
  72.         throw new BinaryLengthValidationPoemException(this, (byte[])raw);
  73.     }
  74.   }

  75.   protected String _stringOfRaw(Object raw) {
  76.     return new String(Base64.encodeBase64((byte[])raw));
  77.   }

  78.   protected byte[] _getRaw(ResultSet rs, int col) throws SQLException {
  79.     return rs.getBytes(col);
  80.   }

  81.   protected void _setRaw(PreparedStatement ps, int col, Object string)
  82.       throws SQLException {
  83.     ps.setBytes(col, (byte[])string);
  84.   }

  85.   protected byte[] _rawOfString(String rawString) {
  86.     return Base64.decodeBase64(rawString.getBytes());
  87.   }

  88.   protected String _sqlDefinition(Dbms dbms) {
  89.     try {
  90.       return dbms.getBinarySqlDefinition(getSize());
  91.     } catch (SQLException e) {
  92.       throw new SQLSeriousPoemException(e);
  93.     }
  94.   }

  95.   protected boolean _canRepresent(SQLPoemType<?> other) {
  96.     return
  97.         sqlTypeCode() == other.sqlTypeCode() &&
  98.         other instanceof BinaryPoemType &&
  99.         sizeGreaterEqual(getSize(), ((BinaryPoemType)other).getSize());
  100.   }

  101.   /**
  102.    * {@inheritDoc}
  103.    * @see org.melati.poem.BasePoemType#toString()
  104.    */
  105.   public String toString() {
  106.     return (getNullable() ? "nullable " : "") + "binary(" + getSize() + ")";
  107.   }

  108.   /**
  109.    * {@inheritDoc}
  110.    * @see org.melati.poem.PoemType#toDsdType()
  111.    */
  112.   public String toDsdType() {
  113.     return "byte[]";
  114.   }

  115.   protected void _saveColumnInfo(ColumnInfo columnInfo)
  116.       throws AccessPoemException {
  117.     columnInfo.setTypefactory(PoemTypeFactory.BINARY);
  118.     columnInfo.setSize(getSize());
  119.   }

  120.   protected String _quotedRaw(Object raw) {
  121.     return StringUtils.quoted(_stringOfRaw(raw), '\'');
  122.   }

  123. }