diff --git a/Calculator-1.0.0.zip b/Calculator-1.0.0.zip
new file mode 100644
index 0000000..bb923e5
Binary files /dev/null and b/Calculator-1.0.0.zip differ
diff --git a/pom.xml b/pom.xml
index 0a84bd0..b395a1a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,9 +45,9 @@
provided
- org.wso2.carbon.apimgt
- org.wso2.carbon.apimgt.impl
- 9.31.86
+ io.swagger
+ swagger-parser
+ 1.0.75
diff --git a/src/main/java/cz/trask/migration/ApiSync.java b/src/main/java/cz/trask/migration/ApiSync.java
index af3ac8f..7562233 100644
--- a/src/main/java/cz/trask/migration/ApiSync.java
+++ b/src/main/java/cz/trask/migration/ApiSync.java
@@ -29,7 +29,6 @@ public class ApiSync {
log.info("Export command selected.");
ExportToWso2FromV32 exp = new ExportToWso2FromV32();
exp.process();
- log.error("Export command not implemented yet.");
} else {
log.error("Unknown command: " + sp.getCommand());
printHelp();
diff --git a/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java b/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java
index dce7c21..313939d 100644
--- a/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java
+++ b/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java
@@ -9,13 +9,13 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.wso2.carbon.apimgt.api.APIDefinition;
-import org.wso2.carbon.apimgt.impl.definitions.OASParserUtil;
import cz.trask.migration.AbstractProcess;
import cz.trask.migration.mapper.ApiDefinitionMapper;
@@ -114,6 +114,13 @@ public class ExportToWso2FromV32 extends AbstractProcess {
byte[] data = prepareApiZipFile32to45(client, ver, ref);
String fileName = api.getName() + "-" + ver.getVersion() + ".zip";
+ FileOutputStream fos = new FileOutputStream(fileName);
+ fos.write(data);
+ fos.flush();
+ fos.close();
+
+ // System.exit(0);
+
if (data != null && data.length > 0 && fileName != null && !fileName.isEmpty()) {
int responseCode = publishApiToWso2(fileName, data, tokenResponse);
if (responseCode == 200 || responseCode == 201) {
@@ -161,8 +168,8 @@ public class ExportToWso2FromV32 extends AbstractProcess {
return responseCode;
}
- public static byte[] prepareApiZipFile32to45(RegistryClient client, SearchedVersion ver,
- List ref) throws Exception {
+ public byte[] prepareApiZipFile32to45(RegistryClient client, SearchedVersion ver, List ref)
+ throws Exception {
String baseDir = ver.getName() + "-" + ver.getVersion() + "/";
@@ -170,7 +177,6 @@ public class ExportToWso2FromV32 extends AbstractProcess {
ZipOutputStream zos = new ZipOutputStream(baos)) {
ApiDefinition32 apiDef = null;
- APIDefinition openApiParser = null;
String contentStr = null;
for (ArtifactReference r : ref) {
@@ -178,43 +184,65 @@ public class ExportToWso2FromV32 extends AbstractProcess {
ArtifactMetaData amd = client.getArtifactMetaData(r.getGroupId(), r.getArtifactId());
- String subDir = "";
-
- if (FileType.OPENAPI.toString().equals(amd.getGroupId())) {
- subDir = "Definitions/";
- } else if (FileType.POLICY_IN.toString().equals(amd.getGroupId())) {
- subDir = "Policies/";
- }
-
- String fileName = baseDir + subDir + r.getName();
- log.info(" - Adding file: {}", fileName);
-
byte[] content = client.getContentByGlobalId(amd.getGlobalId()).readAllBytes();
- if (FileType.APIDEF.toString().equals(amd.getGroupId())) {
- apiDef = mapperYaml.readValue(content, ApiDefinition32.class);
+ String subDir = "";
+ boolean appendFile = true;
+ String specialName = null;
+
+ if (FileType.POLICY_IN.toString().equals(amd.getGroupId())) {
+ subDir = "Policies/";
+ specialName = r.getName().replace(".xml", "_v1_common.j2");
+ content = convertSequenceToPolicy(content);
+ } else if (FileType.POLICY_OUT.toString().equals(amd.getGroupId())) {
+ subDir = "Policies/";
+ specialName = r.getName().replace(".xml", "_v1_common.j2");
+ content = convertSequenceToPolicy(content);
+ } else if (FileType.POLICY_FAULT.toString().equals(amd.getGroupId())) {
+ subDir = "Policies/";
+ specialName = r.getName().replace(".xml", "_v1_common.j2");
+ content = convertSequenceToPolicy(content);
} else if (FileType.OPENAPI.toString().equals(amd.getGroupId())) {
+ subDir = "Definitions/";
contentStr = new String(content);
- if (contentStr != null)
- openApiParser = OASParserUtil.getOASParser(contentStr);
+ } else if (FileType.CERTIFICATE.toString().equals(amd.getGroupId())) {
+ subDir = "Meta-information/";
+ } else if (FileType.APIDEF.toString().equals(amd.getGroupId())) {
+ apiDef = mapperYaml.readValue(content, ApiDefinition32.class);
+ appendFile = false;
}
- if (apiDef != null && openApiParser != null) {
- ApiDefinition45 apiDef45 = ApiDefinitionMapper.map(apiDef, openApiParser, contentStr);
- content = mapperYaml.writeValueAsBytes(apiDef45);
- FileOutputStream fos = new FileOutputStream("api.yaml");
- fos.write(content);
- fos.flush();
- fos.close();
- System.exit(0);
- }
+ String fileName = baseDir + subDir + (specialName != null ? specialName : r.getName());
+ log.info(" - Adding file: {}", fileName);
- zos.putNextEntry(new ZipEntry(fileName));
+ if (appendFile) {
+ zos.putNextEntry(new ZipEntry(fileName));
+ zos.write(content);
+ zos.closeEntry();
+ }
+ }
+ if (apiDef != null && contentStr != null) {
+ ApiDefinition45 apiDef45 = ApiDefinitionMapper.map(apiDef, contentStr);
+ byte[] content = mapperYaml.writeValueAsBytes(apiDef45);
+ zos.putNextEntry(new ZipEntry(baseDir.concat("api.yaml")));
zos.write(content);
zos.closeEntry();
}
+
zos.finish();
return baos.toByteArray();
}
}
+
+ private byte[] convertSequenceToPolicy(byte[] content) throws Exception {
+ if (content != null && content.length > 0) {
+ Pattern pattern = Pattern.compile("]*>(.*?)", Pattern.DOTALL);
+ Matcher matcher = pattern.matcher(new String(content));
+
+ // Replace the entire sequence block with its inner content
+ String result = matcher.replaceAll("$1").trim();
+ return result.getBytes();
+ }
+ return null;
+ }
}
diff --git a/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java b/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java
index a080a07..2b3a32b 100644
--- a/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java
+++ b/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java
@@ -3,27 +3,25 @@ package cz.trask.migration.mapper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.stream.Collectors;
-import org.wso2.carbon.apimgt.api.APIDefinition;
-import org.wso2.carbon.apimgt.api.model.Scope;
-import org.wso2.carbon.apimgt.api.model.URITemplate;
-
import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
import cz.trask.migration.AbstractProcess;
import cz.trask.migration.model.ApiDefinition32;
import cz.trask.migration.model.ApiDefinition45;
import cz.trask.migration.model.ApiDefinition45.ApiPolicies;
+import cz.trask.migration.model.ApiDefinition45.Operation;
+import cz.trask.migration.model.ApiDefinition45.OperationPolicies;
import cz.trask.migration.util.CredentialsDecoder;
public class ApiDefinitionMapper {
- public static ApiDefinition45 map(ApiDefinition32 oldApi, APIDefinition openApiParser, String swagger)
- throws Exception {
+ public static ApiDefinition45 map(ApiDefinition32 oldApi, String swagger) throws Exception {
if (oldApi == null)
return null;
@@ -107,6 +105,7 @@ public class ApiDefinitionMapper {
// ---------- API policies ----------
data.setApiPolicies(mapApiPolicies(oldApi));
+ // data.setApiPolicies(mapApiPolicies(null));
// ---------- key managers ----------
data.setKeyManagers(oldApi.getKeyManagers());
@@ -134,8 +133,7 @@ public class ApiDefinitionMapper {
data.setSubscriptionAvailableTenants(Collections.emptyList());
// ---------- operations ----------
- Set uriTemplates = openApiParser.getURITemplates(swagger);
- data.setOperations(mapOperations(uriTemplates));
+ data.setOperations(mapOperations(swagger));
// ---------- additional metadata ----------
data.setCreatedTime(oldApi.getCreatedTime());
@@ -151,18 +149,18 @@ public class ApiDefinitionMapper {
private static ApiPolicies mapApiPolicies(ApiDefinition32 oldApi) {
ApiDefinition45.ApiPolicies apiPolicies = new ApiDefinition45.ApiPolicies();
// ---------- request policies ----------
- if (oldApi.getInSequence() != null && !oldApi.getInSequence().isEmpty()) {
+ if (oldApi != null && oldApi.getInSequence() != null && !oldApi.getInSequence().isEmpty()) {
ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy();
requestPolicy.setPolicyName(oldApi.getInSequence());
- requestPolicy.setPolicyType("common");
- requestPolicy.setPolicyVersion("v1");
+ requestPolicy.setPolicyType("");
+ requestPolicy.setPolicyVersion("");
requestPolicy.setPolicyId("");
requestPolicy.setParameters(Collections.emptyMap());
apiPolicies.setRequest(List.of(requestPolicy));
} else
apiPolicies.setRequest(Collections.emptyList());
// ---------- response policies ----------
- if (oldApi.getOutSequence() != null && !oldApi.getOutSequence().isEmpty()) {
+ if (oldApi != null && oldApi.getOutSequence() != null && !oldApi.getOutSequence().isEmpty()) {
ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy();
requestPolicy.setPolicyName(oldApi.getOutSequence());
requestPolicy.setPolicyType("common");
@@ -173,7 +171,7 @@ public class ApiDefinitionMapper {
} else
apiPolicies.setResponse(Collections.emptyList());
// ---------- fault policies ----------
- if (oldApi.getFaultSequence() != null && !oldApi.getFaultSequence().isEmpty()) {
+ if (oldApi != null && oldApi.getFaultSequence() != null && !oldApi.getFaultSequence().isEmpty()) {
ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy();
requestPolicy.setPolicyName(oldApi.getFaultSequence());
requestPolicy.setPolicyType("common");
@@ -236,7 +234,8 @@ public class ApiDefinitionMapper {
newSec.setType(oldSec.getType());
newSec.setTokenUrl(oldSec.getTokenUrl());
newSec.setClientId(oldSec.getClientId());
- newSec.setClientSecret(CredentialsDecoder.decodeCredentials(oldSec.getClientSecret(), AbstractProcess.PRIVATE_KEY_APIM_32));
+ newSec.setClientSecret(
+ CredentialsDecoder.decodeCredentials(oldSec.getClientSecret(), AbstractProcess.PRIVATE_KEY_APIM_32));
newSec.setUsername(oldSec.getUsername());
newSec.setPassword(oldSec.getPassword());
newSec.setGrantType(oldSec.getGrantType());
@@ -249,8 +248,9 @@ public class ApiDefinitionMapper {
// ---------- parse customParameters JSON string ----------
if (oldSec.getCustomParameters() != null && !oldSec.getCustomParameters().isEmpty()) {
try {
- Map map = AbstractProcess.mapperYaml.readValue(oldSec.getCustomParameters(), new TypeReference<>() {
- });
+ Map map = AbstractProcess.mapperYaml.readValue(oldSec.getCustomParameters(),
+ new TypeReference<>() {
+ });
newSec.setCustomParameters(map);
} catch (Exception e) {
newSec.setCustomParameters(Collections.emptyMap());
@@ -265,37 +265,46 @@ public class ApiDefinitionMapper {
return newSec;
}
- private static List mapOperations(Set uriTemplates) {
- if (uriTemplates == null || uriTemplates.isEmpty())
- return Collections.emptyList();
-
- List operations = new ArrayList<>();
-
- for (URITemplate uriTemplate : uriTemplates) {
-
- ApiDefinition45.Operation op = new ApiDefinition45.Operation();
- op.setId("");
- op.setAuthType(uriTemplate.getAuthType());
- op.setThrottlingPolicy(uriTemplate.getThrottlingTier());
- op.setVerb(uriTemplate.getHTTPVerb());
- op.setTarget(uriTemplate.getUriTemplate());
- op.setScopes(new ArrayList<>());
- for (Scope scope : uriTemplate.getScopes()) {
- if (scope != null && scope.getKey() != null && !scope.getKey().isEmpty()) {
- op.getScopes().add(scope.getName());
- }
- }
-
- op.setUsedProductIds(new ArrayList<>());
-
- ApiDefinition45.OperationPolicies opPolicies = new ApiDefinition45.OperationPolicies();
- opPolicies.setRequest(Collections.emptyList());
- opPolicies.setResponse(Collections.emptyList());
- opPolicies.setFault(Collections.emptyList());
- op.setOperationPolicies(opPolicies);
-
- operations.add(op);
+ public static List mapOperations(String swaggerYamlString) throws Exception {
+ JsonNode root = AbstractProcess.mapperYaml.readTree(swaggerYamlString);
+ JsonNode pathsNode = root.get("paths");
+ if (pathsNode == null || !pathsNode.isObject()) {
+ throw new IllegalArgumentException("Swagger YAML neobsahuje sekci 'paths'.");
}
- return operations;
+
+ List operationsList = new ArrayList<>();
+
+ Iterator> pathIter = pathsNode.fields();
+ while (pathIter.hasNext()) {
+ Map.Entry pathEntry = pathIter.next();
+ String path = pathEntry.getKey();
+ JsonNode methodsNode = pathEntry.getValue();
+
+ Iterator> methodIter = methodsNode.fields();
+ while (methodIter.hasNext()) {
+ Map.Entry methodEntry = methodIter.next();
+ String verb = methodEntry.getKey().toUpperCase();
+ JsonNode methodDef = methodEntry.getValue();
+
+ Operation op = new Operation();
+ op.setId("");
+ op.setTarget(path);
+ op.setVerb(verb);
+ op.setAuthType(methodDef.path("x-auth-type").asText(""));
+ op.setThrottlingPolicy(methodDef.path("x-throttling-tier").asText(""));
+ op.setScopes(new ArrayList<>());
+ op.setUsedProductIds(new ArrayList<>());
+
+ OperationPolicies policies = new OperationPolicies();
+ policies.setRequest(new ArrayList<>());
+ policies.setResponse(new ArrayList<>());
+ policies.setFault(new ArrayList<>());
+ op.setOperationPolicies(policies);
+
+ operationsList.add(op);
+ }
+ }
+
+ return operationsList;
}
}