2424import org .springframework .web .client .RestTemplate ;
2525
2626import java .io .ByteArrayInputStream ;
27+ import java .io .IOException ;
2728import java .sql .Connection ;
2829import java .sql .ResultSet ;
2930import java .sql .SQLException ;
3031import java .util .ArrayList ;
3132import java .util .List ;
3233import java .util .Map ;
34+ import java .util .concurrent .CompletableFuture ;
3335import java .util .stream .Collectors ;
3436
3537@ Component
@@ -38,10 +40,10 @@ public class V1_23__FileResource_Extract_Resources extends BaseJavaMigration {
3840 private static final String COL_FR_ID = "fr_id" ;
3941 private static final String COL_FR_NAME = "fr_name" ;
4042 private static final String COL_FR_TYPE = "fr_type" ;
41- private static final String COL_FR_CONTENT = "fr_content" ;
4243 private static final String COL_FR_STORAGE_TYPE = "fr_storage_type" ;
4344 private static final String COL_EV_ID = "ev_id" ;
4445 private static final String COL_EV_VERSION = "ev_version" ;
46+ private static final String COL_EV_TARGET_PLATFORM = "ev_target_platform" ;
4547 private static final String COL_E_NAME = "e_name" ;
4648 private static final String COL_N_NAME = "n_name" ;
4749
@@ -57,23 +59,29 @@ public class V1_23__FileResource_Extract_Resources extends BaseJavaMigration {
5759 @ Override
5860 public void migrate (Context context ) throws Exception {
5961 var connection = context .getConnection ();
62+ var uploadFutures = new ArrayList <CompletableFuture <Void >>();
6063 var downloads = getAllDownloads (connection );
61- var resources = extractResources (downloads );
62- uploadResources (resources );
63- deleteResources (connection );
64- insertResources (resources , connection );
65- deleteWebResources (connection );
64+ for (var download : downloads ) {
65+ var resources = extractResources (download , connection );
66+ uploadFutures .addAll (uploadResources (resources ));
67+ deleteType ("resource" , download .getExtension ().getId (), connection );
68+ insertResources (resources , connection );
69+ deleteType ("web-resource" , download .getExtension ().getId (), connection );
70+ }
71+ for (var future : uploadFutures ) {
72+ future .join ();
73+ }
6674 }
6775
6876 private List <FileResource > getAllDownloads (Connection connection ) throws SQLException {
6977 var query = "SELECT " +
7078 "fr.id " + COL_FR_ID + ", " +
7179 "fr.name " + COL_FR_NAME + ", " +
7280 "fr.type " + COL_FR_TYPE + ", " +
73- "fr.content " + COL_FR_CONTENT + ", " +
7481 "fr.storage_type " + COL_FR_STORAGE_TYPE + ", " +
7582 "ev.id " + COL_EV_ID + ", " +
7683 "ev.version " + COL_EV_VERSION + ", " +
84+ "ev.target_platform " + COL_EV_TARGET_PLATFORM + ", " +
7785 "e.name " + COL_E_NAME + ", " +
7886 "n.name " + COL_N_NAME + " " +
7987 "FROM file_resource fr " +
@@ -105,65 +113,73 @@ private FileResource toFileResource(ResultSet result) throws SQLException {
105113 var extVersion = new ExtensionVersion ();
106114 extVersion .setId (result .getLong (COL_EV_ID ));
107115 extVersion .setVersion (result .getString (COL_EV_VERSION ));
116+ extVersion .setTargetPlatform (result .getString (COL_EV_TARGET_PLATFORM ));
108117 extVersion .setExtension (extension );
109118
110119 var resource = new FileResource ();
111120 resource .setId (result .getLong (COL_FR_ID ));
112121 resource .setName (result .getString (COL_FR_NAME ));
113122 resource .setType (result .getString (COL_FR_TYPE ));
114- resource .setContent (result .getBytes (COL_FR_CONTENT ));
115123 resource .setStorageType (result .getString (COL_FR_STORAGE_TYPE ));
116124 resource .setExtension (extVersion );
117125
118126 return resource ;
119127 }
120128
121- private List <FileResource > extractResources (List < FileResource > downloads ) {
129+ private List <FileResource > extractResources (FileResource download , Connection connection ) throws SQLException , IOException {
122130 var storages = Map .of (
123131 FileResource .STORAGE_GOOGLE , googleStorage ,
124132 FileResource .STORAGE_AZURE , azureStorage
125133 );
126134
127- var resources = new ArrayList <FileResource >();
128- for (var download : downloads ) {
129- byte [] content ;
130- if (download .getStorageType ().equals (FileResource .STORAGE_DB )) {
131- content = download .getContent ();
132- } else {
133- var storage = storages .get (download .getStorageType ());
134- var uri = storage .getLocation (download );
135- content = restTemplate .getForObject (uri , byte [].class );
136- }
135+ byte [] content ;
136+ if (download .getStorageType ().equals (FileResource .STORAGE_DB )) {
137+ content = getContent (download .getId (), connection );
138+ } else {
139+ var storage = storages .get (download .getStorageType ());
140+ var uri = storage .getLocation (download );
141+ content = restTemplate .getForObject (uri , byte [].class );
142+ }
137143
138- try (var processor = new ExtensionProcessor (new ByteArrayInputStream (content ))) {
139- var processedResources = processor .getResources (download .getExtension ()).stream ()
140- .filter (resource -> resource .getType ().equals (FileResource .RESOURCE ))
141- .map (resource -> {
142- resource .setStorageType (download .getStorageType ());
143- return resource ;
144- })
145- .collect (Collectors .toList ());
144+ try (var input = new ByteArrayInputStream (content )) {
145+ try (var processor = new ExtensionProcessor (input )) {
146+ var resources = new ArrayList <FileResource >();
147+ var allResources = processor .getResources (download .getExtension ());
148+ for (var resource : allResources ) {
149+ if (resource .getType ().equals (FileResource .RESOURCE )) {
150+ resource .setStorageType (download .getStorageType ());
151+ resources .add (resource );
152+ }
153+ }
146154
147- resources . addAll ( processedResources ) ;
155+ return resources ;
148156 }
149157 }
158+ }
150159
151- return resources ;
160+ private byte [] getContent (long fileResourceId , Connection connection ) throws SQLException {
161+ try (var statement = connection .prepareStatement ("SELECT content FROM file_resource WHERE id = ?" )) {
162+ statement .setLong (1 , fileResourceId );
163+ try (var result = statement .executeQuery ()) {
164+ return result .next () ? result .getBytes ("content" ): null ;
165+ }
166+ }
152167 }
153168
154- private void uploadResources (List <FileResource > resources ) {
169+ private List < CompletableFuture < Void >> uploadResources (List <FileResource > resources ) {
155170 var storages = Map .of (
156171 FileResource .STORAGE_GOOGLE , googleStorage ,
157172 FileResource .STORAGE_AZURE , azureStorage
158173 );
159174
160- for (var resource : resources ) {
161- if (!resource .getStorageType ().equals (FileResource .STORAGE_DB )) {
162- var storage = storages .get (resource .getStorageType ());
163- storage .uploadFile (resource );
164- resource .setContent (null );
165- }
166- }
175+ return resources .stream ()
176+ .filter (resource -> !resource .getStorageType ().equals (FileResource .STORAGE_DB ))
177+ .map (resource -> CompletableFuture .runAsync (() -> {
178+ var storage = storages .get (resource .getStorageType ());
179+ storage .uploadFile (resource );
180+ resource .setContent (null );
181+ }))
182+ .collect (Collectors .toList ());
167183 }
168184
169185 private void insertResources (List <FileResource > resources , Connection connection ) throws SQLException {
@@ -180,16 +196,11 @@ private void insertResources(List<FileResource> resources, Connection connection
180196 }
181197 }
182198
183- private void deleteResources (Connection connection ) throws SQLException {
184- var query = "DELETE FROM file_resource WHERE type = 'resource'" ;
185- try (var statement = connection .prepareStatement (query )) {
186- statement .executeUpdate ();
187- }
188- }
189-
190- private void deleteWebResources (Connection connection ) throws SQLException {
191- var query = "DELETE FROM file_resource WHERE type = 'web-resource'" ;
199+ private void deleteType (String type , long extensionId , Connection connection ) throws SQLException {
200+ var query = "DELETE FROM file_resource WHERE type = ? AND extension_id = ?" ;
192201 try (var statement = connection .prepareStatement (query )) {
202+ statement .setString (1 , type );
203+ statement .setLong (2 , extensionId );
193204 statement .executeUpdate ();
194205 }
195206 }
0 commit comments