/* * Copyright 2015 Ranjan Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.restfiddle.controller.rest; import io.swagger.models.HttpMethod; import io.swagger.models.Info; import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Swagger; import io.swagger.models.parameters.Parameter; import io.swagger.parser.SwaggerParser; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.fasterxml.jackson.databind.ObjectMapper; import com.restfiddle.constant.NodeType; import com.restfiddle.dao.NodeRepository; import com.restfiddle.dto.ConversationDTO; import com.restfiddle.dto.FormDataDTO; import com.restfiddle.dto.NodeDTO; import com.restfiddle.dto.RfHeaderDTO; import com.restfiddle.dto.RfRequestDTO; import com.restfiddle.entity.BaseNode; import com.restfiddle.entity.Project; import com.restfiddle.util.TreeNode; @RestController @Transactional public class ImportController { Logger logger = LoggerFactory.getLogger(ImportController.class); @Autowired private NodeController nodeController; @Autowired private ConversationController conversationController; @Autowired private ProjectController projectController; @Autowired private NodeRepository nodeRepository; @RequestMapping(value = "/api/import/restfiddle", method = RequestMethod.POST) public @ResponseBody void importRestFiddle(@RequestParam("projectId") String projectId, @RequestParam("name") String name, @RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { byte[] bytes = file.getBytes(); ObjectMapper mapper = new ObjectMapper(); TreeNode projectNode = mapper.readValue(bytes, TreeNode.class); System.out.println("projectNode : " + projectNode); createNodeRecursively(projectNode, projectNode.getChildren()); } catch (Exception e) { logger.error(e.getMessage(), e); } } } private void createNodeRecursively(BaseNode parent, List<TreeNode> nodes) { BaseNode node; for (TreeNode treeNode : nodes) { node = new BaseNode(); node.setName(treeNode.getName()); node.setDescription(treeNode.getDescription()); node.setNodeType(treeNode.getNodeType()); node.setStarred(treeNode.getStarred()); node.setPosition(treeNode.getPosition()); node.setProjectId(treeNode.getProjectId()); node.setParentId(parent.getId());// Important node.setWorkspaceId(parent.getWorkspaceId()); node = nodeRepository.save(node); List<TreeNode> children = treeNode.getChildren(); if (children != null && !children.isEmpty()) { createNodeRecursively(node, children); } } } @RequestMapping(value = "/api/import/swagger", method = RequestMethod.POST) public @ResponseBody void importSwagger(@RequestParam("projectId") String projectId, @RequestParam("name") String name, @RequestParam("file") MultipartFile file) { try { swaggerToRFConverter(projectId, name, file); } catch (IOException e) { e.printStackTrace(); } } @RequestMapping(value = "/api/import/raml", method = RequestMethod.POST) public @ResponseBody void importRaml(@RequestParam("projectId") String projectId, @RequestParam("name") String name, @RequestParam("file") MultipartFile file) { try { ramlToRFConverter(projectId, name, file); } catch (IOException e) { e.printStackTrace(); } } @RequestMapping(value = "/api/import/postman", method = RequestMethod.POST) public @ResponseBody void importPostman(@RequestParam("projectId") String projectId, @RequestParam("name") String name, @RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { byte[] bytes = file.getBytes(); String fileContent = new String(bytes); JSONObject pmCollection = new JSONObject(fileContent); String folderName = pmCollection.getString("name"); System.out.println(folderName); // NodeDTO folderNode = createFolder(projectId, folderName); ConversationDTO conversationDTO; JSONArray requests = pmCollection.getJSONArray("requests"); int len = requests.length(); for (int i = 0; i < len; i++) { JSONObject request = (JSONObject) requests.get(i); String requestName = request.getString("name"); String requestDescription = request.getString("description"); String requestUrl = request.getString("url"); String requestMethod = request.getString("method"); conversationDTO = new ConversationDTO(); // TODO : Set workspace Id to the conversation // conversationDTO.setWorkspaceId(project.getWorkspace().getId()); RfRequestDTO rfRequestDTO = new RfRequestDTO(); rfRequestDTO.setApiUrl(requestUrl); rfRequestDTO.setMethodType(requestMethod); String headersString = request.getString("headers"); if (headersString != null && !headersString.isEmpty()) { List<RfHeaderDTO> headerDTOs = new ArrayList<RfHeaderDTO>(); RfHeaderDTO headerDTO; String[] headersArr = headersString.split("\n"); for (String header : headersArr) { String[] headerToken = header.split(":"); String headerName = headerToken[0]; String headerValue = headerToken[1].trim(); headerDTO = new RfHeaderDTO(); headerDTO.setHeaderName(headerName); headerDTO.setHeaderValue(headerValue); headerDTOs.add(headerDTO); } rfRequestDTO.setHeaders(headerDTOs); } String dataMode = request.getString("dataMode"); if ("raw".equals(dataMode)) { String rawModeData = request.getString("rawModeData"); rfRequestDTO.setApiBody(rawModeData); } else if ("params".equals(dataMode)) { JSONArray formParamsArr = request.getJSONArray("data"); int arrLen = formParamsArr.length(); FormDataDTO formParam; List<FormDataDTO> formParams = new ArrayList<FormDataDTO>(); for (int j = 0; j < arrLen; j++) { JSONObject formParamJSON = (JSONObject) formParamsArr.get(j); formParam = new FormDataDTO(); formParam.setKey(formParamJSON.getString("key")); formParam.setValue(formParamJSON.getString("value")); formParams.add(formParam); } rfRequestDTO.setFormParams(formParams); } conversationDTO.setRfRequestDTO(rfRequestDTO); ConversationDTO createdConversation = conversationController.create(conversationDTO); conversationDTO.setId(createdConversation.getId()); // Request Node NodeDTO childNode = new NodeDTO(); childNode.setName(requestName); childNode.setDescription(requestDescription); childNode.setProjectId(projectId); childNode.setConversationDTO(conversationDTO); NodeDTO createdChildNode = nodeController.create(folderNode.getId(), childNode); System.out.println("created node : " + createdChildNode.getName()); } } catch (Exception e) { logger.error(e.getMessage(), e); } } } private void ramlToRFConverter(String projectId, String name, MultipartFile file) throws IOException { // Raml raml = new RamlDocumentBuilder().build(ramlLocation); } private NodeDTO createFolder(String projectId, String folderName) { Project project = projectController.findById(null, projectId); NodeDTO folderNodeDTO = new NodeDTO(); folderNodeDTO.setName(folderName); folderNodeDTO.setNodeType(NodeType.FOLDER.name()); folderNodeDTO.setProjectId(projectId); NodeDTO collectionNode = nodeController.create(project.getProjectRef().getId(), folderNodeDTO); return collectionNode; } // Swagger sample json : http://petstore.swagger.io/v2/swagger.json private void swaggerToRFConverter(String projectId, String name, MultipartFile file) throws IOException { // MultipartFile file File tempFile = File.createTempFile("RF_SWAGGER_IMPORT", "JSON"); file.transferTo(tempFile); Swagger swagger = new SwaggerParser().read(tempFile.getAbsolutePath()); String host = swagger.getHost(); String basePath = swagger.getBasePath(); Info info = swagger.getInfo(); String title = info.getTitle(); String description = info.getDescription(); NodeDTO folderNode = createFolder(projectId, title); folderNode.setDescription(description); ConversationDTO conversationDTO; Map<String, Path> paths = swagger.getPaths(); Set<String> keySet = paths.keySet(); for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) { String pathKey = iterator.next(); Path path = paths.get(pathKey); Map<HttpMethod, Operation> operationMap = path.getOperationMap(); Set<HttpMethod> operationsKeySet = operationMap.keySet(); for (Iterator<HttpMethod> operIterator = operationsKeySet.iterator(); operIterator.hasNext();) { HttpMethod httpMethod = operIterator.next(); Operation operation = operationMap.get(httpMethod); conversationDTO = new ConversationDTO(); RfRequestDTO rfRequestDTO = new RfRequestDTO(); rfRequestDTO.setApiUrl("http://" + host + basePath + pathKey); rfRequestDTO.setMethodType(httpMethod.name()); operation.getParameters(); conversationDTO.setRfRequestDTO(rfRequestDTO); ConversationDTO createdConversation = conversationController.create(conversationDTO); conversationDTO.setId(createdConversation.getId()); String operationId = operation.getOperationId(); String summary = operation.getSummary(); // Request Node NodeDTO childNode = new NodeDTO(); childNode.setName(operationId); childNode.setDescription(summary); childNode.setProjectId(projectId); childNode.setConversationDTO(conversationDTO); NodeDTO createdChildNode = nodeController.create(folderNode.getId(), childNode); System.out.println("created node : " + createdChildNode.getName()); } } } }