use of org.wso2.carbon.apimgt.core.models.APIDetails in project carbon-apimgt by wso2.
the class FileBasedApiImportExportManager method importAPIs.
/**
* Imports a set of APIs to API Manager by reading and decoding the input stream
*
* @param uploadedApiArchiveInputStream InputStream to be read ana decoded to a set of APIs
* @param provider API provider, if needs to be updated
* @return {@link APIListDTO} object comprising of successfully imported APIs
* @throws APIMgtEntityImportExportException if any error occurs while importing or no APIs are imported successfully
*/
public APIListDTO importAPIs(InputStream uploadedApiArchiveInputStream, String provider) throws APIMgtEntityImportExportException {
String apiArchiveLocation = path + File.separator + IMPORTED_APIS_DIRECTORY_NAME + ".zip";
String archiveExtractLocation = null;
try {
archiveExtractLocation = APIFileUtils.extractUploadedArchive(uploadedApiArchiveInputStream, IMPORTED_APIS_DIRECTORY_NAME, apiArchiveLocation, path);
} catch (APIMgtDAOException e) {
String errorMsg = "Error in accessing uploaded API archive " + apiArchiveLocation;
log.error(errorMsg, e);
throw new APIMgtEntityImportExportException(errorMsg, e, ExceptionCodes.API_IMPORT_ERROR);
}
// List to contain newly created/updated APIs
Set<APIDetails> apiDetailsSet = decodeApiInformationFromDirectoryStructure(archiveExtractLocation, provider);
List<API> apis = new ArrayList<>();
for (APIDetails apiDetails : apiDetailsSet) {
try {
apis.add(importApi(apiDetails));
} catch (APIManagementException e) {
log.error("Error while importing API: " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion());
// skip importing the API
continue;
}
log.info("Successfully imported API: " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion());
}
try {
APIFileUtils.deleteDirectory(path);
} catch (APIMgtDAOException e) {
log.warn("Unable to remove directory " + path);
}
// if no APIs are corrected exported, throw an error
if (apis.isEmpty()) {
String errorMsg = "No APIs imported successfully";
throw new APIMgtEntityImportExportException(errorMsg, ExceptionCodes.API_IMPORT_ERROR);
}
return MappingUtil.toAPIListDTO(apis);
}
use of org.wso2.carbon.apimgt.core.models.APIDetails in project carbon-apimgt by wso2.
the class FileBasedApiImportExportManager method exportDocumentationToFileSystem.
/**
* Writes the given List of {@link DocumentInfo} objects to the file system
*
* @param documentInfo list of {@link DocumentInfo} objects
* @param apiDetails {@link APIDetails} instance, to which the documents are related to
* @param exportLocation file system location to which documents will be written
*/
private void exportDocumentationToFileSystem(Set<DocumentInfo> documentInfo, APIDetails apiDetails, String exportLocation) {
if (documentInfo == null || documentInfo.isEmpty()) {
log.debug("No documentation found for API with api: " + apiDetails.getApi().getName() + ", " + "version: " + apiDetails.getApi().getVersion());
return;
}
// create Documents root directory
String documentsBaseDirectory = exportLocation + File.separator + DOCUMENTS_ROOT_DIRECTORY;
try {
APIFileUtils.createDirectory(documentsBaseDirectory);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
for (DocumentInfo aDocumentInfo : documentInfo) {
// create the root directory for each document
String apiExportDir = documentsBaseDirectory + File.separator + aDocumentInfo.getId();
APIFileUtils.createDirectory(apiExportDir);
// for each document, write a DocumentInfo to a separate json file
String apiDocMetaFileLocation = apiExportDir + File.separator + DOCUMENTATION_DEFINITION_FILE;
APIFileUtils.createFile(apiDocMetaFileLocation);
APIFileUtils.writeToFile(apiDocMetaFileLocation, gson.toJson(aDocumentInfo));
// if the document's SourceType is FILE, retrieve and write the content to a file
DocumentContent content;
if (aDocumentInfo.getSourceType().equals(DocumentInfo.SourceType.FILE)) {
content = apiDetails.getDocumentContent(aDocumentInfo.getId());
if (content != null) {
APIFileUtils.createFile(apiExportDir + File.separator + content.getDocumentInfo().getFileName());
APIFileUtils.writeStreamToFile(apiExportDir + File.separator + content.getDocumentInfo().getFileName(), content.getFileContent());
// modify the document metadata to contain the file name
DocumentInfo modifiedDocInfo = new DocumentInfo.Builder(aDocumentInfo).fileName(content.getDocumentInfo().getFileName()).build();
APIFileUtils.writeToFile(apiDocMetaFileLocation, gson.toJson(modifiedDocInfo));
}
} else if (aDocumentInfo.getSourceType().equals(DocumentInfo.SourceType.INLINE)) {
content = apiDetails.getDocumentContent(aDocumentInfo.getId());
if (content != null) {
APIFileUtils.createFile(apiExportDir + File.separator + content.getDocumentInfo().getName());
APIFileUtils.writeToFile(apiExportDir + File.separator + content.getDocumentInfo().getName(), content.getInlineContent());
// modify the document metadata to contain the inline content name
DocumentInfo modifiedDocInfo = new DocumentInfo.Builder(aDocumentInfo).name(content.getDocumentInfo().getName()).build();
APIFileUtils.writeToFile(apiDocMetaFileLocation, gson.toJson(modifiedDocInfo));
}
}
}
} catch (APIMgtDAOException e) {
log.error("Error in exporting documents to file system for api: " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion());
// cleanup
try {
APIFileUtils.deleteDirectory(path);
} catch (APIMgtDAOException ignore) {
log.warn("Unable to remove directory " + path);
}
}
if (log.isDebugEnabled()) {
log.debug("Successfully exported documentation for api: " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion());
}
}
use of org.wso2.carbon.apimgt.core.models.APIDetails in project carbon-apimgt by wso2.
the class ApiImportExportManager method updateAPIDetails.
/**
* Updates the API details
*
* @param apiDetails {@link APIDetails} instance
* @throws APIManagementException if an error occurs while updating API details
*/
void updateAPIDetails(APIDetails apiDetails) throws APIManagementException {
// update everything
String swaggerDefinition = apiDetails.getSwaggerDefinition();
String gatewayConfig = apiDetails.getGatewayConfiguration();
Map<String, Endpoint> endpointTypeToIdMap = new HashMap<>();
// endpoints
for (Endpoint endpoint : apiDetails.getEndpoints()) {
try {
apiPublisher.updateEndpoint(endpoint);
endpointTypeToIdMap.put(endpoint.getType(), endpoint);
} catch (APIManagementException e) {
// skip updating this API, log and continue
log.error("Error while updating the endpoint with id: " + endpoint.getId() + ", type: " + endpoint.getType() + " for API: " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion());
}
}
API.APIBuilder apiBuilder = new API.APIBuilder(apiDetails.getApi());
apiPublisher.updateAPI(apiBuilder.apiDefinition(swaggerDefinition).gatewayConfig(gatewayConfig).endpoint(endpointTypeToIdMap));
// docs
try {
Set<DocumentInfo> documentInfo = apiDetails.getAllDocumentInformation();
for (DocumentInfo aDocInfo : documentInfo) {
apiPublisher.updateDocumentation(aDocInfo.getId(), aDocInfo);
}
Collection<DocumentContent> docContents = apiDetails.getDocumentContents();
for (DocumentContent docContent : docContents) {
// update documentation
if (docContent.getDocumentInfo().getSourceType().equals(DocumentInfo.SourceType.FILE)) {
apiPublisher.uploadDocumentationFile(docContent.getDocumentInfo().getId(), docContent.getFileContent(), URLConnection.guessContentTypeFromStream(docContent.getFileContent()));
} else if (docContent.getDocumentInfo().getSourceType().equals(DocumentInfo.SourceType.INLINE)) {
apiPublisher.addDocumentationContent(docContent.getDocumentInfo().getId(), docContent.getInlineContent());
}
}
} catch (APIManagementException e) {
// no need to throw, log and continue
log.error("Error while adding Document details for API: " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion(), e);
} catch (IOException e) {
// no need to throw, log and continue
log.error("Error while retrieving content type of the File documentation of API : " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion(), e);
}
// update thumbnail
try {
apiPublisher.saveThumbnailImage(apiDetails.getApi().getId(), apiDetails.getThumbnailStream(), "thumbnail");
} catch (APIManagementException e) {
// no need to throw, log and continue
log.error("Error while updating thumbnail for API: " + apiDetails.getApi().getName() + ", version: " + apiDetails.getApi().getVersion(), e);
}
}
use of org.wso2.carbon.apimgt.core.models.APIDetails in project carbon-apimgt by wso2.
the class ApiImportExportManager method getAPIDetails.
/**
* Retrieves all API details of the APIs for the given search query. API details consist of:
* 1. API {@link org.wso2.carbon.apimgt.core.models.API}
* 2. Document Info {@link org.wso2.carbon.apimgt.core.models.DocumentInfo}
* 3. Document Content {@link org.wso2.carbon.apimgt.core.models.DocumentContent}
* 4. Swagger Definition
* 5. Gateway Definition
* 6. Thumbnail content
*
* @param limit number of max results
* @param offset starting location when returning a limited set of results
* @param query searchQuery
* @return {@link APIDetails} instance
* @throws APIManagementException if an error occurs while retrieving API details
*/
public Set<APIDetails> getAPIDetails(Integer limit, Integer offset, String query) throws APIManagementException {
Set<APIDetails> apiDetailSet = new HashSet<>();
// search for APIs
List<API> apis = apiPublisher.searchAPIs(limit, offset, query);
if (apis == null || apis.isEmpty()) {
// no APIs found, return
return apiDetailSet;
}
// iterate and collect all information
for (API api : apis) {
api = apiPublisher.getAPIbyUUID(api.getId());
// get endpoints at API Level
Map<String, Endpoint> endpoints = api.getEndpoint();
if (endpoints.isEmpty()) {
log.error("No Endpoints found for api: " + api.getName() + ", version: " + api.getVersion());
// skip this API
// continue;
}
Set<Endpoint> endpointSet = new HashSet<>();
for (Map.Entry<String, Endpoint> endpointEntry : endpoints.entrySet()) {
if (APIMgtConstants.GLOBAL_ENDPOINT.equals(endpointEntry.getValue().getApplicableLevel())) {
Endpoint endpoint = new Endpoint.Builder(apiPublisher.getEndpoint(endpointEntry.getValue().getId())).id("").build();
endpoints.replace(endpointEntry.getKey(), endpoint);
endpointSet.add(endpoint);
}
}
// get Endpoints at Resource Level
Map<String, UriTemplate> uriTemplateMap = api.getUriTemplates();
uriTemplateMap.forEach((k, v) -> {
UriTemplate.UriTemplateBuilder uriTemplateBuilder = new UriTemplate.UriTemplateBuilder(v);
Map<String, Endpoint> resourceEndpoints = uriTemplateBuilder.getEndpoint();
resourceEndpoints.forEach((type, value) -> {
Endpoint endpoint = null;
if (APIMgtConstants.GLOBAL_ENDPOINT.equals(value.getApplicableLevel())) {
try {
endpoint = new Endpoint.Builder(apiPublisher.getEndpoint(value.getId())).id("").build();
endpointSet.add(endpoint);
} catch (APIManagementException e) {
log.error("Error in getting endpoints for Resource: " + v.getTemplateId(), e);
}
} else {
endpoint = new Endpoint.Builder(value).id("").build();
}
resourceEndpoints.replace(type, endpoint);
});
uriTemplateMap.replace(k, uriTemplateBuilder.endpoint(resourceEndpoints).build());
});
api = new API.APIBuilder(api).endpoint(endpoints).uriTemplates(uriTemplateMap).build();
// get swagger definition
String swaggerDefinition;
try {
swaggerDefinition = apiPublisher.getApiSwaggerDefinition(api.getId());
} catch (APIManagementException e) {
log.error("Error in getting Swagger configuration for api: " + api.getName() + ", version: " + api.getVersion(), e);
// skip this API
continue;
}
// get gateway configuration
String gatewayConfig;
try {
gatewayConfig = apiPublisher.getApiGatewayConfig(api.getId());
} catch (APIManagementException e) {
log.error("Error in getting gateway configuration for api: " + api.getName() + ", version: " + api.getVersion(), e);
// skip this API
continue;
}
// get doc information
List<DocumentInfo> documentInfo = null;
try {
documentInfo = apiPublisher.getAllDocumentation(api.getId(), 0, Integer.MAX_VALUE);
} catch (APIManagementException e) {
log.error("Error in getting documentation content for api: " + api.getName() + ", version: " + api.getVersion(), e);
// no need to skip the API as docs don't affect API functionality
}
Set<DocumentContent> documentContents = new HashSet<>();
if (documentInfo != null && !documentInfo.isEmpty()) {
// iterate and collect document content
for (DocumentInfo aDocumentInfo : documentInfo) {
try {
documentContents.add(apiPublisher.getDocumentationContent(aDocumentInfo.getId()));
} catch (APIManagementException e) {
log.error("Error in getting documentation content for api: " + api.getName() + ", version: " + api.getVersion() + ", doc id: " + aDocumentInfo.getId(), e);
// no need to skip the API as docs don't affect API functionality
}
}
}
// get thumbnail
InputStream thumbnailStream = null;
try {
thumbnailStream = apiPublisher.getThumbnailImage(api.getId());
} catch (APIManagementException e) {
log.error("Error in getting thumbnail for api: " + api.getName() + ", version: " + api.getVersion(), e);
// no need to skip the API as thumbnail don't affect API functionality
}
// search operation returns a summary of APIs, need to get all details of APIs
APIDetails apiDetails = new APIDetails(api, swaggerDefinition);
apiDetails.setGatewayConfiguration(gatewayConfig);
apiDetails.setEndpoints(endpointSet);
if (documentInfo != null && !documentInfo.isEmpty()) {
apiDetails.addDocumentInformation(documentInfo);
}
if (!documentContents.isEmpty()) {
apiDetails.addDocumentContents(documentContents);
}
if (thumbnailStream != null) {
apiDetails.setThumbnailStream(thumbnailStream);
}
apiDetailSet.add(apiDetails);
}
return apiDetailSet;
}
Aggregations