1 package edu.jiangxin.apktoolbox.file.checksum.panel; 2 3 import edu.jiangxin.apktoolbox.file.checksum.CalculateType; 4 import edu.jiangxin.apktoolbox.swing.extend.EasyChildTabbedPanel; 5 import edu.jiangxin.apktoolbox.swing.extend.filepanel.FilePanel; 6 import edu.jiangxin.apktoolbox.utils.Constants; 7 import org.apache.commons.codec.digest.DigestUtils; 8 import org.apache.commons.io.FileUtils; 9 10 import javax.swing.*; 11 import java.io.File; 12 import java.io.FileInputStream; 13 import java.io.FileNotFoundException; 14 import java.io.IOException; 15 16 public class FileChecksumPanel extends EasyChildTabbedPanel { 17 private static final long serialVersionUID = 63924900336217723L; 18 19 private FilePanel filePanel; 20 21 private JPanel optionPanel; 22 23 private JTextField sizeTextField; 24 private JTextField lastModifiedTimeTextField; 25 private JCheckBox md5CheckBox; 26 private JTextField md5TextField; 27 private JCheckBox sha1CheckBox; 28 private JTextField sha1TextField; 29 private JCheckBox sha256CheckBox; 30 private JTextField sha256TextField; 31 private JCheckBox sha384CheckBox; 32 private JTextField sha384TextField; 33 private JCheckBox sha512CheckBox; 34 private JTextField sha512TextField; 35 private JCheckBox crc32CheckBox; 36 private JTextField crc32TextField; 37 38 private JPanel operationPanel; 39 private JProgressBar progressBar; 40 41 @Override 42 public void createUI() { 43 BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS); 44 setLayout(boxLayout); 45 46 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 47 createFileNamePanel(); 48 add(filePanel); 49 50 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 51 createOptionPanel(); 52 add(optionPanel); 53 54 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 55 createOperationPanel(); 56 add(operationPanel); 57 } 58 59 private void createFileNamePanel() { 60 filePanel = new FilePanel("Choose File"); 61 filePanel.initialize(); 62 filePanel.setFileReadyCallback(file -> { 63 if (file == null) { 64 logger.error("file is null"); 65 return; 66 } 67 calculate(file); 68 }); 69 } 70 71 private void createOptionPanel() { 72 optionPanel = new JPanel(); 73 BoxLayout boxLayout = new BoxLayout(optionPanel, BoxLayout.Y_AXIS); 74 optionPanel.setLayout(boxLayout); 75 76 JPanel sizeOptionPanel = new JPanel(); 77 JPanel lastModifiedTimeOptionPanel = new JPanel(); 78 JPanel md5OptionPanel = new JPanel(); 79 JPanel sha1OptionPanel = new JPanel(); 80 JPanel sha256OptionPanel = new JPanel(); 81 JPanel sha384OptionPanel = new JPanel(); 82 JPanel sha512OptionPanel = new JPanel(); 83 JPanel crc32OptionPanel = new JPanel(); 84 85 optionPanel.add(sizeOptionPanel); 86 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 87 optionPanel.add(lastModifiedTimeOptionPanel); 88 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 89 optionPanel.add(md5OptionPanel); 90 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 91 optionPanel.add(sha1OptionPanel); 92 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 93 optionPanel.add(sha256OptionPanel); 94 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 95 optionPanel.add(sha384OptionPanel); 96 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 97 optionPanel.add(sha512OptionPanel); 98 optionPanel.add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER)); 99 optionPanel.add(crc32OptionPanel); 100 101 sizeOptionPanel.setLayout(new BoxLayout(sizeOptionPanel, BoxLayout.X_AXIS)); 102 JLabel fileSizeLabel = new JLabel("Size:"); 103 sizeTextField = new JTextField(); 104 sizeOptionPanel.add(fileSizeLabel); 105 sizeOptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 106 sizeOptionPanel.add(sizeTextField); 107 108 lastModifiedTimeOptionPanel.setLayout(new BoxLayout(lastModifiedTimeOptionPanel, BoxLayout.X_AXIS)); 109 JLabel fileLastModifiedTimeLabel = new JLabel("Last Modified Time:"); 110 lastModifiedTimeTextField = new JTextField(); 111 lastModifiedTimeOptionPanel.add(fileLastModifiedTimeLabel); 112 lastModifiedTimeOptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 113 lastModifiedTimeOptionPanel.add(lastModifiedTimeTextField); 114 115 md5OptionPanel.setLayout(new BoxLayout(md5OptionPanel, BoxLayout.X_AXIS)); 116 md5CheckBox = new JCheckBox("MD5 checksum:"); 117 md5CheckBox.setSelected(true); 118 md5TextField = new JTextField(); 119 md5OptionPanel.add(md5CheckBox); 120 md5OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 121 md5OptionPanel.add(md5TextField); 122 123 sha1OptionPanel.setLayout(new BoxLayout(sha1OptionPanel, BoxLayout.X_AXIS)); 124 sha1CheckBox = new JCheckBox("SHA1 checksum:"); 125 sha1TextField = new JTextField(); 126 sha1OptionPanel.add(sha1CheckBox); 127 sha1OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 128 sha1OptionPanel.add(sha1TextField); 129 130 sha256OptionPanel.setLayout(new BoxLayout(sha256OptionPanel, BoxLayout.X_AXIS)); 131 sha256CheckBox = new JCheckBox("SHA256 checksum:"); 132 sha256TextField = new JTextField(); 133 sha256OptionPanel.add(sha256CheckBox); 134 sha256OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 135 sha256OptionPanel.add(sha256TextField); 136 137 sha384OptionPanel.setLayout(new BoxLayout(sha384OptionPanel, BoxLayout.X_AXIS)); 138 sha384CheckBox = new JCheckBox("SHA384 checksum:"); 139 sha384TextField = new JTextField(); 140 sha384OptionPanel.add(sha384CheckBox); 141 sha384OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 142 sha384OptionPanel.add(sha384TextField); 143 144 sha512OptionPanel.setLayout(new BoxLayout(sha512OptionPanel, BoxLayout.X_AXIS)); 145 sha512CheckBox = new JCheckBox("SHA512 checksum:"); 146 sha512TextField = new JTextField(); 147 sha512OptionPanel.add(sha512CheckBox); 148 sha512OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 149 sha512OptionPanel.add(sha512TextField); 150 151 crc32OptionPanel.setLayout(new BoxLayout(crc32OptionPanel, BoxLayout.X_AXIS)); 152 crc32CheckBox = new JCheckBox("CRC32 checksum:"); 153 crc32CheckBox.setSelected(true); 154 crc32TextField = new JTextField(); 155 crc32OptionPanel.add(crc32CheckBox); 156 crc32OptionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 157 crc32OptionPanel.add(crc32TextField); 158 } 159 160 private void createOperationPanel() { 161 operationPanel = new JPanel(); 162 163 JButton compareButton = new JButton("Compare"); 164 compareButton.setFocusPainted(false); 165 compareButton.addActionListener(arg0 -> { 166 File file = filePanel.getFile(); 167 if (file == null) { 168 logger.error("file is null"); 169 return; 170 } 171 calculate(file); 172 }); 173 174 progressBar = new JProgressBar(); 175 progressBar.setStringPainted(true); 176 progressBar.setMaximum(100); 177 178 179 operationPanel.setLayout(new BoxLayout(operationPanel, BoxLayout.X_AXIS)); 180 operationPanel.add(compareButton); 181 operationPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER)); 182 operationPanel.add(progressBar); 183 184 } 185 186 private void calculate(File file) { 187 progressBar.setValue(0); 188 new Thread(()->{ 189 sizeTextField.setText(edu.jiangxin.apktoolbox.utils.FileUtils.sizeOfInHumanFormat(file)); 190 progressBar.setValue(progressBar.getValue() + 5); 191 }).start(); 192 193 new Thread(()->{ 194 try { 195 lastModifiedTimeTextField.setText(String.valueOf(FileUtils.lastModified(file))); 196 } catch (IOException e) { 197 lastModifiedTimeTextField.setText("Unknown"); 198 } 199 progressBar.setValue(progressBar.getValue() + 5); 200 }).start(); 201 202 new Thread(()->{ 203 if (md5CheckBox.isSelected()) { 204 md5TextField.setText(calculate(CalculateType.Md5, file)); 205 } else { 206 md5TextField.setText(""); 207 } 208 progressBar.setValue(progressBar.getValue() + 15); 209 }).start(); 210 211 new Thread(()->{ 212 if (sha1CheckBox.isSelected()) { 213 sha1TextField.setText(calculate(CalculateType.Sha1, file)); 214 } else { 215 sha1TextField.setText(""); 216 } 217 progressBar.setValue(progressBar.getValue() + 15); 218 }).start(); 219 220 new Thread(()->{ 221 if (sha256CheckBox.isSelected()) { 222 sha256TextField.setText(calculate(CalculateType.Sha256, file)); 223 } else { 224 sha256TextField.setText(""); 225 } 226 progressBar.setValue(progressBar.getValue() + 15); 227 }).start(); 228 229 new Thread(()->{ 230 if (sha384CheckBox.isSelected()) { 231 sha384TextField.setText(calculate(CalculateType.Sha384, file)); 232 } else { 233 sha384TextField.setText(""); 234 } 235 progressBar.setValue(progressBar.getValue() + 15); 236 }).start(); 237 238 new Thread(()->{ 239 if (sha512CheckBox.isSelected()) { 240 sha512TextField.setText(calculate(CalculateType.Sha512, file)); 241 } else { 242 sha512TextField.setText(""); 243 } 244 progressBar.setValue(progressBar.getValue() + 15); 245 }).start(); 246 247 new Thread(()->{ 248 if (crc32CheckBox.isSelected()) { 249 crc32TextField.setText(calculate(CalculateType.Crc32, file)); 250 } else { 251 crc32TextField.setText(""); 252 } 253 progressBar.setValue(progressBar.getValue() + 15); 254 }).start(); 255 } 256 257 private String calculate(final CalculateType selectedHash, final File file) { 258 String result = ""; 259 try (FileInputStream fis = new FileInputStream(file)) { 260 switch (selectedHash) { 261 case Md5: { 262 result = DigestUtils.md5Hex(fis); 263 break; 264 } 265 case Sha1: { 266 result = DigestUtils.sha1Hex(fis); 267 break; 268 } 269 case Sha256: { 270 result = DigestUtils.sha256Hex(fis); 271 break; 272 } 273 case Sha384: { 274 result = DigestUtils.sha384Hex(fis); 275 break; 276 } 277 case Sha512: { 278 result = DigestUtils.sha512Hex(fis); 279 break; 280 } 281 case Crc32: { 282 result = Long.toHexString(FileUtils.checksumCRC32(file)); 283 break; 284 } 285 default: { 286 result = "Not support"; 287 break; 288 } 289 } 290 } catch (FileNotFoundException e) { 291 logger.error("calculate, FileNotFoundException"); 292 } catch (IOException e) { 293 logger.error("calculate, IOException"); 294 } 295 return result; 296 } 297 } 298