1 18 19 package org.apache.tools.ant.types.selectors; 20 21 import java.io.File ; 22 23 import org.apache.tools.ant.types.Comparison; 24 import org.apache.tools.ant.types.EnumeratedAttribute; 25 import org.apache.tools.ant.types.Parameter; 26 27 32 public class SizeSelector extends BaseExtendSelector { 33 34 35 public static final String SIZE_KEY = "value"; 36 37 public static final String UNITS_KEY = "units"; 38 39 public static final String WHEN_KEY = "when"; 40 41 private long size = -1; 42 private long multiplier = 1; 43 private long sizelimit = -1; 44 private Comparison when = Comparison.EQUAL; 45 46 50 public SizeSelector() { 51 } 52 53 59 public String toString() { 60 StringBuffer buf = new StringBuffer ("{sizeselector value: "); 61 buf.append(sizelimit); 62 buf.append("compare: ").append(when.getValue()); 63 buf.append("}"); 64 return buf.toString(); 65 } 66 67 74 public void setValue(long size) { 75 this.size = size; 76 if (multiplier != 0 && size > -1) { 77 sizelimit = size * multiplier; 78 } 79 } 80 81 107 public void setUnits(ByteUnits units) { 108 int i = units.getIndex(); 109 multiplier = 0; 110 if (i > -1 && i < 4) { 111 multiplier = 1000; 112 } else if (i > 3 && i < 9) { 113 multiplier = 1024; 114 } else if (i > 8 && i < 13) { 115 multiplier = 1000000; 116 } else if (i > 12 && i < 18) { 117 multiplier = 1048576; 118 } else if (i > 17 && i < 22) { 119 multiplier = 1000000000L; 120 } else if (i > 21 && i < 27) { 121 multiplier = 1073741824L; 122 } else if (i > 26 && i < 31) { 123 multiplier = 1000000000000L; 124 } else if (i > 30 && i < 36) { 125 multiplier = 1099511627776L; 126 } 127 if (multiplier > 0 && size > -1) { 128 sizelimit = size * multiplier; 129 } 130 } 131 132 139 public void setWhen(SizeComparisons when) { 140 this.when = when; 141 } 142 143 149 public void setParameters(Parameter[] parameters) { 150 super.setParameters(parameters); 151 if (parameters != null) { 152 for (int i = 0; i < parameters.length; i++) { 153 String paramname = parameters[i].getName(); 154 if (SIZE_KEY.equalsIgnoreCase(paramname)) { 155 try { 156 setValue(new Long (parameters[i].getValue() 157 ).longValue()); 158 } catch (NumberFormatException nfe) { 159 setError("Invalid size setting " 160 + parameters[i].getValue()); 161 } 162 } else if (UNITS_KEY.equalsIgnoreCase(paramname)) { 163 ByteUnits units = new ByteUnits(); 164 units.setValue(parameters[i].getValue()); 165 setUnits(units); 166 } else if (WHEN_KEY.equalsIgnoreCase(paramname)) { 167 SizeComparisons scmp = new SizeComparisons(); 168 scmp.setValue(parameters[i].getValue()); 169 setWhen(scmp); 170 } else { 171 setError("Invalid parameter " + paramname); 172 } 173 } 174 } 175 } 176 177 187 public void verifySettings() { 188 if (size < 0) { 189 setError("The value attribute is required, and must be positive"); 190 } else if (multiplier < 1) { 191 setError("Invalid Units supplied, must be K,Ki,M,Mi,G,Gi,T,or Ti"); 192 } else if (sizelimit < 0) { 193 setError("Internal error: Code is not setting sizelimit correctly"); 194 } 195 } 196 197 206 public boolean isSelected(File basedir, String filename, File file) { 207 208 validate(); 210 211 if (file.isDirectory()) { 213 return true; 214 } 215 long diff = file.length() - sizelimit; 216 return when.evaluate(diff == 0 ? 0 : (int) (diff / Math.abs(diff))); 217 } 218 219 220 238 public static class ByteUnits extends EnumeratedAttribute { 239 242 public String [] getValues() { 243 return new String []{"K", "k", "kilo", "KILO", 244 "Ki", "KI", "ki", "kibi", "KIBI", 245 "M", "m", "mega", "MEGA", 246 "Mi", "MI", "mi", "mebi", "MEBI", 247 "G", "g", "giga", "GIGA", 248 "Gi", "GI", "gi", "gibi", "GIBI", 249 "T", "t", "tera", "TERA", 250 "Ti", "TI", "ti", "tebi", "TEBI" 251 }; 252 } 253 } 254 255 258 public static class SizeComparisons extends Comparison { 259 } 260 261 } 262 263 | Popular Tags |