/*
* Juick
* Copyright (C) 2008-2011, Ugnich Anton
*
* 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.User;
import com.juick.service.TagService;
import com.juick.service.UserService;
import com.juick.www.controllers.PageTemplates;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
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 ru.sape.Sape;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;
/**
*
* @author Ugnich Anton
*/
public class WebApp implements AutoCloseable {
private static Logger logger = LoggerFactory.getLogger(WebApp.class);
private ExternalComponent xmpp;
Environment env;
PageTemplates templates;
UserService userService;
TagService tagService;
private String imgDir;
private String tmpDir;
public WebApp(Environment env, PageTemplates templates, UserService userService, TagService tagService) {
this.env = env;
this.templates = templates;
this.userService = userService;
this.tagService = tagService;
tmpDir = env.getProperty("upload_tmp_dir", "/var/www/juick.com/i/tmp/");
imgDir = env.getProperty("img_path", "/var/www/juick.com/i/");
boolean isXmppDisabled = BooleanUtils.toBoolean(env.getProperty("xmpp_disabled"));
if (!isXmppDisabled) {
setupXmppComponent(Jid.of(env.getProperty("www_xmpp_jid", "www.juick.local")),
env.getProperty("xmpp_password"), NumberUtils.toInt(env.getProperty("xmpp_port", StringUtils.EMPTY), 5347));
}
String sapeUser = env.getProperty("sape_user", StringUtils.EMPTY);
if (!Objects.equals(sapeUser, StringUtils.EMPTY)) {
templates.sape = new Sape(sapeUser, "juick.com", 2000, 3600);
} else {
logger.error("Sape is not initialized");
}
}
@Override
public void close() {
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, "localhost", 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 com.juick.User getVisitorUser(HttpServletRequest request, HttpServletResponse response) {
String hash = Utils.getCookie(request, "hash");
if (hash != null) {
com.juick.User visitor = userService.getUserByHash(hash);
if (response != null && visitor.getUid() > 0) {
response.setHeader("X-Username", visitor.getName());
}
return visitor;
} else {
return new User();
}
}
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;
}
}