26
26
27
27
/**
28
28
* Klasa odpowiedzialna za aktualizowanie własnej wersji do najnowszej.
29
+ * Działa w następujący sposób:
30
+ * <ol>
31
+ * <li>Usuwanie zawartości folderu tymczasowego, gdzie pobrane zostaną pliki ostatniego wydania.</li>
32
+ * <li>Pobieranie najnowszego wydania programu w postaci archiwum ZIP.</li>
33
+ * <li>Wypakowanie zawartości archiwum do folderu tymczasowego.</li>
34
+ * <li>Usunięcie pobranego archiwum ZIP.</li>
35
+ * <li>Wygenerowanie skryptu samoaktualizacji.</li>
36
+ * <li>Uruchomienie skryptu i zamknięcie programu.</li>
37
+ * </ol>
38
+ * Generator skryptu aktualizującego powinien zadbać o uruchomienie programu po skończeniu aktualizacji.
29
39
*
30
40
* @author Kamil Jan Mularski [@koder95]
31
- * @version 0.4.3 , 2024-12-01
41
+ * @version 0.4.4 , 2024-12-02
32
42
* @since 0.4.3
33
43
*/
34
44
public class SelfUpdate implements Runnable {
@@ -56,26 +66,33 @@ public class SelfUpdate implements Runnable {
56
66
* Tworzy domyślną instancję klasy.
57
67
*/
58
68
public SelfUpdate () {
59
- this ((workDone , max ) -> {
60
- double percent = 100 * workDone .doubleValue ()/max .doubleValue ();
61
- System .out .println ("Processing... " + (int ) percent );
62
- }, msg -> System .out .println ("INFO: " + msg ), title -> System .out .println ('\n' + title + '\n' ));
69
+ this ((workDone , max ) -> {}, msg -> {}, title -> System .out .println ('\n' + title + '\n' ));
63
70
}
64
71
65
72
@ Override
66
73
public void run () {
74
+ updateTitle .accept ("Rozpoczęcie aktualizacji" );
67
75
try {
68
- // usuwanie plików z katalogu tymczasowego:
76
+ updateMessage . accept ( "Usuwanie plików z katalogu tymczasowego..." );
69
77
clear ();
70
- // pobieranie zip'a i rozpakowywanie do folderu tymczasowego:
78
+ updateMessage . accept ( "Przygotowywanie do pobierania..." );
71
79
prepare ();
72
80
} catch (IOException e ) {
73
81
throw new RuntimeException (e );
74
82
}
83
+ updateTitle .accept ("Ponowne uruchamianie w celu zapisania zmian..." );
84
+ updateProgress .accept (0 , 0 );
85
+ updateMessage .accept ("" );
86
+ try {
87
+ Thread .sleep (200 );
88
+ } catch (InterruptedException e ) {
89
+ // ignoruj
90
+ }
75
91
restart (); // restartowanie z wywołaniem skryptu
76
92
}
77
93
78
94
private void clear () throws IOException {
95
+ if (Files .notExists (TEMP_DIR )) return ;
79
96
List <Exception > exceptions = new LinkedList <>();
80
97
try (Stream <Path > paths = Files .walk (TEMP_DIR ).sorted (Comparator .reverseOrder ())) {
81
98
paths .forEach (path -> {
@@ -105,16 +122,25 @@ private void restart() {
105
122
}
106
123
107
124
private void prepare () throws IOException {
125
+ updateMessage .accept ("Tworzenie katalogu tymczasowego..." );
126
+ Files .createDirectories (TEMP_DIR );
127
+ updateMessage .accept (Files .exists (TEMP_DIR )? "Stworzono katalog tymczasowy." : "Błąd tworzenia katalogu tymczasowego!" );
128
+ updateMessage .accept ("Sprawdzanie ostatniej wersji..." );
129
+ RepositoryInfo .get ().reload ();
108
130
if (extractZip (downloadZip ())) {
109
131
Map <Path , Path > updateMap = new HashMap <>();
110
132
try (Stream <Path > paths = Files .list (TEMP_DIR )) {
111
- paths .forEach (path -> updateMap .put (path , WORKDIR .resolve (path .getFileName ().toString ())));
133
+ paths .forEach (path -> {
134
+ String fileName = path .getFileName ().toString ();
135
+ if (fileName .startsWith ("eMetrykant" ) && fileName .endsWith (".jar" ))
136
+ fileName = SELF .getFileName ().toString ();
137
+ updateMap .put (path , WORKDIR .resolve (fileName ));
138
+ });
112
139
}
113
140
updateScriptGenerator .generateUpdateScript (updateMap );
114
141
}
115
142
}
116
143
117
-
118
144
private Path downloadZip () throws IOException {
119
145
updateTitle .accept ("Pobieranie " + RepositoryInfo .get ().getLatestReleaseName ());
120
146
return tryTransfer (RepositoryInfo .get ().getLatestReleaseBrowserURL ());
@@ -172,7 +198,7 @@ private boolean extractZip(Path forExtract) throws IOException {
172
198
Files .createFile (outFile );
173
199
174
200
if (Files .isRegularFile (outFile )) {
175
- tryTransfer (zip , entry , outFile , workDone , total );
201
+ workDone = tryTransfer (zip , entry , outFile , workDone , total );
176
202
}
177
203
} else if (Files .notExists (outFile )) {
178
204
Files .createDirectories (outFile );
@@ -199,20 +225,21 @@ private static long getTotal(ZipFile zip) throws IOException {
199
225
return total ;
200
226
}
201
227
202
- private void tryTransfer (ZipFile zip , ZipEntry entry , Path outFile , long workDone , long total ) throws IOException {
228
+ private long tryTransfer (ZipFile zip , ZipEntry entry , Path outFile , long workDone , long total ) throws IOException {
203
229
try (InputStream input = zip .getInputStream (entry );
204
230
OutputStream output = Files .newOutputStream (outFile )) {
205
- transfer (input , output , workDone , total );
231
+ return transfer (input , output , workDone , total );
206
232
}
207
233
}
208
234
209
- private void transfer (InputStream input , OutputStream output , long workDone , long total ) throws IOException {
235
+ private long transfer (InputStream input , OutputStream output , long workDone , long total ) throws IOException {
210
236
while (input .available () > 0 ) {
211
237
int b = input .read ();
212
238
output .write (b );
213
239
output .flush ();
214
240
updateProgress .accept (++workDone , total );
215
241
updateMessage .accept (NumberFormat .getPercentInstance ().format ((double ) workDone / total ));
216
242
}
243
+ return workDone ;
217
244
}
218
245
}
0 commit comments