/* * Copyright 2017 ThoughtWorks, Inc. * * 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.thoughtworks.go.plugin.access.common.handler; import com.google.gson.GsonBuilder; import com.thoughtworks.go.plugin.api.config.Configuration; import com.thoughtworks.go.plugin.api.config.Property; import com.thoughtworks.go.plugin.api.response.Result; import com.thoughtworks.go.plugin.api.response.validation.ValidationError; import com.thoughtworks.go.plugin.api.response.validation.ValidationResult; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static java.lang.String.format; import static org.apache.commons.lang.StringUtils.isEmpty; public class JSONResultMessageHandler { public Map configurationToMap(Configuration configuration) { Map configuredValuesForRepo = new LinkedHashMap(); for (Property property : configuration.list()) { Map map = new LinkedHashMap(); map.put("value", property.getValue()); configuredValuesForRepo.put(property.getKey(), map); } return configuredValuesForRepo; } public ValidationResult toValidationResult(String responseBody) { try { ValidationResult validationResult = new ValidationResult(); if (isEmpty(responseBody)) return validationResult; List errors; try { errors = (List<Map>) new GsonBuilder().create().fromJson(responseBody, Object.class); } catch (Exception e) { throw new RuntimeException("Validation errors should be returned as list or errors, with each error represented as a map"); } for (Object errorObj : errors) { if (!(errorObj instanceof Map)) { throw new RuntimeException("Each validation error should be represented as a map"); } Map errorMap = (Map) errorObj; String key; try { key = (String) errorMap.get("key"); } catch (Exception e) { throw new RuntimeException("Validation error key should be of type string"); } String message; try { message = (String) errorMap.get("message"); } catch (Exception e) { throw new RuntimeException("Validation message should be of type string"); } if (isEmpty(key)) { validationResult.addError(new ValidationError(message)); } else { validationResult.addError(new ValidationError(key, message)); } } return validationResult; } catch (Exception e) { throw new RuntimeException(format("Unable to de-serialize json response. %s", e.getMessage())); } } public Result toResult(String responseBody) { try { Result result = new Result(); Map map; try { map = (Map) new GsonBuilder().create().fromJson(responseBody, Object.class); } catch (Exception e) { throw new RuntimeException("Check connection result should be returned as map, with key represented as string and messages represented as list"); } if (map == null || map.isEmpty()) { throw new RuntimeException("Empty response body"); } String status; try { status = (String) map.get("status"); } catch (Exception e) { throw new RuntimeException("Check connection 'status' should be of type string"); } if (isEmpty(status)) { throw new RuntimeException("Check connection 'status' is a required field"); } if ("success".equalsIgnoreCase(status)) { result.withSuccessMessages(new ArrayList<>()); } else { result.withErrorMessages(new ArrayList<>()); } if (map.containsKey("messages") && map.get("messages") != null) { List messages = null; try { messages = (List) map.get("messages"); } catch (Exception e) { throw new RuntimeException("Check connection 'messages' should be of type list of string"); } if (!messages.isEmpty()) { for (Object message : messages) { if (!(message instanceof String)) { throw new RuntimeException("Check connection 'message' should be of type string"); } } if (result.isSuccessful()) { result.withSuccessMessages(messages); } else { result.withErrorMessages(messages); } } } return result; } catch (Exception e) { throw new RuntimeException(format("Unable to de-serialize json response. %s", e.getMessage())); } } }