/* * Copyright (C) 2008-2017, Juick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package com.juick.www; import com.juick.Message; import com.juick.Tag; import com.juick.service.TagService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.annotation.Value; import rocks.xmpp.addr.Jid; import rocks.xmpp.core.XmppException; import rocks.xmpp.core.session.Extension; import rocks.xmpp.core.session.XmppSessionConfiguration; import rocks.xmpp.core.session.debug.LogbackDebugger; import rocks.xmpp.extensions.component.accept.ExternalComponent; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; /** * * @author Ugnich Anton */ public class WebApp implements DisposableBean { private static Logger logger = LoggerFactory.getLogger(WebApp.class); private ExternalComponent xmpp; @Inject private TagService tagService; @Value("${img_path:/var/www/juick.com/i/}") private String imgDir; @Value("${upload_tmp_dir:/var/www/juick.com/i/tmp/}") private String tmpDir; @Value("${xmpp_host:localhost}") private String xmppHost; @Value("${xmpp_password:secret}") private String xmppPassword; @Value("${www_xmpp_jid:www.juick.local}") private String xmppJid; @Value("${xmpp_port:5347}") private int xmppPort; @Value("${xmpp_disabled:false}") private boolean isXmppDisabled; private String scriptsUrl; private String styleUrl; @PostConstruct public void init() { if (!isXmppDisabled) { setupXmppComponent(Jid.of(xmppJid), xmppPassword, xmppPort); } } @Override public void destroy() { try { if (xmpp != null) xmpp.close(); logger.error("ExternalComponent on WWW destroyed"); } catch (Exception e) { logger.error("exception on destroy", e); } } public void setupXmppComponent(final Jid componentJid, final String password, final int port) { XmppSessionConfiguration configuration = XmppSessionConfiguration.builder() .extensions(Extension.of(Message.class)) .debugger(LogbackDebugger.class) .build(); xmpp = ExternalComponent.create(componentJid.toString(), password, configuration, xmppHost, port); xmpp.addConnectionListener(e -> logger.error(e.toString(), e.getCause())); try { xmpp.connect(); } catch (XmppException e) { logger.error("xmpp extension", e); } } public ExternalComponent getXmpp() { return xmpp; } public String getImgDir() { return imgDir; } public String getTmpDir() { return tmpDir; } public List parseTags(String tagsStr) { List tags = new ArrayList<>(); if (tagsStr != null && !tagsStr.isEmpty()) { Stream tagsList = Arrays.stream(tagsStr.split("[ \\,]")) .distinct().map( t -> { if (t.startsWith("*")) { t = t.substring(1); } if (t.length() > 64) { t = t.substring(0, 64); } return t; }); tags = tagService.getTags(tagsList.toArray(String[]::new), true); while (tags.size() > 5) { tags.remove(5); } } return tags; } public String getStyleUrl() { return styleUrl; } public String getScriptsUrl() { return scriptsUrl; } public void setScriptsUrl(String scriptsUrl) { this.scriptsUrl = scriptsUrl; } public void setStyleUrl(String styleUrl) { this.styleUrl = styleUrl; } }