View Javadoc
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