/* * Copyright 2014-2017 the original author or authors. * * 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 de.codecentric.boot.admin.notify; import java.net.URI; import java.util.HashMap; import java.util.Map; import org.springframework.expression.Expression; import org.springframework.expression.ParserContext; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.util.Base64Utils; import org.springframework.web.client.RestTemplate; import de.codecentric.boot.admin.event.ClientApplicationEvent; /** * Notifier submitting events to let´s Chat. * * @author Rico Pahlisch */ public class LetsChatNotifier extends AbstractStatusChangeNotifier { private static final String DEFAULT_MESSAGE = "*#{application.name}* (#{application.id}) is *#{to.status}*"; private final SpelExpressionParser parser = new SpelExpressionParser(); private RestTemplate restTemplate = new RestTemplate(); /** * Host URL for Let´s Chat */ private URI url; /** * Name of the room */ private String room; /** * Token for the Let´s chat API */ private String token; /** * username which sends notification */ private String username = "Spring Boot Admin"; /** * Message template. SpEL template using event as root */ private Expression message; public LetsChatNotifier() { this.message = parser.parseExpression(DEFAULT_MESSAGE, ParserContext.TEMPLATE_EXPRESSION); } @Override protected void doNotify(ClientApplicationEvent event) throws Exception { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // Let's Chat requiers the token as basic username, the password can be an arbitrary string. String auth = Base64Utils.encodeToString(String.format("%s:%s", token, username).getBytes()); headers.add(HttpHeaders.AUTHORIZATION, String.format("Basic %s", auth)); restTemplate.exchange(createUrl(), HttpMethod.POST, new HttpEntity<>(createMessage(event), headers), Void.class); } private URI createUrl() { return URI.create(String.format("%s/rooms/%s/messages", url, room)); } public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; } public void setUrl(URI url) { this.url = url; } public void setUsername(String username) { this.username = username; } public void setRoom(String room) { this.room = room; } public void setToken(String token) { this.token = token; } public void setMessage(String message) { this.message = parser.parseExpression(message, ParserContext.TEMPLATE_EXPRESSION); } protected Object createMessage(ClientApplicationEvent event) { Map<String, String> messageJson = new HashMap<>(); messageJson.put("text", getText(event)); return messageJson; } protected String getText(ClientApplicationEvent event) { return message.getValue(event, String.class); } }