1 package org.grlea.log.rollover; 2 3 6 18 import java.io.IOException ; 19 import java.util.Date ; 20 import java.util.Map ; 21 22 30 class 31 FileSizeRolloverStrategy 32 implements RolloverStrategy 33 { 34 35 private static final String KEY_FILE_SIZE = "simplelog.rollover.fileSize.size"; 36 37 38 private static final String FILE_SIZE_DEFAULT = "100M"; 39 40 private static final char[] factorUnits = {'B', 'K', 'M', 'G', 'T'}; 41 42 43 private long rolloverSize; 44 45 46 private boolean rolloverSizeSetProgramatically = false; 47 48 53 FileSizeRolloverStrategy() 54 { 55 this.rolloverSize = -1; 56 } 57 58 67 public 68 FileSizeRolloverStrategy(long rolloverSize) 69 { 70 setRolloverSize(rolloverSize); 71 } 72 73 public void 74 configure(Map properties) 75 throws IOException 76 { 77 if (rolloverSizeSetProgramatically) 78 return; 79 80 String fileSizeString = (String ) properties.get(KEY_FILE_SIZE); 81 if (fileSizeString == null) 82 fileSizeString = FILE_SIZE_DEFAULT; 83 else 84 fileSizeString = fileSizeString.trim(); 85 86 if (fileSizeString.length() == 0) 87 fileSizeString = FILE_SIZE_DEFAULT; 88 89 long fileSize = decodeFileSize(fileSizeString); 90 setRolloverSizeInernal(fileSize); 91 } 92 93 105 private long 106 decodeFileSize(String fileSizeString) 107 throws IOException 108 { 109 112 try 113 { 114 int lastCharacterIndex = fileSizeString.length() - 1; 115 116 String sizeOnlyString = fileSizeString.substring(0, lastCharacterIndex); 117 long fileSize = Long.parseLong(sizeOnlyString); 118 119 char lastCharacter = fileSizeString.charAt(lastCharacterIndex); 120 lastCharacter = Character.toUpperCase(lastCharacter); 121 122 boolean factorIdentified = false; 123 for (int factor = 0; !factorIdentified && (factor < factorUnits.length); factor++) 124 { 125 char factorAbbreviation = factorUnits[factor]; 126 if (lastCharacter == factorAbbreviation) 127 { 128 factorIdentified = true; 129 fileSize = fileSize * (1L << (factor * 10)); 130 } 131 } 132 133 if (!factorIdentified) 134 { 135 throw new IOException ( 136 "The specified file size does not conform to the required pattern: " + fileSizeString); 137 } 138 139 return fileSize; 140 } 141 catch (NumberFormatException e) 142 { 143 throw new IOException ("Specified file size does not conform to the required pattern: " + 145 fileSizeString); 146 } 147 } 148 149 public boolean 150 rolloverNow(Date fileCreated, long fileLength) 151 { 152 if (rolloverSize == -1) 153 throw new IllegalStateException ("FileSizeRolloverStrategy has not been configured."); 154 155 return fileLength >= rolloverSize; 156 } 157 158 161 public long 162 getRolloverSize() 163 { 164 return rolloverSize; 165 } 166 167 175 public void 176 setRolloverSize(long rolloverSize) 177 { 178 setRolloverSizeInernal(rolloverSize); 179 this.rolloverSizeSetProgramatically = true; 180 } 181 182 188 private void 189 setRolloverSizeInernal(long rolloverSize) 190 { 191 if (rolloverSize < 1) 192 { 193 throw new IllegalArgumentException ("rolloverSize must be > 0"); 194 } 195 this.rolloverSize = rolloverSize; 196 } 197 } | Popular Tags |