diff --git a/src/main/java/cz/trask/migration/AbstractProcess.java b/src/main/java/cz/trask/migration/AbstractProcess.java index 56870be..364dda4 100644 --- a/src/main/java/cz/trask/migration/AbstractProcess.java +++ b/src/main/java/cz/trask/migration/AbstractProcess.java @@ -28,10 +28,10 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; import cz.trask.migration.config.ConfigManager; import cz.trask.migration.model.APIList; import cz.trask.migration.model.ApplicationConfig; +import cz.trask.migration.model.ApplicationConfig.Wso2Endpoints; import cz.trask.migration.model.HttpResponse; import cz.trask.migration.model.RegisterResponse; import cz.trask.migration.model.TokenResponse; -import cz.trask.migration.model.ApplicationConfig.Wso2Endpoints; import io.apicurio.registry.rest.client.RegistryClient; import io.apicurio.registry.rest.client.RegistryClientFactory; import io.apicurio.registry.rest.v2.beans.ArtifactMetaData; @@ -241,9 +241,11 @@ public abstract class AbstractProcess { log.info("Calling URL: " + urlStr); String query = ""; - for (String key : params.keySet()) { - query = query.concat(URLEncoder.encode(key, "UTF-8")).concat("=") - .concat(URLEncoder.encode(params.get(key), "UTF-8")).concat("&"); + if (params != null) { + for (String key : params.keySet()) { + query = query.concat(URLEncoder.encode(key, "UTF-8")).concat("=") + .concat(URLEncoder.encode(params.get(key), "UTF-8")).concat("&"); + } } if (query.length() > 1 && "GET".equals(method)) { @@ -332,7 +334,20 @@ public abstract class AbstractProcess { out.flush(); out.close(); - InputStream in = con.getInputStream(); + InputStream in; + + try { + in = con.getInputStream(); + } catch (Exception e) { + in = con.getErrorStream(); + } + + if (in == null) { + HttpResponse resp = new HttpResponse(); + resp.setHeaders(con.getHeaderFields()); + resp.setResponseCode(con.getResponseCode()); + return resp; + } String res = ""; byte[] buf = new byte[4096]; diff --git a/src/main/java/cz/trask/migration/impl/v45/ExportAppsToWso2FromV32.java b/src/main/java/cz/trask/migration/impl/v45/ExportAppsToWso2FromV32.java index 7c262f4..4fa8dc5 100644 --- a/src/main/java/cz/trask/migration/impl/v45/ExportAppsToWso2FromV32.java +++ b/src/main/java/cz/trask/migration/impl/v45/ExportAppsToWso2FromV32.java @@ -14,6 +14,7 @@ import cz.trask.migration.model.HttpResponse; import cz.trask.migration.model.TokenResponse; import cz.trask.migration.model.v32.ApplicationDetail; import cz.trask.migration.model.v45.ApplicationCreateRequest; +import cz.trask.migration.model.v45.ApplicationCreateResponse; import io.apicurio.registry.rest.v2.beans.ArtifactMetaData; import io.apicurio.registry.rest.v2.beans.ArtifactSearchResults; import io.apicurio.registry.rest.v2.beans.SearchedArtifact; @@ -102,12 +103,21 @@ public class ExportAppsToWso2FromV32 extends AbstractProcess { HttpResponse response = makeDataRequest(endpoint, httpHeaders, data); if (response.getResponseCode() == 200 || response.getResponseCode() == 201) { - log.info(" - Application version {} imported successfully", ver.getVersion()); - } else { - log.warn(" - Application version {} import failed with response code {}", - ver.getVersion(), response.getResponseCode()); - } + log.info(" - Application {} imported successfully", appDetail.getName()); + ApplicationCreateResponse createdApp = mapper.readValue(response.getResponse(), + ApplicationCreateResponse.class); + log.info(" - Created Application ID in WSO2: {}", createdApp.getApplicationId()); + + if (!createdApp.getOwner().equals(appDetail.getOwner())) { + log.info(" - Changing owner of Application {} to {}", createdApp.getApplicationId(), + appDetail.getOwner()); + changeApplicationOwner(createdApp, appDetail.getOwner(), tokenResponse); + } + + } else if (response.getResponseCode() == 409) { + log.warn(" - Application {} already exists in WSO2, skipping import", appDetail.getName()); + } } // String fileName = api.getName() + "-" + ver.getVersion() + ".zip"; @@ -138,6 +148,30 @@ public class ExportAppsToWso2FromV32 extends AbstractProcess { } } + private void changeApplicationOwner(ApplicationCreateResponse createdApp, String origOwner, + TokenResponse tokenResponse) { + String endpoint = config.getTarget().getAdminApiUrl() + "/applications/" + createdApp.getApplicationId() + + "/change-owner?owner=" + origOwner; + + try { + Map httpHeaders = new HashMap<>(); + httpHeaders.put("Authorization", "Bearer ".concat(tokenResponse.getAccess_token())); + + HttpResponse response = makeRequest("POST", endpoint, httpHeaders, null); + + if (response.getResponseCode() == 200 || response.getResponseCode() == 201) { + log.info(" - Application {} owner changed successfully to {}", createdApp.getApplicationId(), + origOwner); + } else { + log.warn(" - Application {} owner change to {} failed with response code {}", + createdApp.getApplicationId(), origOwner, response.getResponseCode()); + } + } catch (Exception e) { + log.error("IO error while changing owner of Application {}: {}", createdApp.getApplicationId(), + e.getMessage(), e); + } + } + private ApplicationCreateRequest mapAppDetailToCreateRequest(ApplicationDetail appDetail) { ApplicationCreateRequest request = new ApplicationCreateRequest(); request.setName(appDetail.getName()); diff --git a/src/main/java/cz/trask/migration/model/v45/ApplicationCreateResponse.java b/src/main/java/cz/trask/migration/model/v45/ApplicationCreateResponse.java new file mode 100644 index 0000000..95cc8cf --- /dev/null +++ b/src/main/java/cz/trask/migration/model/v45/ApplicationCreateResponse.java @@ -0,0 +1,87 @@ +package cz.trask.migration.model.v45; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ApplicationCreateResponse { + @JsonProperty("applicationId") + private String applicationId; + + @JsonProperty("name") + private String name; + + @JsonProperty("throttlingPolicy") + private String throttlingPolicy; + + @JsonProperty("description") + private String description; + + @JsonProperty("tokenType") + private String tokenType = "JWT"; + + @JsonProperty("status") + private String status = ""; + + @JsonProperty("groups") + private List groups; + + @JsonProperty("subscriptionCount") + private Integer subscriptionCount; + + @JsonProperty("keys") + private List keys; + + @JsonProperty("attributes") + private Map attributes; + + @JsonProperty("subscriptionScopes") + private List subscriptionScopes; + + @JsonProperty("owner") + private String owner; + + @JsonProperty("hashEnabled") + private Boolean hashEnabled; + + @JsonProperty("createdTime") + private String createdTime; + + @JsonProperty("updatedTime") + private String updatedTime; + + @JsonProperty("visibility") + private String visibility; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class ApplicationKey { + @JsonProperty("key") + private String key; + + @JsonProperty("keyType") + private String keyType; + + @JsonProperty("state") + private String state; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class SubscriptionScope { + @JsonProperty("name") + private String name; + + @JsonProperty("description") + private String description; + } +} \ No newline at end of file diff --git a/src/main/resources/apicurio-migrator.yaml b/src/main/resources/apicurio-migrator.yaml index 7c3190f..3471bba 100644 --- a/src/main/resources/apicurio-migrator.yaml +++ b/src/main/resources/apicurio-migrator.yaml @@ -9,6 +9,7 @@ source: target: registration_api_url: https://localhost:9443/client-registration/v0.17/register publisher_api_url: https://localhost:9443/api/am/publisher/v4/apis/import + admin_api_url: https://localhost:9443/api/am/admin/v4 devportal_api_url: https://localhost:9443/api/am/devportal publisher_token_url: https://localhost:9443/oauth2/token wso2_user: YWRtaW46YWRtaW4=