All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sourceforge.squirrel_sql.client.session.schemainfo.CaseInsensitiveString Maven / Gradle / Ivy

Go to download

This is the jar that contains the main application classes which are very specific to SQuirreLSQL.

There is a newer version: 3.5.0
Show newest version
package net.sourceforge.squirrel_sql.client.session.schemainfo;

import java.io.Serializable;
import java.util.HashMap;


/**
 * This class was introduced to allow the Syntax plugin
 * to find out if a token is a column, table, etc without
 * creating new String objects.
 * Since syntax highlightning needs a lot of those checks
 * the usage of this class leads to better performance and
 * memory finger print.
 */
public class CaseInsensitiveString implements Comparable, 
                                              Serializable
{
   private static final long serialVersionUID = -4625230597578277614L;
   private char[] value = new char[0];
   private int offset = 0;
   private int count = 0;
   private int hash = 0;
   private boolean _isMutable;

   private static HashMap upChars;
   private static HashMap lcChars;
   
   static {
       if (upChars == null) {
           upChars = new HashMap();
       }
       if (lcChars == null) {
           lcChars = new HashMap();
       }
   }
   
   public CaseInsensitiveString(String s)
   {
      value = new char[s.length()];
      s.getChars(0, s.length(), value, 0);
      offset = 0;
      count = s.length();
      hash = 0;
      _isMutable = false;
   }

   public CaseInsensitiveString()
   {
      _isMutable = true;
   }

   public void setCharBuffer(char[] buffer, int beginIndex, int len)
   {
      if(false == _isMutable)
      {
         throw new UnsupportedOperationException("This CaseInsensitiveString is immutable");
      }

      value = buffer;
      offset = beginIndex;
      count = len;
      hash = 0;
   }

   public int hashCode()
   {
      int h = hash;
      if (h == 0)
      {
         int off = offset;
         char val[] = value;
         int len = count;

         for (int i = 0; i < len; i++)
         {
            h = 31 * h + toUpperCase(val[off++]);
         }
         hash = h;
      }
      return h;
   }

   public boolean equals(Object obj)
   {
   	if (obj == null) {
   		return false;
   	}
      if(obj instanceof String)
      {
         String other = (String) obj;

         if(other.length() != count)
         {
            return false;
         }

         for(int i=0; i < count; ++i)
         {
            char c1 = value[offset + i];
            char c2 = other.charAt(i);


            // If characters don't match but case may be ignored,
            // try converting both characters to uppercase.
            // If the results match, then the comparison scan should
            // continue.
            char u1 = toUpperCase(c1);
            char u2 = toUpperCase(c2);
            if (u1 == u2)
            {
               continue;
            }
            // Unfortunately, conversion to uppercase does not work properly
            // for the Georgian alphabet, which has strange rules about case
            // conversion.  So we need to make one last check before
            // exiting.
            if (Character.toLowerCase(u1) == Character.toLowerCase(u2))
            {
               continue;
            }

            return false;
         }
         return true;
      }
      else if(obj.getClass() == this.getClass())
      {
         CaseInsensitiveString other = (CaseInsensitiveString) obj;


         if(other.count != count)
         {
            return false;
         }

         for(int i=0; i < count; ++i)
         {
            char c1 = value[offset + i];
            char c2 = other.value[other.offset + i];


            // If characters don't match but case may be ignored,
            // try converting both characters to uppercase.
            // If the results match, then the comparison scan should
            // continue.
            char u1 = Character.toUpperCase(c1);
            char u2 = Character.toUpperCase(c2);
            if (u1 == u2)
            {
               continue;
            }
            // Unfortunately, conversion to uppercase does not work properly
            // for the Georgian alphabet, which has strange rules about case
            // conversion.  So we need to make one last check before
            // exiting.
            if (toLowerCase(u1) == toLowerCase(u2))
            {
               continue;
            }

            return false;
         }
         return true;

      }
      else
      {
         return false;
      }
   }

   public String toString()
   {
      return new String(value, offset, count);
   }

   public int compareTo(CaseInsensitiveString anotherString)
   {
      int len1 = count;
      int len2 = anotherString.count;
      int n = Math.min(len1, len2);
      char v1[] = value;
      char v2[] = anotherString.value;
      int i = offset;
      int j = anotherString.offset;

      if (i == j)
      {
         int k = i;
         int lim = n + i;
         while (k < lim)
         {
            char c1 = v1[k];
            char c2 = v2[k];
            if (toLowerCase(c1) != toLowerCase(c2))
            {
               return toLowerCase(c1) - toLowerCase(c2);
            }
            k++;
         }
      }
      else
      {
         while (n-- != 0)
         {
            char c1 = v1[i++];
            char c2 = v2[j++];
            if (toLowerCase(c1) != toLowerCase(c2))
            {
               return toLowerCase(c1) - toLowerCase(c2);
            }
         }
      }
      return len1 - len2;
   }
   
   private char toLowerCase(char c) {
       char result = c;
       Character key = Character.valueOf(c);
       if (lcChars.containsKey(key)) {
           return lcChars.get(key).charValue();
       }
       if (Character.isUpperCase(c)) {
           result = Character.toLowerCase(c);
       }
       lcChars.put(key, Character.valueOf(result));
       return result;
   }
   
   private char toUpperCase(char c) {
       char result = c;
       Character key = Character.valueOf(c);
       if (upChars.containsKey(key)) {
           return upChars.get(key).charValue();
       }
       if (Character.isLowerCase(c)) {
           result = Character.toUpperCase(c);
       }
       upChars.put(key, Character.valueOf(result));
       return result;
   }
   
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy