/*
* Copyright 2016 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.authentication;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.thoughtworks.go.plugin.access.authentication.models.AuthenticationPluginConfiguration;
import com.thoughtworks.go.plugin.access.authentication.models.User;
import com.thoughtworks.go.util.StringUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JsonMessageHandler1_0 implements JsonMessageHandler {
@Override
public AuthenticationPluginConfiguration responseMessageForPluginConfiguration(String responseBody) {
Map map;
try {
map = parseResponseToMap(responseBody);
} catch (Exception e) {
throw new RuntimeException("Plugin configuration should be returned as a map");
}
return toPluginConfiguration(map);
}
@Override
public String requestMessageForAuthenticateUser(String username, String password) {
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("username", username);
requestMap.put("password", password);
return toJsonString(requestMap);
}
@Override
public User responseMessageForAuthenticateUser(String responseBody) {
Map map;
try {
map = parseResponseToMap(responseBody);
} catch (Exception e) {
throw new RuntimeException("User should be returned as a map");
}
if (map == null || map.isEmpty()) {
return null;
}
Map userMap;
try {
userMap = (Map) map.get("user");
} catch (Exception e) {
throw new RuntimeException("User should be returned as a map");
}
User user = toUser(userMap);
return user;
}
@Override
public String requestMessageForSearchUser(String searchTerm) {
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("search-term", searchTerm);
return toJsonString(requestMap);
}
@Override
public List<User> responseMessageForSearchUser(String responseBody) {
List<Map> list;
try {
list = parseResponseToList(responseBody);
} catch (Exception e) {
throw new RuntimeException("Search results should be returned as a list");
}
List<User> searchResults = new ArrayList<>();
if (list == null || list.isEmpty()) {
return searchResults;
}
for (Map userMap : list) {
User user = toUser(userMap);
searchResults.add(user);
}
return searchResults;
}
private static String toJsonString(Object object) {
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
return gson.toJson(object);
}
private List<Map> parseResponseToList(String responseBody) {
return (List<Map>) new GsonBuilder().create().fromJson(responseBody, Object.class);
}
private Map parseResponseToMap(String responseBody) {
return (Map) new GsonBuilder().create().fromJson(responseBody, Object.class);
}
AuthenticationPluginConfiguration toPluginConfiguration(Map map) {
String displayName;
try {
displayName = (String) map.get("display-name");
} catch (Exception e) {
throw new RuntimeException("Configuration 'display-name' should be of type string");
}
String displayImageURL;
try {
displayImageURL = (String) map.get("display-image-url");
} catch (Exception e) {
throw new RuntimeException("Configuration 'display-image-url' should be of type string");
}
Boolean supportsWebBasedAuthentication = false;
try {
if (map.get("supports-web-based-authentication") != null) {
supportsWebBasedAuthentication = (Boolean) map.get("supports-web-based-authentication");
}
} catch (Exception e) {
throw new RuntimeException("Configuration 'supports-web-based-authentication' should be of type boolean");
}
Boolean supportsPasswordBasedAuthentication = false;
try {
if (map.get("supports-password-based-authentication") != null) {
supportsPasswordBasedAuthentication = (Boolean) map.get("supports-password-based-authentication");
}
} catch (Exception e) {
throw new RuntimeException("Configuration 'supports-password-based-authentication' should be of type boolean");
}
return new AuthenticationPluginConfiguration(displayName, displayImageURL, supportsWebBasedAuthentication, supportsPasswordBasedAuthentication);
}
User toUser(Map map) {
String username;
try {
username = (String) map.get("username");
} catch (Exception e) {
throw new RuntimeException("User 'username' should be of type string");
}
if (StringUtil.isBlank(username)) {
throw new RuntimeException("User 'username' cannot be empty");
}
String displayName;
try {
displayName = (String) map.get("display-name");
} catch (Exception e) {
throw new RuntimeException("User 'display-name' should be of type string");
}
String emailId;
try {
emailId = (String) map.get("email-id");
} catch (Exception e) {
throw new RuntimeException("User 'email-id' should be of type string");
}
return new User(username, displayName, emailId);
}
}