5
5
import javafx .scene .control .Alert ;
6
6
import org .kohsuke .github .GHAsset ;
7
7
import org .kohsuke .github .GHRelease ;
8
- import pl .koder95 .eme .Files ;
9
8
10
9
import java .io .*;
11
10
import java .net .URL ;
12
11
import java .net .URLConnection ;
13
12
import java .nio .channels .Channels ;
14
13
import java .nio .channels .FileChannel ;
15
14
import java .nio .channels .ReadableByteChannel ;
15
+ import java .nio .file .Files ;
16
16
import java .nio .file .Path ;
17
+ import java .nio .file .StandardOpenOption ;
17
18
import java .text .NumberFormat ;
18
19
import java .util .Enumeration ;
19
20
import java .util .HashMap ;
20
21
import java .util .Map ;
21
22
import java .util .zip .ZipEntry ;
22
23
import java .util .zip .ZipFile ;
23
24
24
- import static pl .koder95 .eme .Files .SELF ;
25
- import static pl .koder95 .eme .Files .TEMP_DIR ;
25
+ import static pl .koder95 .eme .Files .*;
26
26
27
27
public class AutoUpdateTask extends Task <Object > {
28
+
28
29
@ Override
29
30
protected Object call () throws Exception {
30
31
GHAsset zip ;
31
32
try {
32
33
GitHubRepositoryController controller = new GitHubRepositoryController ("koder95" , "eMetrykant" );
33
34
controller .init ();
34
35
GHRelease latest = controller .getRepository ().getLatestRelease ();
35
- zip = latest .listAssets ().toList ().stream ().reduce (null , (r , c ) -> {
36
- System .out .println (c );
37
- return c .getName ().contains ("eMetrykant" ) && c .getName ().endsWith (".zip" )? c : r ;
38
- });
36
+ zip = getGithubAsset (latest );
39
37
} catch (IOException e ) {
40
38
e .printStackTrace ();
41
- Alert a = new Alert (Alert .AlertType .ERROR , "Nie można pobrać eMetrykanta." );
42
- a .show ();
39
+ showException (e );
43
40
return null ;
44
41
}
45
42
46
43
// pobieranie zip'a
47
44
Path downloaded = downloadZip (zip .getBrowserDownloadUrl (), TEMP_DIR , zip .getName (), zip .getSize ());
48
45
// rozpakowywanie do folderu tymczasowego
49
46
if (extractZip (downloaded , TEMP_DIR , true )) {
50
- // TODO: tworzenie mapy aktualizacji
51
47
Map <Path , Path > updateMap = new HashMap <>();
52
- updateMap .put (TEMP_DIR .resolve ("eMetrykant.jar" ), SELF );
53
-
54
- restart (updateMap );
48
+ Files .list (TEMP_DIR ).forEach (path -> {
49
+ updateMap .put (path , WORKDIR .resolve (path .getFileName ()));
50
+ });
51
+ generateUpdateScript (UPDATE_WIN , updateMap );
55
52
}
53
+ restart ();
56
54
return null ;
57
55
}
58
56
57
+ private void showException (Exception e ) {
58
+ showException (e , "Nie można pobrać eMetrykanta." );
59
+ }
60
+
61
+ private void showException (Exception e , String title ) {
62
+ Alert a = new Alert (Alert .AlertType .ERROR );
63
+ a .setTitle (title == null ? "Wyjątek" : title );
64
+ a .setHeaderText (e .getClass ().getName ());
65
+ a .setContentText (e .getLocalizedMessage ());
66
+ a .show ();
67
+ }
68
+
69
+ private GHAsset getGithubAsset (GHRelease latest ) throws IOException {
70
+ return latest .listAssets ().toList ().stream ().reduce (null , (r , c ) -> {
71
+ System .out .println (c );
72
+ return isMainZip (c ) ? c : r ;
73
+ });
74
+ }
75
+
76
+ private boolean isMainZip (GHAsset c ) {
77
+ return c .getName ().contains ("eMetrykant" ) && c .getName ().endsWith (".zip" );
78
+ }
79
+
59
80
private Path downloadZip (String url , Path dir , String name , long size ) throws IOException {
60
81
NumberFormat pF = NumberFormat .getPercentInstance ();
61
- String title = "Pobieranie " + name ;
62
- updateTitle (title );
82
+ updateTitle ("Pobieranie " + name );
63
83
updateProgress (0 , 1 );
64
84
65
85
URLConnection connection = new URL (url ).openConnection ();
66
86
Path forDownload = dir .resolve (name );
67
- java .nio .file .Files .createFile (forDownload );
87
+ if (Files .notExists (forDownload .getParent ()))
88
+ Files .createDirectories (forDownload .getParent ());
89
+ if (Files .notExists (forDownload ))
90
+ Files .createFile (forDownload );
68
91
69
- try (InputStream in = connection .getInputStream ();
70
- ReadableByteChannel rbc = Channels .newChannel (in );
71
- FileChannel channel = FileChannel .open (forDownload )) {
92
+ try (ReadableByteChannel rbc = Channels .newChannel (connection .getInputStream ());
93
+ FileChannel channel = FileChannel .open (forDownload , StandardOpenOption .WRITE )) {
72
94
channel .truncate (size );
73
- in .mark ((int ) size );
74
95
long workDone = 0 ;
75
96
long count = size > 100 ? size / 100 : 1 ;
76
97
while (workDone < size ) {
@@ -91,15 +112,14 @@ private boolean extractZip(Path forExtract, Path dir, boolean deleteZip) throws
91
112
updateProgress (0 , 1 );
92
113
updateMessage ("" );
93
114
try (ZipFile zip = new ZipFile (forExtract .toFile ())) {
94
- updateProgress (0 , java . nio . file . Files .size (forExtract ));
115
+ updateProgress (0 , Files .size (forExtract ));
95
116
double total = 0 ;
96
117
if (dir == null ) dir = forExtract .getParent ();
97
118
Enumeration <? extends ZipEntry > entries = zip .entries ();
98
119
while (entries .hasMoreElements ()) {
99
120
ZipEntry entry = entries .nextElement ();
100
- System .out .println (entry );
101
121
if (entry .isDirectory ()) {
102
- if (java . nio . file . Files .isDirectory (java . nio . file . Files .createDirectories (dir .resolve (entry .getName ()))))
122
+ if (Files .isDirectory (Files .createDirectories (dir .resolve (entry .getName ()))))
103
123
System .out .println ("Directory created!" );
104
124
}
105
125
@@ -114,15 +134,15 @@ private boolean extractZip(Path forExtract, Path dir, boolean deleteZip) throws
114
134
Path outFile = dir .resolve (entry .getName ());
115
135
116
136
if (!entry .isDirectory ()) {
117
- if (java . nio . file . Files .isRegularFile (java . nio . file . Files .createFile (outFile ))) {
137
+ if (Files .isRegularFile (Files .createFile (outFile ))) {
118
138
System .out .println ("New file created: " + outFile );
119
139
}
120
140
}
121
141
else continue ;
122
142
123
143
System .out .println ("Entry: " + entry );
124
144
InputStream input = zip .getInputStream (entry );
125
- try (OutputStream output = java . nio . file . Files .newOutputStream (outFile )) {
145
+ try (OutputStream output = Files .newOutputStream (outFile )) {
126
146
while (input .available () > 0 ) {
127
147
int b = input .read ();
128
148
output .write (b );
@@ -134,24 +154,22 @@ private boolean extractZip(Path forExtract, Path dir, boolean deleteZip) throws
134
154
}
135
155
}
136
156
updateProgress (Double .NaN , 0 );
137
- if (deleteZip ) return java . nio . file . Files .deleteIfExists (forExtract );
157
+ if (deleteZip ) return Files .deleteIfExists (forExtract );
138
158
return false ;
139
159
}
140
160
141
- private static void restart (Map < Path , Path > updateMap ) {
161
+ private static void restart () {
142
162
Platform .exit ();
143
163
try {
144
- File update = Files .UPDATE_WIN ;
145
- generateUpdateScript (update , updateMap );
146
- new ProcessBuilder (update .getPath ()).start ();
164
+ new ProcessBuilder (UPDATE_WIN .toString ()).start ();
147
165
} catch (IOException e ) {
148
166
e .printStackTrace ();
149
167
}
150
168
System .exit (0 );
151
169
}
152
170
153
- private static void generateUpdateScript (File update , Map <Path , Path > updateMap ) {
154
- try (BufferedWriter writer = new BufferedWriter ( new FileWriter ( update ) )) {
171
+ private static void generateUpdateScript (Path update , Map <Path , Path > updateMap ) {
172
+ try (BufferedWriter writer = Files . newBufferedWriter ( update , StandardOpenOption . WRITE )) {
155
173
generateWinUpdateScript (writer , updateMap );
156
174
} catch (IOException e ) {
157
175
e .printStackTrace ();
@@ -167,17 +185,21 @@ private static void generateWinUpdateScript(BufferedWriter writer, Map<Path, Pat
167
185
for (Map .Entry <Path , Path > entry : updateMap .entrySet ()) {
168
186
Path oldFile = entry .getValue ();
169
187
Path newFile = entry .getKey ();
170
- if (java . nio . file . Files .exists (newFile )) {
188
+ if (Files .exists (newFile )) {
171
189
writer .write ("copy " + '"' );
172
190
writer .write (newFile .toString ());
173
191
writer .write ('"' + " " + '"' );
174
192
writer .write (oldFile .toString ());
175
193
writer .write ('"' + " /y" );
176
194
writer .newLine ();
195
+ writer .write ("rmdir -r " + '"' );
196
+ writer .write (oldFile .getParent ().toString ());
197
+ writer .write ('"' + " /y" );
198
+ writer .newLine ();
177
199
} else throw new FileNotFoundException ("Nie znaleziono odpowiednich plików do aktualizacji." );
178
200
}
179
201
final String javaBin = '"' + System .getProperty ("java.home" ) + File .separator + "bin" + File .separator ;
180
- writer .write (javaBin + "java.exe\" -jar " + '"' + Files . SELF + '"' );
202
+ writer .write (javaBin + "java.exe\" -jar " + '"' + SELF + '"' );
181
203
writer .newLine ();
182
204
}
183
205
}
0 commit comments