first working draft
This commit is contained in:
parent
c164ff7802
commit
eb9cbdcfde
@ -1,6 +1,7 @@
|
|||||||
package cz.trask.apioperator;
|
package cz.trask.apioperator;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
@ -309,4 +310,79 @@ public abstract class AbstractProcess {
|
|||||||
}
|
}
|
||||||
return listOfApis;
|
return listOfApis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common function used for upload API
|
||||||
|
*
|
||||||
|
* @param urlStr - url to dev poral
|
||||||
|
* @param httpHeaders
|
||||||
|
* @param params - currently is not used
|
||||||
|
* @param api - zip file to upload
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
protected static HttpResponse makeFileRequest(String method, String urlStr, Map<String, String> httpHeaders,
|
||||||
|
byte[] buff, String attachmentFileName) throws Exception {
|
||||||
|
|
||||||
|
if (buff==null) {
|
||||||
|
log.error("Cannot send NULL payload to rest service.");
|
||||||
|
}
|
||||||
|
|
||||||
|
String crlf = "\r\n";
|
||||||
|
|
||||||
|
String twoHyphens = "--";
|
||||||
|
String boundary = "----" + System.currentTimeMillis() + "----";
|
||||||
|
|
||||||
|
URL url = new URL(urlStr);
|
||||||
|
|
||||||
|
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
|
||||||
|
con.setUseCaches(false);
|
||||||
|
con.setDoOutput(true);
|
||||||
|
|
||||||
|
con.setRequestMethod(method);
|
||||||
|
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
|
||||||
|
con.setRequestProperty("User-Agent", "curl/7.55.1");
|
||||||
|
con.setRequestProperty("Accept", "*/*");
|
||||||
|
|
||||||
|
for (String key : httpHeaders.keySet()) {
|
||||||
|
con.addRequestProperty(key, httpHeaders.get(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
DataOutputStream request = new DataOutputStream(con.getOutputStream());
|
||||||
|
request.writeBytes(crlf);
|
||||||
|
request.writeBytes(twoHyphens + boundary + crlf);
|
||||||
|
request.writeBytes(
|
||||||
|
"Content-Disposition: form-data; name=\"file\"; filename=\"" + attachmentFileName + "\"" + crlf);
|
||||||
|
request.writeBytes("Content-Type: application/octet-stream" + crlf);
|
||||||
|
request.writeBytes("Content-Transfer-Encoding: binary" + crlf);
|
||||||
|
request.writeBytes(crlf);
|
||||||
|
request.write(buff);
|
||||||
|
request.writeBytes(crlf);
|
||||||
|
request.writeBytes(twoHyphens + boundary + twoHyphens + crlf);
|
||||||
|
request.flush();
|
||||||
|
request.close();
|
||||||
|
|
||||||
|
String res = "";
|
||||||
|
byte[] buf = new byte[4096];
|
||||||
|
|
||||||
|
HttpResponse resp = new HttpResponse();
|
||||||
|
InputStream in;
|
||||||
|
int responseCode = con.getResponseCode();
|
||||||
|
|
||||||
|
if (responseCode == 200 || responseCode == 201) {
|
||||||
|
in = con.getInputStream();
|
||||||
|
} else {
|
||||||
|
in = con.getErrorStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
while (in.available() > 0) {
|
||||||
|
int read = in.read(buf);
|
||||||
|
res = res.concat(new String(buf, 0, read));
|
||||||
|
}
|
||||||
|
|
||||||
|
resp.setHeaders(con.getHeaderFields());
|
||||||
|
resp.setResponse(res);
|
||||||
|
resp.setResponseCode(responseCode);
|
||||||
|
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,18 @@
|
|||||||
package cz.trask.apioperator.impl;
|
package cz.trask.apioperator.impl;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
@ -12,10 +20,13 @@ import org.apache.logging.log4j.Logger;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
|
||||||
import cz.trask.apioperator.AbstractProcess;
|
import cz.trask.apioperator.AbstractProcess;
|
||||||
|
import cz.trask.apioperator.model.FileType;
|
||||||
|
import cz.trask.apioperator.model.HttpResponse;
|
||||||
import cz.trask.apioperator.model.RegisterResponse;
|
import cz.trask.apioperator.model.RegisterResponse;
|
||||||
import cz.trask.apioperator.model.TokenResponse;
|
import cz.trask.apioperator.model.TokenResponse;
|
||||||
import io.apicurio.registry.rest.client.RegistryClient;
|
import io.apicurio.registry.rest.client.RegistryClient;
|
||||||
import io.apicurio.registry.rest.client.RegistryClientFactory;
|
import io.apicurio.registry.rest.client.RegistryClientFactory;
|
||||||
|
import io.apicurio.registry.rest.v2.beans.ArtifactMetaData;
|
||||||
import io.apicurio.registry.rest.v2.beans.ArtifactReference;
|
import io.apicurio.registry.rest.v2.beans.ArtifactReference;
|
||||||
import io.apicurio.registry.rest.v2.beans.ArtifactSearchResults;
|
import io.apicurio.registry.rest.v2.beans.ArtifactSearchResults;
|
||||||
import io.apicurio.registry.rest.v2.beans.SearchedArtifact;
|
import io.apicurio.registry.rest.v2.beans.SearchedArtifact;
|
||||||
@ -90,17 +101,25 @@ public class ExportToWso2 extends AbstractProcess {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
log.info("Processing API {} of {}", index, total);
|
log.info("Processing API {} of {}", index, total);
|
||||||
|
|
||||||
VersionSearchResults versions = client.listArtifactVersions(config.getDefaultApiGroup(), api.getId(), null, null);
|
VersionSearchResults versions = client.listArtifactVersions(config.getDefaultApiGroup(), api.getId(), null,
|
||||||
|
null);
|
||||||
|
|
||||||
for (SearchedVersion ver : versions.getVersions()) {
|
for (SearchedVersion ver : versions.getVersions()) {
|
||||||
log.info(" - Found version: {}", ver.getVersion());
|
log.info(" - Found version: {}", ver.getVersion());
|
||||||
List<ArtifactReference> ref = client.getArtifactReferencesByCoordinates(config.getDefaultApiGroup(), api.getId(), ver.getVersion());
|
List<ArtifactReference> ref = client.getArtifactReferencesByCoordinates(config.getDefaultApiGroup(),
|
||||||
|
api.getId(), ver.getVersion());
|
||||||
if (ref != null && !ref.isEmpty()) {
|
if (ref != null && !ref.isEmpty()) {
|
||||||
log.info("Artifact has {} references", ref.size());
|
log.info("Artifact has {} references", ref.size());
|
||||||
|
byte[] data = prepareApiZipFile(ver, ref);
|
||||||
|
String fileName = api.getName() + "-" + ver.getVersion() + ".zip";
|
||||||
|
if (data != null && data.length > 0 && fileName != null && !fileName.isEmpty()) {
|
||||||
|
publishApiToWso2(fileName, data, tokenResponse);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
log.info("Finished processing API {} of {} in {} ms", index, total, (end - start));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("IO error while importing API {}: {}", api.getId(), e.getMessage(), e);
|
log.error("IO error while importing API {}: {}", api.getId(), e.getMessage(), e);
|
||||||
}
|
}
|
||||||
@ -110,4 +129,64 @@ public class ExportToWso2 extends AbstractProcess {
|
|||||||
/* Helper methods */
|
/* Helper methods */
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
private int publishApiToWso2(String fileName, byte[] data, TokenResponse tokenResponse) {
|
||||||
|
int responseCode = -1;
|
||||||
|
try {
|
||||||
|
String url = config.getTargetPublisherApiUrl().concat(String.format("?preserveProvider=false&overwrite=true"));
|
||||||
|
|
||||||
|
log.info("API Import URL: " + url);
|
||||||
|
|
||||||
|
Map<String, String> httpHeaders = new HashMap<>();
|
||||||
|
|
||||||
|
httpHeaders.put("Authorization", "Bearer " + tokenResponse.getAccess_token());
|
||||||
|
|
||||||
|
HttpResponse response = makeFileRequest("POST", url, httpHeaders, data, fileName);
|
||||||
|
|
||||||
|
responseCode = response.getResponseCode();
|
||||||
|
|
||||||
|
if (response.getResponseCode() != 201 && response.getResponseCode() != 200) {
|
||||||
|
log.info("Cannot import API file: " + fileName + ", response code: " + response.getResponseCode());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("IO error while importing API file: " + fileName + ", error: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
return responseCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] prepareApiZipFile(SearchedVersion ver, List<ArtifactReference> ref) throws IOException {
|
||||||
|
|
||||||
|
String baseDir = ver.getName() + "-" + ver.getVersion() + "/";
|
||||||
|
|
||||||
|
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
ZipOutputStream zos = new ZipOutputStream(baos)) {
|
||||||
|
|
||||||
|
for (ArtifactReference r : ref) {
|
||||||
|
log.info(" - Reference: {} {} {}", r.getGroupId(), r.getArtifactId(), r.getVersion());
|
||||||
|
|
||||||
|
ArtifactMetaData amd = client.getArtifactMetaData(r.getGroupId(), r.getArtifactId());
|
||||||
|
|
||||||
|
String subDir = "";
|
||||||
|
|
||||||
|
if (FileType.OPENAPI.toString().equals(amd.getGroupId())) {
|
||||||
|
subDir = "Definitions/";
|
||||||
|
} else if (FileType.POLICY.toString().equals(amd.getGroupId())) {
|
||||||
|
subDir = "Policies/";
|
||||||
|
}
|
||||||
|
|
||||||
|
String fileName = baseDir + subDir + r.getName();
|
||||||
|
log.info(" - Adding file: {}", fileName);
|
||||||
|
|
||||||
|
zos.putNextEntry(new ZipEntry(fileName));
|
||||||
|
|
||||||
|
try (InputStream is = client.getContentByGlobalId(amd.getGlobalId())) {
|
||||||
|
zos.write(is.readAllBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
zos.closeEntry();
|
||||||
|
}
|
||||||
|
zos.finish();
|
||||||
|
return baos.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ SOURCE_PUBLISHER_TOKEN_URL = https://localhost:9443/oauth2/token
|
|||||||
SOURCE_WSO2_USER = YWRtaW46YWRtaW4=
|
SOURCE_WSO2_USER = YWRtaW46YWRtaW4=
|
||||||
|
|
||||||
TARGET_REGISTRATION_API_URL = https://localhost:9443/client-registration/v0.17/register
|
TARGET_REGISTRATION_API_URL = https://localhost:9443/client-registration/v0.17/register
|
||||||
TARGET_PUBLISHER_API_URL = https://localhost:9443/api/am/publisher
|
TARGET_PUBLISHER_API_URL = https://localhost:9443/api/am/publisher/v3/apis/import
|
||||||
TARGET_DEVPORTAL_API_URL = https://localhost:9443/api/am/devportal
|
TARGET_DEVPORTAL_API_URL = https://localhost:9443/api/am/devportal
|
||||||
TARGET_PUBLISHER_TOKEN_URL = https://localhost:9443/oauth2/token
|
TARGET_PUBLISHER_TOKEN_URL = https://localhost:9443/oauth2/token
|
||||||
TARGET_WSO2_USER = YWRtaW46YWRtaW4=
|
TARGET_WSO2_USER = YWRtaW46YWRtaW4=
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user