src/core/net/sf/basedb/util/encode/TabCrLfEncoderDecoder.java

Code
Comments
Other
Rev Date Author Line
5188 09 Nov 09 nicklas 1 /**
5188 09 Nov 09 nicklas 2   $Id $
5188 09 Nov 09 nicklas 3
5188 09 Nov 09 nicklas 4   Copyright (C) 2009 Nicklas Nordborg
5188 09 Nov 09 nicklas 5
5188 09 Nov 09 nicklas 6   This file is part of BASE - BioArray Software Environment.
5188 09 Nov 09 nicklas 7   Available at http://base.thep.lu.se/
5188 09 Nov 09 nicklas 8
5188 09 Nov 09 nicklas 9   BASE is free software; you can redistribute it and/or
5188 09 Nov 09 nicklas 10   modify it under the terms of the GNU General Public License
5188 09 Nov 09 nicklas 11   as published by the Free Software Foundation; either version 3
5188 09 Nov 09 nicklas 12   of the License, or (at your option) any later version.
5188 09 Nov 09 nicklas 13
5188 09 Nov 09 nicklas 14   BASE is distributed in the hope that it will be useful,
5188 09 Nov 09 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
5188 09 Nov 09 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5188 09 Nov 09 nicklas 17   GNU General Public License for more details.
5188 09 Nov 09 nicklas 18
5188 09 Nov 09 nicklas 19   You should have received a copy of the GNU General Public License
5188 09 Nov 09 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5188 09 Nov 09 nicklas 21 */
5188 09 Nov 09 nicklas 22 package net.sf.basedb.util.encode;
5188 09 Nov 09 nicklas 23
5188 09 Nov 09 nicklas 24 /**
5188 09 Nov 09 nicklas 25   Symmetrical encoder/decoder implementation that replaces newline, carriage return, 
5188 09 Nov 09 nicklas 26   tab and backslash with \n, \r, \t and \\. This encoder is suitable for use with
5188 09 Nov 09 nicklas 27   tab-separated text files.
5193 27 Nov 09 nicklas 28   
5188 09 Nov 09 nicklas 29   @author Nicklas
5188 09 Nov 09 nicklas 30   @since 2.15
5188 09 Nov 09 nicklas 31 */
5188 09 Nov 09 nicklas 32 public class TabCrLfEncoderDecoder 
5188 09 Nov 09 nicklas 33   implements EncoderDecoder 
5188 09 Nov 09 nicklas 34 {
5188 09 Nov 09 nicklas 35
5193 27 Nov 09 nicklas 36   private final boolean nullIsEmptyString;
5188 09 Nov 09 nicklas 37   
5193 27 Nov 09 nicklas 38   /**
5193 27 Nov 09 nicklas 39     Creates a new encoder/decoder.
5193 27 Nov 09 nicklas 40     @param nullIsEmptyString TRUE to encode null as empty string,
5193 27 Nov 09 nicklas 41       FALSE to not encode null. NOTE! If TRUE, this encoder is no
5193 27 Nov 09 nicklas 42       longer symmetrical
5193 27 Nov 09 nicklas 43   */
5193 27 Nov 09 nicklas 44   public TabCrLfEncoderDecoder(boolean nullIsEmptyString)
5193 27 Nov 09 nicklas 45   {
5193 27 Nov 09 nicklas 46     this.nullIsEmptyString = nullIsEmptyString;
5193 27 Nov 09 nicklas 47   }
5193 27 Nov 09 nicklas 48   
5188 09 Nov 09 nicklas 49   /*
5188 09 Nov 09 nicklas 50     From the EncoderDecoder interface
5188 09 Nov 09 nicklas 51     ---------------------------------
5188 09 Nov 09 nicklas 52   */
5188 09 Nov 09 nicklas 53   @Override
5188 09 Nov 09 nicklas 54   public boolean isSymmetrical() 
5188 09 Nov 09 nicklas 55   {
5193 27 Nov 09 nicklas 56     return !nullIsEmptyString;
5188 09 Nov 09 nicklas 57   }
5188 09 Nov 09 nicklas 58
5188 09 Nov 09 nicklas 59   @Override
5188 09 Nov 09 nicklas 60   public String decode(String s) 
5188 09 Nov 09 nicklas 61   {
5188 09 Nov 09 nicklas 62     if (s == null) return null;
5193 27 Nov 09 nicklas 63     if (s.length() == 0) return nullIsEmptyString ? null : s;
5188 09 Nov 09 nicklas 64     boolean neededDecode = false;
5188 09 Nov 09 nicklas 65     StringBuilder sb = new StringBuilder(s.length());
5188 09 Nov 09 nicklas 66     for (int i = 0; i < s.length(); ++i)
5188 09 Nov 09 nicklas 67     {
5188 09 Nov 09 nicklas 68       char c = s.charAt(i);
5188 09 Nov 09 nicklas 69       if (c == '\\' && i < s.length() - 1)
5188 09 Nov 09 nicklas 70       {
5188 09 Nov 09 nicklas 71         ++i;
5188 09 Nov 09 nicklas 72         c = s.charAt(i);
5188 09 Nov 09 nicklas 73         if (c == 't')
5188 09 Nov 09 nicklas 74         {
5188 09 Nov 09 nicklas 75           sb.append("\t");
5188 09 Nov 09 nicklas 76           neededDecode = true;
5188 09 Nov 09 nicklas 77         }
5188 09 Nov 09 nicklas 78         else if (c == 'n')
5188 09 Nov 09 nicklas 79         {
5188 09 Nov 09 nicklas 80           sb.append("\n");
5188 09 Nov 09 nicklas 81           neededDecode = true;
5188 09 Nov 09 nicklas 82         }
5188 09 Nov 09 nicklas 83         else if (c == 'r')
5188 09 Nov 09 nicklas 84         {
5188 09 Nov 09 nicklas 85           sb.append("\r");
5188 09 Nov 09 nicklas 86           neededDecode = true;
5188 09 Nov 09 nicklas 87         }
5188 09 Nov 09 nicklas 88         else if (c == '\\')
5188 09 Nov 09 nicklas 89         {
5188 09 Nov 09 nicklas 90           sb.append("\\");
5188 09 Nov 09 nicklas 91           neededDecode = true;
5188 09 Nov 09 nicklas 92         }
5188 09 Nov 09 nicklas 93         else
5188 09 Nov 09 nicklas 94         {
5188 09 Nov 09 nicklas 95           // Hmm... \ followed by something else than n, r, t, or \... 
5188 09 Nov 09 nicklas 96           // pass through unmodified since it is better to be nice...
5188 09 Nov 09 nicklas 97           sb.append("\\").append(c);
5188 09 Nov 09 nicklas 98         }
5188 09 Nov 09 nicklas 99       }
5188 09 Nov 09 nicklas 100       else
5188 09 Nov 09 nicklas 101       {
5188 09 Nov 09 nicklas 102         sb.append(c);
5188 09 Nov 09 nicklas 103       }
5188 09 Nov 09 nicklas 104     }
5188 09 Nov 09 nicklas 105     return neededDecode ? sb.toString() : s;
5188 09 Nov 09 nicklas 106   }
5188 09 Nov 09 nicklas 107
5188 09 Nov 09 nicklas 108   @Override
5188 09 Nov 09 nicklas 109   public String encode(String s) 
5188 09 Nov 09 nicklas 110   {
5193 27 Nov 09 nicklas 111     if (s == null) return nullIsEmptyString ? "" : null;
5188 09 Nov 09 nicklas 112     boolean neededEncode = false;
5188 09 Nov 09 nicklas 113     StringBuilder sb = new StringBuilder(s.length());
5188 09 Nov 09 nicklas 114     for (int i = 0; i < s.length(); ++i)
5188 09 Nov 09 nicklas 115     {
5188 09 Nov 09 nicklas 116       char c = s.charAt(i);
5188 09 Nov 09 nicklas 117       if (c == '\t')
5188 09 Nov 09 nicklas 118       {
5188 09 Nov 09 nicklas 119         sb.append("\\t");
5188 09 Nov 09 nicklas 120         neededEncode = true;
5188 09 Nov 09 nicklas 121       }
5188 09 Nov 09 nicklas 122       else if (c == '\n')
5188 09 Nov 09 nicklas 123       {
5188 09 Nov 09 nicklas 124         sb.append("\\n");
5188 09 Nov 09 nicklas 125         neededEncode = true;
5188 09 Nov 09 nicklas 126       }
5188 09 Nov 09 nicklas 127       else if (c == '\r')
5188 09 Nov 09 nicklas 128       {
5188 09 Nov 09 nicklas 129         sb.append("\\r");
5188 09 Nov 09 nicklas 130         neededEncode = true;
5188 09 Nov 09 nicklas 131       }
5188 09 Nov 09 nicklas 132       else if (c == '\\')
5188 09 Nov 09 nicklas 133       {
5188 09 Nov 09 nicklas 134         sb.append("\\\\");
5188 09 Nov 09 nicklas 135         neededEncode = true;
5188 09 Nov 09 nicklas 136       }
5188 09 Nov 09 nicklas 137       else
5188 09 Nov 09 nicklas 138       {
5188 09 Nov 09 nicklas 139         sb.append(c);
5188 09 Nov 09 nicklas 140       }
5188 09 Nov 09 nicklas 141     }
5188 09 Nov 09 nicklas 142     return neededEncode ? sb.toString() : s;
5188 09 Nov 09 nicklas 143   }
5188 09 Nov 09 nicklas 144   // -------------------------------------------
5188 09 Nov 09 nicklas 145
5188 09 Nov 09 nicklas 146 }