001 /* 002 * Copyright (C) 2012 eXo Platform SAS. 003 * 004 * This is free software; you can redistribute it and/or modify it 005 * under the terms of the GNU Lesser General Public License as 006 * published by the Free Software Foundation; either version 2.1 of 007 * the License, or (at your option) any later version. 008 * 009 * This software is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * You should have received a copy of the GNU Lesser General Public 015 * License along with this software; if not, write to the Free 016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 018 */ 019 020 package org.crsh.util; 021 022 import java.io.Serializable; 023 024 /** 025 * An immutable sequence of white spaces. 026 */ 027 public class BlankSequence implements CharSequence, Serializable { 028 029 /** . */ 030 private static final BlankSequence[] CACHE = new BlankSequence[64]; 031 032 static { 033 for (int i = 0;i < CACHE.length;i++) { 034 CACHE[i] = new BlankSequence(i); 035 } 036 } 037 038 public static BlankSequence create(int length) { 039 if (length < 0) { 040 throw new IllegalArgumentException("No negative length accepted"); 041 } 042 if (length < CACHE.length) { 043 return CACHE[length]; 044 } else { 045 return new BlankSequence(length); 046 } 047 } 048 049 /** . */ 050 private final int length; 051 052 /** . */ 053 private String value; 054 055 /** 056 * Build a new blank sequence. 057 * 058 * @param length the length 059 * @throws IllegalArgumentException when length is negative 060 */ 061 private BlankSequence(int length) throws IllegalArgumentException { 062 if (length < 0) { 063 throw new IllegalArgumentException(); 064 } 065 066 // 067 this.length = length; 068 this.value = null; 069 } 070 071 public int length() { 072 return length; 073 } 074 075 public char charAt(int index) { 076 checkIndex("index", index); 077 return ' '; 078 } 079 080 public CharSequence subSequence(int start, int end) { 081 checkIndex("start", start); 082 checkIndex("end", end); 083 if (start > end) { 084 throw new IndexOutOfBoundsException("Start " + start + " cannot greater than end " + end); 085 } 086 return new BlankSequence(end - start); 087 } 088 089 @Override 090 public String toString() { 091 if (value == null) { 092 if (length == 0) { 093 value = ""; 094 } else { 095 char[] chars = new char[length]; 096 for (int i = 0;i < length;i++) { 097 chars[i] = ' '; 098 } 099 value = new String(chars, 0, chars.length); 100 } 101 } 102 return value; 103 } 104 105 private void checkIndex(String name, int index) { 106 if (index < 0) { 107 throw new IndexOutOfBoundsException("No negative " + name + " value " + index); 108 } 109 if (index > length) { 110 throw new IndexOutOfBoundsException("The " + name + " value " + index + " cannot greater than length " + length); 111 } 112 } 113 }